mirror of https://github.com/KLayout/klayout.git
WIP: BJT - don't place base and emitter terminals over each other.
This commit is contained in:
parent
8881851537
commit
847f60947d
|
|
@ -469,17 +469,35 @@ void NetlistDeviceExtractorBJT3Transistor::extract_devices (const std::vector<db
|
||||||
db::Region rbase (*p);
|
db::Region rbase (*p);
|
||||||
rbase.set_base_verbosity (rbases.base_verbosity ());
|
rbase.set_base_verbosity (rbases.base_verbosity ());
|
||||||
|
|
||||||
db::Region rcollector2base = rbase & rcollectors;
|
|
||||||
if (rcollector2base.empty ()) {
|
|
||||||
rcollector2base = rbase;
|
|
||||||
}
|
|
||||||
|
|
||||||
db::Region remitter2base = rbase & remitters;
|
db::Region remitter2base = rbase & remitters;
|
||||||
|
|
||||||
if (remitter2base.empty ()) {
|
if (remitter2base.empty ()) {
|
||||||
error (tl::to_string (tr ("Base shape without emitters - ignored")), *p);
|
error (tl::to_string (tr ("Base shape without emitters - ignored")), *p);
|
||||||
} else {
|
} 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 ab = dbu () * dbu () * p->area ();
|
||||||
double pb = dbu () * p->perimeter ();
|
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_AC, ac);
|
||||||
device->set_parameter_value (db::DeviceClassBJT3Transistor::param_id_PC, pc);
|
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_C, collector_terminal_geometry_index, rcollector);
|
||||||
define_terminal (device, db::DeviceClassBJT3Transistor::terminal_id_B, base_terminal_geometry_index, *p);
|
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);
|
define_terminal (device, db::DeviceClassBJT3Transistor::terminal_id_E, emitter_terminal_geometry_index, *pe);
|
||||||
|
|
||||||
// allow derived classes to modify the device
|
// allow derived classes to modify the device
|
||||||
modify_device (*p, layer_geometry, device);
|
modify_device (*p, layer_geometry, device);
|
||||||
|
|
||||||
// output the device for debugging
|
// output the device for debugging
|
||||||
device_out (device, rcollector2base, rbase, *pe);
|
device_out (device, rcollector, rbase, *pe);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue