WIP: less nodes.

This commit is contained in:
Matthias Koefferlein 2020-07-12 10:15:21 +02:00
parent 98f808d585
commit 8bb7342147
1 changed files with 94 additions and 269 deletions

View File

@ -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<const db::Pin *, const db::Pin *> pins_of_this ()
{
return pp ();
}
virtual std::pair<const db::Net *, const db::Net *> 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<CircuitPinItemData *> (parent ());
return p->pp ();
}
virtual std::pair<const db::Net *, const db::Net *> 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<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> &tp, bool is_self);
CircuitNetDeviceTerminalOthersItemData (NetlistModelItemData *parent, const IndexedNetlistModel::net_pair &np, const std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> &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<CircuitNetDeviceTerminalItemData *> (parent ());
return p->dp ();
}
private:
std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> 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<const db::Pin *, const db::Pin *> 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<const db::Net *, const db::Net *> 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<const db::Net *, const db::Net *> 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<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> &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<const db::Net *, const db::Net *> nets_of_this ()
{
return nets_from_device_terminals (devices (), m_tp);
}
private:
std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> 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 | <empty> | <empty>
// + 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<const db::DeviceClass *, const db::DeviceClass *> device_classes = device_classes_from_devices (dp ());
std::pair<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> 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<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> &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<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> &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<const db::DeviceTerminalDefinition *, const db::DeviceTerminalDefinition *> &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 ())));
}
// ----------------------------------------------------------------------------------