New node hierarchy for netlist browser.

This commit is contained in:
Matthias Koefferlein 2020-07-09 00:55:38 +02:00
parent 6aff74c844
commit 6021a66c40
1 changed files with 201 additions and 121 deletions

View File

@ -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<const db::Circuit *, const db::Circuit *> 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<CircuitItemData *> (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<CircuitPinItemData *> (parent ());
return p->cp ();
}
const IndexedNetlistModel::pin_pair &pp ()
{
CircuitPinItemData *p = static_cast<CircuitPinItemData *> (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<CircuitItemData *> (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<CircuitNetItemData *> (parent ());
return p->cp ();
}
const IndexedNetlistModel::net_pair &np ()
{
CircuitNetItemData *p = static_cast<CircuitNetItemData *> (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<CircuitNetDeviceTerminalItemData *> (parent ());
return p->cp ();
}
IndexedNetlistModel::device_pair dp ()
{
CircuitNetDeviceTerminalItemData *p = static_cast<CircuitNetDeviceTerminalItemData *> (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<CircuitNetItemData *> (parent ());
return p->cp ();
}
const IndexedNetlistModel::net_pair &np ()
{
CircuitNetItemData *p = static_cast<CircuitNetItemData *> (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<CircuitNetSubCircuitPinItemData *> (parent ());
return p->cp ();
}
IndexedNetlistModel::pin_pair pp ()
{
CircuitNetSubCircuitPinItemData *p = static_cast<CircuitNetSubCircuitPinItemData *> (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<CircuitItemData *> (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<CircuitSubCircuitItemData *> (parent ());
return p->cp ();
}
const IndexedNetlistModel::subcircuit_pair &sp ()
{
CircuitSubCircuitItemData *p = static_cast<CircuitSubCircuitItemData *> (parent ());
@ -1140,12 +1106,6 @@ public:
return m_dp;
}
const IndexedNetlistModel::circuit_pair &cp ()
{
CircuitItemData *p = static_cast<CircuitItemData *> (parent ());
return p->cp ();
}
virtual std::pair<const db::Device *, const db::Device *> devices ()
{
return m_dp;
@ -1176,12 +1136,6 @@ public:
return p->dp ();
}
const IndexedNetlistModel::circuit_pair &cp ()
{
CircuitDeviceItemData *p = static_cast<CircuitDeviceItemData *> (parent ());
return p->cp ();
}
private:
std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> 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<CircuitNetItemData *> (child (index));
for (size_t i = 0; i < child_count (); ++i) {
CircuitNetItemData *d = static_cast<CircuitItemNodeData *> (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<CircuitDeviceItemData *> (child (index));
for (size_t i = 0; i < child_count (); ++i) {
CircuitDeviceItemData *d = static_cast<CircuitItemNodeData *> (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<CircuitSubCircuitItemData *> (child (index));
for (size_t i = 0; i < child_count (); ++i) {
CircuitSubCircuitItemData *d = static_cast<CircuitItemNodeData *> (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<CircuitNetItemData *> (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<CircuitDeviceItemData *> (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<CircuitSubCircuitItemData *> (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;
}
// ----------------------------------------------------------------------------------