Spice reader flags existing parameters as primary

This commit is contained in:
Matthias Koefferlein 2021-07-27 22:13:31 +02:00
parent cb085069ee
commit 37457aa02f
3 changed files with 41 additions and 2 deletions

View File

@ -620,11 +620,14 @@ bool NetlistSpiceReaderDelegate::element (db::Circuit *circuit, const std::strin
defp = db::DeviceClassInductor::param_id_L;
}
const std::vector<db::DeviceParameterDefinition> &pd = cls->parameter_definitions ();
for (std::vector<db::DeviceParameterDefinition>::const_iterator i = pd.begin (); i != pd.end (); ++i) {
std::vector<db::DeviceParameterDefinition> &pd = cls->parameter_definitions_non_const ();
for (std::vector<db::DeviceParameterDefinition>::iterator i = pd.begin (); i != pd.end (); ++i) {
std::map<std::string, double>::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 ());
}

View File

@ -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);
}

5
testdata/algo/nreader16.cir vendored Normal file
View File

@ -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