mirror of https://github.com/KLayout/klayout.git
WIP: tests for specialized device classes and device combination
This commit is contained in:
parent
45b35f3aae
commit
44b5b2742e
|
|
@ -98,6 +98,11 @@ void DeviceClassResistor::serial (Device *a, Device *b) const
|
|||
// ------------------------------------------------------------------------------------
|
||||
// DeviceClassCapacitor implementation
|
||||
|
||||
DB_PUBLIC size_t DeviceClassCapacitor::param_id_C = 0;
|
||||
|
||||
DB_PUBLIC size_t DeviceClassCapacitor::terminal_id_A = 0;
|
||||
DB_PUBLIC size_t DeviceClassCapacitor::terminal_id_B = 1;
|
||||
|
||||
DeviceClassCapacitor::DeviceClassCapacitor ()
|
||||
{
|
||||
add_terminal_definition (db::DeviceTerminalDefinition ("A", "Terminal A"));
|
||||
|
|
@ -123,6 +128,11 @@ void DeviceClassCapacitor::parallel (Device *a, Device *b) const
|
|||
// ------------------------------------------------------------------------------------
|
||||
// DeviceClassInductor implementation
|
||||
|
||||
DB_PUBLIC size_t DeviceClassInductor::param_id_L = 0;
|
||||
|
||||
DB_PUBLIC size_t DeviceClassInductor::terminal_id_A = 0;
|
||||
DB_PUBLIC size_t DeviceClassInductor::terminal_id_B = 1;
|
||||
|
||||
DeviceClassInductor::DeviceClassInductor ()
|
||||
{
|
||||
add_terminal_definition (db::DeviceTerminalDefinition ("A", "Terminal A"));
|
||||
|
|
@ -148,6 +158,11 @@ void DeviceClassInductor::serial (Device *a, Device *b) const
|
|||
// ------------------------------------------------------------------------------------
|
||||
// DeviceClassInductor implementation
|
||||
|
||||
DB_PUBLIC size_t DeviceClassDiode::param_id_A = 0;
|
||||
|
||||
DB_PUBLIC size_t DeviceClassDiode::terminal_id_A = 0;
|
||||
DB_PUBLIC size_t DeviceClassDiode::terminal_id_C = 1;
|
||||
|
||||
DeviceClassDiode::DeviceClassDiode ()
|
||||
{
|
||||
add_terminal_definition (db::DeviceTerminalDefinition ("A", "Anode"));
|
||||
|
|
@ -164,7 +179,7 @@ bool DeviceClassDiode::combine_devices (Device *a, Device *b) const
|
|||
const db::Net *nb2 = b->net_for_terminal (1);
|
||||
|
||||
// only parallel diodes can be combined and their areas will add
|
||||
if ((na1 == nb1 && na2 == nb2) || (na1 == nb2 && na2 == nb1)) {
|
||||
if (na1 == nb1 && na2 == nb2) {
|
||||
|
||||
a->set_parameter_value (0, a->parameter_value (0) + b->parameter_value (0));
|
||||
b->connect_terminal (0, 0);
|
||||
|
|
@ -180,6 +195,15 @@ bool DeviceClassDiode::combine_devices (Device *a, Device *b) const
|
|||
// ------------------------------------------------------------------------------------
|
||||
// DeviceClassMOS3Transistor implementation
|
||||
|
||||
DB_PUBLIC size_t DeviceClassMOS3Transistor::param_id_L = 0;
|
||||
DB_PUBLIC size_t DeviceClassMOS3Transistor::param_id_W = 1;
|
||||
DB_PUBLIC size_t DeviceClassMOS3Transistor::param_id_AS = 2;
|
||||
DB_PUBLIC size_t DeviceClassMOS3Transistor::param_id_AD = 3;
|
||||
|
||||
DB_PUBLIC size_t DeviceClassMOS3Transistor::terminal_id_S = 0;
|
||||
DB_PUBLIC size_t DeviceClassMOS3Transistor::terminal_id_G = 1;
|
||||
DB_PUBLIC size_t DeviceClassMOS3Transistor::terminal_id_D = 2;
|
||||
|
||||
DeviceClassMOS3Transistor::DeviceClassMOS3Transistor ()
|
||||
{
|
||||
add_terminal_definition (db::DeviceTerminalDefinition ("S", "Source"));
|
||||
|
|
@ -226,6 +250,16 @@ bool DeviceClassMOS3Transistor::combine_devices (Device *a, Device *b) const
|
|||
// ------------------------------------------------------------------------------------
|
||||
// DeviceClassMOS4Transistor implementation
|
||||
|
||||
DB_PUBLIC size_t DeviceClassMOS4Transistor::param_id_L = 0;
|
||||
DB_PUBLIC size_t DeviceClassMOS4Transistor::param_id_W = 1;
|
||||
DB_PUBLIC size_t DeviceClassMOS4Transistor::param_id_AS = 2;
|
||||
DB_PUBLIC size_t DeviceClassMOS4Transistor::param_id_AD = 3;
|
||||
|
||||
DB_PUBLIC size_t DeviceClassMOS4Transistor::terminal_id_S = 0;
|
||||
DB_PUBLIC size_t DeviceClassMOS4Transistor::terminal_id_G = 1;
|
||||
DB_PUBLIC size_t DeviceClassMOS4Transistor::terminal_id_D = 2;
|
||||
DB_PUBLIC size_t DeviceClassMOS4Transistor::terminal_id_B = 3;
|
||||
|
||||
DeviceClassMOS4Transistor::DeviceClassMOS4Transistor ()
|
||||
{
|
||||
add_terminal_definition (db::DeviceTerminalDefinition ("S", "Source"));
|
||||
|
|
|
|||
|
|
@ -85,6 +85,11 @@ public:
|
|||
return new DeviceClassCapacitor (*this);
|
||||
}
|
||||
|
||||
static size_t param_id_C;
|
||||
|
||||
static size_t terminal_id_A;
|
||||
static size_t terminal_id_B;
|
||||
|
||||
virtual void parallel (Device *a, Device *b) const;
|
||||
virtual void serial (Device *a, Device *b) const;
|
||||
};
|
||||
|
|
@ -105,6 +110,11 @@ public:
|
|||
return new DeviceClassInductor (*this);
|
||||
}
|
||||
|
||||
static size_t param_id_L;
|
||||
|
||||
static size_t terminal_id_A;
|
||||
static size_t terminal_id_B;
|
||||
|
||||
virtual void parallel (Device *a, Device *b) const;
|
||||
virtual void serial (Device *a, Device *b) const;
|
||||
};
|
||||
|
|
@ -121,6 +131,11 @@ class DB_PUBLIC DeviceClassDiode
|
|||
public:
|
||||
DeviceClassDiode ();
|
||||
|
||||
static size_t param_id_A;
|
||||
|
||||
static size_t terminal_id_A;
|
||||
static size_t terminal_id_C;
|
||||
|
||||
virtual db::DeviceClass *clone () const
|
||||
{
|
||||
return new DeviceClassDiode (*this);
|
||||
|
|
@ -142,6 +157,15 @@ class DB_PUBLIC DeviceClassMOS3Transistor
|
|||
public:
|
||||
DeviceClassMOS3Transistor ();
|
||||
|
||||
static size_t param_id_L;
|
||||
static size_t param_id_W;
|
||||
static size_t param_id_AS;
|
||||
static size_t param_id_AD;
|
||||
|
||||
static size_t terminal_id_S;
|
||||
static size_t terminal_id_G;
|
||||
static size_t terminal_id_D;
|
||||
|
||||
virtual db::DeviceClass *clone () const
|
||||
{
|
||||
return new DeviceClassMOS3Transistor (*this);
|
||||
|
|
@ -162,6 +186,16 @@ class DB_PUBLIC DeviceClassMOS4Transistor
|
|||
public:
|
||||
DeviceClassMOS4Transistor ();
|
||||
|
||||
static size_t param_id_L;
|
||||
static size_t param_id_W;
|
||||
static size_t param_id_AS;
|
||||
static size_t param_id_AD;
|
||||
|
||||
static size_t terminal_id_S;
|
||||
static size_t terminal_id_G;
|
||||
static size_t terminal_id_D;
|
||||
static size_t terminal_id_B;
|
||||
|
||||
virtual db::DeviceClass *clone () const
|
||||
{
|
||||
return new DeviceClassMOS4Transistor (*this);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -133,8 +133,8 @@ public:
|
|||
|
||||
db::Device *device = create_device ();
|
||||
|
||||
device->set_parameter_value ("W", dbu () * edges.length () * 0.5);
|
||||
device->set_parameter_value ("L", dbu () * (p->perimeter () - edges.length ()) * 0.5);
|
||||
device->set_parameter_value (db::DeviceClassMOS3Transistor::param_id_W, dbu () * edges.length () * 0.5);
|
||||
device->set_parameter_value (db::DeviceClassMOS3Transistor::param_id_L, dbu () * (p->perimeter () - edges.length ()) * 0.5);
|
||||
|
||||
int diff_index = 0;
|
||||
for (db::Region::const_iterator d = rdiff2gate.begin (); !d.at_end () && diff_index < 2; ++d, ++diff_index) {
|
||||
|
|
@ -144,13 +144,13 @@ public:
|
|||
int n = rgates.selected_interacting (db::Region (*d)).size ();
|
||||
tl_assert (n > 0);
|
||||
|
||||
device->set_parameter_value (diff_index == 0 ? "AS" : "AD", dbu () * dbu () * d->area () / double (n));
|
||||
device->set_parameter_value (diff_index == 0 ? db::DeviceClassMOS3Transistor::param_id_AS : db::DeviceClassMOS3Transistor::param_id_AD, dbu () * dbu () * d->area () / double (n));
|
||||
|
||||
define_terminal (device, device->device_class ()->terminal_id_for_name (diff_index == 0 ? "S" : "D"), terminal_geometry_index, *d);
|
||||
define_terminal (device, diff_index == 0 ? db::DeviceClassMOS3Transistor::terminal_id_S : db::DeviceClassMOS3Transistor::terminal_id_D, terminal_geometry_index, *d);
|
||||
|
||||
}
|
||||
|
||||
define_terminal (device, device->device_class ()->terminal_id_for_name ("G"), gate_geometry_index, *p);
|
||||
define_terminal (device, db::DeviceClassMOS3Transistor::terminal_id_G, gate_geometry_index, *p);
|
||||
|
||||
// output the device for debugging
|
||||
device_out (device, rdiff2gate, rgate);
|
||||
|
|
|
|||
Loading…
Reference in New Issue