diff --git a/src/db/db/dbLayoutToNetlist.cc b/src/db/db/dbLayoutToNetlist.cc index 42888ec9c..997fe993d 100644 --- a/src/db/db/dbLayoutToNetlist.cc +++ b/src/db/db/dbLayoutToNetlist.cc @@ -158,9 +158,7 @@ db::Region *LayoutToNetlist::make_layer (const std::string &n) si.shape_flags (db::ShapeIterator::Nothing); std::unique_ptr region (new db::Region (si, dss ())); - if (! n.empty ()) { - register_layer (*region, n); - } + register_layer (*region, n); return region.release (); } @@ -171,9 +169,7 @@ db::Region *LayoutToNetlist::make_layer (unsigned int layer_index, const std::st si.shape_flags (db::ShapeIterator::All); std::unique_ptr region (new db::Region (si, dss ())); - if (! n.empty ()) { - register_layer (*region, n); - } + register_layer (*region, n); return region.release (); } @@ -184,9 +180,7 @@ db::Texts *LayoutToNetlist::make_text_layer (unsigned int layer_index, const std si.shape_flags (db::ShapeIterator::Texts); std::unique_ptr texts (new db::Texts (si, dss ())); - if (! n.empty ()) { - register_layer (*texts, n); - } + register_layer (*texts, n); return texts.release (); } @@ -197,9 +191,7 @@ db::Region *LayoutToNetlist::make_polygon_layer (unsigned int layer_index, const si.shape_flags (db::ShapeIterator::Paths | db::ShapeIterator::Polygons | db::ShapeIterator::Boxes); std::unique_ptr region (new db::Region (si, dss ())); - if (! n.empty ()) { - register_layer (*region, n); - } + register_layer (*region, n); return region.release (); } @@ -434,6 +426,7 @@ void LayoutToNetlist::mem_stat (MemStatistics *stat, MemStatistics::purpose_t pu db::mem_stat (stat, purpose, cat, m_named_regions, true, (void *) this); db::mem_stat (stat, purpose, cat, m_name_of_layer, true, (void *) this); db::mem_stat (stat, purpose, cat, m_region_by_original, true, (void *) this); + db::mem_stat (stat, purpose, cat, m_region_of_layer, true, (void *) this); db::mem_stat (stat, purpose, cat, m_joined_net_names, true, (void *) this); db::mem_stat (stat, purpose, cat, m_joined_net_names_per_cell, true, (void *) this); db::mem_stat (stat, purpose, cat, m_joined_nets, true, (void *) this); @@ -538,11 +531,11 @@ db::Region *LayoutToNetlist::layer_by_name (const std::string &name) db::Region *LayoutToNetlist::layer_by_index (unsigned int index) { - auto n = m_name_of_layer.find (index); - if (n == m_name_of_layer.end ()) { + auto n = m_region_of_layer.find (index); + if (n == m_region_of_layer.end ()) { return 0; } else { - return layer_by_name (n->second); + return new db::Region (new db::DeepRegion (n->second)); } } @@ -587,16 +580,19 @@ std::string LayoutToNetlist::name (const ShapeCollection &coll) const } } -void LayoutToNetlist::register_layer (const ShapeCollection &collection, const std::string &n) +void LayoutToNetlist::register_layer (const ShapeCollection &collection, const std::string &n_in) { if (m_region_by_original.find (tl::id_of (collection.get_delegate ())) != m_region_by_original.end ()) { throw tl::Exception (tl::to_string (tr ("The layer is already registered"))); } - if (! n.empty () && m_named_regions.find (n) != m_named_regions.end ()) { - throw tl::Exception (tl::to_string (tr ("Layer name is already used: ")) + n); + if (! n_in.empty () && m_named_regions.find (n_in) != m_named_regions.end ()) { + throw tl::Exception (tl::to_string (tr ("Layer name is already used: ")) + n_in); } + // Caution: this make create names which clash with future explicit names. Hopefully, the generated names are unique enough. + std::string n = n_in.empty () ? make_new_name () : n_in; + db::DeepLayer dl; if (m_is_flat) { @@ -612,11 +608,6 @@ void LayoutToNetlist::register_layer (const ShapeCollection &collection, const s } else { - if (is_persisted (collection)) { - std::string prev_name = name (collection); - m_named_regions.erase (prev_name); - } - dl = delegate->deep_layer (); } @@ -624,11 +615,9 @@ void LayoutToNetlist::register_layer (const ShapeCollection &collection, const s } m_region_by_original [tl::id_of (collection.get_delegate ())] = dl; - - if (! n.empty ()) { - m_named_regions [n] = dl; - m_name_of_layer [dl.layer ()] = n; - } + m_region_of_layer [dl.layer ()] = dl; + m_named_regions [n] = dl; + m_name_of_layer [dl.layer ()] = n; } db::DeepLayer LayoutToNetlist::deep_layer_of (const db::ShapeCollection &coll) const @@ -1882,11 +1871,11 @@ NetBuilder::make_netname_propid (db::PropertiesRepository &pr, NetPropertyMode n if (! netname_prop.is_nil ()) { db::property_names_id_type name_propnameid = pr.prop_name_id (netname_prop); - if (net_prop_mode == NPM_NetNameAndIDOnly) { + if (net_prop_mode == NPM_NetQualifiedNameOnly) { std::vector l; l.reserve (2); l.push_back (tl::Variant (net.expanded_name ())); - l.push_back (tl::Variant (reinterpret_cast (&net))); + 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 (&net)))); diff --git a/src/db/db/dbLayoutToNetlist.h b/src/db/db/dbLayoutToNetlist.h index 78d988c58..dd99a3763 100644 --- a/src/db/db/dbLayoutToNetlist.h +++ b/src/db/db/dbLayoutToNetlist.h @@ -941,6 +941,7 @@ private: std::map m_named_regions; std::map m_name_of_layer; std::map m_region_by_original; + std::map m_region_of_layer; bool m_netlist_extracted; bool m_is_flat; double m_device_scaling; diff --git a/src/db/db/dbLayoutToNetlistEnums.h b/src/db/db/dbLayoutToNetlistEnums.h index 2662c92c2..708426294 100644 --- a/src/db/db/dbLayoutToNetlistEnums.h +++ b/src/db/db/dbLayoutToNetlistEnums.h @@ -52,9 +52,9 @@ enum NetPropertyMode NPM_NetIDOnly, /** - * @brief Like NetNameOnly, but use a tuple of name and ID + * @brief Like NetNameOnly, but use a tuple of net and circuit name */ - NPM_NetNameAndIDOnly, + NPM_NetQualifiedNameOnly, }; /** diff --git a/src/db/db/gsiDeclDbRegion.cc b/src/db/db/gsiDeclDbRegion.cc index 76166766d..f4e4c2f29 100644 --- a/src/db/db/gsiDeclDbRegion.cc +++ b/src/db/db/gsiDeclDbRegion.cc @@ -747,7 +747,7 @@ fill_region_multi (const db::Region *fr, db::Cell *cell, db::cell_index_type fil static db::Region nets (const db::Region *region, db::LayoutToNetlist &l2n, const tl::Variant &net_prop_name, const std::vector *net_filter) { - return region->nets (l2n, net_prop_name.is_nil () ? db::NPM_NoProperties : db::NPM_NetNameAndIDOnly, net_prop_name, net_filter); + return region->nets (l2n, net_prop_name.is_nil () ? db::NPM_NoProperties : db::NPM_NetQualifiedNameOnly, net_prop_name, net_filter); } static db::Region diff --git a/src/db/unit_tests/dbHierNetsProcessorTests.cc b/src/db/unit_tests/dbHierNetsProcessorTests.cc index 381bdf0c1..ce947ade3 100644 --- a/src/db/unit_tests/dbHierNetsProcessorTests.cc +++ b/src/db/unit_tests/dbHierNetsProcessorTests.cc @@ -131,11 +131,11 @@ void run_test (tl::TestBase *_this, bool flat, bool flat_nets, const std::string l2n->extract_netlist (); - db::Region rmetal1_nets = rmetal1.nets (*l2n, db::NPM_NetNameAndIDOnly, tl::Variant (1)); + db::Region rmetal1_nets = rmetal1.nets (*l2n, db::NPM_NetQualifiedNameOnly, tl::Variant (1)); if (! flat) { EXPECT_EQ (dss.has_net_builder_for (0, l2n.get ()), true); } - db::Region rmetal2_nets = rmetal2.nets (*l2n, db::NPM_NetNameAndIDOnly, tl::Variant (1)); + db::Region rmetal2_nets = rmetal2.nets (*l2n, db::NPM_NetQualifiedNameOnly, tl::Variant (1)); db::Region res1 = rmetal1_nets.bool_and (rmetal2_nets, db::SamePropertiesConstraint); db::Region res2 = rmetal1_nets.bool_and (rmetal2_nets, db::DifferentPropertiesConstraint); diff --git a/src/plugins/tools/net_tracer/db_plugin/dbNetTracer.cc b/src/plugins/tools/net_tracer/db_plugin/dbNetTracer.cc index 13ee04df9..84738ddd8 100644 --- a/src/plugins/tools/net_tracer/db_plugin/dbNetTracer.cc +++ b/src/plugins/tools/net_tracer/db_plugin/dbNetTracer.cc @@ -829,9 +829,7 @@ NetTracerLayerExpression::make_l2n_region (db::LayoutToNetlist &l2n, std::map get (); } - if (! name.empty ()) { - l2n.register_layer (*res, name); - } + l2n.register_layer (*res, name); return tl::shared_ptr (new NetTracerLayerExpression::RegionHolder (res.release ())); } diff --git a/testdata/algo/net_proc_au1.gds b/testdata/algo/net_proc_au1.gds index 0f2963078..79ac941b5 100644 Binary files a/testdata/algo/net_proc_au1.gds and b/testdata/algo/net_proc_au1.gds differ diff --git a/testdata/algo/net_proc_au2.gds b/testdata/algo/net_proc_au2.gds index aa1308051..694462a29 100644 Binary files a/testdata/algo/net_proc_au2.gds and b/testdata/algo/net_proc_au2.gds differ diff --git a/testdata/algo/net_proc_au3.gds b/testdata/algo/net_proc_au3.gds index f52c02180..17920b65b 100644 Binary files a/testdata/algo/net_proc_au3.gds and b/testdata/algo/net_proc_au3.gds differ