diff --git a/src/laybasic/laybasic/layNetlistBrowserModel.cc b/src/laybasic/laybasic/layNetlistBrowserModel.cc index f1c7ec0bb..142674903 100644 --- a/src/laybasic/laybasic/layNetlistBrowserModel.cc +++ b/src/laybasic/laybasic/layNetlistBrowserModel.cc @@ -899,71 +899,6 @@ private: // ---------------------------------------------------------------------------------- -class CircuitPinItemData - : public NetlistModelItemData -{ -public: - CircuitPinItemData (NetlistModelItemData *parent, const IndexedNetlistModel::pin_pair &pp); - - virtual void do_ensure_children (NetlistBrowserModel * /*model*/); - virtual QIcon icon (NetlistBrowserModel *model); - virtual QString text (int column, NetlistBrowserModel *model); - virtual QString search_text (); - virtual std::string tooltip (NetlistBrowserModel *model); - virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); - - const IndexedNetlistModel::pin_pair &pp () - { - return m_pp; - } - - virtual std::pair pins_of_this () - { - return pp (); - } - - virtual std::pair nets_of_this () - { - return nets_from_circuit_pins (circuits (), pins_of_this ()); - } - -private: - IndexedNetlistModel::pin_pair m_pp; - bool m_pin_seen; -}; - -// ---------------------------------------------------------------------------------- - -class CircuitPinNetItemData - : public NetlistModelItemData -{ -public: - CircuitPinNetItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_pair &np); - - virtual void do_ensure_children (NetlistBrowserModel *model); - virtual QIcon icon (NetlistBrowserModel *model); - virtual QString text (int column, NetlistBrowserModel *model); - virtual QString search_text (); - virtual std::string tooltip (NetlistBrowserModel *model); - virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); - - const IndexedNetlistModel::pin_pair &pp () - { - CircuitPinItemData *p = static_cast (parent ()); - return p->pp (); - } - - virtual std::pair nets_of_this () - { - return m_np; - } - -private: - IndexedNetlistModel::net_pair m_np; -}; - -// ---------------------------------------------------------------------------------- - class CircuitNetItemData : public NetlistModelItemData { @@ -987,8 +922,14 @@ public: return m_np; } + bool seen () const + { + return m_seen; + } + private: IndexedNetlistModel::net_pair m_np; + bool m_seen; }; // ---------------------------------------------------------------------------------- @@ -1035,28 +976,18 @@ private: // ---------------------------------------------------------------------------------- class CircuitNetDeviceTerminalOthersItemData - : public NetlistModelItemData + : public CircuitNetItemData { public: - CircuitNetDeviceTerminalOthersItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_pair &np, const std::pair &tp, bool is_self); + CircuitNetDeviceTerminalOthersItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_pair &np, const std::pair &tp); - virtual void do_ensure_children (NetlistBrowserModel *); virtual QIcon icon (NetlistBrowserModel *model); virtual QString text (int column, NetlistBrowserModel *model); virtual QString search_text (); - virtual std::string tooltip (NetlistBrowserModel *model); - virtual db::NetlistCrossReference::Status status (NetlistBrowserModel * /*model*/); - - IndexedNetlistModel::device_pair dp () - { - CircuitNetDeviceTerminalItemData *p = static_cast (parent ()); - return p->dp (); - } private: std::pair m_tp; IndexedNetlistModel::net_pair m_np; - bool m_net_seen; }; // ---------------------------------------------------------------------------------- @@ -1162,6 +1093,55 @@ private: // ---------------------------------------------------------------------------------- +class CircuitPinItemData + : public CircuitNetItemData +{ +public: + CircuitPinItemData (NetlistModelItemData *parent, const IndexedNetlistModel::pin_pair &pp); + + virtual QIcon icon (NetlistBrowserModel *model); + + virtual std::pair pins_of_this () + { + return m_pp; + } + +private: + IndexedNetlistModel::pin_pair m_pp; +}; + +// ---------------------------------------------------------------------------------- + +// @@@ TODO: remove? +class CircuitPinNetItemData + : public NetlistModelItemData +{ +public: + CircuitPinNetItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_pair &np); + + virtual void do_ensure_children (NetlistBrowserModel *model); + virtual QIcon icon (NetlistBrowserModel *model); + virtual QString text (int column, NetlistBrowserModel *model); + virtual QString search_text (); + virtual std::string tooltip (NetlistBrowserModel *model); + virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); + + IndexedNetlistModel::pin_pair pp () + { + return pins (); + } + + virtual std::pair nets_of_this () + { + return m_np; + } + +private: + IndexedNetlistModel::net_pair m_np; +}; + +// ---------------------------------------------------------------------------------- + class CircuitSubCircuitPinsItemData : public NetlistModelItemData { @@ -1187,17 +1167,14 @@ private: // ---------------------------------------------------------------------------------- class CircuitSubCircuitPinItemData - : public NetlistModelItemData + : public CircuitNetItemData { public: CircuitSubCircuitPinItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_subcircuit_pin_pair &pp); - virtual void do_ensure_children (NetlistBrowserModel *); virtual QIcon icon (NetlistBrowserModel *model); virtual QString text (int column, NetlistBrowserModel *model); virtual QString search_text (); - virtual std::string tooltip (NetlistBrowserModel *model); - virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); IndexedNetlistModel::subcircuit_pair sp () { @@ -1209,11 +1186,6 @@ public: return pins_from_netrefs (m_pp); } - virtual std::pair nets_of_this () - { - return nets_from_pinrefs (m_pp); - } - private: IndexedNetlistModel::net_subcircuit_pin_pair m_pp; }; @@ -1250,22 +1222,14 @@ private: // ---------------------------------------------------------------------------------- class CircuitDeviceTerminalItemData - : public NetlistModelItemData + : public CircuitNetItemData { public: CircuitDeviceTerminalItemData (NetlistModelItemData *parent, const std::pair &tp); - virtual void do_ensure_children (NetlistBrowserModel *); virtual QIcon icon (NetlistBrowserModel *model); virtual QString text (int column, NetlistBrowserModel *model); virtual QString search_text (); - virtual std::string tooltip (NetlistBrowserModel *model); - virtual db::NetlistCrossReference::Status status (NetlistBrowserModel * /*model*/); - - virtual std::pair nets_of_this () - { - return nets_from_device_terminals (devices (), m_tp); - } private: std::pair m_tp; @@ -1817,63 +1781,17 @@ CircuitItemNodeData::circuit_subcircuit_item (NetlistBrowserModel *model, const // ---------------------------------------------------------------------------------- CircuitPinItemData::CircuitPinItemData (NetlistModelItemData *parent, const IndexedNetlistModel::pin_pair &pp) - : NetlistModelItemData (parent), m_pp (pp), m_pin_seen (parent && parent->derived_from_pins (pp)) + : CircuitNetItemData (parent, nets_from_circuit_pins (parent->circuits (), pp)), + m_pp (pp) { } -void -CircuitPinItemData::do_ensure_children (NetlistBrowserModel * /*model*/) -{ - if (! m_pin_seen) { - push_back (new CircuitNetItemData (this, nets_from_circuit_pins (circuits (), pp ()))); - } -} - QIcon CircuitPinItemData::icon (NetlistBrowserModel * /*model*/) { return icon_for_pin (); } -QString -CircuitPinItemData::text (int column, NetlistBrowserModel *model) -{ - // pin: - // + single mode: xname | | - // + dual mode: xname(a)/xname(b) | xname(a) | xname(b) - if (column == model->object_column ()) { - std::string suffix; - if (m_pin_seen) { - suffix = tl::to_string (tr (" (already seen)")); - } - return escaped (str_from_expanded_names (pp (), model->indexer ()->is_single ()) + suffix); - } else if (!model->indexer ()->is_single () && (column == model->first_column () || column == model->second_column ())) { - return escaped (str_from_expanded_name (column == model->first_column () ? pp ().first : pp ().second)); - } - - return QString (); -} - -QString -CircuitPinItemData::search_text () -{ - return tl::to_qstring (search_string_from_expanded_names (pp ())); -} - -std::string -CircuitPinItemData::tooltip (NetlistBrowserModel *model) -{ - size_t index = model->indexer ()->pin_index (pp (), circuits ()); - return model->indexer ()->pin_status_hint (circuits (), index); -} - -db::NetlistCrossReference::Status -CircuitPinItemData::status (NetlistBrowserModel *model) -{ - size_t index = model->indexer ()->pin_index (pp (), circuits ()); - return model->indexer ()->pin_from_index (circuits (), index).second; -} - // ---------------------------------------------------------------------------------- // @@@ remove? @@ -1927,12 +1845,17 @@ CircuitPinNetItemData::status (NetlistBrowserModel * /*model*/) // ---------------------------------------------------------------------------------- CircuitNetItemData::CircuitNetItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_pair &np) - : NetlistModelItemData (parent), m_np (np) + : NetlistModelItemData (parent), m_np (np), m_seen (parent && parent->derived_from_nets (np)) { } void CircuitNetItemData::do_ensure_children (NetlistBrowserModel *model) { + // no subnodes if already seen + if (m_seen) { + return; + } + size_t n; n = model->indexer ()->net_terminal_count (np ()); @@ -1962,7 +1885,11 @@ CircuitNetItemData::text (int column, NetlistBrowserModel *model) { // circuit/net: header column = node count, second column net name if (column == model->object_column ()) { - return escaped (str_from_expanded_names (m_np, model->indexer ()->is_single ())); + std::string suffix; + if (seen ()) { + suffix = tl::to_string (tr (" (already seen)")); + } + return escaped (str_from_expanded_names (m_np, model->indexer ()->is_single ()) + suffix); } else if (column == model->first_column () && m_np.first) { return escaped (m_np.first->expanded_name () + " (" + tl::to_string (m_np.first->pin_count () + m_np.first->terminal_count () + m_np.first->subcircuit_pin_count ()) + ")"); } else if (column == model->second_column () && m_np.second) { @@ -2010,7 +1937,7 @@ CircuitNetDeviceTerminalItemData::do_ensure_children (NetlistBrowserModel *model std::pair device_classes = device_classes_from_devices (dp ()); std::pair termdefs = terminal_defs_from_device_classes (model->indexer (), device_classes, dp (), i); IndexedNetlistModel::net_pair nets = nets_from_device_terminals (dp (), termdefs); - push_back (new CircuitNetDeviceTerminalOthersItemData (this, nets, termdefs, derived_from_nets (nets))); + push_back (new CircuitNetDeviceTerminalOthersItemData (this, nets, termdefs)); } } @@ -2069,25 +1996,14 @@ CircuitNetDeviceTerminalItemData::status (NetlistBrowserModel *model) // ---------------------------------------------------------------------------------- -CircuitNetDeviceTerminalOthersItemData::CircuitNetDeviceTerminalOthersItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_pair &np, const std::pair &tp, bool net_seen) - : NetlistModelItemData (parent), m_tp (tp), m_np (np), m_net_seen (net_seen) +CircuitNetDeviceTerminalOthersItemData::CircuitNetDeviceTerminalOthersItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_pair &np, const std::pair &tp) + : CircuitNetItemData (parent, nets_from_device_terminals (parent->devices (), tp)), m_tp (tp), m_np (np) { } -void -CircuitNetDeviceTerminalOthersItemData::do_ensure_children (NetlistBrowserModel *) -{ - if (! m_net_seen) { - IndexedNetlistModel::net_pair nets = nets_from_device_terminals (dp (), m_tp); - if (nets.first || nets.second) { - push_back (new CircuitNetItemData (this, nets)); - } - } -} - QIcon CircuitNetDeviceTerminalOthersItemData::icon (NetlistBrowserModel *model) { - return model->icon_for_connection (nets_from_device_terminals (dp (), m_tp)); + return model->icon_for_connection (nets_from_device_terminals (devices (), m_tp)); } QString @@ -2095,41 +2011,16 @@ CircuitNetDeviceTerminalOthersItemData::text (int column, NetlistBrowserModel *m { // circuit/net/device terminal/more: header column = terminal name, second column = net link if (column == model->object_column ()) { - - 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 ()) { - - return model->make_link_to (m_np, column); - + return escaped (str_from_names (m_tp, model->indexer ()->is_single ()) + (seen () ? tl::to_string (tr (" (already seen)")) : std::string ())); + } else { + return CircuitNetItemData::text (column, model); } - - return QString (); } QString CircuitNetDeviceTerminalOthersItemData::search_text () { - IndexedNetlistModel::net_pair nets = nets_from_device_terminals (dp (), m_tp); - return tl::to_qstring (combine_search_strings (search_string_from_names (m_tp), search_string_from_expanded_names (nets))); -} - -std::string -CircuitNetDeviceTerminalOthersItemData::tooltip (NetlistBrowserModel * /*model*/) -{ - return std::string (); -} - -db::NetlistCrossReference::Status -CircuitNetDeviceTerminalOthersItemData::status (NetlistBrowserModel *model) -{ - if (! model->is_valid_net_pair (nets_from_device_terminals (dp (), m_tp))) { - // This indicates a wrong connection: the nets are associated in a way which is a not - // corresponding to a mapped net pair. Report Mismatch here. - return db::NetlistCrossReference::NoMatch; - } - - return db::NetlistCrossReference::None; + return tl::to_qstring (combine_search_strings (search_string_from_names (m_tp), search_string_from_expanded_names (nets_of_this ()))); } // ---------------------------------------------------------------------------------- @@ -2371,18 +2262,9 @@ CircuitSubCircuitItemData::status (NetlistBrowserModel *model) // ---------------------------------------------------------------------------------- CircuitSubCircuitPinItemData::CircuitSubCircuitPinItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_subcircuit_pin_pair &pp) - : NetlistModelItemData (parent), m_pp (pp) + : CircuitNetItemData (parent, nets_from_pinrefs (pp)), m_pp (pp) { } -void -CircuitSubCircuitPinItemData::do_ensure_children (NetlistBrowserModel *) -{ - IndexedNetlistModel::net_pair nets = nets_from_pinrefs (m_pp); - if (nets.first || nets.second) { - push_back (new CircuitNetItemData (this, nets)); - } -} - QIcon CircuitSubCircuitPinItemData::icon (NetlistBrowserModel * /*model*/) { @@ -2393,12 +2275,10 @@ QString CircuitSubCircuitPinItemData::text (int column, NetlistBrowserModel *model) { if (column == model->object_column ()) { - return model->make_link_to (pins (), circuit_refs_from_subcircuits (sp ())); - } else if (column == model->first_column () || column == model->second_column ()) { - return model->make_link_to (nets_from_pinrefs (m_pp), column); + return model->make_link_to (pins (), circuit_refs_from_subcircuits (sp ())) + (seen () ? tr (" (already seen)") : QString ()); + } else { + return CircuitNetItemData::text (column, model); } - - return QString (); } QString @@ -2407,31 +2287,6 @@ CircuitSubCircuitPinItemData::search_text () return tl::to_qstring (combine_search_strings (search_string_from_names (pins ()), search_string_from_expanded_names (nets_from_pinrefs (m_pp)))); } -std::string -CircuitSubCircuitPinItemData::tooltip (NetlistBrowserModel *model) -{ - std::string hint; - - // Check whether the pins may be attached to an invalid net pair - if (! model->is_valid_net_pair (nets_from_pinrefs (m_pp))) { - hint = rewire_subcircuit_pins_status_hint (); - } - - return hint; -} - -db::NetlistCrossReference::Status -CircuitSubCircuitPinItemData::status (NetlistBrowserModel *model) -{ - if (! model->is_valid_net_pair (nets_from_pinrefs (m_pp))) { - // This indicates a wrong connection: the nets are associated in a way which is a not - // corresponding to a mapped net pair. Report Mismatch here. - return db::NetlistCrossReference::NoMatch; - } - - return db::NetlistCrossReference::None; -} - // ---------------------------------------------------------------------------------- CircuitDeviceItemData::CircuitDeviceItemData (NetlistModelItemData *parent, const IndexedNetlistModel::device_pair &dp) @@ -2506,63 +2361,33 @@ CircuitDeviceItemData::status (NetlistBrowserModel *model) // ---------------------------------------------------------------------------------- CircuitDeviceTerminalItemData::CircuitDeviceTerminalItemData (NetlistModelItemData *parent, const std::pair &tp) - : NetlistModelItemData (parent), m_tp (tp) + : CircuitNetItemData (parent, nets_from_device_terminals (parent->devices (), tp)), m_tp (tp) { } -void -CircuitDeviceTerminalItemData::do_ensure_children (NetlistBrowserModel *) -{ - IndexedNetlistModel::net_pair nets = nets_from_device_terminals (devices (), m_tp); - push_back (new CircuitNetItemData (this, nets)); -} - QIcon CircuitDeviceTerminalItemData::icon (NetlistBrowserModel *model) { - return model->icon_for_connection (nets_from_device_terminals (devices (), m_tp)); + return model->icon_for_connection (nets_of_this ()); } QString CircuitDeviceTerminalItemData::text (int column, NetlistBrowserModel *model) { - // circuit/device/terminal: header column = terminal name, second column link to net if (column == model->object_column ()) { - - return escaped (str_from_names (m_tp, model->indexer ()->is_single ())); - - } else if (column == model->first_column () || column == model->second_column ()) { - - IndexedNetlistModel::net_pair nets = nets_from_device_terminals (devices (), m_tp); - return model->make_link_to (nets, column); - + std::string suffix; + if (seen ()) { + suffix = tl::to_string (tr (" (already seen)")); + } + return escaped (str_from_names (m_tp, model->indexer ()->is_single ()) + suffix); + } else { + return CircuitNetItemData::text (column, model); } - - return QString (); } QString CircuitDeviceTerminalItemData::search_text () { - IndexedNetlistModel::net_pair nets = nets_from_device_terminals (devices (), m_tp); - return tl::to_qstring (combine_search_strings (search_string_from_names (m_tp), search_string_from_expanded_names (nets))); -} - -std::string -CircuitDeviceTerminalItemData::tooltip (NetlistBrowserModel * /*model*/) -{ - return std::string (); -} - -db::NetlistCrossReference::Status -CircuitDeviceTerminalItemData::status (NetlistBrowserModel *model) -{ - if (! model->is_valid_net_pair (nets_from_device_terminals (devices (), m_tp))) { - // This indicates a wrong connection: the nets are associated in a way which is a not - // corresponding to a mapped net pair. Report Mismatch here. - return db::NetlistCrossReference::NoMatch; - } - - return db::NetlistCrossReference::None; + return tl::to_qstring (combine_search_strings (search_string_from_names (m_tp), search_string_from_expanded_names (nets_of_this ()))); } // ----------------------------------------------------------------------------------