diff --git a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc index cc2010c58..842b3287a 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc @@ -727,9 +727,36 @@ DEFImporter::do_read (db::Layout &layout) std::string vn = get (); db::FTrans ft = get_orient (true /*optional*/); + db::Coord dx = 0, dy = 0; + long nx = 1, ny = 1; + + if (specialnets && test ("DO")) { + + nx = std::max (0l, get_long ()); + test ("BY"); + ny = std::max (0l, get_long ()); + test ("STEP"); + dx = db::coord_traits::rounded (get_double () * scale); + dy = db::coord_traits::rounded (get_double () * scale); + + if (nx < 0) { + dx = -dx; + nx = -nx; + } + if (ny < 0) { + dy = -dy; + ny = -ny; + } + + } + std::map::const_iterator vd = via_desc.find (vn); if (vd != via_desc.end () && ! pts.empty ()) { - design.insert (db::CellInstArray (db::CellInst (vd->second.cell->cell_index ()), db::Trans (ft.rot (), db::Vector (pts.back ())))); + if (nx <= 1 && ny <= 1) { + design.insert (db::CellInstArray (db::CellInst (vd->second.cell->cell_index ()), db::Trans (ft.rot (), db::Vector (pts.back ())))); + } else { + design.insert (db::CellInstArray (db::CellInst (vd->second.cell->cell_index ()), db::Trans (ft.rot (), db::Vector (pts.back ())), db::Vector (dx, 0), db::Vector (0, dy), (unsigned long) nx, (unsigned long) ny)); + } if (ln == vd->second.m1) { ln = vd->second.m2; } else if (ln == vd->second.m2) { diff --git a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImport.cc b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc similarity index 96% rename from src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImport.cc rename to src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc index 367802008..14cc6fcac 100644 --- a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImport.cc +++ b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc @@ -240,11 +240,16 @@ TEST(19) } TEST(20) +{ + run_test (_this, "def11", "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); } -TEST(21) +TEST(101) { db::LEFDEFReaderOptions opt = default_options (); opt.set_produce_pin_names (true); @@ -252,7 +257,7 @@ TEST(21) run_test (_this, "issue-489", "lef:in.lef+def:in.def", "au.oas", opt, false); } -TEST(22) +TEST(102) { db::LEFDEFReaderOptions opt = default_options (); opt.set_produce_pin_names (true); @@ -260,8 +265,12 @@ TEST(22) run_test (_this, "issue-489b", "lef:in_tech.lef+lef:in.lef", "au.oas.gz", opt, false); } -TEST(23) +TEST(103) { run_test (_this, "issue-517", "def:in.def", "au.oas.gz", default_options (), false); } +TEST(104) +{ + run_test (_this, "doxy_vias", "def:test.def", "au.oas.gz", default_options (), false); +} diff --git a/src/plugins/streamers/lefdef/unit_tests/unit_tests.pro b/src/plugins/streamers/lefdef/unit_tests/unit_tests.pro index 93529fc7f..3958da4b2 100644 --- a/src/plugins/streamers/lefdef/unit_tests/unit_tests.pro +++ b/src/plugins/streamers/lefdef/unit_tests/unit_tests.pro @@ -6,7 +6,7 @@ TARGET = lefdef_tests include($$PWD/../../../../lib_ut.pri) SOURCES = \ - dbLEFDEFImport.cc + dbLEFDEFImportTests.cc INCLUDEPATH += $$LAY_INC $$TL_INC $$DB_INC $$GSI_INC $$PWD/../db_plugin $$PWD/../../../common DEPENDPATH += $$LAY_INC $$TL_INC $$DB_INC $$GSI_INC $$PWD/../db_plugin $$PWD/../../../common diff --git a/testdata/lefdef/doxy_vias/.test.def.swp b/testdata/lefdef/doxy_vias/.test.def.swp new file mode 100644 index 000000000..fcf20729c Binary files /dev/null and b/testdata/lefdef/doxy_vias/.test.def.swp differ diff --git a/testdata/lefdef/doxy_vias/au.oas.gz b/testdata/lefdef/doxy_vias/au.oas.gz new file mode 100644 index 000000000..c01179c1f Binary files /dev/null and b/testdata/lefdef/doxy_vias/au.oas.gz differ diff --git a/testdata/lefdef/doxy_vias/test.def b/testdata/lefdef/doxy_vias/test.def new file mode 100644 index 000000000..58efeb9c0 --- /dev/null +++ b/testdata/lefdef/doxy_vias/test.def @@ -0,0 +1,19 @@ + +VERSION 5.8 ; +DIVIDERCHAR "/" ; +BUSBITCHARS "[]" ; +DESIGN chip_top ; +UNITS DISTANCE MICRONS 1000 ; +DIEAREA ( 30000 3000 ) ( 10000000 4000 ) ; +VIAS 1 ; + - VIA1_dummy + + RECT M1 ( -200 -140 ) ( 200 140 ) + + RECT VIA1 ( -100 -100 ) ( 100 100 ) + + RECT M2 ( -300 -120 ) ( 300 120 ) ; +END VIAS +SPECIALNETS 1 ; +- dummy + + ROUTED M1 150 + SHAPE IOWIRE ( 40000 3600 ) VIA1_dummy DO 16000 BY 1 STEP 700 0 +; +END SPECIALNETS +END DESIGN