From 6021a66c40f3cdc0d3efe46234e9f84ae6967a87 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 9 Jul 2020 00:55:38 +0200 Subject: [PATCH] New node hierarchy for netlist browser. --- .../laybasic/layNetlistBrowserModel.cc | 322 +++++++++++------- 1 file changed, 201 insertions(+), 121 deletions(-) diff --git a/src/laybasic/laybasic/layNetlistBrowserModel.cc b/src/laybasic/laybasic/layNetlistBrowserModel.cc index c50fcb4f4..519cecb52 100644 --- a/src/laybasic/laybasic/layNetlistBrowserModel.cc +++ b/src/laybasic/laybasic/layNetlistBrowserModel.cc @@ -724,14 +724,9 @@ public: virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); - const IndexedNetlistModel::circuit_pair &cp () - { - return m_cp; - } - virtual std::pair circuits () { - return cp (); + return m_cp; } CircuitNetItemData *circuit_net_item (NetlistBrowserModel *model, const IndexedNetlistModel::net_pair &np); @@ -744,6 +739,31 @@ private: // ---------------------------------------------------------------------------------- +class CircuitItemNodeData + : public NetlistModelItemData +{ +public: + enum type { Nets, Devices, Pins, SubCircuits }; + + CircuitItemNodeData (NetlistModelItemData *parent, type t); + + 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); + + CircuitNetItemData *circuit_net_item (NetlistBrowserModel *model, const IndexedNetlistModel::net_pair &np); + CircuitDeviceItemData *circuit_device_item (NetlistBrowserModel *model, const IndexedNetlistModel::device_pair &dp); + CircuitSubCircuitItemData *circuit_subcircuit_item (NetlistBrowserModel *model, const IndexedNetlistModel::subcircuit_pair &sp); + +private: + type m_type; +}; + +// ---------------------------------------------------------------------------------- + class CircuitPinItemData : public NetlistModelItemData { @@ -757,12 +777,6 @@ public: virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); - const IndexedNetlistModel::circuit_pair &cp () - { - CircuitItemData *p = static_cast (parent ()); - return p->cp (); - } - const IndexedNetlistModel::pin_pair &pp () { return m_pp; @@ -792,12 +806,6 @@ public: virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); - const IndexedNetlistModel::circuit_pair &cp () - { - CircuitPinItemData *p = static_cast (parent ()); - return p->cp (); - } - const IndexedNetlistModel::pin_pair &pp () { CircuitPinItemData *p = static_cast (parent ()); @@ -828,12 +836,6 @@ public: virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); - const IndexedNetlistModel::circuit_pair &cp () - { - CircuitItemData *p = static_cast (parent ()); - return p->cp (); - } - const IndexedNetlistModel::net_pair &np () { return m_np; @@ -863,12 +865,6 @@ public: virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); - const IndexedNetlistModel::circuit_pair &cp () - { - CircuitNetItemData *p = static_cast (parent ()); - return p->cp (); - } - const IndexedNetlistModel::net_pair &np () { CircuitNetItemData *p = static_cast (parent ()); @@ -909,12 +905,6 @@ public: virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel * /*model*/); - const IndexedNetlistModel::circuit_pair &cp () - { - CircuitNetDeviceTerminalItemData *p = static_cast (parent ()); - return p->cp (); - } - IndexedNetlistModel::device_pair dp () { CircuitNetDeviceTerminalItemData *p = static_cast (parent ()); @@ -946,12 +936,6 @@ public: virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); - const IndexedNetlistModel::circuit_pair &cp () - { - CircuitNetItemData *p = static_cast (parent ()); - return p->cp (); - } - const IndexedNetlistModel::net_pair &np () { CircuitNetItemData *p = static_cast (parent ()); @@ -998,12 +982,6 @@ public: virtual std::string tooltip (NetlistBrowserModel * /*model*/); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel * /*model*/); - const IndexedNetlistModel::circuit_pair &cp () - { - CircuitNetSubCircuitPinItemData *p = static_cast (parent ()); - return p->cp (); - } - IndexedNetlistModel::pin_pair pp () { CircuitNetSubCircuitPinItemData *p = static_cast (parent ()); @@ -1064,12 +1042,6 @@ public: virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); - const IndexedNetlistModel::circuit_pair &cp () - { - CircuitItemData *p = static_cast (parent ()); - return p->cp (); - } - const IndexedNetlistModel::subcircuit_pair &sp () { return m_sp; @@ -1099,12 +1071,6 @@ public: virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); - const IndexedNetlistModel::circuit_pair &cp () - { - CircuitSubCircuitItemData *p = static_cast (parent ()); - return p->cp (); - } - const IndexedNetlistModel::subcircuit_pair &sp () { CircuitSubCircuitItemData *p = static_cast (parent ()); @@ -1140,12 +1106,6 @@ public: return m_dp; } - const IndexedNetlistModel::circuit_pair &cp () - { - CircuitItemData *p = static_cast (parent ()); - return p->cp (); - } - virtual std::pair devices () { return m_dp; @@ -1176,12 +1136,6 @@ public: return p->dp (); } - const IndexedNetlistModel::circuit_pair &cp () - { - CircuitDeviceItemData *p = static_cast (parent ()); - return p->cp (); - } - private: std::pair m_tp; }; @@ -1332,26 +1286,17 @@ CircuitItemData::CircuitItemData (NetlistModelItemData *parent, const IndexedNet void CircuitItemData::do_ensure_children (NetlistBrowserModel *model) { - size_t n; - - n = model->indexer ()->pin_count (cp ()); - for (size_t i = 0; i < n; ++i) { - push_back (new CircuitPinItemData (this, model->indexer ()->pin_from_index (cp (), i).first)); + if (model->indexer ()->pin_count (circuits ()) > 0) { + push_back (new CircuitItemNodeData (this, CircuitItemNodeData::Pins)); } - - n = model->indexer ()->net_count (cp ()); - for (size_t i = 0; i < n; ++i) { - push_back (new CircuitNetItemData (this, model->indexer ()->net_from_index (cp (), i).first)); + if (model->indexer ()->net_count (circuits ()) > 0) { + push_back (new CircuitItemNodeData (this, CircuitItemNodeData::Nets)); } - - n = model->indexer ()->subcircuit_count (cp ()); - for (size_t i = 0; i < n; ++i) { - push_back (new CircuitSubCircuitItemData (this, model->indexer ()->subcircuit_from_index (cp (), i).first)); + if (model->indexer ()->subcircuit_count (circuits ()) > 0) { + push_back (new CircuitItemNodeData (this, CircuitItemNodeData::SubCircuits)); } - - n = model->indexer ()->device_count (cp ()); - for (size_t i = 0; i < n; ++i) { - push_back (new CircuitDeviceItemData (this, model->indexer ()->device_from_index (cp (), i).first)); + if (model->indexer ()->device_count (circuits ()) > 0) { + push_back (new CircuitItemNodeData (this, CircuitItemNodeData::Devices)); } } @@ -1379,7 +1324,7 @@ CircuitItemData::text (int column, NetlistBrowserModel *model) QString CircuitItemData::search_text () { - return tl::to_qstring (search_string_from_names (cp ())); + return tl::to_qstring (search_string_from_names (circuits ())); } std::string @@ -1399,31 +1344,166 @@ CircuitItemData::status (NetlistBrowserModel *model) CircuitNetItemData * CircuitItemData::circuit_net_item (NetlistBrowserModel *model, const IndexedNetlistModel::net_pair &np) { - ensure_children (model); - size_t index = model->indexer ()->net_index (np); - index += model->indexer ()->pin_count (cp ()); - return dynamic_cast (child (index)); + for (size_t i = 0; i < child_count (); ++i) { + CircuitNetItemData *d = static_cast (child (i))->circuit_net_item (model, np); + if (d) { + return d; + } + } + return 0; } CircuitDeviceItemData * CircuitItemData::circuit_device_item (NetlistBrowserModel *model, const IndexedNetlistModel::device_pair &dp) { - ensure_children (model); - size_t index = model->indexer ()->device_index (dp); - index += model->indexer ()->pin_count (cp ()); - index += model->indexer ()->net_count (cp ()); - index += model->indexer ()->subcircuit_count (cp ()); - return dynamic_cast (child (index)); + for (size_t i = 0; i < child_count (); ++i) { + CircuitDeviceItemData *d = static_cast (child (i))->circuit_device_item (model, dp); + if (d) { + return d; + } + } + return 0; } CircuitSubCircuitItemData * CircuitItemData::circuit_subcircuit_item (NetlistBrowserModel *model, const IndexedNetlistModel::subcircuit_pair &sp) { - ensure_children (model); - size_t index = model->indexer ()->subcircuit_index (sp); - index += model->indexer ()->pin_count (cp ()); - index += model->indexer ()->net_count (cp ()); - return dynamic_cast (child (index)); + for (size_t i = 0; i < child_count (); ++i) { + CircuitSubCircuitItemData *d = static_cast (child (i))->circuit_subcircuit_item (model, sp); + if (d) { + return d; + } + } + return 0; +} + +// ---------------------------------------------------------------------------------- + +CircuitItemNodeData::CircuitItemNodeData (NetlistModelItemData *parent, CircuitItemNodeData::type t) + : NetlistModelItemData (parent), m_type (t) +{ } + +void +CircuitItemNodeData::do_ensure_children (NetlistBrowserModel *model) +{ + size_t n; + + if (m_type == Pins) { + + n = model->indexer ()->pin_count (circuits ()); + for (size_t i = 0; i < n; ++i) { + push_back (new CircuitPinItemData (this, model->indexer ()->pin_from_index (circuits (), i).first)); + } + + } else if (m_type == Nets) { + + n = model->indexer ()->net_count (circuits ()); + for (size_t i = 0; i < n; ++i) { + push_back (new CircuitNetItemData (this, model->indexer ()->net_from_index (circuits (), i).first)); + } + + } else if (m_type == SubCircuits) { + + n = model->indexer ()->subcircuit_count (circuits ()); + for (size_t i = 0; i < n; ++i) { + push_back (new CircuitSubCircuitItemData (this, model->indexer ()->subcircuit_from_index (circuits (), i).first)); + } + + } else if (m_type == Devices) { + + n = model->indexer ()->device_count (circuits ()); + for (size_t i = 0; i < n; ++i) { + push_back (new CircuitDeviceItemData (this, model->indexer ()->device_from_index (circuits (), i).first)); + } + + } +} + +QIcon +CircuitItemNodeData::icon (NetlistBrowserModel * /*model*/) +{ + if (m_type == Pins) { + return icon_for_pin (); + } else if (m_type == SubCircuits) { + return icon_for_circuit (); + } else if (m_type == Devices) { + return icon_for_device (0); + } else if (m_type == Nets) { + return icon_for_net (); + } else { + return QIcon (); + } +} + +QString +CircuitItemNodeData::text (int column, NetlistBrowserModel *model) +{ + if (column == model->object_column ()) { + if (m_type == Pins) { + return tr ("Pins"); + } else if (m_type == Devices) { + return tr ("Devices"); + } else if (m_type == Nets) { + return tr ("Nets"); + } else if (m_type == SubCircuits) { + return tr ("Subcircuits"); + } + } + return QString (); +} + +QString +CircuitItemNodeData::search_text () +{ + return QString (); +} + +std::string +CircuitItemNodeData::tooltip (NetlistBrowserModel * /*model*/) +{ + return std::string (); +} + +db::NetlistCrossReference::Status +CircuitItemNodeData::status (NetlistBrowserModel * /*model*/) +{ + return db::NetlistCrossReference::None; +} + +CircuitNetItemData * +CircuitItemNodeData::circuit_net_item (NetlistBrowserModel *model, const IndexedNetlistModel::net_pair &np) +{ + if (m_type == Nets) { + ensure_children (model); + size_t index = model->indexer ()->net_index (np); + return dynamic_cast (child (index)); + } else { + return 0; + } +} + +CircuitDeviceItemData * +CircuitItemNodeData::circuit_device_item (NetlistBrowserModel *model, const IndexedNetlistModel::device_pair &dp) +{ + if (m_type == Devices) { + ensure_children (model); + size_t index = model->indexer ()->device_index (dp); + return dynamic_cast (child (index)); + } else { + return 0; + } +} + +CircuitSubCircuitItemData * +CircuitItemNodeData::circuit_subcircuit_item (NetlistBrowserModel *model, const IndexedNetlistModel::subcircuit_pair &sp) +{ + if (m_type == SubCircuits) { + ensure_children (model); + size_t index = model->indexer ()->subcircuit_index (sp); + return dynamic_cast (child (index)); + } else { + return 0; + } } // ---------------------------------------------------------------------------------- @@ -1435,7 +1515,7 @@ CircuitPinItemData::CircuitPinItemData (NetlistModelItemData *parent, const Inde void CircuitPinItemData::do_ensure_children (NetlistBrowserModel * /*model*/) { - push_back (new CircuitPinNetItemData (this, nets_from_circuit_pins (cp (), pp ()))); + push_back (new CircuitPinNetItemData (this, nets_from_circuit_pins (circuits (), pp ()))); } QIcon @@ -1468,15 +1548,15 @@ CircuitPinItemData::search_text () std::string CircuitPinItemData::tooltip (NetlistBrowserModel *model) { - size_t index = model->indexer ()->pin_index (pp (), cp ()); - return model->indexer ()->pin_status_hint (cp (), index); + 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 (), cp ()); - return model->indexer ()->pin_from_index (cp (), index).second; + size_t index = model->indexer ()->pin_index (pp (), circuits ()); + return model->indexer ()->pin_from_index (circuits (), index).second; } // ---------------------------------------------------------------------------------- @@ -1513,7 +1593,7 @@ CircuitPinNetItemData::text (int column, NetlistBrowserModel *model) QString CircuitPinNetItemData::search_text () { - return tl::to_qstring (search_string_from_expanded_names (nets_from_circuit_pins (cp (), pp ()))); + return tl::to_qstring (search_string_from_expanded_names (nets_from_circuit_pins (circuits (), pp ()))); } std::string @@ -1586,14 +1666,14 @@ std::string CircuitNetItemData::tooltip (NetlistBrowserModel *model) { size_t index = model->indexer ()->net_index (m_np); - return model->indexer ()->net_status_hint (cp (), index); + return model->indexer ()->net_status_hint (circuits (), index); } db::NetlistCrossReference::Status CircuitNetItemData::status (NetlistBrowserModel *model) { size_t index = model->indexer ()->net_index (m_np); - return model->indexer ()->net_from_index (cp (), index).second; + return model->indexer ()->net_from_index (circuits (), index).second; } // ---------------------------------------------------------------------------------- @@ -1653,13 +1733,13 @@ CircuitNetDeviceTerminalItemData::search_text () std::string CircuitNetDeviceTerminalItemData::tooltip (NetlistBrowserModel *model) { - return model->indexer ()->device_status_hint (cp (), model->indexer ()->device_index (dp ())); + return model->indexer ()->device_status_hint (circuits (), model->indexer ()->device_index (dp ())); } db::NetlistCrossReference::Status CircuitNetDeviceTerminalItemData::status (NetlistBrowserModel *model) { - return model->indexer ()->device_from_index (cp (), model->indexer ()->device_index (dp ())).second; + return model->indexer ()->device_from_index (circuits (), model->indexer ()->device_index (dp ())).second; } // ---------------------------------------------------------------------------------- @@ -1775,14 +1855,14 @@ std::string CircuitNetSubCircuitPinItemData::tooltip (NetlistBrowserModel *model) { IndexedNetlistModel::subcircuit_pair subcircuits = subcircuits_from_pinrefs (sp ()); - return model->indexer ()->subcircuit_status_hint (cp (), model->indexer ()->subcircuit_index (subcircuits)); + return model->indexer ()->subcircuit_status_hint (circuits (), model->indexer ()->subcircuit_index (subcircuits)); } db::NetlistCrossReference::Status CircuitNetSubCircuitPinItemData::status (NetlistBrowserModel *model) { IndexedNetlistModel::subcircuit_pair subcircuits = subcircuits_from_pinrefs (sp ()); - return model->indexer ()->subcircuit_from_index (cp (), model->indexer ()->subcircuit_index (subcircuits)).second; + return model->indexer ()->subcircuit_from_index (circuits (), model->indexer ()->subcircuit_index (subcircuits)).second; } // ---------------------------------------------------------------------------------- @@ -1957,14 +2037,14 @@ std::string CircuitSubCircuitItemData::tooltip (NetlistBrowserModel *model) { size_t index = model->indexer ()->subcircuit_index (sp ()); - return model->indexer ()->subcircuit_status_hint (cp (), index); + return model->indexer ()->subcircuit_status_hint (circuits (), index); } db::NetlistCrossReference::Status CircuitSubCircuitItemData::status (NetlistBrowserModel *model) { size_t index = model->indexer ()->subcircuit_index (sp ()); - return model->indexer ()->subcircuit_from_index (cp (), index).second; + return model->indexer ()->subcircuit_from_index (circuits (), index).second; } // ---------------------------------------------------------------------------------- @@ -2106,14 +2186,14 @@ std::string CircuitDeviceItemData::tooltip (NetlistBrowserModel *model) { size_t index = model->indexer ()->device_index (m_dp); - return model->indexer ()->device_status_hint (cp (), index); + return model->indexer ()->device_status_hint (circuits (), index); } db::NetlistCrossReference::Status CircuitDeviceItemData::status (NetlistBrowserModel *model) { size_t index = model->indexer ()->device_index (m_dp); - return model->indexer ()->device_from_index (cp (), index).second; + return model->indexer ()->device_from_index (circuits (), index).second; } // ----------------------------------------------------------------------------------