From 440b2b122b9f83fe54fbdbc0d1f479c8b2e88f2a Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 2 Aug 2020 00:09:20 +0200 Subject: [PATCH] Fixed test cases - main reason is the different assignment of layer numbers, mainly for the auxiliary layers such as OUTLINE --- .../lefdef/db_plugin/dbLEFDEFImporter.cc | 137 ++++++++++++------ .../lefdef/db_plugin/dbLEFDEFImporter.h | 1 - .../lefdef/unit_tests/dbLEFDEFImportTests.cc | 93 ++++++++++-- testdata/lefdef/masks-1/au.oas.gz | Bin 1162 -> 1038 bytes 4 files changed, 170 insertions(+), 61 deletions(-) diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc index e8e5f6d7e..d2520e9bf 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc @@ -972,37 +972,39 @@ LEFDEFReaderState::open_layer_uncached (db::Layout &layout, const std::string &n std::string name = n + name_suffix; db::LayerProperties lp (name); + lp.datatype = dt; + std::map::const_iterator ldef = m_default_number.find (n); + if (ldef != m_default_number.end ()) { + lp.layer = ldef->second; + } std::pair ll = m_layer_map.logical (name, layout); + if (! ll.first) { + ll = m_layer_map.logical (n, layout); + } + if (ll.first) { const db::LayerProperties *lpp = m_layer_map.target (ll.second); if (lpp) { lp = *lpp; - } - - } else { - - ll = m_layer_map.logical (n, layout); - if (ll.first) { - - const db::LayerProperties *lpp = m_layer_map.target (ll.second); - if (lpp) { - lp = *lpp; - if (lp.datatype >= 0) { - lp.datatype += dt; - } + if (lp.datatype >= 0) { + lp.datatype += dt; + } + if (lp.name.empty ()) { + lp.name = name; } - - } else if (! m_create_layers) { - return std::make_pair (false, 0); } + } else if (! m_create_layers) { + return std::make_pair (false, 0); } - for (db::Layout::layer_iterator l = layout.begin_layers (); l != layout.end_layers (); ++l) { - if ((*l).second->log_equal (lp)) { - return std::make_pair (true, (*l).first); + if (lp.layer >= 0 && lp.datatype >= 0) { + for (db::Layout::layer_iterator l = layout.begin_layers (); l != layout.end_layers (); ++l) { + if ((*l).second->log_equal (lp)) { + return std::make_pair (true, (*l).first); + } } } @@ -1023,59 +1025,106 @@ LEFDEFReaderState::finish (db::Layout &layout) } } - for (std::map::const_iterator ln = m_default_number.begin (); ln != m_default_number.end (); ++ln) { + std::map number_for_name = m_default_number; + + for (std::map::const_iterator ln = number_for_name.begin (); ln != number_for_name.end (); ++ln) { used_numbers.insert (ln->second); } - for (std::map >, unsigned int>::const_iterator l = m_unassigned_layers.begin (); l != m_unassigned_layers.end (); ++l) { + // Assign default numbers and generate a canonical mapping + + db::LayerMap lm; + + for (std::map >, std::pair >::const_iterator l = m_layers.begin (); l != m_layers.end (); ++l) { + + if (! l->second.first) { + continue; + } + + std::string ps; - int dt = 0; switch (l->first.second.first) { + case Outline: + ps = "OUTLINE"; + break; + case Regions: + ps = "REGION"; + break; + case PlacementBlockage: + ps = "PLACEMENT_BLK"; + break; case Routing: default: - dt = mp_tech_comp->routing_datatype_per_mask (l->first.second.second); + ps = "NET"; break; case SpecialRouting: - dt = mp_tech_comp->special_routing_datatype_per_mask (l->first.second.second); + ps = "SPNET"; break; case ViaGeometry: - dt = mp_tech_comp->via_geometry_datatype_per_mask (l->first.second.second); + ps = "VIA"; break; case Label: - dt = mp_tech_comp->labels_datatype (); + ps = "LABEL"; break; case Pins: - dt = mp_tech_comp->pins_datatype_per_mask (l->first.second.second); + ps = "PIN"; break; case LEFPins: - dt = mp_tech_comp->lef_pins_datatype_per_mask (l->first.second.second); + ps = "LEFPIN"; break; case Obstructions: - dt = mp_tech_comp->obstructions_datatype (); + ps = "OBS"; break; case Blockage: - dt = mp_tech_comp->blockages_datatype (); + ps = "BLK"; break; } - int dl = 0; - std::map::const_iterator ln = m_default_number.find (l->first.first); - if (ln != m_default_number.end ()) { - dl = ln->second; - } else { - do { - ++lnum; - } while (used_numbers.find (lnum) != used_numbers.end ()); - m_default_number.insert (std::make_pair (l->first.first, lnum)); - dl = lnum; + unsigned int layer_index = l->second.second; + db::LayerProperties lp = layout.get_properties (layer_index); + + if (lp.layer < 0) { + + std::map::const_iterator n4n = number_for_name.end (); + if (! l->first.first.empty ()) { + n4n = number_for_name.find (l->first.first); + } + + if (n4n == number_for_name.end ()) { + do { + ++lnum; + } while (used_numbers.find (lnum) != used_numbers.end ()); + number_for_name.insert (std::make_pair (l->first.first, lnum)); + lp.layer = lnum; + } else { + lp.layer = n4n->second; + } + } - db::LayerProperties lp = layout.get_properties (l->second); - lp.layer = dl; - lp.datatype = dt; - layout.set_properties (l->second, lp); + if (lp.datatype < 0) { + lp.datatype = 0; + } + + layout.set_properties (layer_index, lp); + + std::string n = l->first.first; + if (! n.empty ()) { + n += "."; + } + n += ps; + + if (l->first.second.second > 0) { + n += ":"; + n += tl::to_string (l->first.second.second); + } + + lm.map (db::LayerProperties (n), l->second.second, lp); } + + // On return we deliver the "canonical" map + m_layer_map = lm; } void diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h index 65d2c0e6c..b85ed0ef8 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h @@ -1047,7 +1047,6 @@ private: LEFDEFReaderState &operator= (const LEFDEFReaderState &); std::map >, std::pair > m_layers; - std::map >, unsigned int> m_unassigned_layers; db::LayerMap m_layer_map; bool m_create_layers; bool m_has_explicit_layer_mapping; diff --git a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc index ba4d649ac..6d31847b8 100644 --- a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc +++ b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc @@ -49,7 +49,7 @@ static db::LEFDEFReaderOptions default_options () return tc; } -static void run_test (tl::TestBase *_this, const char *lef_dir, const char *filename, const char *au, const db::LEFDEFReaderOptions &options, bool priv = true) +static db::LayerMap run_test (tl::TestBase *_this, const char *lef_dir, const char *filename, const char *au, const db::LEFDEFReaderOptions &options, bool priv = true) { std::string fn_path (priv ? tl::testsrc_private () : tl::testsrc ()); fn_path += "/testdata/lefdef/"; @@ -186,6 +186,8 @@ static void run_test (tl::TestBase *_this, const char *lef_dir, const char *file } } + + return ld.layer_map (); } TEST(1) @@ -200,7 +202,9 @@ TEST(2) TEST(3) { - run_test (_this, "lef3", "lef:in.lef", "au.oas.gz", default_options ()); + db::LEFDEFReaderOptions options = default_options (); + options.set_cell_outline_layer ("OUTLINE (2/0)"); + run_test (_this, "lef3", "lef:in.lef", "au.oas.gz", options); } TEST(4) @@ -220,7 +224,9 @@ TEST(6) TEST(7) { - run_test (_this, "lef7", "lef:in_tech.lef+lef:in.lef", "au.oas.gz", default_options ()); + db::LEFDEFReaderOptions options = default_options (); + options.set_cell_outline_layer ("OUTLINE (8/0)"); + run_test (_this, "lef7", "lef:in_tech.lef+lef:in.lef", "au.oas.gz", options); } TEST(10) @@ -230,12 +236,16 @@ TEST(10) TEST(11) { - run_test (_this, "def2", "lef:0.lef+lef:1.lef+def:in.def.gz", "au.oas.gz", default_options ()); + db::LEFDEFReaderOptions options = default_options (); + options.set_cell_outline_layer ("OUTLINE (10/0)"); + run_test (_this, "def2", "lef:0.lef+lef:1.lef+def:in.def.gz", "au.oas.gz", options); } TEST(12) { - run_test (_this, "def3", "lef:in.lef+def:in.def", "au.oas.gz", default_options ()); + db::LEFDEFReaderOptions options = default_options (); + options.set_cell_outline_layer ("OUTLINE (13/0)"); + run_test (_this, "def3", "lef:in.lef+def:in.def", "au.oas.gz", options); } TEST(13) @@ -255,8 +265,12 @@ TEST(15) TEST(16) { - run_test (_this, "def7", "lef:cells.lef+lef:tech.lef+def:in.def.gz", "au.oas.gz", default_options ()); - run_test (_this, "def7", "map:in.map+lef:cells.lef+lef:tech.lef+def:in.def.gz", "au_with_map_file.oas.gz", default_options ()); + db::LEFDEFReaderOptions options = default_options (); + options.set_placement_blockage_layer ("PLACEMENT_BLK (11/0)"); + run_test (_this, "def7", "lef:cells.lef+lef:tech.lef+def:in.def.gz", "au.oas.gz", options); + + options.set_placement_blockage_layer ("PLACEMENT_BLK (60/0)"); + run_test (_this, "def7", "map:in.map+lef:cells.lef+lef:tech.lef+def:in.def.gz", "au_with_map_file.oas.gz", options); } TEST(17) @@ -275,17 +289,23 @@ TEST(18) TEST(19) { - run_test (_this, "def10", "def:in.def", "au.oas.gz", default_options ()); + db::LEFDEFReaderOptions opt = default_options (); + opt.set_cell_outline_layer ("OUTLINE (2/0)"); + run_test (_this, "def10", "def:in.def", "au.oas.gz", opt); } TEST(20) { - run_test (_this, "def11", "lef:test.lef+def:test.def", "au.oas.gz", default_options ()); + db::LEFDEFReaderOptions opt = default_options (); + opt.set_cell_outline_layer ("OUTLINE (12/0)"); + run_test (_this, "def11", "lef:test.lef+def:test.def", "au.oas.gz", opt); } TEST(21) { - run_test (_this, "def12", "lef:test.lef+def:test.def", "au.oas.gz", default_options ()); + db::LEFDEFReaderOptions opt = default_options (); + opt.set_cell_outline_layer ("OUTLINE (20/0)"); + run_test (_this, "def12", "lef:test.lef+def:test.def", "au.oas.gz", opt); } TEST(100) @@ -298,6 +318,7 @@ TEST(101) db::LEFDEFReaderOptions opt = default_options (); opt.set_produce_pin_names (true); opt.set_pin_property_name (2); + opt.set_cell_outline_layer ("OUTLINE (13/0)"); run_test (_this, "issue-489", "lef:in.lef+def:in.def", "au.oas", opt, false); } @@ -306,17 +327,22 @@ TEST(102) db::LEFDEFReaderOptions opt = default_options (); opt.set_produce_pin_names (true); opt.set_pin_property_name (3); + opt.set_cell_outline_layer ("OUTLINE (8/0)"); run_test (_this, "issue-489b", "lef:in_tech.lef+lef:in.lef", "au.oas.gz", opt, false); } TEST(103) { - run_test (_this, "issue-517", "def:in.def", "au.oas.gz", default_options (), false); + db::LEFDEFReaderOptions options = default_options (); + options.set_cell_outline_layer ("OUTLINE (4/0)"); + run_test (_this, "issue-517", "def:in.def", "au.oas.gz", options, false); } TEST(104_doxy_vias) { - run_test (_this, "doxy_vias", "def:test.def", "au.oas.gz", default_options (), false); + db::LEFDEFReaderOptions options = default_options (); + options.set_cell_outline_layer ("OUTLINE (4/0)"); + run_test (_this, "doxy_vias", "def:test.def", "au.oas.gz", options, false); } TEST(105_specialnets_geo) @@ -354,9 +380,10 @@ TEST(108_scanchain) TEST(109_foreigncell) { - run_test (_this, "foreigncell", "gds:foreign.gds+lef:in_tech.lef+lef:in.lef+def:in.def", "au.oas.gz", default_options (), false); - db::LEFDEFReaderOptions options = default_options (); + options.set_cell_outline_layer ("OUTLINE (43/0)"); + + run_test (_this, "foreigncell", "gds:foreign.gds+lef:in_tech.lef+lef:in.lef+def:in.def", "au.oas.gz", options, false); run_test (_this, "foreigncell", "gds:foreign.gds+lef:in_tech.lef+lef:in2.lef+def:in.def", "au_default.oas.gz", options, false); @@ -373,6 +400,7 @@ TEST(110_lefpins) { db::LEFDEFReaderOptions options = default_options (); options.set_produce_lef_pins (false); + options.set_cell_outline_layer ("OUTLINE (8/0)"); run_test (_this, "lefpins", "lef:in_tech.lef+lef:in.lef+def:in.def", "au_no_lefpins.oas.gz", options, false); options.set_produce_lef_pins (true); @@ -392,7 +420,14 @@ TEST(111_mapfile) TEST(112_via_properties) { - run_test (_this, "via_properties", "lef:in.lef+def:in.def", "au.oas.gz", default_options (), false); + db::LEFDEFReaderOptions options = default_options (); + db::LayerMap lm = db::LayerMap::from_string_file_format ("metal1: 1\nvia1: 2\nmetal2: 3"); + options.set_layer_map (lm); + + db::LayerMap lm_read = run_test (_this, "via_properties", "lef:in.lef+def:in.def", "au.oas.gz", options, false); + EXPECT_EQ (lm_read.to_string (), + "layer_map('OUTLINE : OUTLINE (4/0)';'metal1.VIA : metal1 (1/0)';'metal2.VIA : metal2 (3/0)';'via1.VIA : via1 (2/0)')" + ) } TEST(113_masks_1) @@ -410,7 +445,33 @@ TEST(113_masks_1) options.set_pins_suffix (""); options.set_pins_datatype_per_mask (1, 110); options.set_pins_datatype_per_mask (2, 210); + options.set_cell_outline_layer ("OUTLINE (4/0)"); - run_test (_this, "masks-1", "lef:in_tech.lef+def:in.def", "au.oas.gz", options, false); + db::LayerMap lm = db::LayerMap::from_string_file_format ("M1: 3\nM0PO: 1\nVIA0: 2"); + options.set_layer_map (lm); + + db::LayerMap lm_read = run_test (_this, "masks-1", "lef:in_tech.lef+def:in.def", "au.oas.gz", options, false); + + EXPECT_EQ (lm_read.to_string_file_format (), + "OUTLINE : OUTLINE (4/0)\n" + "'M0PO.SPNET:1' : M0PO (1/101)\n" + "'M1.SPNET:2' : M1 (3/201)\n" + "'M1.SPNET:1' : M1 (3/101)\n" + "'M0PO.VIA:2' : M0PO (1/202)\n" + "'M1.VIA:1' : M1 (3/102)\n" + "'VIA0.VIA:1' : VIA0 (2/102)\n" + "'M0PO.SPNET:2' : M0PO (1/201)\n" + "M0PO.PIN : M0PO (1/2)\n" + "M0PO.LABEL : M0PO.LABEL (1/1)\n" + "'M0PO.PIN:2' : M0PO (1/210)\n" + "'M1.PIN:1' : M1 (3/110)\n" + "M1.LABEL : M1.LABEL (3/1)\n" + "'M1.NET:1' : M1 (3/100)\n" + "'M1.NET:2' : M1 (3/200)\n" + "'M0PO.VIA:1' : M0PO (1/102)\n" + "'M1.VIA:2' : M1 (3/202)\n" + "'VIA0.VIA:2' : VIA0 (2/202)\n" + "'M0PO.NET:1' : M0PO (1/100)\n" + ) } diff --git a/testdata/lefdef/masks-1/au.oas.gz b/testdata/lefdef/masks-1/au.oas.gz index 03632bea656446f22d8a712738dd04d8a4651154..579a0bc453fbb049ac78be435ba6f347a924779e 100644 GIT binary patch delta 332 zcmeC;?Bkelx1Pnm(U>K`!g z>=gapdcZWN|Cw|i#v%+nohAoO?qw!&m7XhASbYY5ul5pBP3e55nQ=DN@NG7w`zj3Z E1yV*$00000