From 37457aa02ff48689f37385ae48a057ce354a7ae1 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Tue, 27 Jul 2021 22:13:31 +0200 Subject: [PATCH] Spice reader flags existing parameters as primary --- src/db/db/dbNetlistSpiceReader.cc | 7 +++-- src/db/unit_tests/dbNetlistReaderTests.cc | 31 +++++++++++++++++++++++ testdata/algo/nreader16.cir | 5 ++++ 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 testdata/algo/nreader16.cir diff --git a/src/db/db/dbNetlistSpiceReader.cc b/src/db/db/dbNetlistSpiceReader.cc index 0f0fe8312..9b11a8093 100644 --- a/src/db/db/dbNetlistSpiceReader.cc +++ b/src/db/db/dbNetlistSpiceReader.cc @@ -620,11 +620,14 @@ bool NetlistSpiceReaderDelegate::element (db::Circuit *circuit, const std::strin defp = db::DeviceClassInductor::param_id_L; } - const std::vector &pd = cls->parameter_definitions (); - for (std::vector::const_iterator i = pd.begin (); i != pd.end (); ++i) { + std::vector &pd = cls->parameter_definitions_non_const (); + for (std::vector::iterator i = pd.begin (); i != pd.end (); ++i) { std::map::const_iterator v = params.find (i->name ()); if (v != params.end ()) { device->set_parameter_value (i->id (), v->second / i->si_scaling ()); + // Make given parameters primary. This way they are netlisted again and participate in netlist compare when + // they are made primary in the extracted netlist too. + i->set_is_primary (true); } else if (i->id () == defp) { device->set_parameter_value (i->id (), value / i->si_scaling ()); } diff --git a/src/db/unit_tests/dbNetlistReaderTests.cc b/src/db/unit_tests/dbNetlistReaderTests.cc index 987c432af..8ac7197df 100644 --- a/src/db/unit_tests/dbNetlistReaderTests.cc +++ b/src/db/unit_tests/dbNetlistReaderTests.cc @@ -590,3 +590,34 @@ TEST(15_ContinuationWithBlanks) "end;\n" ); } + +TEST(16_PrimaryParametersFromSpice) +{ + db::Netlist nl; + + std::string path = tl::combine_path (tl::combine_path (tl::testdata (), "algo"), "nreader16.cir"); + + db::NetlistSpiceReader reader; + tl::InputStream is (path); + reader.read (is, nl); + + const db::DeviceClass *dc; + + // RMODEL1 does not have L and W parameters + dc = nl.device_class_by_name ("RMODEL1"); + EXPECT_EQ (dc->parameter_definition (db::DeviceClassResistor::param_id_W)->is_primary (), false); + EXPECT_EQ (dc->parameter_definition (db::DeviceClassResistor::param_id_L)->is_primary (), false); + EXPECT_EQ (dc->parameter_definition (db::DeviceClassResistor::param_id_R)->is_primary (), true); + + // RMODEL2 has L and W parameters + dc = nl.device_class_by_name ("RMODEL2"); + EXPECT_EQ (dc->parameter_definition (db::DeviceClassResistor::param_id_W)->is_primary (), true); + EXPECT_EQ (dc->parameter_definition (db::DeviceClassResistor::param_id_L)->is_primary (), true); + EXPECT_EQ (dc->parameter_definition (db::DeviceClassResistor::param_id_R)->is_primary (), true); + + // RMODEL3 has W parameter only + dc = nl.device_class_by_name ("RMODEL3"); + EXPECT_EQ (dc->parameter_definition (db::DeviceClassResistor::param_id_W)->is_primary (), true); + EXPECT_EQ (dc->parameter_definition (db::DeviceClassResistor::param_id_L)->is_primary (), false); + EXPECT_EQ (dc->parameter_definition (db::DeviceClassResistor::param_id_R)->is_primary (), true); +} diff --git a/testdata/algo/nreader16.cir b/testdata/algo/nreader16.cir new file mode 100644 index 000000000..4ba071d79 --- /dev/null +++ b/testdata/algo/nreader16.cir @@ -0,0 +1,5 @@ + +R$1 1 2 1k RMODEL1 M=2 +R$1 2 3 1k RMODEL2 W=0.5u L=17u +R$1 3 4 1k RMODEL3 W=0.5u +