Fixing second part - small L,R and C were not handled properly

This commit is contained in:
Matthias Koefferlein 2024-09-07 22:39:20 +02:00
parent 4ce5a9805a
commit 20099a38b9
2 changed files with 199 additions and 3 deletions

View File

@ -116,7 +116,7 @@ public:
{
double va = a->parameter_value (0);
double vb = b->parameter_value (0);
a->set_parameter_value (0, va + vb < 1e-10 ? 0.0 : va * vb / (va + vb));
a->set_parameter_value (0, va + vb < 1e-30 ? 0.0 : va * vb / (va + vb));
// parallel width is sum of both, length is the one that gives the same value of resistance
// R = 1/(1/R1 + 1/R2)
@ -204,7 +204,7 @@ public:
{
double va = a->parameter_value (0);
double vb = b->parameter_value (0);
a->set_parameter_value (0, va + vb < 1e-10 ? 0.0 : va * vb / (va + vb));
a->set_parameter_value (0, va + vb < 1e-30 ? 0.0 : va * vb / (va + vb));
// TODO: does this implementation make sense?
double aa = a->parameter_value (1);
@ -259,7 +259,7 @@ public:
{
double va = a->parameter_value (0);
double vb = b->parameter_value (0);
a->set_parameter_value (0, va + vb < 1e-10 ? 0.0 : va * vb / (va + vb));
a->set_parameter_value (0, va + vb < 1e-30 ? 0.0 : va * vb / (va + vb));
}
void serial (Device *a, Device *b) const

View File

@ -1792,3 +1792,199 @@ TEST(26_JoinNets)
"end;\n"
);
}
// Issue #1832 - small caps are not combined properly
TEST(27_CombineSmallC)
{
db::Netlist nl;
db::Circuit *circuit = new db::Circuit ();
circuit->set_name ("TOP");
nl.add_circuit (circuit);
db::DeviceClass *device = new db::DeviceClassCapacitor ();
device->set_name ("model_name");
nl.add_device_class (device);
db::Net *n1 = new db::Net ("n1");
circuit->add_net (n1);
db::Net *n2 = new db::Net ("n2");
circuit->add_net (n2);
db::Net *n3 = new db::Net ("n3");
circuit->add_net (n3);
auto p1 = circuit->add_pin ("p1");
auto p2 = circuit->add_pin ("p2");
circuit->connect_pin (p1.id (), n1);
circuit->connect_pin (p2.id (), n3);
db::Device *c1 = new db::Device (device, "c1");
circuit->add_device (c1);
c1->set_parameter_value (db::DeviceClassCapacitor::param_id_C, 1e-15);
db::Device *c2 = new db::Device (device, "c2");
circuit->add_device (c2);
c2->set_parameter_value (db::DeviceClassCapacitor::param_id_C, 2e-15);
db::Device *c3 = new db::Device (device, "c3");
circuit->add_device (c3);
c3->set_parameter_value (db::DeviceClassCapacitor::param_id_C, 3e-15);
c1->connect_terminal (db::DeviceClassCapacitor::terminal_id_A, n1);
c1->connect_terminal (db::DeviceClassCapacitor::terminal_id_B, n2);
c2->connect_terminal (db::DeviceClassCapacitor::terminal_id_A, n2);
c2->connect_terminal (db::DeviceClassCapacitor::terminal_id_B, n3);
c3->connect_terminal (db::DeviceClassCapacitor::terminal_id_A, n1);
c3->connect_terminal (db::DeviceClassCapacitor::terminal_id_B, n3);
EXPECT_EQ (nl.to_string (),
"circuit TOP (p1=n1,p2=n3);\n"
" device model_name c1 (A=n1,B=n2) (C=1e-15,A=0,P=0);\n"
" device model_name c2 (A=n2,B=n3) (C=2e-15,A=0,P=0);\n"
" device model_name c3 (A=n1,B=n3) (C=3e-15,A=0,P=0);\n"
"end;\n"
);
nl.combine_devices ();
EXPECT_EQ (nl.to_string (),
"circuit TOP (p1=n1,p2=n3);\n"
" device model_name c1 (A=n1,B=n3) (C=3.66666666667e-15,A=0,P=0);\n"
"end;\n"
);
}
TEST(27_CombineSmallR)
{
db::Netlist nl;
db::Circuit *circuit = new db::Circuit ();
circuit->set_name ("TOP");
nl.add_circuit (circuit);
db::DeviceClass *device = new db::DeviceClassResistor ();
device->set_name ("model_name");
nl.add_device_class (device);
db::Net *n1 = new db::Net ("n1");
circuit->add_net (n1);
db::Net *n2 = new db::Net ("n2");
circuit->add_net (n2);
db::Net *n3 = new db::Net ("n3");
circuit->add_net (n3);
auto p1 = circuit->add_pin ("p1");
auto p2 = circuit->add_pin ("p2");
circuit->connect_pin (p1.id (), n1);
circuit->connect_pin (p2.id (), n3);
db::Device *c1 = new db::Device (device, "c1");
circuit->add_device (c1);
c1->set_parameter_value (db::DeviceClassResistor::param_id_R, 1e-15);
db::Device *c2 = new db::Device (device, "c2");
circuit->add_device (c2);
c2->set_parameter_value (db::DeviceClassResistor::param_id_R, 2e-15);
db::Device *c3 = new db::Device (device, "c3");
circuit->add_device (c3);
c3->set_parameter_value (db::DeviceClassResistor::param_id_R, 3e-15);
c1->connect_terminal (db::DeviceClassResistor::terminal_id_A, n1);
c1->connect_terminal (db::DeviceClassResistor::terminal_id_B, n2);
c2->connect_terminal (db::DeviceClassResistor::terminal_id_A, n2);
c2->connect_terminal (db::DeviceClassResistor::terminal_id_B, n3);
c3->connect_terminal (db::DeviceClassResistor::terminal_id_A, n1);
c3->connect_terminal (db::DeviceClassResistor::terminal_id_B, n3);
EXPECT_EQ (nl.to_string (),
"circuit TOP (p1=n1,p2=n3);\n"
" device model_name c1 (A=n1,B=n2) (R=1e-15,L=0,W=0,A=0,P=0);\n"
" device model_name c2 (A=n2,B=n3) (R=2e-15,L=0,W=0,A=0,P=0);\n"
" device model_name c3 (A=n1,B=n3) (R=3e-15,L=0,W=0,A=0,P=0);\n"
"end;\n"
);
nl.combine_devices ();
EXPECT_EQ (nl.to_string (),
"circuit TOP (p1=n1,p2=n3);\n"
" device model_name c1 (A=n1,B=n3) (R=1.5e-15,L=0,W=0,A=0,P=0);\n"
"end;\n"
);
}
TEST(27_CombineSmallL)
{
db::Netlist nl;
db::Circuit *circuit = new db::Circuit ();
circuit->set_name ("TOP");
nl.add_circuit (circuit);
db::DeviceClass *device = new db::DeviceClassInductor ();
device->set_name ("model_name");
nl.add_device_class (device);
db::Net *n1 = new db::Net ("n1");
circuit->add_net (n1);
db::Net *n2 = new db::Net ("n2");
circuit->add_net (n2);
db::Net *n3 = new db::Net ("n3");
circuit->add_net (n3);
auto p1 = circuit->add_pin ("p1");
auto p2 = circuit->add_pin ("p2");
circuit->connect_pin (p1.id (), n1);
circuit->connect_pin (p2.id (), n3);
db::Device *c1 = new db::Device (device, "c1");
circuit->add_device (c1);
c1->set_parameter_value (db::DeviceClassInductor::param_id_L, 1e-15);
db::Device *c2 = new db::Device (device, "c2");
circuit->add_device (c2);
c2->set_parameter_value (db::DeviceClassInductor::param_id_L, 2e-15);
db::Device *c3 = new db::Device (device, "c3");
circuit->add_device (c3);
c3->set_parameter_value (db::DeviceClassInductor::param_id_L, 3e-15);
c1->connect_terminal (db::DeviceClassInductor::terminal_id_A, n1);
c1->connect_terminal (db::DeviceClassInductor::terminal_id_B, n2);
c2->connect_terminal (db::DeviceClassInductor::terminal_id_A, n2);
c2->connect_terminal (db::DeviceClassInductor::terminal_id_B, n3);
c3->connect_terminal (db::DeviceClassInductor::terminal_id_A, n1);
c3->connect_terminal (db::DeviceClassInductor::terminal_id_B, n3);
EXPECT_EQ (nl.to_string (),
"circuit TOP (p1=n1,p2=n3);\n"
" device model_name c1 (A=n1,B=n2) (L=1e-15);\n"
" device model_name c2 (A=n2,B=n3) (L=2e-15);\n"
" device model_name c3 (A=n1,B=n3) (L=3e-15);\n"
"end;\n"
);
nl.combine_devices ();
EXPECT_EQ (nl.to_string (),
"circuit TOP (p1=n1,p2=n3);\n"
" device model_name c1 (A=n1,B=n3) (L=1.5e-15);\n"
"end;\n"
);
}