WIP: tests for specialized device classes and device combination

This commit is contained in:
Matthias Koefferlein 2018-12-29 22:58:29 +01:00
parent 45b35f3aae
commit 44b5b2742e
4 changed files with 1048 additions and 15 deletions

View File

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

View File

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

View File

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