mirror of https://github.com/KLayout/klayout.git
Enhancements for netlist tree view - deep hierarchy, no 'failing' terminals on ambiguous device terminals
This commit is contained in:
parent
6021a66c40
commit
aaa8352a40
|
|
@ -434,15 +434,39 @@ static std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalD
|
||||||
return std::make_pair (termrefs.first ? termrefs.first->terminal_def () : 0, termrefs.second ? termrefs.second->terminal_def () : 0);
|
return std::make_pair (termrefs.first ? termrefs.first->terminal_def () : 0, termrefs.second ? termrefs.second->terminal_def () : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> terminal_defs_from_device_classes (const std::pair<const db::DeviceClass *, const db::DeviceClass *> &device_classes, size_t terminal_id)
|
static std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> terminal_defs_from_device_classes (IndexedNetlistModel *model, const std::pair<const db::DeviceClass *, const db::DeviceClass *> &device_classes, const std::pair<const db::Device *, const db::Device *> &devices, size_t terminal_id)
|
||||||
{
|
{
|
||||||
const db::DeviceTerminalDefinition *td1 = 0, *td2 = 0;
|
const db::DeviceTerminalDefinition *td1 = 0, *td2 = 0;
|
||||||
if (device_classes.first && device_classes.first->terminal_definitions ().size () > terminal_id) {
|
if (device_classes.first && device_classes.first->terminal_definitions ().size () > terminal_id) {
|
||||||
td1 = &device_classes.first->terminal_definitions () [terminal_id];
|
td1 = &device_classes.first->terminal_definitions () [terminal_id];
|
||||||
}
|
}
|
||||||
if (device_classes.second && device_classes.second->terminal_definitions ().size () > terminal_id) {
|
|
||||||
td2 = &device_classes.second->terminal_definitions () [terminal_id];
|
if (device_classes.second) {
|
||||||
|
|
||||||
|
size_t second_terminal_id = terminal_id;
|
||||||
|
|
||||||
|
// Because of terminal swapping we need to look up the second terminal by looking for equivalent terminals which carry the corresponding net
|
||||||
|
if (td1 && devices.first && devices.second) {
|
||||||
|
|
||||||
|
size_t td1_id_norm = device_classes.first->normalize_terminal_id (td1->id ());
|
||||||
|
const db::Net *n2 = model->second_net_for (devices.first->net_for_terminal (terminal_id));
|
||||||
|
|
||||||
|
for (size_t i = 0; i < device_classes.second->terminal_definitions ().size (); ++i) {
|
||||||
|
const db::DeviceTerminalDefinition &td = device_classes.second->terminal_definitions () [i];
|
||||||
|
if (device_classes.second->normalize_terminal_id (td.id ()) == td1_id_norm) {
|
||||||
|
if (devices.second->net_for_terminal (i) == n2) {
|
||||||
|
second_terminal_id = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
td2 = &device_classes.second->terminal_definitions () [second_terminal_id];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::make_pair (td1, td2);
|
return std::make_pair (td1, td2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -511,91 +535,151 @@ static size_t rows_for (const db::NetTerminalRef *ref)
|
||||||
|
|
||||||
static QIcon icon_for_net ()
|
static QIcon icon_for_net ()
|
||||||
{
|
{
|
||||||
QIcon icon;
|
static QIcon icon;
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_48.png")));
|
if (icon.isNull ()) {
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_32.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_48.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_24.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_32.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_16.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_24.png")));
|
||||||
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_16.png")));
|
||||||
|
}
|
||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QIcon light_icon_for_net ()
|
static QIcon light_icon_for_net ()
|
||||||
{
|
{
|
||||||
QIcon icon;
|
static QIcon icon;
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_light_48.png")));
|
if (icon.isNull ()) {
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_light_32.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_light_48.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_light_24.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_light_32.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_light_16.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_light_24.png")));
|
||||||
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_net_light_16.png")));
|
||||||
|
}
|
||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QIcon icon_for_connection ()
|
static QIcon icon_for_connection ()
|
||||||
{
|
{
|
||||||
QIcon icon;
|
static QIcon icon;
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_48.png")));
|
if (icon.isNull ()) {
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_32.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_48.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_24.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_32.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_16.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_24.png")));
|
||||||
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_16.png")));
|
||||||
|
}
|
||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QIcon light_icon_for_connection ()
|
static QIcon light_icon_for_connection ()
|
||||||
{
|
{
|
||||||
QIcon icon;
|
static QIcon icon;
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_light_48.png")));
|
if (icon.isNull ()) {
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_light_32.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_light_48.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_light_24.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_light_32.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_light_16.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_light_24.png")));
|
||||||
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_conn_light_16.png")));
|
||||||
|
}
|
||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QIcon icon_for_pin ()
|
static QIcon icon_for_pin ()
|
||||||
{
|
{
|
||||||
QIcon icon;
|
static QIcon icon;
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_pin_48.png")));
|
if (icon.isNull ()) {
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_pin_32.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_pin_48.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_pin_24.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_pin_32.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_pin_16.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_pin_24.png")));
|
||||||
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_pin_16.png")));
|
||||||
|
}
|
||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QIcon icon_for_device (const db::DeviceClass *dc)
|
static QIcon icon_for_device (const db::DeviceClass *dc, size_t term_id = 0)
|
||||||
{
|
{
|
||||||
QIcon icon;
|
static QIcon icon_for_res;
|
||||||
// TODO: inductor, generic device ...
|
static QIcon icon_for_ind;
|
||||||
if (dynamic_cast<const db::DeviceClassResistor *> (dc)) {
|
static QIcon icon_for_cap;
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_48.png")));
|
static QIcon icons_for_diode[2];
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_32.png")));
|
static QIcon icons_for_bjt[4];
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_24.png")));
|
static QIcon icons_for_mos[4];
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_16.png")));
|
|
||||||
} else if (dynamic_cast<const db::DeviceClassInductor *> (dc)) {
|
if (icon_for_res.isNull ()) {
|
||||||
// fake ...
|
icon_for_res.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_48.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_48.png")));
|
icon_for_res.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_32.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_32.png")));
|
icon_for_res.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_24.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_24.png")));
|
icon_for_res.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_16.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_16.png")));
|
}
|
||||||
} else if (dynamic_cast<const db::DeviceClassCapacitor *> (dc)) {
|
if (icon_for_ind.isNull ()) {
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_cap_48.png")));
|
// fake ...
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_cap_32.png")));
|
icon_for_ind.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_48.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_cap_24.png")));
|
icon_for_ind.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_32.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_cap_16.png")));
|
icon_for_ind.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_24.png")));
|
||||||
} else if (dynamic_cast<const db::DeviceClassDiode *> (dc)) {
|
icon_for_ind.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_16.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_diode_48.png")));
|
}
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_diode_32.png")));
|
if (icon_for_cap.isNull ()) {
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_diode_24.png")));
|
icon_for_cap.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_cap_48.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_diode_16.png")));
|
icon_for_cap.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_cap_32.png")));
|
||||||
} else if (dynamic_cast<const db::DeviceClassBJT3Transistor *> (dc)) {
|
icon_for_cap.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_cap_24.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_bjt_48.png")));
|
icon_for_cap.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_cap_16.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_bjt_32.png")));
|
}
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_bjt_24.png")));
|
if (icons_for_diode[0].isNull ()) {
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_bjt_16.png")));
|
QImage i48 (QString::fromUtf8 (":/images/icon_device_diode_48.png"));
|
||||||
} else {
|
QImage i32 (QString::fromUtf8 (":/images/icon_device_diode_32.png"));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_mos_48.png")));
|
QImage i24 (QString::fromUtf8 (":/images/icon_device_diode_24.png"));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_mos_32.png")));
|
QImage i16 (QString::fromUtf8 (":/images/icon_device_diode_16.png"));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_mos_24.png")));
|
QTransform tr;
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_mos_16.png")));
|
for (size_t i = 0; i < sizeof (icons_for_diode) / sizeof (icons_for_diode [0]); ++i) {
|
||||||
|
icons_for_diode[i].addPixmap (QPixmap::fromImage (i48.transformed (tr)));
|
||||||
|
icons_for_diode[i].addPixmap (QPixmap::fromImage (i32.transformed (tr)));
|
||||||
|
icons_for_diode[i].addPixmap (QPixmap::fromImage (i24.transformed (tr)));
|
||||||
|
icons_for_diode[i].addPixmap (QPixmap::fromImage (i16.transformed (tr)));
|
||||||
|
tr.rotate (180.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (icons_for_bjt[0].isNull ()) {
|
||||||
|
QImage i48 (QString::fromUtf8 (":/images/icon_device_bjt_48.png"));
|
||||||
|
QImage i32 (QString::fromUtf8 (":/images/icon_device_bjt_32.png"));
|
||||||
|
QImage i24 (QString::fromUtf8 (":/images/icon_device_bjt_24.png"));
|
||||||
|
QImage i16 (QString::fromUtf8 (":/images/icon_device_bjt_16.png"));
|
||||||
|
QTransform tr;
|
||||||
|
for (size_t i = 0; i < sizeof (icons_for_bjt) / sizeof (icons_for_bjt [0]); ++i) {
|
||||||
|
icons_for_bjt[i].addPixmap (QPixmap::fromImage (i48.transformed (tr)));
|
||||||
|
icons_for_bjt[i].addPixmap (QPixmap::fromImage (i32.transformed (tr)));
|
||||||
|
icons_for_bjt[i].addPixmap (QPixmap::fromImage (i24.transformed (tr)));
|
||||||
|
icons_for_bjt[i].addPixmap (QPixmap::fromImage (i16.transformed (tr)));
|
||||||
|
tr.rotate (90.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (icons_for_mos[0].isNull ()) {
|
||||||
|
QImage i48 (QString::fromUtf8 (":/images/icon_device_mos_48.png"));
|
||||||
|
QImage i32 (QString::fromUtf8 (":/images/icon_device_mos_32.png"));
|
||||||
|
QImage i24 (QString::fromUtf8 (":/images/icon_device_mos_24.png"));
|
||||||
|
QImage i16 (QString::fromUtf8 (":/images/icon_device_mos_16.png"));
|
||||||
|
QTransform tr;
|
||||||
|
for (size_t i = 0; i < sizeof (icons_for_mos) / sizeof (icons_for_mos [0]); ++i) {
|
||||||
|
icons_for_mos[i].addPixmap (QPixmap::fromImage (i48.transformed (tr)));
|
||||||
|
icons_for_mos[i].addPixmap (QPixmap::fromImage (i32.transformed (tr)));
|
||||||
|
icons_for_mos[i].addPixmap (QPixmap::fromImage (i24.transformed (tr)));
|
||||||
|
icons_for_mos[i].addPixmap (QPixmap::fromImage (i16.transformed (tr)));
|
||||||
|
tr.rotate (90.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: generic device ...
|
||||||
|
if (dynamic_cast<const db::DeviceClassResistor *> (dc)) {
|
||||||
|
return icon_for_res;
|
||||||
|
} else if (dynamic_cast<const db::DeviceClassInductor *> (dc)) {
|
||||||
|
return icon_for_ind;
|
||||||
|
} else if (dynamic_cast<const db::DeviceClassCapacitor *> (dc)) {
|
||||||
|
return icon_for_cap;
|
||||||
|
} else if (dynamic_cast<const db::DeviceClassDiode *> (dc)) {
|
||||||
|
return icons_for_diode [term_id >= sizeof (icons_for_diode) / sizeof (icons_for_diode [0]) ? sizeof (icons_for_diode) / sizeof (icons_for_diode [0]) - 1 : term_id];
|
||||||
|
} else if (dynamic_cast<const db::DeviceClassBJT3Transistor *> (dc) || dynamic_cast<const db::DeviceClassBJT4Transistor *> (dc)) {
|
||||||
|
return icons_for_bjt [term_id >= sizeof (icons_for_bjt) / sizeof (icons_for_bjt [0]) ? sizeof (icons_for_bjt) / sizeof (icons_for_bjt [0]) - 1 : term_id];
|
||||||
|
} else if (dynamic_cast<const db::DeviceClassMOS3Transistor *> (dc) || dynamic_cast<const db::DeviceClassMOS4Transistor *> (dc)) {
|
||||||
|
return icons_for_mos [term_id >= sizeof (icons_for_mos) / sizeof (icons_for_mos [0]) ? sizeof (icons_for_mos) / sizeof (icons_for_mos [0]) - 1 : term_id];
|
||||||
|
} else {
|
||||||
|
return icons_for_mos [0];
|
||||||
}
|
}
|
||||||
return icon;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static QIcon icon_for_devices (const std::pair<const db::DeviceClass *, const db::DeviceClass *> &device_classes)
|
static QIcon icon_for_devices (const std::pair<const db::DeviceClass *, const db::DeviceClass *> &device_classes)
|
||||||
|
|
@ -603,13 +687,35 @@ static QIcon icon_for_devices (const std::pair<const db::DeviceClass *, const db
|
||||||
return icon_for_device (device_classes.first ? device_classes.first : device_classes.second);
|
return icon_for_device (device_classes.first ? device_classes.first : device_classes.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QIcon icon_for_devices (const std::pair<const db::DeviceClass *, const db::DeviceClass *> &device_classes,
|
||||||
|
const std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> &terminal_defs)
|
||||||
|
{
|
||||||
|
return icon_for_device (device_classes.first ? device_classes.first : device_classes.second, terminal_defs.first ? terminal_defs.first->id () : (terminal_defs.second ? terminal_defs.second->id () : 0));
|
||||||
|
}
|
||||||
|
|
||||||
static QIcon icon_for_circuit ()
|
static QIcon icon_for_circuit ()
|
||||||
{
|
{
|
||||||
QIcon icon;
|
static QIcon icon;
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_circuit_48.png")));
|
if (icon.isNull ()) {
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_circuit_32.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_circuit_48.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_circuit_24.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_circuit_32.png")));
|
||||||
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_circuit_16.png")));
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_circuit_24.png")));
|
||||||
|
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_circuit_16.png")));
|
||||||
|
}
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
static QIcon icon_for_subcircuit ()
|
||||||
|
{
|
||||||
|
static QIcon icon;
|
||||||
|
if (icon.isNull ()) {
|
||||||
|
QTransform tr;
|
||||||
|
tr.rotate (90.0);
|
||||||
|
icon.addPixmap (QPixmap::fromImage (QImage (QString::fromUtf8 (":/images/icon_circuit_48.png"))).transformed (tr));
|
||||||
|
icon.addPixmap (QPixmap::fromImage (QImage (QString::fromUtf8 (":/images/icon_circuit_32.png"))).transformed (tr));
|
||||||
|
icon.addPixmap (QPixmap::fromImage (QImage (QString::fromUtf8 (":/images/icon_circuit_24.png"))).transformed (tr));
|
||||||
|
icon.addPixmap (QPixmap::fromImage (QImage (QString::fromUtf8 (":/images/icon_circuit_16.png"))).transformed (tr));
|
||||||
|
}
|
||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -812,7 +918,7 @@ public:
|
||||||
return p->pp ();
|
return p->pp ();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::pair<const db::Net *, const db::Net *> nets ()
|
virtual std::pair<const db::Net *, const db::Net *> nets_of_this ()
|
||||||
{
|
{
|
||||||
return m_np;
|
return m_np;
|
||||||
}
|
}
|
||||||
|
|
@ -841,7 +947,7 @@ public:
|
||||||
return m_np;
|
return m_np;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::pair<const db::Net *, const db::Net *> nets ()
|
virtual std::pair<const db::Net *, const db::Net *> nets_of_this ()
|
||||||
{
|
{
|
||||||
return m_np;
|
return m_np;
|
||||||
}
|
}
|
||||||
|
|
@ -896,7 +1002,7 @@ class CircuitNetDeviceTerminalOthersItemData
|
||||||
: public NetlistModelItemData
|
: public NetlistModelItemData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CircuitNetDeviceTerminalOthersItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_pair &np, const std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> &tp);
|
CircuitNetDeviceTerminalOthersItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_pair &np, const std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> &tp, bool is_self);
|
||||||
|
|
||||||
virtual void do_ensure_children (NetlistBrowserModel *);
|
virtual void do_ensure_children (NetlistBrowserModel *);
|
||||||
virtual QIcon icon (NetlistBrowserModel *model);
|
virtual QIcon icon (NetlistBrowserModel *model);
|
||||||
|
|
@ -911,7 +1017,7 @@ public:
|
||||||
return p->dp ();
|
return p->dp ();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::pair<const db::Net *, const db::Net *> nets ()
|
virtual std::pair<const db::Net *, const db::Net *> nets_of_this ()
|
||||||
{
|
{
|
||||||
return m_np;
|
return m_np;
|
||||||
}
|
}
|
||||||
|
|
@ -919,6 +1025,7 @@ public:
|
||||||
private:
|
private:
|
||||||
std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> m_tp;
|
std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> m_tp;
|
||||||
IndexedNetlistModel::net_pair m_np;
|
IndexedNetlistModel::net_pair m_np;
|
||||||
|
bool m_net_seen;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
@ -973,7 +1080,7 @@ class CircuitNetSubCircuitPinOthersItemData
|
||||||
: public NetlistModelItemData
|
: public NetlistModelItemData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CircuitNetSubCircuitPinOthersItemData (NetlistModelItemData *parent, const IndexedNetlistModel::pin_pair &pp);
|
CircuitNetSubCircuitPinOthersItemData (NetlistModelItemData *parent, const IndexedNetlistModel::pin_pair &pp, bool is_self);
|
||||||
|
|
||||||
virtual void do_ensure_children (NetlistBrowserModel *);
|
virtual void do_ensure_children (NetlistBrowserModel *);
|
||||||
virtual QIcon icon (NetlistBrowserModel *model);
|
virtual QIcon icon (NetlistBrowserModel *model);
|
||||||
|
|
@ -1001,6 +1108,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
IndexedNetlistModel::pin_pair m_pp;
|
IndexedNetlistModel::pin_pair m_pp;
|
||||||
|
bool m_net_seen;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
@ -1217,10 +1325,33 @@ NetlistModelItemData::subcircuits ()
|
||||||
return mp_parent ? mp_parent->subcircuits () : std::pair<const db::SubCircuit *, const db::SubCircuit *> (0, 0);
|
return mp_parent ? mp_parent->subcircuits () : std::pair<const db::SubCircuit *, const db::SubCircuit *> (0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::pair<const db::Net *, const db::Net *>
|
||||||
|
NetlistModelItemData::nets_of_this ()
|
||||||
|
{
|
||||||
|
return std::pair<const db::Net *, const db::Net *> (0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
std::pair<const db::Net *, const db::Net *>
|
std::pair<const db::Net *, const db::Net *>
|
||||||
NetlistModelItemData::nets ()
|
NetlistModelItemData::nets ()
|
||||||
{
|
{
|
||||||
return mp_parent ? mp_parent->nets () : std::pair<const db::Net *, const db::Net *> (0, 0);
|
std::pair<const db::Net *, const db::Net *> r = nets_of_this ();
|
||||||
|
if (! mp_parent || r.first || r.second) {
|
||||||
|
return r;
|
||||||
|
} else {
|
||||||
|
return mp_parent->nets ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
NetlistModelItemData::derived_from_nets (const std::pair<const db::Net *, const db::Net *> &np)
|
||||||
|
{
|
||||||
|
if (nets_of_this () == np) {
|
||||||
|
return true;
|
||||||
|
} else if (mp_parent) {
|
||||||
|
return mp_parent->derived_from_nets (np);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
@ -1683,14 +1814,14 @@ CircuitNetDeviceTerminalItemData::CircuitNetDeviceTerminalItemData (NetlistModel
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
void
|
void
|
||||||
CircuitNetDeviceTerminalItemData::do_ensure_children (NetlistBrowserModel * /*model*/)
|
CircuitNetDeviceTerminalItemData::do_ensure_children (NetlistBrowserModel *model)
|
||||||
{
|
{
|
||||||
size_t n = std::max (rows_for (m_tp.first), rows_for (m_tp.second));
|
size_t n = std::max (rows_for (m_tp.first), rows_for (m_tp.second));
|
||||||
for (size_t i = 0; i < n; ++i) {
|
for (size_t i = 0; i < n; ++i) {
|
||||||
std::pair<const db::DeviceClass *, const db::DeviceClass *> device_classes = device_classes_from_devices (dp ());
|
std::pair<const db::DeviceClass *, const db::DeviceClass *> device_classes = device_classes_from_devices (dp ());
|
||||||
std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> termdefs = terminal_defs_from_device_classes (device_classes, i);
|
std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> termdefs = terminal_defs_from_device_classes (model->indexer (), device_classes, dp (), i);
|
||||||
IndexedNetlistModel::net_pair nets = nets_from_device_terminals (dp (), termdefs);
|
IndexedNetlistModel::net_pair nets = nets_from_device_terminals (dp (), termdefs);
|
||||||
push_back (new CircuitNetDeviceTerminalOthersItemData (this, nets, termdefs));
|
push_back (new CircuitNetDeviceTerminalOthersItemData (this, nets, termdefs, derived_from_nets (nets)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1698,7 +1829,7 @@ QIcon
|
||||||
CircuitNetDeviceTerminalItemData::icon (NetlistBrowserModel * /*model*/)
|
CircuitNetDeviceTerminalItemData::icon (NetlistBrowserModel * /*model*/)
|
||||||
{
|
{
|
||||||
std::pair<const db::DeviceClass *, const db::DeviceClass *> device_classes = device_classes_from_devices (dp ());
|
std::pair<const db::DeviceClass *, const db::DeviceClass *> device_classes = device_classes_from_devices (dp ());
|
||||||
return icon_for_devices (device_classes);
|
return icon_for_devices (device_classes, terminal_defs_from_terminal_refs (m_tp));
|
||||||
}
|
}
|
||||||
|
|
||||||
QString
|
QString
|
||||||
|
|
@ -1744,14 +1875,16 @@ CircuitNetDeviceTerminalItemData::status (NetlistBrowserModel *model)
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
CircuitNetDeviceTerminalOthersItemData::CircuitNetDeviceTerminalOthersItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_pair &np, const std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> &tp)
|
CircuitNetDeviceTerminalOthersItemData::CircuitNetDeviceTerminalOthersItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_pair &np, const std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> &tp, bool net_seen)
|
||||||
: NetlistModelItemData (parent), m_tp (tp), m_np (np)
|
: NetlistModelItemData (parent), m_tp (tp), m_np (np), m_net_seen (net_seen)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
void
|
void
|
||||||
CircuitNetDeviceTerminalOthersItemData::do_ensure_children (NetlistBrowserModel *)
|
CircuitNetDeviceTerminalOthersItemData::do_ensure_children (NetlistBrowserModel *)
|
||||||
{
|
{
|
||||||
// nothing (leaf node)
|
if (! m_net_seen) {
|
||||||
|
push_back (new CircuitNetItemData (this, nets_from_device_terminals (dp (), m_tp)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QIcon
|
QIcon
|
||||||
|
|
@ -1766,7 +1899,7 @@ CircuitNetDeviceTerminalOthersItemData::text (int column, NetlistBrowserModel *m
|
||||||
// circuit/net/device terminal/more: header column = terminal name, second column = net link
|
// circuit/net/device terminal/more: header column = terminal name, second column = net link
|
||||||
if (column == model->object_column ()) {
|
if (column == model->object_column ()) {
|
||||||
|
|
||||||
return escaped (str_from_names (m_tp, model->indexer ()->is_single ()));
|
return escaped (str_from_names (m_tp, model->indexer ()->is_single ())) + (m_net_seen ? tr (" (already seen)") : QString ());
|
||||||
|
|
||||||
} else if (column == model->first_column () || column == model->second_column ()) {
|
} else if (column == model->first_column () || column == model->second_column ()) {
|
||||||
|
|
||||||
|
|
@ -1817,14 +1950,15 @@ CircuitNetSubCircuitPinItemData::do_ensure_children (NetlistBrowserModel *model)
|
||||||
size_t n = model->indexer ()->pin_count (circuit_refs);
|
size_t n = model->indexer ()->pin_count (circuit_refs);
|
||||||
for (size_t i = 0; i < n; ++i) {
|
for (size_t i = 0; i < n; ++i) {
|
||||||
IndexedNetlistModel::pin_pair pp = model->indexer ()->pin_from_index (circuit_refs, i).first;
|
IndexedNetlistModel::pin_pair pp = model->indexer ()->pin_from_index (circuit_refs, i).first;
|
||||||
push_back (new CircuitNetSubCircuitPinOthersItemData (this, pp));
|
bool is_seen = derived_from_nets (nets_from_subcircuit_pins (subcircuits, pp));
|
||||||
|
push_back (new CircuitNetSubCircuitPinOthersItemData (this, pp, is_seen));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QIcon
|
QIcon
|
||||||
CircuitNetSubCircuitPinItemData::icon (NetlistBrowserModel * /*model*/)
|
CircuitNetSubCircuitPinItemData::icon (NetlistBrowserModel * /*model*/)
|
||||||
{
|
{
|
||||||
return icon_for_pin ();
|
return icon_for_subcircuit ();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString
|
QString
|
||||||
|
|
@ -1867,14 +2001,19 @@ CircuitNetSubCircuitPinItemData::status (NetlistBrowserModel *model)
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
CircuitNetSubCircuitPinOthersItemData::CircuitNetSubCircuitPinOthersItemData (NetlistModelItemData *parent, const IndexedNetlistModel::pin_pair &pp)
|
CircuitNetSubCircuitPinOthersItemData::CircuitNetSubCircuitPinOthersItemData (NetlistModelItemData *parent, const IndexedNetlistModel::pin_pair &pp, bool net_seen)
|
||||||
: NetlistModelItemData (parent), m_pp (pp)
|
: NetlistModelItemData (parent), m_pp (pp), m_net_seen (net_seen)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
void
|
void
|
||||||
CircuitNetSubCircuitPinOthersItemData::do_ensure_children (NetlistBrowserModel *)
|
CircuitNetSubCircuitPinOthersItemData::do_ensure_children (NetlistBrowserModel *)
|
||||||
{
|
{
|
||||||
// nothing (leaf node)
|
if (! m_net_seen) {
|
||||||
|
IndexedNetlistModel::subcircuit_pair subcircuits = subcircuits_from_pinrefs (sp ());
|
||||||
|
IndexedNetlistModel::circuit_pair circuit_refs = circuit_refs_from_subcircuits (subcircuits);
|
||||||
|
IndexedNetlistModel::net_pair nets = nets_from_circuit_pins (circuit_refs, m_pp);
|
||||||
|
push_back (new CircuitNetItemData (this, nets));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QIcon
|
QIcon
|
||||||
|
|
@ -1892,7 +2031,7 @@ CircuitNetSubCircuitPinOthersItemData::text (int column, NetlistBrowserModel *mo
|
||||||
IndexedNetlistModel::circuit_pair circuit_refs = circuit_refs_from_subcircuits (subcircuits);
|
IndexedNetlistModel::circuit_pair circuit_refs = circuit_refs_from_subcircuits (subcircuits);
|
||||||
|
|
||||||
if (column == model->object_column ()) {
|
if (column == model->object_column ()) {
|
||||||
return model->make_link_to (m_pp, circuit_refs);
|
return model->make_link_to (m_pp, circuit_refs) + (m_net_seen ? tr (" (already seen)") : QString ());
|
||||||
} else if (column == model->first_column () || column == model->second_column ()) {
|
} else if (column == model->first_column () || column == model->second_column ()) {
|
||||||
return model->make_link_to (nets_from_subcircuit_pins (subcircuits, m_pp), column);
|
return model->make_link_to (nets_from_subcircuit_pins (subcircuits, m_pp), column);
|
||||||
}
|
}
|
||||||
|
|
@ -2056,7 +2195,8 @@ CircuitSubCircuitPinItemData::CircuitSubCircuitPinItemData (NetlistModelItemData
|
||||||
void
|
void
|
||||||
CircuitSubCircuitPinItemData::do_ensure_children (NetlistBrowserModel *)
|
CircuitSubCircuitPinItemData::do_ensure_children (NetlistBrowserModel *)
|
||||||
{
|
{
|
||||||
// nothing (leaf node)
|
IndexedNetlistModel::net_pair nets = nets_from_subcircuit_pins (sp (), m_pp);
|
||||||
|
push_back (new CircuitNetItemData (this, nets));
|
||||||
}
|
}
|
||||||
|
|
||||||
QIcon
|
QIcon
|
||||||
|
|
@ -2132,11 +2272,11 @@ CircuitDeviceItemData::CircuitDeviceItemData (NetlistModelItemData *parent, cons
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
void
|
void
|
||||||
CircuitDeviceItemData::do_ensure_children (NetlistBrowserModel * /*model*/)
|
CircuitDeviceItemData::do_ensure_children (NetlistBrowserModel *model)
|
||||||
{
|
{
|
||||||
size_t n = std::max (rows_for (dp ().first), rows_for (dp ().second));
|
size_t n = std::max (rows_for (dp ().first), rows_for (dp ().second));
|
||||||
for (size_t i = 0; i < n; ++i) {
|
for (size_t i = 0; i < n; ++i) {
|
||||||
std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> tp = terminal_defs_from_device_classes (device_classes_from_devices (dp ()), i);
|
std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> tp = terminal_defs_from_device_classes (model->indexer (), device_classes_from_devices (dp ()), dp (), i);
|
||||||
push_back (new CircuitDeviceTerminalItemData (this, tp));
|
push_back (new CircuitDeviceTerminalItemData (this, tp));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2205,7 +2345,8 @@ CircuitDeviceTerminalItemData::CircuitDeviceTerminalItemData (NetlistModelItemDa
|
||||||
void
|
void
|
||||||
CircuitDeviceTerminalItemData::do_ensure_children (NetlistBrowserModel *)
|
CircuitDeviceTerminalItemData::do_ensure_children (NetlistBrowserModel *)
|
||||||
{
|
{
|
||||||
// nothing (leaf node)
|
IndexedNetlistModel::net_pair nets = nets_from_device_terminals (dp (), m_tp);
|
||||||
|
push_back (new CircuitNetItemData (this, nets));
|
||||||
}
|
}
|
||||||
|
|
||||||
QIcon
|
QIcon
|
||||||
|
|
@ -2846,6 +2987,8 @@ NetlistBrowserModel::rowCount (const QModelIndex &parent) const
|
||||||
if (d) {
|
if (d) {
|
||||||
d->ensure_children (const_cast<NetlistBrowserModel *> (this));
|
d->ensure_children (const_cast<NetlistBrowserModel *> (this));
|
||||||
return int (d->child_count ());
|
return int (d->child_count ());
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -150,7 +150,10 @@ public:
|
||||||
virtual std::pair<const db::Device *, const db::Device *> devices ();
|
virtual std::pair<const db::Device *, const db::Device *> devices ();
|
||||||
virtual std::pair<const db::Pin *, const db::Pin *> pins ();
|
virtual std::pair<const db::Pin *, const db::Pin *> pins ();
|
||||||
virtual std::pair<const db::SubCircuit *, const db::SubCircuit *> subcircuits ();
|
virtual std::pair<const db::SubCircuit *, const db::SubCircuit *> subcircuits ();
|
||||||
virtual std::pair<const db::Net *, const db::Net *> nets ();
|
virtual std::pair<const db::Net *, const db::Net *> nets_of_this ();
|
||||||
|
|
||||||
|
std::pair<const db::Net *, const db::Net *> nets ();
|
||||||
|
bool derived_from_nets (const std::pair<const db::Net *, const db::Net *> &np);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NetlistModelItemData *mp_parent;
|
NetlistModelItemData *mp_parent;
|
||||||
|
|
|
||||||
|
|
@ -142,7 +142,8 @@ NetlistBrowserPage::NetlistBrowserPage (QWidget * /*parent*/)
|
||||||
QAction *sep;
|
QAction *sep;
|
||||||
directory_tree->addAction (m_show_all_action);
|
directory_tree->addAction (m_show_all_action);
|
||||||
directory_tree->addAction (actionCollapseAll);
|
directory_tree->addAction (actionCollapseAll);
|
||||||
directory_tree->addAction (actionExpandAll);
|
// TODO: this gives a too big tree - confine to single branches?
|
||||||
|
// directory_tree->addAction (actionExpandAll);
|
||||||
sep = new QAction (directory_tree);
|
sep = new QAction (directory_tree);
|
||||||
sep->setSeparator (true);
|
sep->setSeparator (true);
|
||||||
directory_tree->addAction (sep);
|
directory_tree->addAction (sep);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue