diff --git a/src/laybasic/laybasic/layNetlistBrowserModel.cc b/src/laybasic/laybasic/layNetlistBrowserModel.cc index 142674903..335141342 100644 --- a/src/laybasic/laybasic/layNetlistBrowserModel.cc +++ b/src/laybasic/laybasic/layNetlistBrowserModel.cc @@ -798,11 +798,6 @@ static std::string search_string_from_names (const std::pair nets_of_this () - { - return m_np; - } - -private: - IndexedNetlistModel::net_pair m_np; -}; - -// ---------------------------------------------------------------------------------- - class CircuitSubCircuitPinsItemData : public NetlistModelItemData { @@ -1794,56 +1759,6 @@ CircuitPinItemData::icon (NetlistBrowserModel * /*model*/) // ---------------------------------------------------------------------------------- -// @@@ remove? -CircuitPinNetItemData::CircuitPinNetItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_pair &np) - : NetlistModelItemData (parent), m_np (np) -{ } - -void -CircuitPinNetItemData::do_ensure_children (NetlistBrowserModel * /*model*/) -{ - // nothing (leaf node) -} - -QIcon -CircuitPinNetItemData::icon (NetlistBrowserModel *model) -{ - return model->icon_for_connection (m_np); -} - -QString -CircuitPinNetItemData::text (int column, NetlistBrowserModel *model) -{ - // circuit/pin/net: header column = name, second column link to net - if (column == model->object_column ()) { - return escaped (str_from_expanded_names (m_np, model->indexer ()->is_single ())); - } else if (column == model->first_column () || column == model->second_column ()) { - return model->make_link_to (m_np, column); - } - - return QString (); -} - -QString -CircuitPinNetItemData::search_text () -{ - return tl::to_qstring (search_string_from_expanded_names (nets_from_circuit_pins (circuits (), pp ()))); -} - -std::string -CircuitPinNetItemData::tooltip (NetlistBrowserModel * /*model*/) -{ - return std::string (); -} - -db::NetlistCrossReference::Status -CircuitPinNetItemData::status (NetlistBrowserModel * /*model*/) -{ - return db::NetlistCrossReference::None; -} - -// ---------------------------------------------------------------------------------- - CircuitNetItemData::CircuitNetItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_pair &np) : NetlistModelItemData (parent), m_np (np), m_seen (parent && parent->derived_from_nets (np)) { } diff --git a/src/laybasic/laybasic/layNetlistCrossReferenceModel.cc b/src/laybasic/laybasic/layNetlistCrossReferenceModel.cc index fc82a79a6..bf816b302 100644 --- a/src/laybasic/laybasic/layNetlistCrossReferenceModel.cc +++ b/src/laybasic/laybasic/layNetlistCrossReferenceModel.cc @@ -310,17 +310,73 @@ const db::Circuit *NetlistCrossReferenceModel::second_circuit_for (const db::Cir namespace { - struct CompareNetRefsByPins + // TODO: borrowed from dbNetlistCrossReference.cc + + static int string_value_compare (const std::string &a, const std::string &b) { - bool operator () (const std::pair &a, - const std::pair &b) + return a == b ? 0 : (a < b ? -1 : 1); + } + + template + struct by_expanded_name_value_compare + { + int operator() (const Obj &a, const Obj &b) const { - size_t pin_id1 = a.first ? a.first->pin_id () : (a.second ? a.second->pin_id () : std::numeric_limits::max ()); - size_t pin_id2 = b.first ? b.first->pin_id () : (b.second ? b.second->pin_id () : std::numeric_limits::max ()); - return pin_id1 < pin_id2; + return string_value_compare (a.expanded_name (), b.expanded_name ()); } }; + template struct net_object_compare; + + template <> + struct net_object_compare + { + int operator() (const db::NetSubcircuitPinRef &a, const db::NetSubcircuitPinRef &b) const + { + int ct = by_expanded_name_value_compare () (*a.subcircuit (), *b.subcircuit ()); + if (ct == 0) { + return by_expanded_name_value_compare () (*a.pin (), *b.pin ()); + } else { + return ct; + } + } + }; + + template + struct two_pointer_compare + { + int operator() (const Obj *a, const Obj *b) const + { + if ((a == 0) != (b == 0)) { + return (a == 0) > (b == 0) ? -1 : 1; + } + if (a != 0) { + return ValueCompare () (*a, *b); + } else { + return 0; + } + } + }; + + template + struct two_pair_compare + { + bool operator() (const std::pair &a, const std::pair &b) + { + int ct = two_pointer_compare () (a.first, b.first); + if (ct != 0) { + return ct < 0; + } + return two_pointer_compare () (a.second, b.second) < 0; + } + }; + + struct SortNetSubCircuitPins + : public two_pair_compare > + { + // .. nothing yet .. + }; + } void NetlistCrossReferenceModel::ensure_subcircuit_data_built () const @@ -370,7 +426,7 @@ void NetlistCrossReferenceModel::ensure_subcircuit_data_built () const } } - std::sort (sc_data.nets_per_pins.begin (), sc_data.nets_per_pins.end (), CompareNetRefsByPins ()); + std::sort (sc_data.nets_per_pins.begin (), sc_data.nets_per_pins.end (), SortNetSubCircuitPins ()); }