WIP: experimenting with pulling net names from subcircuits for dummy connections

This commit is contained in:
Matthias Koefferlein 2023-01-21 11:22:03 +01:00
parent 86cb1d0f8b
commit 9b64224cb4
3 changed files with 26 additions and 7 deletions

View File

@ -1691,9 +1691,10 @@ NetBuilder::build_nets (const std::vector<const Net *> *nets, const std::map<uns
double dbu = mp_target->dbu ();
db::ICplxTrans tr = db::CplxTrans (dbu).inverted () * subcircuit.trans () * db::CplxTrans (dbu);
db::properties_id_type netname_propid = make_netname_propid (target ().properties_repository (), prop_mode, netname_prop, *n);
std::string net_name_prefix = subcircuit.expanded_name () + ":";
db::properties_id_type netname_propid = make_netname_propid (target ().properties_repository (), prop_mode, netname_prop, *n, net_name_prefix);
build_net_rec (*n, c->cell_index (), lmap, subcircuit.expanded_name () + ":", netname_propid, tr);
build_net_rec (*n, c->cell_index (), lmap, net_name_prefix, netname_propid, tr);
}
@ -1853,7 +1854,7 @@ NetBuilder::build_net_rec (const db::Net &net, db::cell_index_type circuit_cell,
}
db::properties_id_type
NetBuilder::make_netname_propid (db::PropertiesRepository &pr, NetPropertyMode net_prop_mode, const tl::Variant &netname_prop, const db::Net &net)
NetBuilder::make_netname_propid (db::PropertiesRepository &pr, NetPropertyMode net_prop_mode, const tl::Variant &netname_prop, const db::Net &net, const std::string &net_name_prefix)
{
if (net_prop_mode == NPM_NoProperties) {
@ -1874,13 +1875,13 @@ NetBuilder::make_netname_propid (db::PropertiesRepository &pr, NetPropertyMode n
if (net_prop_mode == NPM_NetQualifiedNameOnly) {
std::vector<tl::Variant> l;
l.reserve (2);
l.push_back (tl::Variant (net.expanded_name ()));
l.push_back (tl::Variant (net_name_prefix + net.expanded_name ()));
l.push_back (tl::Variant (net.circuit ()->name ()));
propset.insert (std::make_pair (name_propnameid, tl::Variant (l)));
} else if (net_prop_mode == NPM_NetIDOnly) {
propset.insert (std::make_pair (name_propnameid, tl::Variant (reinterpret_cast <size_t> (&net))));
} else {
propset.insert (std::make_pair (name_propnameid, tl::Variant (net.expanded_name ())));
propset.insert (std::make_pair (name_propnameid, tl::Variant (net_name_prefix + net.expanded_name ())));
}
}

View File

@ -1071,7 +1071,7 @@ public:
/**
* @brief A helper function to create a property ID for a given net, net property name and net property mode
*/
static db::properties_id_type make_netname_propid (db::PropertiesRepository &pr, NetPropertyMode net_prop_mode, const tl::Variant &netname_prop, const db::Net &net);
static db::properties_id_type make_netname_propid (db::PropertiesRepository &pr, NetPropertyMode net_prop_mode, const tl::Variant &netname_prop, const db::Net &net, const std::string &net_name_prefix = std::string ());
private:
struct CellReuseTableKey

View File

@ -285,7 +285,8 @@ NetlistExtractor::extract_nets (const db::DeepShapeStore &dss, unsigned int layo
for (connected_clusters_type::all_iterator c = clusters.begin_all (); ! c.at_end (); ++c) {
const db::local_cluster<db::NetShape> &lc = clusters.cluster_by_id (*c);
if (clusters.connections_for_cluster (*c).empty () && lc.empty ()) {
const connected_clusters_type::connections_type &cc = clusters.connections_for_cluster (*c);
if (cc.empty () && lc.empty ()) {
// this is an entirely empty cluster so we skip it.
// Such clusters are left over when joining clusters.
continue;
@ -313,6 +314,23 @@ NetlistExtractor::extract_nets (const db::DeepShapeStore &dss, unsigned int layo
}
}
#if 0
// This code will pull net names from subcircuits into their parents if those nets are dummy connections
// made to satisfy the subcircuit's pin, but not to make a physical connection.
// Don't know whether this is a good idea, so this code is disabled for now.
if (net_names.empty () && clusters.is_dummy (*c) && net->subcircuit_pin_count () == 1) {
// in the case of a dummy connection (partially connected subcircuits) create a
// new name indicating the subcircuit and the subcircuit net name - this makes subcircuit
// net names available (the net is pseudo-root inside in the subcircuit)
const db::NetSubcircuitPinRef &sc_pin = *net->begin_subcircuit_pins ();
const db::Net *sc_net = sc_pin.subcircuit ()->circuit_ref ()->net_for_pin (sc_pin.pin_id ());
if (sc_net && ! sc_net->name ().empty ()) {
net_names.insert (sc_pin.subcircuit ()->expanded_name () + ":" + sc_net->name ());
}
}
#endif
assign_net_names (net, net_names);
if (! clusters.is_root (*c)) {