From 8d242a3c9f0a83ae4b697639cc82c66de73baed0 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 10:51:25 -0800 Subject: [PATCH 01/19] add plot script --- Cargo.lock | 413 ++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/blocks/sram/testbench/mod.rs | 1 + src/blocks/sram/testbench/plot.rs | 96 +++++++ 4 files changed, 511 insertions(+) create mode 100644 src/blocks/sram/testbench/plot.rs diff --git a/Cargo.lock b/Cargo.lock index 1b51f736..ec39cc85 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,6 +14,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "ahash" version = "0.7.8" @@ -257,6 +263,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "bytemuck" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" + [[package]] name = "byteorder" version = "1.5.0" @@ -393,6 +405,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "colorchoice" version = "1.0.3" @@ -428,12 +446,58 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "core-text" +version = "20.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d2790b5c08465d49f8dc05c8bcae9fea467855947db39b0f8145c091aaced5" +dependencies = [ + "core-foundation", + "core-graphics", + "foreign-types", + "libc", +] + [[package]] name = "cpufeatures" version = "0.2.14" @@ -443,6 +507,15 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + [[package]] name = "crossbeam-deque" version = "0.8.5" @@ -708,6 +781,48 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "dwrote" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70182709525a3632b2ba96b6569225467b18ecb4a77f46d255f713a6bebf05fd" +dependencies = [ + "lazy_static", + "libc", + "winapi", + "wio", +] + [[package]] name = "dyn-clone" version = "1.0.17" @@ -760,6 +875,25 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +[[package]] +name = "fdeflate" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "flate2" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "flexbuffers" version = "2.0.0" @@ -773,6 +907,12 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "float-ord" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d" + [[package]] name = "float_eq" version = "1.0.1" @@ -785,6 +925,69 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "font-kit" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b64b34f4efd515f905952d91bc185039863705592c0c53ae6d979805dd154520" +dependencies = [ + "bitflags 2.6.0", + "byteorder", + "core-foundation", + "core-graphics", + "core-text", + "dirs", + "dwrote", + "float-ord", + "freetype-sys", + "lazy_static", + "libc", + "log", + "pathfinder_geometry", + "pathfinder_simd", + "walkdir", + "winapi", + "yeslogic-fontconfig-sys", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "freetype-sys" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7edc5b9669349acfda99533e9e0bcf26a51862ab43b08ee7745c55d28eb134" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "fstrings" version = "0.2.3" @@ -873,6 +1076,16 @@ dependencies = [ "wasi", ] +[[package]] +name = "gif" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "globset" version = "0.4.15" @@ -981,6 +1194,20 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "jpeg-decoder", + "num-traits", + "png", +] + [[package]] name = "indexmap" version = "1.9.3" @@ -1053,6 +1280,12 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + [[package]] name = "js-sys" version = "0.3.72" @@ -1123,12 +1356,32 @@ dependencies = [ "thiserror", ] +[[package]] +name = "libloading" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + [[package]] name = "libm" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -1183,6 +1436,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", + "simd-adler32", +] + [[package]] name = "ngspice" version = "0.0.1" @@ -1342,6 +1605,12 @@ version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "overload" version = "0.1.1" @@ -1363,6 +1632,25 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pathfinder_geometry" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" +dependencies = [ + "log", + "pathfinder_simd", +] + +[[package]] +name = "pathfinder_simd" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cf07ef4804cfa9aea3b04a7bbdd5a40031dbb6b4f2cbaf2b011666c80c5b4f2" +dependencies = [ + "rustc_version", +] + [[package]] name = "pathfinding" version = "4.11.0" @@ -1472,6 +1760,71 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "chrono", + "font-kit", + "image", + "lazy_static", + "num-traits", + "pathfinder_geometry", + "plotters-backend", + "plotters-bitmap", + "plotters-svg", + "ttf-parser", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-bitmap" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ce181e3f6bf82d6c1dc569103ca7b1bd964c60ba03d7e6cdfbb3e3eb7f7405" +dependencies = [ + "gif", + "image", + "plotters-backend", +] + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "png" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + [[package]] name = "portable-atomic" version = "1.9.0" @@ -1658,6 +2011,17 @@ dependencies = [ "rand_core 0.3.1", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + [[package]] name = "regex" version = "1.11.1" @@ -1968,6 +2332,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "simdutf8" version = "0.1.5" @@ -2095,6 +2465,7 @@ dependencies = [ "log", "ngspice", "paste", + "plotters", "psfparser", "rust_decimal", "rust_decimal_macros", @@ -2474,6 +2845,12 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "ttf-parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" + [[package]] name = "typenum" version = "1.17.0" @@ -2649,6 +3026,22 @@ version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +[[package]] +name = "web-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + [[package]] name = "winapi" version = "0.3.9" @@ -2864,6 +3257,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "wio" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" +dependencies = [ + "winapi", +] + [[package]] name = "wyz" version = "0.5.1" @@ -2882,6 +3284,17 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "yeslogic-fontconfig-sys" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503a066b4c037c440169d995b869046827dbc71263f6e8f3be6d77d4f3229dbd" +dependencies = [ + "dlib", + "once_cell", + "pkg-config", +] + [[package]] name = "zerocopy" version = "0.7.35" diff --git a/Cargo.toml b/Cargo.toml index 608ded47..25c5f1c0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,6 +42,7 @@ spectre = { git = "https://github.com/substrate-labs/substrate", branch = "main" sub_calibre = { git = "ssh://git@bwrcrepo.eecs.berkeley.edu/rohankumar/substrate_mentor_plugins.git", branch = "main", optional = true } rust_decimal = "1" rust_decimal_macros = "1" +plotters = "0.3.7" [dev-dependencies] tempfile = "3" diff --git a/src/blocks/sram/testbench/mod.rs b/src/blocks/sram/testbench/mod.rs index d2e30b19..816fec67 100644 --- a/src/blocks/sram/testbench/mod.rs +++ b/src/blocks/sram/testbench/mod.rs @@ -21,6 +21,7 @@ use substrate::verification::simulation::waveform::{TimeWaveform, Waveform}; use super::{Sram, SramParams, SramPex, SramPexParams, SramPhysicalDesign}; +pub mod plot; pub mod verify; #[derive(Debug, Clone, Builder, Serialize, Deserialize)] diff --git a/src/blocks/sram/testbench/plot.rs b/src/blocks/sram/testbench/plot.rs new file mode 100644 index 00000000..ce3c0d7d --- /dev/null +++ b/src/blocks/sram/testbench/plot.rs @@ -0,0 +1,96 @@ +use crate::blocks::sram::testbench::{TbParams, TbSignals}; +use psfparser::analysis::transient::TransientData; +use psfparser::binary::ast::PsfAst; +use std::path::PathBuf; +use substrate::verification::simulation::waveform::SharedWaveform; + +pub struct PlotParams { + tb: TbParams, + psf: PathBuf, + output_path: PathBuf, +} + +pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { + use plotters::prelude::*; + + let data = std::fs::read(params.psf)?; + let ast = psfparser::binary::parse(&data)?; + let data = TransientData::from_binary(ast); + let t = data.signal("time").unwrap(); + let y = data + .signal(¶ms.tb.sram_signal_path(TbSignals::Bl(0))) + .unwrap(); + + let root = BitMapBackend::new(¶ms.output_path, (1920, 1080)).into_drawing_area(); + root.fill(&WHITE).unwrap(); + + let mut chart = ChartBuilder::on(&root) + .x_label_area_size(35) + .y_label_area_size(40) + .margin(5) + .caption("Dual Y-Axis Example", ("sans-serif", 50.0).into_font()) + .build_cartesian_2d(0f32..20e-9f32, -0.2f32..2.2f32) + .unwrap(); + + chart + .configure_mesh() + .disable_x_mesh() + .disable_y_mesh() + .y_desc("Voltage") + .draw() + .unwrap(); + + chart + .draw_series(LineSeries::new( + t.iter().zip(y).map(|(x, y)| (*x as f32, *y as f32)), + &BLUE, + )) + .unwrap() + .label("bl[0]") + .legend(|(x, y)| PathElement::new(vec![(x, y), (x + 20, y)], BLUE)); + + chart + .configure_series_labels() + .background_style(RGBColor(128, 128, 128)) + .draw() + .unwrap(); + + // To avoid the IO failure being ignored silently, we manually call the present function + root.present().expect("Unable to write result to file"); + println!("Result has been saved to {:?}", ¶ms.output_path); + + Ok(()) +} + +#[cfg(test)] +mod tests { + use crate::blocks::sram::testbench::plot::PlotParams; + use crate::blocks::sram::testbench::TestSequence; + use crate::blocks::sram::tests::SRAM22_512X64M4W8; + use crate::blocks::sram::SramPhysicalDesignScript; + use crate::setup_ctx; + use crate::tests::test_work_dir; + + #[test] + fn plot_sram() { + let ctx = setup_ctx(); + let params = SRAM22_512X64M4W8; + let seq = TestSequence::Short; + let dsn = ctx + .run_script::(¶ms) + .expect("failed to run sram design script"); + let pex_level = calibre::pex::PexLevel::Rc; + let sram_work_dir = test_work_dir("test_sram22_512x64m4w8"); + let pex_netlist_path = crate::paths::out_pex(&sram_work_dir, "pex_netlist", pex_level); + let pex_netlist = Some((pex_netlist_path.clone(), pex_level)); + let tb = crate::blocks::sram::testbench::tb_params(params, dsn, 1.8f64, seq, pex_netlist); + let psf = sram_work_dir.join("tt_1.80_short/psf"); + + let work_dir = test_work_dir("plot_sram"); + let plot = PlotParams { + tb, + psf, + output_path: work_dir.join("waveforms.png"), + }; + } +} From 22da1466aba82f3943f2c098d6ab67bcd6273f5b Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 10:56:58 -0800 Subject: [PATCH 02/19] hardcode psf path --- src/blocks/sram/testbench/plot.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/blocks/sram/testbench/plot.rs b/src/blocks/sram/testbench/plot.rs index ce3c0d7d..eeafbc1c 100644 --- a/src/blocks/sram/testbench/plot.rs +++ b/src/blocks/sram/testbench/plot.rs @@ -70,6 +70,7 @@ mod tests { use crate::blocks::sram::SramPhysicalDesignScript; use crate::setup_ctx; use crate::tests::test_work_dir; + use std::path::PathBuf; #[test] fn plot_sram() { @@ -80,7 +81,8 @@ mod tests { .run_script::(¶ms) .expect("failed to run sram design script"); let pex_level = calibre::pex::PexLevel::Rc; - let sram_work_dir = test_work_dir("test_sram22_512x64m4w8"); + let sram_work_dir = + PathBuf::from("/tools/C/rohankumar/sram22/build/test_sram22_512x64m4w8"); let pex_netlist_path = crate::paths::out_pex(&sram_work_dir, "pex_netlist", pex_level); let pex_netlist = Some((pex_netlist_path.clone(), pex_level)); let tb = crate::blocks::sram::testbench::tb_params(params, dsn, 1.8f64, seq, pex_netlist); From 258f1e847d453f6cc4271fd32f381a4b7c404a50 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 11:38:09 -0800 Subject: [PATCH 03/19] plot --- src/blocks/sram/testbench/plot.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/blocks/sram/testbench/plot.rs b/src/blocks/sram/testbench/plot.rs index eeafbc1c..3f4f7956 100644 --- a/src/blocks/sram/testbench/plot.rs +++ b/src/blocks/sram/testbench/plot.rs @@ -64,7 +64,7 @@ pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { #[cfg(test)] mod tests { - use crate::blocks::sram::testbench::plot::PlotParams; + use crate::blocks::sram::testbench::plot::{plot_sim, PlotParams}; use crate::blocks::sram::testbench::TestSequence; use crate::blocks::sram::tests::SRAM22_512X64M4W8; use crate::blocks::sram::SramPhysicalDesignScript; @@ -94,5 +94,6 @@ mod tests { psf, output_path: work_dir.join("waveforms.png"), }; + plot_sim(plot).unwrap(); } } From f41ff510b8bfcb7f9e176a658fcfd343cc2f61a6 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 11:50:21 -0800 Subject: [PATCH 04/19] create work dir --- src/blocks/sram/testbench/plot.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/blocks/sram/testbench/plot.rs b/src/blocks/sram/testbench/plot.rs index 3f4f7956..e71d3f63 100644 --- a/src/blocks/sram/testbench/plot.rs +++ b/src/blocks/sram/testbench/plot.rs @@ -89,6 +89,7 @@ mod tests { let psf = sram_work_dir.join("tt_1.80_short/psf"); let work_dir = test_work_dir("plot_sram"); + std::fs::create_dir_all(&work_dir).unwrap(); let plot = PlotParams { tb, psf, From 53ca186e2e16ae1faad6b67568c6e141f6e9f403 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 11:54:14 -0800 Subject: [PATCH 05/19] fix psf path --- src/blocks/sram/testbench/plot.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blocks/sram/testbench/plot.rs b/src/blocks/sram/testbench/plot.rs index e71d3f63..677bce64 100644 --- a/src/blocks/sram/testbench/plot.rs +++ b/src/blocks/sram/testbench/plot.rs @@ -86,7 +86,7 @@ mod tests { let pex_netlist_path = crate::paths::out_pex(&sram_work_dir, "pex_netlist", pex_level); let pex_netlist = Some((pex_netlist_path.clone(), pex_level)); let tb = crate::blocks::sram::testbench::tb_params(params, dsn, 1.8f64, seq, pex_netlist); - let psf = sram_work_dir.join("tt_1.80_short/psf"); + let psf = sram_work_dir.join("tt_1.80_short/psf/analysis_0.tran.tran"); let work_dir = test_work_dir("plot_sram"); std::fs::create_dir_all(&work_dir).unwrap(); From 4f58724d9234f6b28533c34159b42f8515e4ec72 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 12:08:50 -0800 Subject: [PATCH 06/19] plot useful signals --- src/blocks/sram/testbench/plot.rs | 39 ++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/blocks/sram/testbench/plot.rs b/src/blocks/sram/testbench/plot.rs index 677bce64..29aff1fa 100644 --- a/src/blocks/sram/testbench/plot.rs +++ b/src/blocks/sram/testbench/plot.rs @@ -17,9 +17,6 @@ pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { let ast = psfparser::binary::parse(&data)?; let data = TransientData::from_binary(ast); let t = data.signal("time").unwrap(); - let y = data - .signal(¶ms.tb.sram_signal_path(TbSignals::Bl(0))) - .unwrap(); let root = BitMapBackend::new(¶ms.output_path, (1920, 1080)).into_drawing_area(); root.fill(&WHITE).unwrap(); @@ -29,25 +26,41 @@ pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { .y_label_area_size(40) .margin(5) .caption("Dual Y-Axis Example", ("sans-serif", 50.0).into_font()) - .build_cartesian_2d(0f32..20e-9f32, -0.2f32..2.2f32) + .build_cartesian_2d(138e-9f32..158e-9f32, -0.2f32..2.2f32) .unwrap(); chart .configure_mesh() .disable_x_mesh() .disable_y_mesh() - .y_desc("Voltage") + .x_desc("Time (ns)") + .x_label_formatter(&|x| format!("{:.1}", x * 1e9f32)) + .y_desc("Voltage (V)") .draw() .unwrap(); - chart - .draw_series(LineSeries::new( - t.iter().zip(y).map(|(x, y)| (*x as f32, *y as f32)), - &BLUE, - )) - .unwrap() - .label("bl[0]") - .legend(|(x, y)| PathElement::new(vec![(x, y), (x + 20, y)], BLUE)); + let mut plot = |name: &str, sig: TbSignals| { + let y = data.signal(¶ms.tb.sram_signal_path(sig)).unwrap(); + chart + .draw_series(LineSeries::new( + t.iter().zip(y).map(|(x, y)| (*x as f32, *y as f32)), + &BLUE, + )) + .unwrap() + .label(name) + .legend(|(x, y)| PathElement::new(vec![(x, y), (x + 20, y)], BLUE)); + }; + + plot("bl[4]", TbSignals::Bl(4)); + plot("br[4]", TbSignals::Br(4)); + plot("sae", TbSignals::SenseEnEnd); + plot("pcb", TbSignals::PcBEnd); + plot("wlen", TbSignals::Wlen); + plot("wl[0]", TbSignals::WlEnd(0)); + plot("rbl", TbSignals::Rbl); + plot("rwl", TbSignals::Rwl); + plot("clk", TbSignals::Clk); + plot("dout[1]", TbSignals::Dout(1)); chart .configure_series_labels() From 8dae00465c58983bd0fdb57af27c22b5eab46784 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 12:20:29 -0800 Subject: [PATCH 07/19] change plot title --- src/blocks/sram/testbench/plot.rs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/blocks/sram/testbench/plot.rs b/src/blocks/sram/testbench/plot.rs index 29aff1fa..647f9522 100644 --- a/src/blocks/sram/testbench/plot.rs +++ b/src/blocks/sram/testbench/plot.rs @@ -1,4 +1,11 @@ use crate::blocks::sram::testbench::{TbParams, TbSignals}; +use plotters::backend::BitMapBackend; +use plotters::chart::ChartBuilder; +use plotters::drawing::IntoDrawingArea; +use plotters::element::PathElement; +use plotters::prelude::IntoFont; +use plotters::series::LineSeries; +use plotters::style::RGBColor; use psfparser::analysis::transient::TransientData; use psfparser::binary::ast::PsfAst; use std::path::PathBuf; @@ -11,8 +18,6 @@ pub struct PlotParams { } pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { - use plotters::prelude::*; - let data = std::fs::read(params.psf)?; let ast = psfparser::binary::parse(&data)?; let data = TransientData::from_binary(ast); @@ -25,7 +30,7 @@ pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { .x_label_area_size(35) .y_label_area_size(40) .margin(5) - .caption("Dual Y-Axis Example", ("sans-serif", 50.0).into_font()) + .caption("SRAM Read", ("sans-serif", 32.0).into_font()) .build_cartesian_2d(138e-9f32..158e-9f32, -0.2f32..2.2f32) .unwrap(); @@ -39,16 +44,23 @@ pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { .draw() .unwrap(); + use plotters::style::colors::full_palette::*; + let styles = [ + RED, PURPLE, INDIGO, BLUE, CYAN, TEAL, LIGHTGREEN, YELLOW, ORANGE, DEEPORANGE, BROWN, GREY, + BLUEGREY, + ]; + let mut styles = styles.into_iter().cycle(); let mut plot = |name: &str, sig: TbSignals| { + let style = styles.next().unwrap(); let y = data.signal(¶ms.tb.sram_signal_path(sig)).unwrap(); chart .draw_series(LineSeries::new( t.iter().zip(y).map(|(x, y)| (*x as f32, *y as f32)), - &BLUE, + &style, )) .unwrap() .label(name) - .legend(|(x, y)| PathElement::new(vec![(x, y), (x + 20, y)], BLUE)); + .legend(move |(x, y)| PathElement::new(vec![(x, y), (x + 20, y)], style.clone())); }; plot("bl[4]", TbSignals::Bl(4)); From 8bcebcf798d1ce2eb5d98e227c2469c074c2e47a Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 12:29:16 -0800 Subject: [PATCH 08/19] fix stroke --- src/blocks/sram/testbench/plot.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/blocks/sram/testbench/plot.rs b/src/blocks/sram/testbench/plot.rs index 647f9522..c5c79a9f 100644 --- a/src/blocks/sram/testbench/plot.rs +++ b/src/blocks/sram/testbench/plot.rs @@ -5,7 +5,7 @@ use plotters::drawing::IntoDrawingArea; use plotters::element::PathElement; use plotters::prelude::IntoFont; use plotters::series::LineSeries; -use plotters::style::RGBColor; +use plotters::style::{Color, RGBColor, ShapeStyle}; use psfparser::analysis::transient::TransientData; use psfparser::binary::ast::PsfAst; use std::path::PathBuf; @@ -46,12 +46,17 @@ pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { use plotters::style::colors::full_palette::*; let styles = [ - RED, PURPLE, INDIGO, BLUE, CYAN, TEAL, LIGHTGREEN, YELLOW, ORANGE, DEEPORANGE, BROWN, GREY, + RED, PURPLE, INDIGO, BLUE, CYAN, TEAL, LIGHTGREEN, ORANGE, DEEPORANGE, BROWN, GREY, BLUEGREY, ]; let mut styles = styles.into_iter().cycle(); let mut plot = |name: &str, sig: TbSignals| { let style = styles.next().unwrap(); + let style = ShapeStyle { + color: style.mix(1.0f32), + filled: true, + stroke_width: 3, + }; let y = data.signal(¶ms.tb.sram_signal_path(sig)).unwrap(); chart .draw_series(LineSeries::new( @@ -67,16 +72,16 @@ pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { plot("br[4]", TbSignals::Br(4)); plot("sae", TbSignals::SenseEnEnd); plot("pcb", TbSignals::PcBEnd); - plot("wlen", TbSignals::Wlen); - plot("wl[0]", TbSignals::WlEnd(0)); + // plot("wlen", TbSignals::Wlen); + // plot("wl[0]", TbSignals::WlEnd(0)); plot("rbl", TbSignals::Rbl); plot("rwl", TbSignals::Rwl); - plot("clk", TbSignals::Clk); + // plot("clk", TbSignals::Clk); plot("dout[1]", TbSignals::Dout(1)); chart .configure_series_labels() - .background_style(RGBColor(128, 128, 128)) + .background_style(RGBColor(64, 64, 64)) .draw() .unwrap(); From cea9ae1321e859ff5bee5399dcc6f90ce33f0cbc Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 12:30:17 -0800 Subject: [PATCH 09/19] compile errors --- src/blocks/sram/testbench/plot.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/blocks/sram/testbench/plot.rs b/src/blocks/sram/testbench/plot.rs index c5c79a9f..cb86eca8 100644 --- a/src/blocks/sram/testbench/plot.rs +++ b/src/blocks/sram/testbench/plot.rs @@ -53,7 +53,7 @@ pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { let mut plot = |name: &str, sig: TbSignals| { let style = styles.next().unwrap(); let style = ShapeStyle { - color: style.mix(1.0f32), + color: style.mix(1.0), filled: true, stroke_width: 3, }; @@ -61,7 +61,7 @@ pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { chart .draw_series(LineSeries::new( t.iter().zip(y).map(|(x, y)| (*x as f32, *y as f32)), - &style, + style.clone(), )) .unwrap() .label(name) From 08aefa8753724fd97dc004fd179289bce8c8a896 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 12:35:06 -0800 Subject: [PATCH 10/19] updates --- src/blocks/sram/testbench/plot.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blocks/sram/testbench/plot.rs b/src/blocks/sram/testbench/plot.rs index cb86eca8..79364a9a 100644 --- a/src/blocks/sram/testbench/plot.rs +++ b/src/blocks/sram/testbench/plot.rs @@ -81,7 +81,7 @@ pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { chart .configure_series_labels() - .background_style(RGBColor(64, 64, 64)) + .background_style(RGBColor(192, 192, 192)) .draw() .unwrap(); From c45107fbb2ee532977251833bf737d45ee872701 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 16:10:35 -0800 Subject: [PATCH 11/19] read and write plots --- src/blocks/sram/testbench/plot.rs | 92 ++++++++++++++++++++++++------- 1 file changed, 72 insertions(+), 20 deletions(-) diff --git a/src/blocks/sram/testbench/plot.rs b/src/blocks/sram/testbench/plot.rs index 79364a9a..42585223 100644 --- a/src/blocks/sram/testbench/plot.rs +++ b/src/blocks/sram/testbench/plot.rs @@ -1,6 +1,7 @@ use crate::blocks::sram::testbench::{TbParams, TbSignals}; use plotters::backend::BitMapBackend; use plotters::chart::ChartBuilder; +use plotters::coord::types::RangedCoordf32; use plotters::drawing::IntoDrawingArea; use plotters::element::PathElement; use plotters::prelude::IntoFont; @@ -8,16 +9,23 @@ use plotters::series::LineSeries; use plotters::style::{Color, RGBColor, ShapeStyle}; use psfparser::analysis::transient::TransientData; use psfparser::binary::ast::PsfAst; +use std::ops::Range; use std::path::PathBuf; use substrate::verification::simulation::waveform::SharedWaveform; +#[derive(Debug, Clone)] pub struct PlotParams { tb: TbParams, psf: PathBuf, output_path: PathBuf, + plot_name: String, } -pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { +fn plot_inner( + params: PlotParams, + time_span: Range, + signals: &[(&str, TbSignals)], +) -> substrate::error::Result<()> { let data = std::fs::read(params.psf)?; let ast = psfparser::binary::parse(&data)?; let data = TransientData::from_binary(ast); @@ -30,8 +38,8 @@ pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { .x_label_area_size(35) .y_label_area_size(40) .margin(5) - .caption("SRAM Read", ("sans-serif", 32.0).into_font()) - .build_cartesian_2d(138e-9f32..158e-9f32, -0.2f32..2.2f32) + .caption(params.plot_name, ("sans-serif", 32.0).into_font()) + .build_cartesian_2d(time_span, -0.2f32..2.2f32) .unwrap(); chart @@ -68,17 +76,9 @@ pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { .legend(move |(x, y)| PathElement::new(vec![(x, y), (x + 20, y)], style.clone())); }; - plot("bl[4]", TbSignals::Bl(4)); - plot("br[4]", TbSignals::Br(4)); - plot("sae", TbSignals::SenseEnEnd); - plot("pcb", TbSignals::PcBEnd); - // plot("wlen", TbSignals::Wlen); - // plot("wl[0]", TbSignals::WlEnd(0)); - plot("rbl", TbSignals::Rbl); - plot("rwl", TbSignals::Rwl); - // plot("clk", TbSignals::Clk); - plot("dout[1]", TbSignals::Dout(1)); - + for (name, sig) in signals { + plot(name, sig.clone()); + } chart .configure_series_labels() .background_style(RGBColor(192, 192, 192)) @@ -92,9 +92,42 @@ pub fn plot_sim(params: PlotParams) -> substrate::error::Result<()> { Ok(()) } +pub fn plot_read(params: PlotParams) -> substrate::error::Result<()> { + plot_inner( + params, + 138e-9f32..158e-9f32, + &vec![ + ("clk", TbSignals::Clk), + ("rwl", TbSignals::Rwl), + ("rbl", TbSignals::Rbl), + ("bl[4]", TbSignals::Bl(4)), + ("br[4]", TbSignals::Br(4)), + ("sae", TbSignals::SenseEnEnd), + ("dout[1]", TbSignals::Dout(1)), + ("pcb", TbSignals::PcBEnd), + ], + ) +} + +pub fn plot_write(params: PlotParams) -> substrate::error::Result<()> { + plot_inner( + params, + 38e-9f32..58e-9f32, + &vec![ + ("clk", TbSignals::Clk), + ("write_driver_en[0]", TbSignals::WeI(0)), + ("write_driver_enb[0]", TbSignals::WeIb(0)), + ("wl[0]", TbSignals::WlEnd(0)), + ("bl[4]", TbSignals::Bl(4)), + ("br[4]", TbSignals::Br(4)), + ("pcb", TbSignals::PcBEnd), + ], + ) +} + #[cfg(test)] mod tests { - use crate::blocks::sram::testbench::plot::{plot_sim, PlotParams}; + use crate::blocks::sram::testbench::plot::*; use crate::blocks::sram::testbench::TestSequence; use crate::blocks::sram::tests::SRAM22_512X64M4W8; use crate::blocks::sram::SramPhysicalDesignScript; @@ -111,20 +144,39 @@ mod tests { .run_script::(¶ms) .expect("failed to run sram design script"); let pex_level = calibre::pex::PexLevel::Rc; - let sram_work_dir = - PathBuf::from("/tools/C/rohankumar/sram22/build/test_sram22_512x64m4w8"); + let sram_work_dir = PathBuf::from(format!( + "/tools/C/rohankumar/sram22/build/test_{}", + params.name() + )); + let corner = "tt"; let pex_netlist_path = crate::paths::out_pex(&sram_work_dir, "pex_netlist", pex_level); let pex_netlist = Some((pex_netlist_path.clone(), pex_level)); let tb = crate::blocks::sram::testbench::tb_params(params, dsn, 1.8f64, seq, pex_netlist); - let psf = sram_work_dir.join("tt_1.80_short/psf/analysis_0.tran.tran"); + let psf = sram_work_dir.join(format!("{corner}_1.80_short/psf/analysis_0.tran.tran")); let work_dir = test_work_dir("plot_sram"); std::fs::create_dir_all(&work_dir).unwrap(); + let plot = PlotParams { + tb: tb.clone(), + psf: psf.clone(), + output_path: work_dir.join(format!("{}_read.png", params.name())), + plot_name: format!( + "{} read (RC extracted, {}/25C/1.8V)", + params.name(), + corner.to_uppercase() + ), + }; + plot_read(plot).unwrap(); let plot = PlotParams { tb, psf, - output_path: work_dir.join("waveforms.png"), + output_path: work_dir.join(format!("{}_write.png", params.name())), + plot_name: format!( + "{} write (RC extracted, {}/25C/1.8V)", + params.name(), + corner.to_uppercase() + ), }; - plot_sim(plot).unwrap(); + plot_write(plot.clone()).unwrap(); } } From 458555adda51aac09eed3275eb04bb37ea2751fc Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 16:11:43 -0800 Subject: [PATCH 12/19] add corner to file name --- src/blocks/sram/testbench/plot.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/blocks/sram/testbench/plot.rs b/src/blocks/sram/testbench/plot.rs index 42585223..4f14df0c 100644 --- a/src/blocks/sram/testbench/plot.rs +++ b/src/blocks/sram/testbench/plot.rs @@ -159,7 +159,7 @@ mod tests { let plot = PlotParams { tb: tb.clone(), psf: psf.clone(), - output_path: work_dir.join(format!("{}_read.png", params.name())), + output_path: work_dir.join(format!("{}_{}_read.png", params.name(), corner)), plot_name: format!( "{} read (RC extracted, {}/25C/1.8V)", params.name(), @@ -170,7 +170,7 @@ mod tests { let plot = PlotParams { tb, psf, - output_path: work_dir.join(format!("{}_write.png", params.name())), + output_path: work_dir.join(format!("{}_{}_write.png", params.name(), corner)), plot_name: format!( "{} write (RC extracted, {}/25C/1.8V)", params.name(), From 8389cc42b45f2bb7fe2b61cfe6660f007e904cab Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 16:19:05 -0800 Subject: [PATCH 13/19] plot all srams --- src/blocks/sram/testbench/plot.rs | 102 ++++++++++++++++++------------ 1 file changed, 63 insertions(+), 39 deletions(-) diff --git a/src/blocks/sram/testbench/plot.rs b/src/blocks/sram/testbench/plot.rs index 4f14df0c..cd0b31d4 100644 --- a/src/blocks/sram/testbench/plot.rs +++ b/src/blocks/sram/testbench/plot.rs @@ -129,7 +129,7 @@ pub fn plot_write(params: PlotParams) -> substrate::error::Result<()> { mod tests { use crate::blocks::sram::testbench::plot::*; use crate::blocks::sram::testbench::TestSequence; - use crate::blocks::sram::tests::SRAM22_512X64M4W8; + use crate::blocks::sram::tests::*; use crate::blocks::sram::SramPhysicalDesignScript; use crate::setup_ctx; use crate::tests::test_work_dir; @@ -138,45 +138,69 @@ mod tests { #[test] fn plot_sram() { let ctx = setup_ctx(); - let params = SRAM22_512X64M4W8; let seq = TestSequence::Short; - let dsn = ctx - .run_script::(¶ms) - .expect("failed to run sram design script"); - let pex_level = calibre::pex::PexLevel::Rc; - let sram_work_dir = PathBuf::from(format!( - "/tools/C/rohankumar/sram22/build/test_{}", - params.name() - )); - let corner = "tt"; - let pex_netlist_path = crate::paths::out_pex(&sram_work_dir, "pex_netlist", pex_level); - let pex_netlist = Some((pex_netlist_path.clone(), pex_level)); - let tb = crate::blocks::sram::testbench::tb_params(params, dsn, 1.8f64, seq, pex_netlist); - let psf = sram_work_dir.join(format!("{corner}_1.80_short/psf/analysis_0.tran.tran")); + for params in [ + SRAM22_64X24M4W8, + SRAM22_64X32M4W8, + SRAM22_128X16M4W8, + SRAM22_128X24M4W8, + SRAM22_128X32M4W8, + SRAM22_256X8M8W1, + SRAM22_256X16M8W8, + SRAM22_256X32M4W8, + SRAM22_256X64M4W8, + SRAM22_256X128M4W8, + SRAM22_512X8M8W1, + SRAM22_512X32M4W8, + SRAM22_512X64M4W8, + SRAM22_512X128M4W8, + SRAM22_1024X8M8W1, + SRAM22_1024X32M8W8, + SRAM22_1024X64M4W8, + SRAM22_2048X8M8W1, + SRAM22_2048X32M8W8, + ] { + let dsn = ctx + .run_script::(¶ms) + .expect("failed to run sram design script"); + let pex_level = calibre::pex::PexLevel::Rc; + let sram_work_dir = PathBuf::from(format!( + "/tools/C/rohankumar/sram22/build/test_{}", + params.name() + )); + let pex_netlist_path = crate::paths::out_pex(&sram_work_dir, "pex_netlist", pex_level); + let pex_netlist = Some((pex_netlist_path.clone(), pex_level)); + let tb = + crate::blocks::sram::testbench::tb_params(params, dsn, 1.8f64, seq, pex_netlist); + for corner in ["tt", "sf", "fs", "ss", "ff"] { + let psf = + sram_work_dir.join(format!("{corner}_1.80_short/psf/analysis_0.tran.tran")); - let work_dir = test_work_dir("plot_sram"); - std::fs::create_dir_all(&work_dir).unwrap(); - let plot = PlotParams { - tb: tb.clone(), - psf: psf.clone(), - output_path: work_dir.join(format!("{}_{}_read.png", params.name(), corner)), - plot_name: format!( - "{} read (RC extracted, {}/25C/1.8V)", - params.name(), - corner.to_uppercase() - ), - }; - plot_read(plot).unwrap(); - let plot = PlotParams { - tb, - psf, - output_path: work_dir.join(format!("{}_{}_write.png", params.name(), corner)), - plot_name: format!( - "{} write (RC extracted, {}/25C/1.8V)", - params.name(), - corner.to_uppercase() - ), - }; - plot_write(plot.clone()).unwrap(); + let work_dir = test_work_dir("plot_sram"); + std::fs::create_dir_all(&work_dir).unwrap(); + let plot = PlotParams { + tb: tb.clone(), + psf: psf.clone(), + output_path: work_dir.join(format!("{}_{}_read.png", params.name(), corner)), + plot_name: format!( + "{} read (RC extracted, {}/25C/1.8V)", + params.name(), + corner.to_uppercase() + ), + }; + plot_read(plot).unwrap(); + let plot = PlotParams { + tb: tb.clone(), + psf: psf.clone(), + output_path: work_dir.join(format!("{}_{}_write.png", params.name(), corner)), + plot_name: format!( + "{} write (RC extracted, {}/25C/1.8V)", + params.name(), + corner.to_uppercase() + ), + }; + plot_write(plot.clone()).unwrap(); + } + } } } From c27a1d417bbc063055d97404672441a7a482c6b7 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 16:58:19 -0800 Subject: [PATCH 14/19] use bl/br 8 --- src/blocks/sram/testbench/plot.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/blocks/sram/testbench/plot.rs b/src/blocks/sram/testbench/plot.rs index cd0b31d4..3777baff 100644 --- a/src/blocks/sram/testbench/plot.rs +++ b/src/blocks/sram/testbench/plot.rs @@ -100,8 +100,8 @@ pub fn plot_read(params: PlotParams) -> substrate::error::Result<()> { ("clk", TbSignals::Clk), ("rwl", TbSignals::Rwl), ("rbl", TbSignals::Rbl), - ("bl[4]", TbSignals::Bl(4)), - ("br[4]", TbSignals::Br(4)), + ("bl[4]", TbSignals::Bl(8)), + ("br[4]", TbSignals::Br(8)), ("sae", TbSignals::SenseEnEnd), ("dout[1]", TbSignals::Dout(1)), ("pcb", TbSignals::PcBEnd), @@ -118,8 +118,8 @@ pub fn plot_write(params: PlotParams) -> substrate::error::Result<()> { ("write_driver_en[0]", TbSignals::WeI(0)), ("write_driver_enb[0]", TbSignals::WeIb(0)), ("wl[0]", TbSignals::WlEnd(0)), - ("bl[4]", TbSignals::Bl(4)), - ("br[4]", TbSignals::Br(4)), + ("bl[4]", TbSignals::Bl(8)), + ("br[4]", TbSignals::Br(8)), ("pcb", TbSignals::PcBEnd), ], ) From 539eecf24999dbdb78caf11ef3a7910609c042b4 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 16:59:05 -0800 Subject: [PATCH 15/19] remove tt corner --- src/blocks/sram/testbench/plot.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blocks/sram/testbench/plot.rs b/src/blocks/sram/testbench/plot.rs index cd0b31d4..d133ae0e 100644 --- a/src/blocks/sram/testbench/plot.rs +++ b/src/blocks/sram/testbench/plot.rs @@ -172,7 +172,7 @@ mod tests { let pex_netlist = Some((pex_netlist_path.clone(), pex_level)); let tb = crate::blocks::sram::testbench::tb_params(params, dsn, 1.8f64, seq, pex_netlist); - for corner in ["tt", "sf", "fs", "ss", "ff"] { + for corner in ["sf", "fs", "ss", "ff"] { let psf = sram_work_dir.join(format!("{corner}_1.80_short/psf/analysis_0.tran.tran")); From 40ce26db9f5b994a9f9c3641983cd97e569afff4 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 22:11:04 -0800 Subject: [PATCH 16/19] add vpb/vnb ports --- tech/sky130/gds/sramgen_sp_sense_amp.gds | Bin 38912 -> 37400 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tech/sky130/gds/sramgen_sp_sense_amp.gds b/tech/sky130/gds/sramgen_sp_sense_amp.gds index a5b5a762f110a2dd0e148dd6c1d5f2e082123993..c4b8c0473ad3bb1e644d417ea6dd91919cafd826 100644 GIT binary patch literal 37400 zcmcJYd$3+rdB%6n$w@+TPA-U85!(bL5rYPDGcf`u7X&dE5_7*2gffnhf+)3M>!rg~ ztF@!!rQ>BLR$FyY#139Mb}Ek6cCb$C)TvW#RjeIt)v;5j*iJ9>`K@<7-{s`2_b_1d zM}PL&>)GpF?|S!Id++b?echaHWaMCX{;ZL?Kj;>8W8Jyk{BGUg|L*3E%-R0JEnRoc z=-3sT-}u}Yed$C0x^dfQR-Jy&;l17YV{P9r%$ak?%TL~V^G&Bt+;Q89J8n94$4w_r z-g;X%dtTSgnHcG|c5@bvbmw%JEFSH;g-`CfP45kE|4;FAU1wSsXD{id_s^aceu!`O zy?x@Z$N%5_Pc;6qk9XZw3%U-Tyi^G~)Tec^8UOgr;fMGqlqeH_J>K*$`a<|2zQwop ziN79i`o~_?b(?>v_{A;nQ2g)i)4JI7&sHCs|6cPXp5d>$jyL_|%e!vtr!`J-+ewZ8 znm(NGMo8dRDi>ZIdpM-zcn(&*} z#ipP6+o@{?;$!_Wt&2_n$cy9pfvi6x|I;VePd(oBlRw(Qsq2?@vFRUNKk&1DnE31Q zrk{SDr(JVu{wl3!`Fo;%^20ns=AHbR)@Pc3+7XBA#%_kLw4LH~gmc z?E1sUbq=}i@tfAO>mMKMB=o*vTF=%`eB>FDcltN2XZatze`DR}{>^0lpXvUMerX5s z(Z6Y3Y|j7S{U<)|KTZ5I-G9=r^Thr`|EBes^5=H;nbtEu`C*od(i?HGsa z#fi0`Gp%QS^2T)zx$Xy_AFR)G{nL(dc-=6q zXMXZVJBV-a`Nw+Zr(gC7=yk`mp6wq$4?p`1=V9Mr{!HuH{=>Kr+!NzJ_@NlTX<|1zzM z&Hm><&~@uS*>&)_C%SII@jk7KO+R(N@>@~=li!W;o7TmqpZTL5#7F&_)-ykKv-Gc{ zelEB=>c_M$Hv3<^N#oVr7b*vfC-wiE)<53%m+{{f<6nJFjNe>Yb+Oq$@zW0CqyA0n znZM*ueu$6!nfUARw14V^{;3=KH?3#&Q{sMt{#B#V|D_j2|E6`Z89(`dp5A#t*PUry zZ2F0xb`T%qH?3!Wu3Oqcd^~@c)-ylXFYO>c?mtcInV)rwb`T%ymuWro)9;4MqW_I| zNB^dEv6;Uo>L+g(s&3)M_eK6p>teHi=6!j+&Q`oPu0PYd*z|LK&<^6``Z29%e)3K` zh>!f6)-yljrX9pb{g~D>KXtodcGNHPM*W)B#pd{#Kk^L8JN0K;&+Z7h>!Kdw4V9tci-vgfB&`7ziC};#?Sb#(f(2Ru^9g~ruE_Hr!&Tn zpE&R_{vNF-e#VWzP=3abztDQ(C+-&>i1@En4YL26*2U)diJNv1AMu;kGe2?D4&ozj z(|YD7{%dv3z!&X{_)Y6#8b9rbA0P3X)-!*JTYiX-_)Yxvc(eZ!_oEU2_K!sT=8LK> zHvJ`TwS)MG-^5>!H~l4UwS)MG-^5>!H~pM{r|x+QKNbD&G_8-f<7fQWY5jq_-xT9F zt&3^@w4;A~jNi1L`57PWAU?)#TF?B%y=Ps-zvtT#e~;GJy5U>zTjAtv(_94)L4pKlOOC{z}|x2k{ZViN79i`b*qu z2k{ZViN79i`b*r8Mx5+B#BZ|y)Zc46Mm+K6h~Km> zrt1&wh#wzuo7OWwanlasBW}}r<|poBZ;AMiZ;1F!>tY%|?T8;A@tf8&KXKEpj6;6n z#}BP%e)>J~tI_|_WzoNBU2MkBeJAr@sCno9lld>Sp3Fb@o%jpo6y@*?$r7_h|hW^Z4--KR)8`(R$)1Zv2Jv6F>e!>xrNEpQF!@;VON8 z%yna07t{RHj`;BrziB=56F2Q3KH@g5XZ{lRmm>a4Z;SZNRaF<$_-RM{_=w-Mp7~4M z@iwmwhqf@6q~sdHnc^A0P4eXg%>0AO1r5i64KV^~6uV&-hIA zf6)!mziC};j-P&M2l3IbX+86kzYA}S{5@k~zSXpX;;P} zAMxXd)-yl-F540PFZ)^a+oSaz?f4o0GarcYUwk~qZ(0}A@zaht@G)-Fdgf=`w1fB< zw`o1|6aR|qBmQU3kN8dNVj4f~h#w#Eo7OWwanr7hLw@4N53Of@;$J=<@h|^W#NVU! zyP_q`Y%+!+`rR*q4lJH z?%VMf%Ex^>{zB`CpXU$agv8DBt7(0v_-RM{_=wxIp81KJb`T$No7OWwakEa8acJEj ze%23YJzGDBn|2T%@tf8&KXKEpj6;6n#}BP%e)?toD%AQ#|Eyny)|2&%akEZ9)(ysO zTF=%G`lTJjN57`^%+I)K2k|j((|YD7Zmka`e%1}*H?51!^^3S^SH>Yf@#BZqGe2?D zu8c!I;>QoIXMW=6`YY6RNBmrWh1QenkAAt&f!z1duW3EIf1+RRKMKDX{c`_7|2;jq z{~&LdPe%SO|Ch*HkJcyi{L>HTpbHyqVU;wEk#E9QYW&X+85ZZrVY7jN7z6lb`v+&%EL9(fVXN ze#Xyp0_3@Yx-qS1&ku~7b`T%qH?3!W;-($MNBpMs%wOWx^#i$Xh~MP;smGi1$8nxh zAzSW%(+=We{HFEHPux7e7V5c`_<4RUw4OY_mU&a2AbBHx zll;}=&HQnk{tMMFe)=!8p7hVS@fXU+`0*E7PyCGg${)n|C*Kz1Hm!?k{Inx}e8g>9 z&-}zqJBW|CP3xJT_^)_-#DC=#5x;3&Y{rkD_e_xYPRzS$J$wJexM>IRF@Do}=4afr zgZLP~X+87PFYmb^@4e{Xw4S~H!bhGUdBbm7&+1&Jh!la6>9(DxrP0!(0a0e@!Ub3LF$g@57T;9fAmW`h>w0v>zSYDCfY%KJU5xv zGe2>Y=Q0lEpZLi?w4UXkxM^3$As_MMht@Mcanr7hLq6ii53Of@;=Ww-T&Q^`Zsxzx z`V8}rpZM_+caPQ+KXKzPl%Kfq7g|sJ#LayMeD{)%=LNT{M!^C=ijwB&Tpb~UUSDE#raM9#Ps~vofGHZ|G_xFiO%`WeJ_afoA!z6 z`Hwt3&VTY_;Wv-o9p^XE$)9PTn4W*bia7t~6LEfX<2`YH6TN(2Ri%Amdj6$9jq^WC z`wR1DUa&jPZ=!R4(>}3ze!j1YI)K#AqBr-6zVMMa4ym7sZ}n+kRzKzYuv90Iy5amL z^}%^f>W1^1=+&RbPaV*Xy5amLI_Ed38_sXqC#L784mdw`f#0NVIKPQb|E7Ie{cv9D z08$^E-=uChzlqNIP5ZL?;k?uVq%JtWN!@UM6P@#$_BHCKe1Be9PaciBTssl4|IQzT-?T2K{(YyyzyH| zsejqi!hgZV;Ww>|O+WKVo*{W>K27Uc{_&A#NZ#?A*0cQMBhQe$<2S8m`Nv0|A$iAd zTF>&2k32*2j^DJNtfn} zX{Y}2(Z6Xu^{f9QPm2DJYQ1FqrgbsxzqC{T_~_rXp8D1QhNnmW8-F+YH?50l|D~P! z$4CFB_0+Ham;Q6~f5DOH-?T2K{g-y?A0Pdj)-(UaC!&5K^}Fc8KB?b&yxIRkJ@?WM z;$QeTeOecre$G#wLh6?OP3u|x(l6~GKKeJUXMXynP9b$m|EBehr1vl1?9;k9SifiZuTtIN->&Cg{HAp=^TV(Ne1j_^NOKgCbKoX7f<_$LR~pHBa_ zewzQ=bvL}F>&||#PwV1f{Kp6V%n#4maK|l?H`BV9`gxAVzfUocchmZm=j${2Kl=Ib z^W2Qzv@SOLCvU_FiJQEc*0cEW5ho;W{HFCRetg6Ui5tIZeM``;9P)4G`YcWV73j-5XXe~;FO_n)Es;oC47{ta6H8Gnz~C-eT7jfa2Pr^4T( z_2IvtIHUh#pAG-IWb7Q>gmEPyG~HPwEFB^;4+&!AJcRTAys^A0PEo zsQST2{S;bH>IWZn0;wB(ruD3T@KHa7+y~1~{S;bH>Sz7~`u?9!K929N9Qgha{@#es zKUQ3?`;S}uv@SO5pLLUV5I^guX+86^Zqg3oWBoL(XMR36r5(gKqP^R+p83a=zw$d3 zV)^}v<9%A6_V+8if80=ie?lz3KcSj2+5gAmcr$;@yT2!H?fEh9ruAvRKd$!A`nhgt ztUtZ)je988p`N~UX#Tbh-hc4^nC}UKdp;na-oKjGr+k0Vkbh*J)}NOv?;`gV3t3bRAsJbKI-@v@YiUZ#4W>UpxH%d#L{< z+cbaI>b^rj`nF?Z1!LLmo)rUUvo+B=X;hoPr3h8|EBdR-@h~z|HxBx{m29P z-o??4eOecr@lQOczrXrlUH9UpOEq6grDGiUm5X3;-Ao-VG@5m z-t2!=Ye%Vbv3zgdBYj%W>VNdlv|f)YZ({l0tnc?}eaiRO4ds8H#?3e(+6YxVoz-lO~AckBDKD%V$CY>t2Ij>sP*Z*$(!C;6+#n|{V!@+6l0Y5b=3nexXt zIS=EXEx&0!8~+o{|HR+v`dy*A5!c?V_4mK}v@SNsKcT&Uv-U2y<*VU0t&2_n=-1RA z;}_R2*7#L_rggFHSKV-(jfz}%W2zg|dUpNcD|r^lJATvpO!;5?y_mo9y@#4V)4JG> zU)SAMt(#nj+ddlOH?50J|DxYg{obW@L!^Ee>m7<|U2OX2E?2y|P9WD!`ToU9>)G{F z)))0Z?fO&otpACJ;`)JHH;Z)Pn_NHjcr$+LmURZQ{!qWB^=$nq*SF%F_WG}S7Ju14 z)Nb1Sqw1Nz{5^)QAGk%=Px<|@O0J)JJRN_@lg3Zp7{6&fTYtzKbq=X}{HFD+{>$%= z-L3go-`n1&^IX&C)~btX{GKPzn`u3rKjm%n>6*Xq)cjRi7n}W;_;0WAf1<`;xwYzI z(_gMX?Gw{pe^t-!AE>(ncSijk)EdD4V_FxR{SV%Mmf!7pME9?6k9Fj++<&s}@H;uM z{BDl?ru8YmpEI<7v;WW!Ed6TzGp&ow`0*Xu9{$6p6!(wn?+1z2#njL51aY47yFu#T zv_9qc|KbFCKqa%$sRlY>!{Q zk|(j`?~y*Or}>kw&~>E<$vzk%AfKN$@{!L zeOk}*&%VWV2D$FIe>SaW*B|>6qdR9O9$~Z;Fjo-9B)A*TZ&QpFjN`BLNHvikM+; zk$=;AcKzWic@oJRe$#rIKlw_YMDm8;w4UZqzB11u^N!!Np3c8~CC{Sk&a|H8f4;^{ zo*{W(a9^L+v;3FqPjOFs{Z;+I@PEHCw0@TTQ|+MlO;f(2Xa4ecTQAi7e@l7O`yc-P z%G_9WvAO=1`{&<@`{(2LYyG)GFN zU()HI{WBv;@|M;2zLhH%=&;LTqKV;q)9O{$#ug9D7 zcb3M_JVEB|EREl^p3NUV<_R)y_)Y8C{NW@2g~~gA@?U5@$^Y1&>iPHIwahr6T0sZS6r?8-JxuG-t>p802=r~UdOt=o`&^!@=_ zzo^|m`^MJK$NImG_5S^;ze?-kVEk7NetxGrhw}T2kl$TA`@udBycV?_Z~D1^U$b80 z7S|q>|F%A@i%mbz?OX4R=Xd_zXF{=?*2SiO?4_Dt-t&oDzN-2DexKIGroX#R@qSN( z6nXDFHrA*0Des?$^2d7%-m^i!cQdU|dH;5XpZi4oes5@6pK|{?>$~ zGp&ow@zXEQ8SuDjXX^8RJ>K-wFLCmZxar@tp2g4S#>akH{fozS?eh7tXtgEPsXYt-t}QWs)4JI7^Za&9^#}djW?C1U{;AKuyuY9hVdMFCsQy_$ zcuxTR-oUgz<^91Ke%=${_j?1=`jqzvL;kZKiTa1s{lq`^N&VO3&GGa6N1a3Jp66%N zdRG7VsB=i&<2S8m^^cD_htxfO(|T6_6Se*!b-%FIKcxQa@%H%Tqt0nZ-QzQ@XZ26q z)H(Ef2h)01|M;kLNZm7j(|T6_^IsqJ5B=W2r2gyi=JtfTt=vA@*!4+?a_s1stUp?ORbKgQch>!PwruA(996vw&5Z{EJ0Zjb$c(ebp8^aIr z&G}%T`0MeepU7V#3-9MdH+~St+sQ$Tss!BkwIom&W@`$ouDdd@z6U{-*jDosM=8|6~69x9We~?@z0L$+p=4ApP_A zYbN_&JznA;S9wf~bc+Ank#2D}=P9%F=OS~?)2h>rKW%LC>if>Q>*1^KS1F8bIV_ET z<9tWPh@P$XUf<1o>YQJB5?X2alhgDQd0a}#&vS`gOBlfZNTsQa^I($*2TekJEMQDEB^U8!?f<} zt>#t!Y3KXe%WwO@*XKV!=J>4ZHI6ID<()U)IGoGJ>|asl_0Bu=QO4k0JZAs0ll1?R zTV6KopDgi@m3p1muh-2Fk^}uKHG0;~`riJ-CH~uP$o$cIlXmUX!>#LVtG9(*9p&2< z=G~=l)4yN4vv_iu?k3cWXe=1@0S}{Wi~s-t literal 38912 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 AQ2+n{ From f5ddefc056dfdee6c2484b87ddbb18b712370e94 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 22:12:25 -0800 Subject: [PATCH 17/19] pins --- tech/sky130/gds/sramgen_sp_sense_amp.gds | Bin 37400 -> 37592 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tech/sky130/gds/sramgen_sp_sense_amp.gds b/tech/sky130/gds/sramgen_sp_sense_amp.gds index c4b8c0473ad3bb1e644d417ea6dd91919cafd826..f770c5656a6487c25b010e3d21d2e160e54d8a04 100644 GIT binary patch delta 179 zcmbQSgz3goCM5s_7@D?46F=d3_J`X$n1$qn*3-&8>8+|nEZ2s1dlrd zL)>Qu4oSAMl$6P`6TeQrG*LGaD5$y;ELdF3z`!C1#2gF^Y`jbi4h(F3Obj{_9VE7y#a|9)kb? delta 75 zcmcbylxfBiCM5s_7@D?46F=d3|tJR$n1$qn*3-&8>8+|m|QvWCL22g I0}BfS0PvO#i~s-t From 2e038403e7762df0e45569d9cf739a2158b4a279 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 5 Nov 2024 22:39:57 -0800 Subject: [PATCH 18/19] add tapped sense amp --- tech/sky130/gds/sramgen_sp_sense_amp.gds | Bin 37592 -> 37144 bytes .../gds/sramgen_sp_sense_amp_tapped.gds | Bin 0 -> 52896 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tech/sky130/gds/sramgen_sp_sense_amp_tapped.gds diff --git a/tech/sky130/gds/sramgen_sp_sense_amp.gds b/tech/sky130/gds/sramgen_sp_sense_amp.gds index f770c5656a6487c25b010e3d21d2e160e54d8a04..cc7de41b8b0423590e7bf7ef990d86da55b41cd7 100644 GIT binary patch delta 75 zcmcbylxfByCM5s_7@D?46F=d3?dBN$n1$qn*3-&8>8k=m|Qtgl8v2# IfrW(u0M}Ry3IG5A delta 475 zcmbQSi0Q^sCM5s_7@D?46F=d3_J`X$n1$qn*3-&8>8k=P+^l|WME+6 zk!E!~0Hi^HM}V1ufis<81VB=+C zaA08LV`30s&;c38QN_RzzX3ugDl#x|0gZ>zFmWKwBFMnN0@YuIqMw(6K{*7dA4seG z2kJkKpkd-b8l=CTg$M2cF(w9U1~zd<1`Y-s{^Sw{8l(eueqIvLa*zW^(hu~$>PoQw s;$pCV54aB?A)o^Z0rr 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%0A`Jwbn^0k2?>0f(o`lWiX^sio%e(DJMOZ8ys zzvM~jzvR>D@2UQz+JDjg>A(0b>6hxkGXAR9rGM2wrN5{8>uUeXuc!aQjp>)_!7{#o zr+($h>6hvU{rmM3`*-RT*DwF>y;QI27e49~q;7Hjlj>Fd!bkmT+?Iao7wzSFMQOg*3QxCr+(3ndR4#hQKukv z3!hZ4>K8uhRBPvj>8F0tj(SzU@U@>ehM!Ac&!=U(@%iBT#ZR4r)Ggvl^{Rg1qfWJU zqJH70enIuBe&M4|LFyJhsb1ADeAKDd&hyew{h}T9s(#_4el>nNebg`fy8F0tPOlgB3m=&-fj6w6Feo}3*_g6>zBCfzZ+xUO?>v>jq1hz8z1{@$i5q& zRIm2mytiPzHOBs%_ZIBG8`X>bH*wiNH^#o1`0Sq>)r1=e?>g!d3^YT55(LZ@u@M@gQb7X(dl1%Z2F~o zaM&Mt-yHX=`pcrgoQ(*=<9yxn zhtcmK>wod$G1Y^E@fUtE`v1Q02X|c?=g*JER1XgNm&CZyPe{L)cKwIyRsWZ+i|1`e zhA+77XXE|#jxp7PgYg$%oZ|->zoWK{$@q1j5BlkM8>e8aAJKoQKHK=wPuijXjGt7m z`hU3NzxES{xsY{aGH@UCtB8c{6q5nCjK}!@8x;K5*V|E2nDgF; z6TIQc(N3%%sU95c|6$J`Ob|f#R(Fh`YqMV_~B!n&<^Vdzf`Z*4?flj zWZmGG>ec$e*ZLW3{SUuXpRNDQGwm?{#Fy&T{4?&HXOQ!b@t5k=`G>EKQ?QL&_@#O| ze&K856l~)beyLuLU-;TQ2iv@dU#ge$AHFuu!AG--_pZwe`&w1dMe;4z=cue)``49W%mEY?2& !#52Tg z9o2(_@p*2;a|+15i|02|y?TDJ^y-WciQDdfI}*S9d@%l!xbNaQHze-T(U|JNLI33V zwS8xdpFEWDJKX*s?(;XE8!^t0_W9AHetzfopKplg#j#(U17i=u?*Z+pKK<|K1f2m&0A3o-2C~w_xa%YzxcnVzcKtr zy*d4j;qN{l^e_0m^f!io;ezxxhQIrK(9gQvu|C)D&Y#ZpE7gO;{wL@Bt$;CqEAF3Q z%wN-s`J;bpPRV|*`CRtDr}`-SfpZU?u&FZgF;ss{)A z&voN^>OTBZ*8iUBFB|r=Z`pfB?qB%1Gxje%)z29Avp>P#7=HFI_#4%y`%j;Ie;wP^ z(dr-bzp?L+KJatAQaw1?{{#Gcqwes}1F?6(FV%yOsoy-!TdG(2^WNR}?1%XNeOmwV z`<~tR?oxfm`}b*n#*1-s+)jwK%lJX{YW(ogPe{MNDP7P4mxu|H$)~$@eea=Y#q4Ir9XW zH~dn4w)u0Nx$dNTwf>09a|*cXqywKHcApRCf4J+9@13mtLBtQPdVbX3?~kb-9E^{T z`*gVax6&`wXWYL}pTF>}{bc&rFG{~u4-UuwTI_S(jqK za=|avgTwyt@SK7E^Sw#NPpZ#&ese(oH@qqR8?Q^hR1XfupM3ta>Y4fcNAmoo`+U$p z^ZD7#=a=2*gMR7;&l#c59i{q==a19-A3mNl;`h0uRG;zuahiYW;yiyL=k4-G#^n6% zJ|E1V=SQq_$ol8`n^X^$e%3jD);)fyUafz8taHe^$1l}`!|}WIzr0)jaT#jsAF}?@ ztM$+4taHe^$0yaR^-tbDXJg%yzf`Z*KYrFZWZmPJ>ec$6eE!I~=lP>#{U7A{p?|BuG?x8n_+ z9vqCn?CEj+pBwxC;0=$9dH9_%)n~jvpEiC|@&0@72{CU$u6w+HlIp?1`0QIa4&s|S zaZL5fzwBA*hxnJrnwR*y&j;f#esB6AzN79P6My&lpr7Zz90&0)eB+qv!9oA>zl-sH zDDn>8_>*q`)KPuL_XnnpKl!mwglmt>{H1!ee`I_(4&r0{qKel+(VT&HNq z`v$3A?LVVjwD^$tv?Ixjf2#c_pVLqNq2G=JRG-oRe13H7sQv!pNB#b!^FQkMC!POM zzdz~xQ@j74zyF-;r}HyzjB?EbUF?ddzw8#HWrv z)^ecLLp^S0^o2RD`FlmX_lo>I-wR?*!fU@CgY?`n)q|7Qr33soUzYv{?@PZ_4^I03 zcYCfl%DNiP_FfpWA7p(=-WT(a@8!Fhj=DU#E*?McCCC0vJ1*DA{3F|wnOGxlJ0~vk ole0dHbHVMgN4|me^1Hu(UUx5jXfcmFb;5a0#*BweM; Date: Tue, 5 Nov 2024 22:44:51 -0800 Subject: [PATCH 19/19] add missing pins --- .../gds/sramgen_sp_sense_amp_tapped.gds | Bin 52896 -> 53000 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tech/sky130/gds/sramgen_sp_sense_amp_tapped.gds b/tech/sky130/gds/sramgen_sp_sense_amp_tapped.gds index 5a8bb1443553478777351887725cf439459f41b7..5bfef3e7f6e5005c58af9a81bcfa401a337a1349 100644 GIT binary patch delta 185 zcmZ25m$_pevnB%@0~1pOgA5}R`wIqc237_!1|0@%WHti_6Pu5x(?mx}31nep_Qs;3 z)0*Op3>*w>Qj81?3_Q}Tjt77=2=E9nGcfR#GB6x;W#EuxOU}uj9C$`-a{n3b&F@b0 cG2zuFwuymZp&m$EW?tT8`E$CHh0gT>0G?zZPyhe` delta 112 zcmeB}$Gl)Jvnm4{0~1pOgA5}R11_MzG%;3AUxb;}&au