mirror of https://github.com/KLayout/klayout.git
Fixing second part - small L,R and C were not handled properly
This commit is contained in:
parent
4ce5a9805a
commit
20099a38b9
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue