From 8dddc4000f6270c05ecf59aeab5c8b9ee9750567 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Wed, 13 Nov 2019 23:09:09 +0100 Subject: [PATCH] Also write the net properties to GDS or OASIS "build_nets" will now write the net's properties to the generated net shapes. This might enable interesting applications. --- src/db/db/dbLayoutToNetlist.cc | 15 +++++++-- .../dbLayoutToNetlistReaderTests.cc | 30 ++++++++++++++++++ testdata/algo/l2n_writer_au_p.oas | Bin 0 -> 2370 bytes 3 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 testdata/algo/l2n_writer_au_p.oas diff --git a/src/db/db/dbLayoutToNetlist.cc b/src/db/db/dbLayoutToNetlist.cc index b30dfb26a..f33bd4286 100644 --- a/src/db/db/dbLayoutToNetlist.cc +++ b/src/db/db/dbLayoutToNetlist.cc @@ -814,11 +814,20 @@ LayoutToNetlist::build_net_rec (db::cell_index_type ci, size_t cid, db::Layout & db::properties_id_type LayoutToNetlist::make_netname_propid (db::Layout &ly, const tl::Variant &netname_prop, const db::Net &net) const { - if (! netname_prop.is_nil ()) { + if (! netname_prop.is_nil () || net.begin_properties () != net.end_properties ()) { - db::property_names_id_type name_propnameid = ly.properties_repository ().prop_name_id (netname_prop); db::PropertiesRepository::properties_set propset; - propset.insert (std::make_pair (name_propnameid, tl::Variant (net.expanded_name ()))); + + // add the user properties too (TODO: make this configurable?) + for (db::Net::property_iterator p = net.begin_properties (); p != net.end_properties (); ++p) { + db::property_names_id_type key_propnameid = ly.properties_repository ().prop_name_id (p->first); + propset.insert (std::make_pair (key_propnameid, p->second)); + } + + if (! netname_prop.is_nil ()) { + db::property_names_id_type name_propnameid = ly.properties_repository ().prop_name_id (netname_prop); + propset.insert (std::make_pair (name_propnameid, tl::Variant (net.expanded_name ()))); + } return ly.properties_repository ().properties_id (propset); diff --git a/src/db/unit_tests/dbLayoutToNetlistReaderTests.cc b/src/db/unit_tests/dbLayoutToNetlistReaderTests.cc index 4c7002443..cc3c0fb90 100644 --- a/src/db/unit_tests/dbLayoutToNetlistReaderTests.cc +++ b/src/db/unit_tests/dbLayoutToNetlistReaderTests.cc @@ -288,6 +288,36 @@ TEST(1c_ReaderBasicShortWithProps) std::string au_path = tl::combine_path (tl::combine_path (tl::combine_path (tl::testsrc (), "testdata"), "algo"), "l2n_writer_au_p.txt"); compare_text_files (path, au_path); + + { + db::Layout ly2; + ly2.dbu (l2n.internal_layout ()->dbu ()); + db::Cell &top2 = ly2.cell (ly2.add_cell ("TOP")); + + std::map lmap; + lmap [ly2.insert_layer (db::LayerProperties (3, 0))] = l2n.layer_by_name ("poly"); + lmap [ly2.insert_layer (db::LayerProperties (3, 1))] = l2n.layer_by_name ("poly_lbl"); + lmap [ly2.insert_layer (db::LayerProperties (4, 0))] = l2n.layer_by_name ("diff_cont"); + lmap [ly2.insert_layer (db::LayerProperties (5, 0))] = l2n.layer_by_name ("poly_cont"); + lmap [ly2.insert_layer (db::LayerProperties (6, 0))] = l2n.layer_by_name ("metal1"); + lmap [ly2.insert_layer (db::LayerProperties (6, 1))] = l2n.layer_by_name ("metal1_lbl"); + lmap [ly2.insert_layer (db::LayerProperties (7, 0))] = l2n.layer_by_name ("via1"); + lmap [ly2.insert_layer (db::LayerProperties (8, 0))] = l2n.layer_by_name ("metal2"); + lmap [ly2.insert_layer (db::LayerProperties (8, 1))] = l2n.layer_by_name ("metal2_lbl"); + lmap [ly2.insert_layer (db::LayerProperties (10, 0))] = l2n.layer_by_name ("psd"); + lmap [ly2.insert_layer (db::LayerProperties (11, 0))] = l2n.layer_by_name ("nsd"); + + db::CellMapping cm = l2n.cell_mapping_into (ly2, top2); + + l2n.build_all_nets (cm, ly2, lmap, "NET_", tl::Variant (), db::LayoutToNetlist::BNH_Disconnected, 0, "DEVICE_"); + + std::string au = tl::testsrc (); + au = tl::combine_path (au, "testdata"); + au = tl::combine_path (au, "algo"); + au = tl::combine_path (au, "l2n_writer_au_p.oas"); + + db::compare_layouts (_this, ly2, au, db::WriteOAS); + } } TEST(2_ReaderWithGlobalNets) diff --git a/testdata/algo/l2n_writer_au_p.oas b/testdata/algo/l2n_writer_au_p.oas new file mode 100644 index 0000000000000000000000000000000000000000..4db5853310aeaf2d750a1848b3692c92c808cf97 GIT binary patch literal 2370 zcmd^AOKclO7~Y-P^{yWqXPj}`INMjcc}M|NyGb86N^F9q#)-0SfCE|u@emRuf(9ue zAObR65K)9eR6vMSRE3rUJwQQ1z!WUeN*sJZs3A%5At3iqDUn)c)yl0V( z&V$)>{sCPv4bwe7mb+7c84uY`zJI{!$s9czfz;CKY^OJEI|GCL1DV16!&-dUX&D(E zah`pCbnNlRTAbr!&pkErq^1o!Pdq(3JQjq>u2c{tk3*IXm27S(1p~QEo+^PxIy02* z$vA0ips(NdxjE)mqpTE+)sP@~W^4RC51}tK0}1b@OuZc4vhYNR zwfd2A)-nuKj?M>Axz3}zrfjBLS3SBn)LOdNG&~V@>1baeRE|)(Qn=jds#^)Ubg@Tc z@xuXGFR3TMxrSF%5-F)`fhoFo;1`+b%fWTZyc&<;Uu5u2WZD!nc~?Jc;b54OtEe1g zTJ@8(LUjn*JRKbyam#obFZN z<+gCXPkh)O&i9iK+s!fWei^%5$TvM>rwbLDy#hO2=v3N+OcyFX<3Y_Xv@++Do8V-` zhc$7wt3GTyr+dpMcN^#X%7-<&7<(aP`ooxkc(&Ls;n|e|x)ffZ%c&1#x)y(A>&gwb z7CrzBzsT0&8eP3tNY%715HSN-hJz%F^=Z?7G^KwsbA{{nLf zyr9p((w|_e`cz%{2TYqr15fzPOEB9d9YrOxQI5)HBj7*H)_d^+{VK3$a?1erp;&C1 zON6EQZ{_+e!zT1|-^nv@Eitt<6@BdCw7C_9AtO?ch=E855rBwlNQiVG(vC