diff --git a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc index 657f7e581..4b65f2ade 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc @@ -377,9 +377,8 @@ DEFImporter::produce_routing_geometry (db::Cell &design, const Polygon *style, u // Manhattan paths are stitched together from two-point paths if the // horizontal and vertical width is different. - std::pair e = std::max (ext.front (), ext.back ()); - bool is_isotropic = (e.first == e.second && w.first == w.second); - bool was_path = false; + bool is_isotropic = (w.first == w.second); + bool was_path_before = false; std::vector::const_iterator pt = pts.begin (); while (pt != pts.end ()) { @@ -405,26 +404,39 @@ DEFImporter::produce_routing_geometry (db::Cell &design, const Polygon *style, u if (multipart || (pt0->x () == pt0[1].x () || pt0->y () == pt0[1].y())) { - db::Coord wxy, wxy_perp, exy; + db::Coord wxy, wxy_perp; if (pt0->x () == pt0 [1].x ()) { wxy = w.second; wxy_perp = w.first; - exy = e.second; } else { wxy = w.first; wxy_perp = w.second; - exy = e.first; } - db::Path p (pt0, pt + 1, wxy, pt0 == pts.begin () ? exy : (was_path ? wxy_perp / 2 : 0), pt + 1 == pts.end () ? exy : 0, false); + // compute begin extension + db::Coord be = 0; + if (pt0 == pts.begin ()) { + be = ext.front ().first; + } else if (was_path_before) { + // provides the overlap to the previous segment + be = wxy_perp / 2; + } + + // compute end extension + db::Coord ee = 0; + if (pt + 1 == pts.end ()) { + ee = ext.back ().first; + } + + db::Path p (pt0, pt + 1, wxy, be, ee, false); if (prop_id != 0) { design.shapes (layer).insert (db::object_with_properties (p, prop_id)); } else { design.shapes (layer).insert (p); } - was_path = true; + was_path_before = true; } else { @@ -456,7 +468,7 @@ DEFImporter::produce_routing_geometry (db::Cell &design, const Polygon *style, u design.shapes (layer).insert (p); } - was_path = false; + was_path_before = false; } @@ -596,8 +608,6 @@ DEFImporter::read_single_net (std::string &nondefaultrule, Layout &layout, db::C } else if (peek ("(")) { - ext.clear (); - while (peek ("(") || peek ("MASK")) { if (test ("MASK")) { @@ -689,6 +699,9 @@ DEFImporter::read_single_net (std::string &nondefaultrule, Layout &layout, db::C pts.erase (pts.begin (), pts.end () - 1); } + ext.clear (); + ext.push_back (def_ext); + } else { break; } diff --git a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc index fd9b1b896..5ff589fb1 100644 --- a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc +++ b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc @@ -112,6 +112,7 @@ static void run_test (tl::TestBase *_this, const char *lef_dir, const char *file tl::OutputStream stream (tmp_file); db::SaveLayoutOptions options; options.set_format ("OASIS"); + options.set_option_by_name ("oasis_permissive", tl::Variant (true)); db::Writer writer (options); writer.write (layout, stream); } @@ -244,6 +245,11 @@ TEST(20) run_test (_this, "def11", "lef:test.lef+def:test.def", "au.oas.gz", default_options ()); } +TEST(21) +{ + run_test (_this, "def12", "lef:test.lef+def:test.def", "au.oas.gz", default_options ()); +} + TEST(100) { run_test (_this, "issue-172", "lef:in.lef+def:in.def", "au.oas.gz", default_options (), false); diff --git a/testdata/lefdef/specialnets_geo/au.oas.gz b/testdata/lefdef/specialnets_geo/au.oas.gz index 994644702..9a20c2234 100644 Binary files a/testdata/lefdef/specialnets_geo/au.oas.gz and b/testdata/lefdef/specialnets_geo/au.oas.gz differ