diff --git a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc index 580615738..80b1f836b 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc @@ -897,8 +897,6 @@ DEFImporter::read_vias (db::Layout & /*layout*/, db::Cell & /*design*/, double s std::auto_ptr rule_based_vg; std::auto_ptr geo_based_vg; - unsigned int mask = 0; - std::auto_ptr via_generator; std::set seen_layers; std::vector routing_layers; @@ -1018,6 +1016,7 @@ DEFImporter::read_vias (db::Layout & /*layout*/, db::Cell & /*design*/, double s } + unsigned int mask = 0; if (test ("+")) { expect ("MASK"); mask = get_mask (get_long ()); diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc index 56b5fcf3a..06a1c4df5 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc @@ -243,27 +243,39 @@ GeometryBasedViaGenerator::GeometryBasedViaGenerator () { } unsigned int -GeometryBasedViaGenerator::mask_for (const std::string &ln, unsigned int m, unsigned int mask_bottom, unsigned int mask_cut, unsigned int mask_top) const +GeometryBasedViaGenerator::mask_for (const std::string &ln, unsigned int m, unsigned int mask_bottom, unsigned int mask_cut, unsigned int mask_top, const LEFDEFNumberOfMasks *nm) const { - if (m == 0) { + if (m == 0 || ! nm) { + if (ln == m_bottom_layer) { - return (mask_bottom); + return mask_bottom; } else if (ln == m_cut_layer) { - return (mask_cut); + return mask_cut; } else if (ln == m_top_layer) { - return (mask_top); + return mask_top; } + + } else { + + if (ln == m_bottom_layer) { + return mask_bottom > 0 ? ((m + mask_bottom - 2) % nm->number_of_masks (m_bottom_layer) + 1) : m; + } else if (ln == m_cut_layer) { + return mask_cut > 0 ? ((m + mask_cut - 2) % nm->number_of_masks (m_cut_layer) + 1) : m; + } else if (ln == m_top_layer) { + return mask_top > 0 ? ((m + mask_top - 2) % nm->number_of_masks (m_top_layer) + 1) : m; + } + } return m; } void -GeometryBasedViaGenerator::create_cell (LEFDEFReaderState &reader, Layout &layout, db::Cell &cell, unsigned int mask_bottom, unsigned int mask_cut, unsigned int mask_top, const LEFDEFNumberOfMasks * /*nm*/) +GeometryBasedViaGenerator::create_cell (LEFDEFReaderState &reader, Layout &layout, db::Cell &cell, unsigned int mask_bottom, unsigned int mask_cut, unsigned int mask_top, const LEFDEFNumberOfMasks *nm) { for (std::map > >::const_iterator g = m_polygons.begin (); g != m_polygons.end (); ++g) { for (std::list >::const_iterator i = g->second.begin (); i != g->second.end (); ++i) { - std::pair dl = reader.open_layer (layout, g->first, ViaGeometry, mask_for (g->first, i->first, mask_bottom, mask_cut, mask_top)); + std::pair dl = reader.open_layer (layout, g->first, ViaGeometry, mask_for (g->first, i->first, mask_bottom, mask_cut, mask_top, nm)); if (dl.first) { cell.shapes (dl.second).insert (i->second); } @@ -272,7 +284,7 @@ GeometryBasedViaGenerator::create_cell (LEFDEFReaderState &reader, Layout &layou for (std::map > >::const_iterator g = m_boxes.begin (); g != m_boxes.end (); ++g) { for (std::list >::const_iterator i = g->second.begin (); i != g->second.end (); ++i) { - std::pair dl = reader.open_layer (layout, g->first, ViaGeometry, mask_for (g->first, i->first, mask_bottom, mask_cut, mask_top)); + std::pair dl = reader.open_layer (layout, g->first, ViaGeometry, mask_for (g->first, i->first, mask_bottom, mask_cut, mask_top, nm)); if (dl.first) { cell.shapes (dl.second).insert (i->second); } diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h index b85ed0ef8..efa621b15 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h @@ -935,7 +935,7 @@ private: std::map > > m_boxes; std::string m_bottom_layer, m_cut_layer, m_top_layer; - unsigned int mask_for (const std::string &ln, unsigned int m, unsigned int mask_bottom, unsigned int mask_cut, unsigned int mask_top) const; + unsigned int mask_for (const std::string &ln, unsigned int m, unsigned int mask_bottom, unsigned int mask_cut, unsigned int mask_top, const LEFDEFNumberOfMasks *nm) const; }; /** diff --git a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc index bc9526c93..dd60edf1c 100644 --- a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc +++ b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc @@ -308,6 +308,12 @@ TEST(21) run_test (_this, "def12", "lef:test.lef+def:test.def", "au.oas.gz", opt); } +TEST(22) +{ + db::LEFDEFReaderOptions opt = default_options (); + run_test (_this, "def13", "map:test.map+lef:test.lef_5.8+def:top.def.gz", "au.oas.gz", opt); +} + TEST(100) { run_test (_this, "issue-172", "lef:in.lef+def:in.def", "au.oas.gz", default_options (), false);