From 4fb55f9938b32fb79bbaca74a83c26a05f331280 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 24 Sep 2026 20:24:06 -0700 Subject: [PATCH 1/2] chore(deps): implement dependabot suggestions --- codegen/Cargo.toml | 8 ++-- codegen/src/derive_interface.rs | 7 ++- codegen/src/hard_macro.rs | 10 +++- libs/gds21/Cargo.toml | 12 ++--- libs/gds21/src/lib.rs | 14 ++++++ libs/gds21/src/read.rs | 2 +- libs/subgeom/Cargo.toml | 2 +- libs/sublut/Cargo.toml | 4 +- plugins/ngspice/Cargo.toml | 2 +- plugins/ngspice/src/templates.rs | 11 ++--- plugins/spectre/Cargo.toml | 4 +- plugins/spectre/src/lib.rs | 14 +++--- plugins/spectre/src/templates.rs | 11 ++--- plugins/spice_rawfile/Cargo.toml | 4 +- plugins/spice_rawfile/src/parser/mod.rs | 61 +++++++++++++----------- plugins/subspice/Cargo.toml | 4 +- plugins/subspice/src/parser/mod.rs | 31 ++++++------ substrate/Cargo.toml | 14 +++--- substrate/src/layout/cell.rs | 4 +- substrate/src/layout/placement/grid.rs | 6 +-- substrate/src/layout/routing/auto/abs.rs | 2 +- substrate/src/layout/routing/auto/mod.rs | 2 +- 22 files changed, 128 insertions(+), 101 deletions(-) diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml index f2442ff..6a17361 100644 --- a/codegen/Cargo.toml +++ b/codegen/Cargo.toml @@ -6,13 +6,13 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -darling = "0.14.4" -syn = "1.0.91" +darling = "0.24.1" +syn = "3.0.6" quote = "1.0.26" paste = "1.0.12" proc-macro2 = "1.0.37" -proc-macro-crate = "1.3.1" -itertools = "0.10.5" +proc-macro-crate = "3.5.0" +itertools = "0.15.0" [lib] proc-macro = true diff --git a/codegen/src/derive_interface.rs b/codegen/src/derive_interface.rs index 339aba0..72e9995 100644 --- a/codegen/src/derive_interface.rs +++ b/codegen/src/derive_interface.rs @@ -24,8 +24,11 @@ pub(crate) fn derive_interface_inner(item: TokenStream) -> TokenStream { .named .into_iter() .map(|field| { - let is_input = field.attrs.iter().any(|attr| attr.path.is_ident("input")); - let is_output = field.attrs.iter().any(|attr| attr.path.is_ident("output")); + let is_input = field.attrs.iter().any(|attr| attr.path().is_ident("input")); + let is_output = field + .attrs + .iter() + .any(|attr| attr.path().is_ident("output")); if is_input ^ is_output { Ok((field, is_input)) } else { diff --git a/codegen/src/hard_macro.rs b/codegen/src/hard_macro.rs index 93949f2..b46db45 100644 --- a/codegen/src/hard_macro.rs +++ b/codegen/src/hard_macro.rs @@ -1,10 +1,11 @@ +use darling::ast::NestedMeta; use darling::FromMeta; use proc_macro::TokenStream; use proc_macro2::Span; use proc_macro_crate::{crate_name, FoundCrate}; use quote::quote; use syn::spanned::Spanned; -use syn::{parse_macro_input, AttributeArgs, Error, Fields, Ident, ItemStruct}; +use syn::{parse_macro_input, Error, Fields, Ident, ItemStruct}; #[derive(Debug, FromMeta)] struct HardMacroArgs { @@ -17,7 +18,12 @@ struct HardMacroArgs { } pub(crate) fn hard_macro_inner(args: TokenStream, input: TokenStream) -> TokenStream { - let attr_args = parse_macro_input!(args as AttributeArgs); + let attr_args = match NestedMeta::parse_meta_list(args.into()) { + Ok(v) => v, + Err(e) => { + return TokenStream::from(darling::Error::from(e).write_errors()); + } + }; let input = parse_macro_input!(input as ItemStruct); let args = match HardMacroArgs::from_list(&attr_args) { diff --git a/libs/gds21/Cargo.toml b/libs/gds21/Cargo.toml index 1769f12..5f2dcf2 100644 --- a/libs/gds21/Cargo.toml +++ b/libs/gds21/Cargo.toml @@ -13,18 +13,18 @@ exclude = ["resources",] [dependencies] byteorder = "1.4.3" chrono = { version = "0.4.24", features = ["serde"] } -derive_builder = "0.9.0" -derive_more = "0.99.17" -num-derive = "0.4" +derive_builder = "0.20.2" +derive_more = { version = "2.1.1", features = ["add", "add_assign", "from"] } +num-derive = "0.5" num-traits = "0.2.15" serde = { version = "1.0.159", features = ["derive"] } serde_derive = "1.0.159" serde_json = "1.0" -serde_yaml = "0.8" -toml = "0.7.3" +serde_yaml = "0.9" +toml = "1.1.6" tempfile = { version = "3", optional = true } arcstr = { version = "1.1.5", features = ["serde"] } -textwrap = "0.14.2" +textwrap = "0.16.4" [dev-dependencies] tempfile = {version = "3"} diff --git a/libs/gds21/src/lib.rs b/libs/gds21/src/lib.rs index 25935a0..862418e 100644 --- a/libs/gds21/src/lib.rs +++ b/libs/gds21/src/lib.rs @@ -510,6 +510,7 @@ pub struct GdsProperty { /// ``` /// #[derive(Default, Clone, Builder, Debug, Deserialize, Serialize, PartialEq)] +#[builder(build_fn(error = "GdsError"))] #[builder(pattern = "owned", setter(into), private)] pub struct GdsPath { // Required Fields @@ -559,6 +560,7 @@ pub struct GdsPath { /// ``` /// #[derive(Default, Clone, Builder, Debug, Deserialize, Serialize, PartialEq)] +#[builder(build_fn(error = "GdsError"))] #[builder(pattern = "owned", setter(into), private)] pub struct GdsBoundary { // Required Fields @@ -594,6 +596,7 @@ pub struct GdsBoundary { /// ``` /// #[derive(Default, Clone, Builder, Debug, Deserialize, Serialize, PartialEq)] +#[builder(build_fn(error = "GdsError"))] #[builder(pattern = "owned", setter(into), private)] pub struct GdsStructRef { // Required Fields @@ -628,6 +631,7 @@ pub struct GdsStructRef { /// ``` /// #[derive(Default, Clone, Builder, Debug, Deserialize, Serialize, PartialEq)] +#[builder(build_fn(error = "GdsError"))] #[builder(pattern = "owned", setter(into), private)] pub struct GdsArrayRef { // Required Fields @@ -663,6 +667,7 @@ pub struct GdsArrayRef { /// TEXTTYPE [PRESENTATION] [PATHTYPE] [WIDTH] [] XY STRING /// ``` #[derive(Default, Clone, Builder, Debug, Deserialize, Serialize, PartialEq)] +#[builder(build_fn(error = "GdsError"))] #[builder(pattern = "owned", setter(into), private)] pub struct GdsTextElem { // Required Fields @@ -708,6 +713,7 @@ pub struct GdsTextElem { /// ``` /// #[derive(Default, Clone, Builder, Debug, Deserialize, Serialize, PartialEq)] +#[builder(build_fn(error = "GdsError"))] #[builder(pattern = "owned", setter(into), private)] pub struct GdsNode { // Required Fields @@ -738,6 +744,7 @@ pub struct GdsNode { /// ``` /// #[derive(Default, Clone, Builder, Debug, Deserialize, Serialize, PartialEq)] +#[builder(build_fn(error = "GdsError"))] #[builder(pattern = "owned", setter(into), private)] pub struct GdsBox { // Required Fields @@ -837,6 +844,7 @@ impl Default for GdsDateTimes { /// ``` /// #[derive(Default, Clone, Builder, Debug, Deserialize, Serialize, PartialEq)] +#[builder(build_fn(error = "GdsError"))] #[builder(pattern = "owned", setter(into), private)] pub struct GdsStruct { /// Struct Name @@ -892,6 +900,7 @@ impl GdsStruct { /// ``` /// #[derive(Default, Clone, Builder, Debug, Deserialize, Serialize, PartialEq)] +#[builder(build_fn(error = "GdsError"))] #[builder(pattern = "owned", setter(into), private)] pub struct GdsLibrary { // Required fields @@ -1102,6 +1111,11 @@ impl From for GdsError { GdsError::Str(e) } } +impl From for GdsError { + fn from(e: derive_builder::UninitializedFieldError) -> Self { + GdsError::Str(e.to_string()) + } +} impl From<&str> for GdsError { fn from(e: &str) -> Self { GdsError::Str(e.to_string()) diff --git a/libs/gds21/src/read.rs b/libs/gds21/src/read.rs index ef18718..453364d 100644 --- a/libs/gds21/src/read.rs +++ b/libs/gds21/src/read.rs @@ -479,7 +479,7 @@ impl GdsParser { } // Add the Vec of structs, and create the Library from its builder lib = lib.structs(structs); - Ok(lib.build()?) + lib.build() } /// Parse a cell ([GdsStruct]) fn parse_struct(&mut self, dates: Vec) -> GdsResult { diff --git a/libs/subgeom/Cargo.toml b/libs/subgeom/Cargo.toml index 5e9b7ca..d729c8c 100644 --- a/libs/subgeom/Cargo.toml +++ b/libs/subgeom/Cargo.toml @@ -9,5 +9,5 @@ edition = "2021" serde = { version = "1", features = ["derive", "rc"] } enum_dispatch = "0.3.11" array_map = { version = "0.4", features = ["derive", "serde", "std"] } -thiserror = "1.0.40" +thiserror = "2.0.20" gds21 = { path = "../../libs/gds21" } diff --git a/libs/sublut/Cargo.toml b/libs/sublut/Cargo.toml index 872fa13..a30e968 100644 --- a/libs/sublut/Cargo.toml +++ b/libs/sublut/Cargo.toml @@ -6,9 +6,9 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -derive_builder = { version = "0.12.0", features = ["clippy"] } +derive_builder = { version = "0.20.2", features = ["clippy"] } serde = { version = "1", features = ["derive", "rc"] } -splines = "4.2.0" +splines = "5.0.0" [dev-dependencies] float_eq = "1" diff --git a/plugins/ngspice/Cargo.toml b/plugins/ngspice/Cargo.toml index 9580df0..d6b4e2e 100644 --- a/plugins/ngspice/Cargo.toml +++ b/plugins/ngspice/Cargo.toml @@ -9,6 +9,6 @@ description = "Substrate plugin for Ngspice" lazy_static = "1.4.0" serde = { version = "1.0.159", features = ["derive"] } substrate = { path = "../../substrate" } -tera = "1.18.1" +tera = { version = "2.4.0", features = ["glob_fs"] } spice_rawfile = { path = "../spice_rawfile" } anyhow = "1.0.70" diff --git a/plugins/ngspice/src/templates.rs b/plugins/ngspice/src/templates.rs index a75ab23..2a8f0f5 100644 --- a/plugins/ngspice/src/templates.rs +++ b/plugins/ngspice/src/templates.rs @@ -10,12 +10,11 @@ pub(crate) const TEMPLATES_PATH: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/te lazy_static! { pub(crate) static ref TEMPLATES: Tera = { - match Tera::new(&format!("{TEMPLATES_PATH}/*")) { - Ok(t) => t, - Err(e) => { - panic!("Encountered errors while parsing Tera templates: {e}"); - } + let mut tera = Tera::new(); + if let Err(e) = tera.load_from_glob(&format!("{TEMPLATES_PATH}/*")) { + panic!("Encountered errors while parsing Tera templates: {e}"); } + tera }; } @@ -29,7 +28,7 @@ pub(crate) struct NetlistCtx<'a> { pub(crate) fn render_netlist(ctx: NetlistCtx<'_>, work_dir: impl AsRef) -> Result { let path = work_dir.as_ref().join("netlist.spice"); - let ctx = Context::from_serialize(ctx) + let ctx = Context::from_serialize(&ctx) .map_err(|e| ErrorSource::Internal(format!("template error: {e}")))?; let mut file = std::fs::File::create(&path)?; diff --git a/plugins/spectre/Cargo.toml b/plugins/spectre/Cargo.toml index 59e98a5..96d7523 100644 --- a/plugins/spectre/Cargo.toml +++ b/plugins/spectre/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" lazy_static = "1.4.0" serde = { version = "1.0.159", features = ["derive"] } substrate = { path = "../../substrate" } -tera = "1.18.1" +tera = { version = "2.4.0", features = ["glob_fs"] } spice_rawfile = { path = "../spice_rawfile" } anyhow = "1.0.70" psfparser = { git = "https://github.com/ucb-substrate/substrate2", branch = "main" } @@ -17,4 +17,4 @@ log = "0.4" [dev-dependencies] approx = "0.5.1" -statrs = "0.16.0" +statrs = "0.19.1" diff --git a/plugins/spectre/src/lib.rs b/plugins/spectre/src/lib.rs index 2b812ac..d674207 100644 --- a/plugins/spectre/src/lib.rs +++ b/plugins/spectre/src/lib.rs @@ -22,11 +22,13 @@ pub const TOP_NETLIST_NAME: &str = "sim.top.spice"; pub const BASE_ANALYSIS_PREFIX: &str = "analysis"; lazy_static! { - pub static ref TEMPLATES: Tera = - match Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/*")) { - Ok(t) => t, - Err(e) => panic!("Error parsing templates: {e}"), - }; + pub static ref TEMPLATES: Tera = { + let mut tera = Tera::new(); + if let Err(e) = tera.load_from_glob(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/*")) { + panic!("Error parsing templates: {e}"); + } + tera + }; } fn tran_conv(data: TransientData) -> TranData { @@ -354,7 +356,7 @@ fn write_run_script(paths: &Paths, input: &SimInput) -> Result<()> { format: output_format_name(input, &input.output_format), flags: &flags(input), }; - let ctx = Context::from_serialize(ctx)?; + let ctx = Context::from_serialize(&ctx)?; let mut f = File::create(&paths.run_script_path)?; TEMPLATES.render_to("run_sim.sh", &ctx, &mut f)?; diff --git a/plugins/spectre/src/templates.rs b/plugins/spectre/src/templates.rs index 9ec260d..5264e3d 100644 --- a/plugins/spectre/src/templates.rs +++ b/plugins/spectre/src/templates.rs @@ -12,12 +12,11 @@ pub(crate) const TEMPLATES_PATH: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/te lazy_static! { pub(crate) static ref TEMPLATES: Tera = { - match Tera::new(&format!("{TEMPLATES_PATH}/*")) { - Ok(t) => t, - Err(e) => { - panic!("Encountered errors while parsing Tera templates: {e}"); - } + let mut tera = Tera::new(); + if let Err(e) = tera.load_from_glob(&format!("{TEMPLATES_PATH}/*")) { + panic!("Encountered errors while parsing Tera templates: {e}"); } + tera }; } @@ -31,7 +30,7 @@ pub(crate) struct NetlistCtx<'a> { } pub(crate) fn render_netlist(ctx: NetlistCtx<'_>, path: impl AsRef) -> Result<()> { - let ctx = Context::from_serialize(ctx) + let ctx = Context::from_serialize(&ctx) .map_err(|e| ErrorSource::Internal(format!("template error: {e}")))?; let mut file = std::fs::File::create(&path)?; diff --git a/plugins/spice_rawfile/Cargo.toml b/plugins/spice_rawfile/Cargo.toml index 3229251..db2cf81 100644 --- a/plugins/spice_rawfile/Cargo.toml +++ b/plugins/spice_rawfile/Cargo.toml @@ -6,6 +6,6 @@ license = "MIT" description = "Parse SPICE rawfiles" [dependencies] -nom = "7.1.3" +nom = "8.0.0" serde = { version = "1.0.159", features = ["derive"] } -thiserror = "1.0.40" +thiserror = "2.0.20" diff --git a/plugins/spice_rawfile/src/parser/mod.rs b/plugins/spice_rawfile/src/parser/mod.rs index 66042a9..ffbab4e 100644 --- a/plugins/spice_rawfile/src/parser/mod.rs +++ b/plugins/spice_rawfile/src/parser/mod.rs @@ -7,8 +7,8 @@ use nom::combinator::opt; use nom::error::{Error, ErrorKind}; use nom::multi::many0; use nom::number::complete::le_f64; -use nom::sequence::{delimited, pair, tuple}; -use nom::{Err, IResult}; +use nom::sequence::{delimited, pair}; +use nom::{Err, IResult, Parser}; use serde::{Deserialize, Serialize}; #[cfg(test)] @@ -85,7 +85,7 @@ fn is_space_or_line(c: u8) -> bool { fn header<'a>(input: &'a [u8], key: &str) -> IResult<&'a [u8], &'a str> { let tag = tag_no_case(key); let header_value = take_till1(is_newline); - let (input, value) = delimited(tag, header_value, line_ending)(input)?; + let (input, value) = delimited(tag, header_value, line_ending).parse(input)?; let value = from_utf8(value)?; Ok((input, value)) } @@ -123,20 +123,21 @@ fn parse_f64(input: &[u8]) -> Result>> { } fn variable(input: &[u8]) -> IResult<&[u8], Variable<'_>> { - let value = take_till1(is_space_or_line); + let value = || take_till1(is_space_or_line); // In AC analysis, may have a `grid=X` declaration - let grid = opt(pair(space1, &value)); - let (input, (_, idx, _, name, _, unit, _, _, _)) = tuple(( + let grid = opt(pair(space1, value())); + let (input, (_, idx, _, name, _, unit, _, _, _)) = ( space0, - &value, + value(), space1, - &value, + value(), space1, - &value, + value(), grid, space0, line_ending, - ))(input)?; + ) + .parse(input)?; let idx = parse_usize(idx)?; let name = from_utf8(name)?; let unit = from_utf8(unit)?; @@ -144,14 +145,14 @@ fn variable(input: &[u8]) -> IResult<&[u8], Variable<'_>> { } fn variables(input: &[u8]) -> IResult<&[u8], Vec>> { - let (input, _) = tuple((tag_no_case("Variables:"), space0, line_ending))(input)?; - let (input, vars) = many0(variable)(input)?; + let (input, _) = (tag_no_case("Variables:"), space0, line_ending).parse(input)?; + let (input, vars) = many0(variable).parse(input)?; Ok((input, vars)) } fn real_data_binary(vars: usize, points: usize) -> impl Fn(&[u8]) -> IResult<&[u8], Data> { move |input| { - let (mut input, _) = tuple((tag_no_case("Binary:"), space0, line_ending))(input)?; + let (mut input, _) = (tag_no_case("Binary:"), space0, line_ending).parse(input)?; let mut out = vec![Vec::with_capacity(points); vars]; for _ in 0..points { for item in out.iter_mut().take(vars) { @@ -167,18 +168,18 @@ fn real_data_binary(vars: usize, points: usize) -> impl Fn(&[u8]) -> IResult<&[u fn real_data_ascii(vars: usize, points: usize) -> impl Fn(&[u8]) -> IResult<&[u8], Data> { move |input| { - let (mut input, _) = tuple((tag_no_case("Values:"), space0, line_ending))(input)?; + let (mut input, _) = (tag_no_case("Values:"), space0, line_ending).parse(input)?; let mut out = vec![Vec::with_capacity(points); vars]; for _ in 0..points { - (input, _) = take_till1(is_space_or_line)(input)?; + (input, _) = take_till1(is_space_or_line).parse(input)?; for item in out.iter_mut().take(vars) { let val; - (input, _) = take_while1(is_space_or_line)(input)?; - (input, val) = take_till1(is_space_or_line)(input)?; + (input, _) = take_while1(is_space_or_line).parse(input)?; + (input, val) = take_till1(is_space_or_line).parse(input)?; item.push(parse_f64(val)?); } - (input, _) = take_while1(is_space_or_line)(input)?; + (input, _) = take_while1(is_space_or_line).parse(input)?; } Ok((input, Data::Real(out))) @@ -189,12 +190,13 @@ fn real_data(input: &[u8], vars: usize, points: usize) -> IResult<&[u8], Data> { alt(( real_data_binary(vars, points), real_data_ascii(vars, points), - ))(input) + )) + .parse(input) } fn complex_data_binary(vars: usize, points: usize) -> impl Fn(&[u8]) -> IResult<&[u8], Data> { move |input| { - let (mut input, _) = tuple((tag_no_case("Binary:"), space0, line_ending))(input)?; + let (mut input, _) = (tag_no_case("Binary:"), space0, line_ending).parse(input)?; let mut out = vec![ComplexSignal::with_capacity(points); vars]; for _ in 0..points { @@ -214,22 +216,22 @@ fn complex_data_binary(vars: usize, points: usize) -> impl Fn(&[u8]) -> IResult< fn complex_data_ascii(vars: usize, points: usize) -> impl Fn(&[u8]) -> IResult<&[u8], Data> { move |input| { - let (mut input, _) = tuple((tag_no_case("Values:"), space0, line_ending))(input)?; + let (mut input, _) = (tag_no_case("Values:"), space0, line_ending).parse(input)?; let mut out = vec![ComplexSignal::with_capacity(points); vars]; for _ in 0..points { - (input, _) = take_till1(is_space_or_line)(input)?; + (input, _) = take_till1(is_space_or_line).parse(input)?; for item in out.iter_mut().take(vars) { - (input, _) = take_while1(is_space_or_line)(input)?; + (input, _) = take_while1(is_space_or_line).parse(input)?; let val; - (input, val) = take_till1(|c| c == b',')(input)?; + (input, val) = take_till1(|c| c == b',').parse(input)?; item.real.push(parse_f64(val)?); - (input, _) = take(1u64)(input)?; + (input, _) = take(1u64).parse(input)?; let val; - (input, val) = take_till1(is_space_or_line)(input)?; + (input, val) = take_till1(is_space_or_line).parse(input)?; item.imag.push(parse_f64(val)?); } - (input, _) = take_while1(is_space_or_line)(input)?; + (input, _) = take_while1(is_space_or_line).parse(input)?; } Ok((input, Data::Complex(out))) @@ -240,7 +242,8 @@ fn complex_data(input: &[u8], vars: usize, points: usize) -> IResult<&[u8], Data alt(( complex_data_binary(vars, points), complex_data_ascii(vars, points), - ))(input) + )) + .parse(input) } fn analysis(input: &[u8]) -> IResult<&[u8], Analysis<'_>> { @@ -276,5 +279,5 @@ fn analysis(input: &[u8]) -> IResult<&[u8], Analysis<'_>> { } pub(crate) fn analyses(input: &[u8]) -> IResult<&[u8], Vec>> { - many0(analysis)(input) + many0(analysis).parse(input) } diff --git a/plugins/subspice/Cargo.toml b/plugins/subspice/Cargo.toml index 2b4c6c9..17da379 100644 --- a/plugins/subspice/Cargo.toml +++ b/plugins/subspice/Cargo.toml @@ -5,6 +5,6 @@ edition = "2021" [dependencies] anyhow = "1.0.70" -nom = "7.1.3" +nom = "8.0.0" serde = { version = "1.0.159", features = ["derive"] } -thiserror = "1.0.40" +thiserror = "2.0.20" diff --git a/plugins/subspice/src/parser/mod.rs b/plugins/subspice/src/parser/mod.rs index 71b4ee2..c807902 100644 --- a/plugins/subspice/src/parser/mod.rs +++ b/plugins/subspice/src/parser/mod.rs @@ -6,8 +6,8 @@ use nom::character::complete::{line_ending, multispace0, space0, space1}; use nom::character::streaming::char; use nom::combinator::opt; use nom::multi::{many0, many1}; -use nom::sequence::{delimited, pair, preceded, tuple}; -use nom::IResult; +use nom::sequence::{delimited, pair, preceded}; +use nom::{IResult, Parser}; use serde::Serialize; #[cfg(test)] @@ -49,66 +49,67 @@ fn within_line_space1(input: &str) -> IResult<&str, ()> { } fn line_continuation1(input: &str) -> IResult<&str, ()> { - let (input, _) = tuple(( + let (input, _) = ( space0, opt(line_comment), line_ending, space0, char('+'), space0, - ))(input)?; + ) + .parse(input)?; Ok((input, ())) } fn many_line_continuation1(input: &str) -> IResult<&str, ()> { - let (input, _) = many1(line_continuation1)(input)?; + let (input, _) = many1(line_continuation1).parse(input)?; Ok((input, ())) } fn spice_space1(input: &str) -> IResult<&str, ()> { - let (input, _) = alt((many_line_continuation1, within_line_space1))(input)?; + let (input, _) = alt((many_line_continuation1, within_line_space1)).parse(input)?; Ok((input, ())) } fn line_comment(input: &str) -> IResult<&str, ()> { - let (input, _) = tuple((space0, char(';'), take_till(is_newline)))(input)?; + let (input, _) = (space0, char(';'), take_till(is_newline)).parse(input)?; Ok((input, ())) } fn ident(input: &str) -> IResult<&str, &str> { - take_till1(is_space_or_line)(input) + take_till1(is_space_or_line).parse(input) } fn subckt_ports(input: &str) -> IResult<&str, Vec<&str>> { - many0(preceded(spice_space1, ident))(input) + many0(preceded(spice_space1, ident)).parse(input) } fn subckt_name(input: &str) -> IResult<&str, &str> { - preceded(spice_space1, ident)(input) + preceded(spice_space1, ident).parse(input) } fn subckt_line(input: &str) -> IResult<&str, SpiceLine<'_>> { let (input, (_, name, ports)) = - tuple((tag_no_case(".subckt"), subckt_name, subckt_ports))(input)?; + (tag_no_case(".subckt"), subckt_name, subckt_ports).parse(input)?; Ok((input, SpiceLine::Subckt(SubcktLine { name, ports }))) } fn comment_line(input: &str) -> IResult<&str, SpiceLine<'_>> { let (input, (_, _, comment, _)) = - tuple((space0, tag_no_case("*"), take_till(is_newline), line_ending))(input)?; + (space0, tag_no_case("*"), take_till(is_newline), line_ending).parse(input)?; Ok((input, SpiceLine::Comment(comment.trim()))) } fn other_line(input: &str) -> IResult<&str, SpiceLine<'_>> { - let (input, _) = pair(ident, many0(preceded(ident, spice_space1)))(input)?; + let (input, _) = pair(ident, many0(preceded(ident, spice_space1))).parse(input)?; Ok((input, SpiceLine::Other)) } fn spice_line(input: &str) -> IResult<&str, SpiceLine<'_>> { - alt((subckt_line, comment_line, other_line))(input) + alt((subckt_line, comment_line, other_line)).parse(input) } pub(crate) fn parse_spice(input: &str) -> IResult<&str, Vec>> { - many0(delimited(multispace0, spice_line, multispace0))(input) + many0(delimited(multispace0, spice_line, multispace0)).parse(input) } diff --git a/substrate/Cargo.toml b/substrate/Cargo.toml index 40aa0f1..bb5cdf8 100644 --- a/substrate/Cargo.toml +++ b/substrate/Cargo.toml @@ -5,15 +5,15 @@ edition = "2021" authors = ["Rahul Kumar ", "Rohan Kumar "] [dependencies] -derive_builder = { version = "0.12.0", features = ["clippy"] } +derive_builder = { version = "0.20.2", features = ["clippy"] } serde = { version = "1", features = ["derive", "rc"] } slotmap = { version = "1.0.6", features = ["serde"] } tempfile = "3.10" -thiserror = "1.0.40" +thiserror = "2.0.20" enum_dispatch = "0.3.11" arcstr = { version = "1.1.5", features = ["serde"] } derivative = "2.2.0" -flexbuffers = "2" +flexbuffers = "25" gds21 = { path = "../libs/gds21" } subspice = { path = "../plugins/subspice" } subgeom = { path = "../libs/subgeom" } @@ -21,13 +21,13 @@ sublut = { path = "../libs/sublut" } codegen = { path = "../codegen" } log = "0.4" array_map = { version = "0.4", features = ["derive", "serde", "std"] } -toml = "0.7" +toml = "1.1" lazy_static = "1.4" regex = "1.7" -grid = "0.9.0" -state = "0.5.3" +grid = "1.0.1" +state = "0.6.0" pathfinding = "4.2.1" -itertools = "0.10.5" +itertools = "0.15.0" serde_json = "1.0.95" anyhow = "1.0.70" bitvec = { version = "1", features = ["serde"] } diff --git a/substrate/src/layout/cell.rs b/substrate/src/layout/cell.rs index 7b5dfa8..f72dffc 100644 --- a/substrate/src/layout/cell.rs +++ b/substrate/src/layout/cell.rs @@ -9,7 +9,7 @@ use std::sync::Arc; use derive_builder::Builder; use serde::{Deserialize, Serialize}; use slotmap::new_key_type; -use state::Container; +use state::TypeMap; use subgeom::bbox::{Bbox, BoundBox}; use subgeom::orientation::Orientation; use subgeom::transform::{Transform, Transformation, Translate}; @@ -55,7 +55,7 @@ pub struct Cell { cache: Option, /// User-defined metadata. - metadata: Container![Send + Sync], + metadata: TypeMap![Send + Sync], } #[derive(Debug, Default, Clone, Eq, PartialEq)] diff --git a/substrate/src/layout/placement/grid.rs b/substrate/src/layout/placement/grid.rs index 64a4f0d..69e35b8 100644 --- a/substrate/src/layout/placement/grid.rs +++ b/substrate/src/layout/placement/grid.rs @@ -114,7 +114,7 @@ impl<'a> GridTiler<'a> { for i in 0..rows { for j in 0..cols { - if let Some(tile) = self.tiles[i][j].as_ref() { + if let Some(tile) = self.tiles[(i, j)].as_ref() { let pos = self.pos_ll(j, rows - i - 1); let pt = pos - tile.bbox().p0; let mut tgroup = tile.draw_ref()?; @@ -148,7 +148,7 @@ impl<'a> GridTiler<'a> { for i in 0..rows { for j in 0..cols { - if let Some(tile) = self.tiles[i][j].as_ref() { + if let Some(tile) = self.tiles[(i, j)].as_ref() { let pos = self.pos_ll(j, rows - i - 1); let pt = pos - tile.bbox().p0; let mut tgroup = tile.draw_ref()?; @@ -168,7 +168,7 @@ impl<'a> GridTiler<'a> { /// This function panics if `i` or `j` are out of bounds, /// or if no [`Tile`] was specified at the given position. pub fn tile(&self, i: usize, j: usize) -> &Tile<'_> { - self.tiles[i][j].as_ref().unwrap() + self.tiles[(i, j)].as_ref().unwrap() } /// Gets the [`Rect`] representing the cell in row `i`, column `j`. diff --git a/substrate/src/layout/routing/auto/abs.rs b/substrate/src/layout/routing/auto/abs.rs index 88d19f9..24f4166 100644 --- a/substrate/src/layout/routing/auto/abs.rs +++ b/substrate/src/layout/routing/auto/abs.rs @@ -631,7 +631,7 @@ impl GreedyAbstractRouter { for (empty, run) in &info .iter_track(tid) .enumerate() - .group_by(|(_, s)| s.is_empty()) + .chunk_by(|(_, s)| s.is_empty()) { if !empty { continue; diff --git a/substrate/src/layout/routing/auto/mod.rs b/substrate/src/layout/routing/auto/mod.rs index de98893..bfc80c4 100644 --- a/substrate/src/layout/routing/auto/mod.rs +++ b/substrate/src/layout/routing/auto/mod.rs @@ -210,7 +210,7 @@ impl GreedyRouter { } let runs: Vec<(abs::Layer, AbstractRoute)> = subroute .into_iter() - .group_by(|n| n.layer) + .chunk_by(|n| n.layer) .into_iter() .map(|(layer, group)| (layer, group.into_iter().collect::())) .collect(); From bf925e4ca1c203f7711fc8031ad3cf5c01984ae2 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Fri, 25 Sep 2026 10:47:07 -0700 Subject: [PATCH 2/2] simplify Cargo.toml --- Cargo.toml | 61 +++++++++++++++++++++ codegen/Cargo.toml | 14 ++--- examples/tut01_getting_started/Cargo.toml | 6 +-- libs/gds21/Cargo.toml | 30 +++++------ libs/subgates/Cargo.toml | 8 +-- libs/subgeom/Cargo.toml | 10 ++-- libs/sublut/Cargo.toml | 10 ++-- pdks/empty_pdk/Cargo.toml | 4 +- pdks/sky130_commercial_pdk/Cargo.toml | 6 +-- pdks/sky130_common_pdk/Cargo.toml | 6 +-- pdks/sky130_open_pdk/Cargo.toml | 6 +-- plugins/ngspice/Cargo.toml | 12 ++--- plugins/spectre/Cargo.toml | 20 +++---- plugins/spice_rawfile/Cargo.toml | 6 +-- plugins/subspice/Cargo.toml | 8 +-- scripts/mergegds/Cargo.toml | 6 +-- substrate/Cargo.toml | 64 +++++++++++------------ 17 files changed, 169 insertions(+), 108 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f9f8364..f727ae3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,3 +19,64 @@ members = [ "scripts/mergegds", "substrate", ] + +[workspace.dependencies] +# Workspace crates +codegen = { path = "codegen" } +empty_pdk = { path = "pdks/empty_pdk" } +gds21 = { path = "libs/gds21" } +ngspice = { path = "plugins/ngspice" } +sky130_common_pdk = { path = "pdks/sky130_common_pdk" } +sky130_open_pdk = { path = "pdks/sky130_open_pdk" } +spice_rawfile = { path = "plugins/spice_rawfile" } +subgates = { path = "libs/subgates" } +subgeom = { path = "libs/subgeom" } +sublut = { path = "libs/sublut" } +subspice = { path = "plugins/subspice" } +substrate = { path = "substrate" } + +# External crates +anyhow = "1" +approx = "0.5" +arcstr = "1" +array_map = "0.4" +bitvec = "1" +byteorder = "1" +chrono = "0.4" +clap = "4" +csv = "1" +darling = "0.24" +derivative = "2" +derive_builder = "0.20" +derive_more = "2" +enum_dispatch = "0.3" +flexbuffers = "25" +float_eq = "1" +grid = "1" +itertools = "0.15" +lazy_static = "1" +log = "0.4" +nom = "8" +num-derive = "0.5" +num-traits = "0.2" +paste = "1" +pathfinding = "4" +proc-macro-crate = "3" +proc-macro2 = "1" +psfparser = { git = "https://github.com/ucb-substrate/substrate2", branch = "main" } +quote = "1" +regex = "1" +serde = "1" +serde_derive = "1" +serde_json = "1" +serde_yaml = "0.9" +slotmap = "1" +splines = "5" +state = "0.6" +statrs = "0.19" +syn = "3" +tempfile = "3.10" +tera = "2" +textwrap = "0.16" +thiserror = "2" +toml = "1" diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml index 6a17361..cff6692 100644 --- a/codegen/Cargo.toml +++ b/codegen/Cargo.toml @@ -6,13 +6,13 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -darling = "0.24.1" -syn = "3.0.6" -quote = "1.0.26" -paste = "1.0.12" -proc-macro2 = "1.0.37" -proc-macro-crate = "3.5.0" -itertools = "0.15.0" +darling = { workspace = true } +syn = { workspace = true } +quote = { workspace = true } +paste = { workspace = true } +proc-macro2 = { workspace = true } +proc-macro-crate = { workspace = true } +itertools = { workspace = true } [lib] proc-macro = true diff --git a/examples/tut01_getting_started/Cargo.toml b/examples/tut01_getting_started/Cargo.toml index 8f2ed5f..ad8cc6b 100644 --- a/examples/tut01_getting_started/Cargo.toml +++ b/examples/tut01_getting_started/Cargo.toml @@ -4,6 +4,6 @@ version = "0.1.0" edition = "2021" [dependencies] -substrate = { path = "../../substrate" } -empty_pdk = { path = "../../pdks/empty_pdk" } -arcstr = "1" +substrate = { workspace = true } +empty_pdk = { workspace = true } +arcstr = { workspace = true } diff --git a/libs/gds21/Cargo.toml b/libs/gds21/Cargo.toml index 5f2dcf2..f8bf6f0 100644 --- a/libs/gds21/Cargo.toml +++ b/libs/gds21/Cargo.toml @@ -11,23 +11,23 @@ workspace = "../../" exclude = ["resources",] [dependencies] -byteorder = "1.4.3" -chrono = { version = "0.4.24", features = ["serde"] } -derive_builder = "0.20.2" -derive_more = { version = "2.1.1", features = ["add", "add_assign", "from"] } -num-derive = "0.5" -num-traits = "0.2.15" -serde = { version = "1.0.159", features = ["derive"] } -serde_derive = "1.0.159" -serde_json = "1.0" -serde_yaml = "0.9" -toml = "1.1.6" -tempfile = { version = "3", optional = true } -arcstr = { version = "1.1.5", features = ["serde"] } -textwrap = "0.16.4" +byteorder = { workspace = true } +chrono = { workspace = true, features = ["serde"] } +derive_builder = { workspace = true } +derive_more = { workspace = true, features = ["add", "add_assign", "from"] } +num-derive = { workspace = true } +num-traits = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde_derive = { workspace = true } +serde_json = { workspace = true } +serde_yaml = { workspace = true } +toml = { workspace = true } +tempfile = { workspace = true, optional = true } +arcstr = { workspace = true, features = ["serde"] } +textwrap = { workspace = true } [dev-dependencies] -tempfile = {version = "3"} +tempfile = { workspace = true } [features] selftest = ["tempfile"] diff --git a/libs/subgates/Cargo.toml b/libs/subgates/Cargo.toml index a860c47..1e31649 100644 --- a/libs/subgates/Cargo.toml +++ b/libs/subgates/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -substrate = { path = "../../substrate" } -subgeom = { path = "../subgeom" } -arcstr = { version = "1.1.5", features = ["serde"] } -serde = { version = "1", features = ["derive", "rc"] } +substrate = { workspace = true } +subgeom = { workspace = true } +arcstr = { workspace = true, features = ["serde"] } +serde = { workspace = true, features = ["derive", "rc"] } diff --git a/libs/subgeom/Cargo.toml b/libs/subgeom/Cargo.toml index d729c8c..a48eba1 100644 --- a/libs/subgeom/Cargo.toml +++ b/libs/subgeom/Cargo.toml @@ -6,8 +6,8 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -serde = { version = "1", features = ["derive", "rc"] } -enum_dispatch = "0.3.11" -array_map = { version = "0.4", features = ["derive", "serde", "std"] } -thiserror = "2.0.20" -gds21 = { path = "../../libs/gds21" } +serde = { workspace = true, features = ["derive", "rc"] } +enum_dispatch = { workspace = true } +array_map = { workspace = true, features = ["derive", "serde", "std"] } +thiserror = { workspace = true } +gds21 = { workspace = true } diff --git a/libs/sublut/Cargo.toml b/libs/sublut/Cargo.toml index a30e968..7b2fea3 100644 --- a/libs/sublut/Cargo.toml +++ b/libs/sublut/Cargo.toml @@ -6,10 +6,10 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -derive_builder = { version = "0.20.2", features = ["clippy"] } -serde = { version = "1", features = ["derive", "rc"] } -splines = "5.0.0" +derive_builder = { workspace = true, features = ["clippy"] } +serde = { workspace = true, features = ["derive", "rc"] } +splines = { workspace = true } [dev-dependencies] -float_eq = "1" -serde = { version = "1", features = ["derive", "rc"] } +float_eq = { workspace = true } +serde = { workspace = true, features = ["derive", "rc"] } diff --git a/pdks/empty_pdk/Cargo.toml b/pdks/empty_pdk/Cargo.toml index 2119357..680c8f5 100644 --- a/pdks/empty_pdk/Cargo.toml +++ b/pdks/empty_pdk/Cargo.toml @@ -5,5 +5,5 @@ edition = "2021" authors = ["Rahul Kumar "] [dependencies] -substrate = { path = "../../substrate" } -arcstr = "1" +substrate = { workspace = true } +arcstr = { workspace = true } diff --git a/pdks/sky130_commercial_pdk/Cargo.toml b/pdks/sky130_commercial_pdk/Cargo.toml index 06a1b47..48615ed 100644 --- a/pdks/sky130_commercial_pdk/Cargo.toml +++ b/pdks/sky130_commercial_pdk/Cargo.toml @@ -5,6 +5,6 @@ edition = "2021" authors = ["Rahul Kumar "] [dependencies] -substrate = { path = "../../substrate" } -arcstr = "1" -sky130_common_pdk = { path = "../sky130_common_pdk" } +substrate = { workspace = true } +arcstr = { workspace = true } +sky130_common_pdk = { workspace = true } diff --git a/pdks/sky130_common_pdk/Cargo.toml b/pdks/sky130_common_pdk/Cargo.toml index a4c0535..2be53cf 100644 --- a/pdks/sky130_common_pdk/Cargo.toml +++ b/pdks/sky130_common_pdk/Cargo.toml @@ -5,6 +5,6 @@ edition = "2021" authors = ["Rahul Kumar ", "Rohan Kumar "] [dependencies] -substrate = { path = "../../substrate" } -subgeom = { path = "../../libs/subgeom" } -arcstr = "1" +substrate = { workspace = true } +subgeom = { workspace = true } +arcstr = { workspace = true } diff --git a/pdks/sky130_open_pdk/Cargo.toml b/pdks/sky130_open_pdk/Cargo.toml index d26af38..4a14e55 100644 --- a/pdks/sky130_open_pdk/Cargo.toml +++ b/pdks/sky130_open_pdk/Cargo.toml @@ -5,6 +5,6 @@ edition = "2021" authors = ["Rahul Kumar "] [dependencies] -substrate = { path = "../../substrate" } -arcstr = "1" -sky130_common_pdk = { path = "../sky130_common_pdk" } +substrate = { workspace = true } +arcstr = { workspace = true } +sky130_common_pdk = { workspace = true } diff --git a/plugins/ngspice/Cargo.toml b/plugins/ngspice/Cargo.toml index d6b4e2e..40740eb 100644 --- a/plugins/ngspice/Cargo.toml +++ b/plugins/ngspice/Cargo.toml @@ -6,9 +6,9 @@ license = "MIT" description = "Substrate plugin for Ngspice" [dependencies] -lazy_static = "1.4.0" -serde = { version = "1.0.159", features = ["derive"] } -substrate = { path = "../../substrate" } -tera = { version = "2.4.0", features = ["glob_fs"] } -spice_rawfile = { path = "../spice_rawfile" } -anyhow = "1.0.70" +lazy_static = { workspace = true } +serde = { workspace = true, features = ["derive"] } +substrate = { workspace = true } +tera = { workspace = true, features = ["glob_fs"] } +spice_rawfile = { workspace = true } +anyhow = { workspace = true } diff --git a/plugins/spectre/Cargo.toml b/plugins/spectre/Cargo.toml index 96d7523..c1719ea 100644 --- a/plugins/spectre/Cargo.toml +++ b/plugins/spectre/Cargo.toml @@ -6,15 +6,15 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -lazy_static = "1.4.0" -serde = { version = "1.0.159", features = ["derive"] } -substrate = { path = "../../substrate" } -tera = { version = "2.4.0", features = ["glob_fs"] } -spice_rawfile = { path = "../spice_rawfile" } -anyhow = "1.0.70" -psfparser = { git = "https://github.com/ucb-substrate/substrate2", branch = "main" } -log = "0.4" +lazy_static = { workspace = true } +serde = { workspace = true, features = ["derive"] } +substrate = { workspace = true } +tera = { workspace = true, features = ["glob_fs"] } +spice_rawfile = { workspace = true } +anyhow = { workspace = true } +psfparser = { workspace = true } +log = { workspace = true } [dev-dependencies] -approx = "0.5.1" -statrs = "0.19.1" +approx = { workspace = true } +statrs = { workspace = true } diff --git a/plugins/spice_rawfile/Cargo.toml b/plugins/spice_rawfile/Cargo.toml index db2cf81..98fad76 100644 --- a/plugins/spice_rawfile/Cargo.toml +++ b/plugins/spice_rawfile/Cargo.toml @@ -6,6 +6,6 @@ license = "MIT" description = "Parse SPICE rawfiles" [dependencies] -nom = "8.0.0" -serde = { version = "1.0.159", features = ["derive"] } -thiserror = "2.0.20" +nom = { workspace = true } +serde = { workspace = true, features = ["derive"] } +thiserror = { workspace = true } diff --git a/plugins/subspice/Cargo.toml b/plugins/subspice/Cargo.toml index 17da379..ab3c7f4 100644 --- a/plugins/subspice/Cargo.toml +++ b/plugins/subspice/Cargo.toml @@ -4,7 +4,7 @@ version = "0.0.2" edition = "2021" [dependencies] -anyhow = "1.0.70" -nom = "8.0.0" -serde = { version = "1.0.159", features = ["derive"] } -thiserror = "2.0.20" +anyhow = { workspace = true } +nom = { workspace = true } +serde = { workspace = true, features = ["derive"] } +thiserror = { workspace = true } diff --git a/scripts/mergegds/Cargo.toml b/scripts/mergegds/Cargo.toml index f10aa90..d6c7e03 100644 --- a/scripts/mergegds/Cargo.toml +++ b/scripts/mergegds/Cargo.toml @@ -5,6 +5,6 @@ edition = "2021" authors = ["Rahul Kumar "] [dependencies] -substrate = { path = "../../substrate" } -empty_pdk = { path = "../../pdks/empty_pdk" } -clap = { version = "4.2.1", features = ["derive"] } +substrate = { workspace = true } +empty_pdk = { workspace = true } +clap = { workspace = true, features = ["derive"] } diff --git a/substrate/Cargo.toml b/substrate/Cargo.toml index bb5cdf8..df5f3ca 100644 --- a/substrate/Cargo.toml +++ b/substrate/Cargo.toml @@ -5,37 +5,37 @@ edition = "2021" authors = ["Rahul Kumar ", "Rohan Kumar "] [dependencies] -derive_builder = { version = "0.20.2", features = ["clippy"] } -serde = { version = "1", features = ["derive", "rc"] } -slotmap = { version = "1.0.6", features = ["serde"] } -tempfile = "3.10" -thiserror = "2.0.20" -enum_dispatch = "0.3.11" -arcstr = { version = "1.1.5", features = ["serde"] } -derivative = "2.2.0" -flexbuffers = "25" -gds21 = { path = "../libs/gds21" } -subspice = { path = "../plugins/subspice" } -subgeom = { path = "../libs/subgeom" } -sublut = { path = "../libs/sublut" } -codegen = { path = "../codegen" } -log = "0.4" -array_map = { version = "0.4", features = ["derive", "serde", "std"] } -toml = "1.1" -lazy_static = "1.4" -regex = "1.7" -grid = "1.0.1" -state = "0.6.0" -pathfinding = "4.2.1" -itertools = "0.15.0" -serde_json = "1.0.95" -anyhow = "1.0.70" -bitvec = { version = "1", features = ["serde"] } -csv = "1.2.1" +derive_builder = { workspace = true, features = ["clippy"] } +serde = { workspace = true, features = ["derive", "rc"] } +slotmap = { workspace = true, features = ["serde"] } +tempfile = { workspace = true } +thiserror = { workspace = true } +enum_dispatch = { workspace = true } +arcstr = { workspace = true, features = ["serde"] } +derivative = { workspace = true } +flexbuffers = { workspace = true } +gds21 = { workspace = true } +subspice = { workspace = true } +subgeom = { workspace = true } +sublut = { workspace = true } +codegen = { workspace = true } +log = { workspace = true } +array_map = { workspace = true, features = ["derive", "serde", "std"] } +toml = { workspace = true } +lazy_static = { workspace = true } +regex = { workspace = true } +grid = { workspace = true } +state = { workspace = true } +pathfinding = { workspace = true } +itertools = { workspace = true } +serde_json = { workspace = true } +anyhow = { workspace = true } +bitvec = { workspace = true, features = ["serde"] } +csv = { workspace = true } [dev-dependencies] -sky130_open_pdk = { path = "../pdks/sky130_open_pdk" } -ngspice = { path = "../plugins/ngspice" } -subgates = { path = "../libs/subgates" } -lazy_static = "1.4.0" -float_eq = "1" +sky130_open_pdk = { workspace = true } +ngspice = { workspace = true } +subgates = { workspace = true } +lazy_static = { workspace = true } +float_eq = { workspace = true }