From e14a96a421c7d5bc7dbb089dedeb628f3ea70cf5 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Mon, 20 Sep 2021 21:14:25 +0200 Subject: [PATCH] Speeding up the netlist browser by shortcutting has_children --- .../laybasic/layNetlistBrowserModel.cc | 45 ++++++++++++++++++- .../laybasic/layNetlistBrowserModel.h | 1 + 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/laybasic/laybasic/layNetlistBrowserModel.cc b/src/laybasic/laybasic/layNetlistBrowserModel.cc index c1ffdd205..2b42c4182 100644 --- a/src/laybasic/laybasic/layNetlistBrowserModel.cc +++ b/src/laybasic/laybasic/layNetlistBrowserModel.cc @@ -910,6 +910,7 @@ public: virtual QString search_text (); virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); + virtual bool has_children (NetlistBrowserModel *) { return true; } CircuitItemData *circuit_item (NetlistBrowserModel *model, const IndexedNetlistModel::circuit_pair &cp); }; @@ -928,6 +929,7 @@ public: virtual QString search_text (); virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); + virtual bool has_children (NetlistBrowserModel *model); virtual std::pair circuits_of_this () { @@ -980,6 +982,7 @@ public: virtual QString search_text (); virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); + virtual bool has_children (NetlistBrowserModel *model); CircuitNetItemData *circuit_net_item (NetlistBrowserModel *model, const IndexedNetlistModel::net_pair &np); CircuitDeviceItemData *circuit_device_item (NetlistBrowserModel *model, const IndexedNetlistModel::device_pair &dp); @@ -1003,6 +1006,7 @@ public: virtual QString search_text (); virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); + virtual bool has_children (NetlistBrowserModel *) { return true; } const IndexedNetlistModel::net_pair &np () { @@ -1038,6 +1042,7 @@ public: virtual QString search_text (); virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); + virtual bool has_children (NetlistBrowserModel *) { return true; } const IndexedNetlistModel::net_pair &np () { @@ -1096,6 +1101,7 @@ public: virtual QString search_text (); virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); + virtual bool has_children (NetlistBrowserModel *) { return true; } const IndexedNetlistModel::net_pair &np () { @@ -1149,6 +1155,7 @@ public: virtual QString search_text (); virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); + virtual bool has_children (NetlistBrowserModel *) { return false; } virtual std::pair pins_of_this () { @@ -1173,6 +1180,7 @@ public: virtual QString search_text (); virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); + virtual bool has_children (NetlistBrowserModel *) { return true; } const IndexedNetlistModel::subcircuit_pair &sp () { @@ -1224,6 +1232,7 @@ public: virtual QString search_text (); virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); + virtual bool has_children (NetlistBrowserModel *model); const IndexedNetlistModel::subcircuit_pair &sp () { @@ -1274,6 +1283,7 @@ public: virtual QString search_text (); virtual std::string tooltip (NetlistBrowserModel *model); virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model); + virtual bool has_children (NetlistBrowserModel *) { return true; } const IndexedNetlistModel::device_pair &dp () { @@ -1594,6 +1604,25 @@ CircuitItemData::do_ensure_children (NetlistBrowserModel *model) } } +bool +CircuitItemData::has_children (NetlistBrowserModel *model) +{ + if (model->indexer ()->pin_count (circuits ()) > 0) { + return true; + } + if (model->indexer ()->net_count (circuits ()) > 0) { + return true; + } + if (model->indexer ()->subcircuit_count (circuits ()) > 0) { + return true; + } + if (model->indexer ()->device_count (circuits ()) > 0) { + return true; + } + return false; +} + + QIcon CircuitItemData::icon (NetlistBrowserModel * /*model*/) { @@ -1717,6 +1746,13 @@ CircuitItemNodeData::CircuitItemNodeData (NetlistModelItemData *parent, CircuitI : NetlistModelItemData (parent), m_type (t) { } +bool +CircuitItemNodeData::has_children (NetlistBrowserModel *) +{ + // the node only exists if it has children + return true; +} + void CircuitItemNodeData::do_ensure_children (NetlistBrowserModel *model) { @@ -2216,6 +2252,12 @@ CircuitSubCircuitPinsItemData::CircuitSubCircuitPinsItemData (NetlistModelItemDa : NetlistModelItemData (parent), m_sp (sp) { } +bool +CircuitSubCircuitPinsItemData::has_children (NetlistBrowserModel *model) +{ + return model->indexer ()->subcircuit_pin_count (sp ()) > 0; +} + void CircuitSubCircuitPinsItemData::do_ensure_children (NetlistBrowserModel *model) { @@ -2887,8 +2929,7 @@ NetlistBrowserModel::hasChildren (const QModelIndex &parent) const d = mp_root.get (); } if (d) { - d->ensure_children (const_cast (this)); - return d->begin () != d->end (); + return d->has_children (const_cast (this)); } else { return false; } diff --git a/src/laybasic/laybasic/layNetlistBrowserModel.h b/src/laybasic/laybasic/layNetlistBrowserModel.h index 487e2c811..5fc6971f9 100644 --- a/src/laybasic/laybasic/layNetlistBrowserModel.h +++ b/src/laybasic/laybasic/layNetlistBrowserModel.h @@ -133,6 +133,7 @@ public: virtual QString search_text () = 0; virtual std::string tooltip (NetlistBrowserModel *model) = 0; virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model) = 0; + virtual bool has_children (NetlistBrowserModel *model) = 0; void ensure_children (NetlistBrowserModel *model);