WIP: BJT - don't place base and emitter terminals over each other.

This commit is contained in:
Matthias Koefferlein 2019-06-22 02:19:49 +02:00
parent 8881851537
commit 847f60947d
1 changed files with 26 additions and 8 deletions

View File

@ -469,17 +469,35 @@ void NetlistDeviceExtractorBJT3Transistor::extract_devices (const std::vector<db
db::Region rbase (*p);
rbase.set_base_verbosity (rbases.base_verbosity ());
db::Region rcollector2base = rbase & rcollectors;
if (rcollector2base.empty ()) {
rcollector2base = rbase;
}
db::Region remitter2base = rbase & remitters;
if (remitter2base.empty ()) {
error (tl::to_string (tr ("Base shape without emitters - ignored")), *p);
} else {
// collectors inside base
db::Region rcollector2base = rbase & rcollectors;
db::Region rcollector;
if (rcollector2base.empty ()) {
// collector is bulk (vertical)
rcollector2base = rbase;
rcollector = rbase;
} else if ((rbase - rcollector2base).empty ()) {
// vertical transistor: collector entirely covers base -> collector terminal is collector outside base
rcollector = rcollector2base - rbase;
} else {
// lateral transistor: base is reduced by collector area
rcollector = rcollector2base;
rbase -= rcollector2base;
}
// this is what is the true base contact
rbase -= remitter2base;
// emitter wins over collector for the collector contact
rcollector -= remitter2base;
double ab = dbu () * dbu () * p->area ();
double pb = dbu () * p->perimeter ();
@ -503,15 +521,15 @@ void NetlistDeviceExtractorBJT3Transistor::extract_devices (const std::vector<db
device->set_parameter_value (db::DeviceClassBJT3Transistor::param_id_AC, ac);
device->set_parameter_value (db::DeviceClassBJT3Transistor::param_id_PC, pc);
define_terminal (device, db::DeviceClassBJT3Transistor::terminal_id_C, collector_terminal_geometry_index, rcollector2base);
define_terminal (device, db::DeviceClassBJT3Transistor::terminal_id_B, base_terminal_geometry_index, *p);
define_terminal (device, db::DeviceClassBJT3Transistor::terminal_id_C, collector_terminal_geometry_index, rcollector);
define_terminal (device, db::DeviceClassBJT3Transistor::terminal_id_B, base_terminal_geometry_index, rbase);
define_terminal (device, db::DeviceClassBJT3Transistor::terminal_id_E, emitter_terminal_geometry_index, *pe);
// allow derived classes to modify the device
modify_device (*p, layer_geometry, device);
// output the device for debugging
device_out (device, rcollector2base, rbase, *pe);
device_out (device, rcollector, rbase, *pe);
}