diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc index 092812911..d2f2ccebc 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc @@ -695,6 +695,80 @@ LEFImporter::read_viadef (Layout &layout, const std::string &nondefaultrule) expect (n); } +static void +read_width_property (const std::string &name, const std::string &value, double &w, double &w_wrongdir, double &wmin, double &wmin_wrongdir) +{ + if (name == "LEF58_MINWIDTH") { + + // Cadence extension + tl::Extractor ex (value.c_str ()); + double v = 0.0; + if (ex.test ("MINWIDTH") && ex.try_read (v)) { + if (ex.test ("WRONGDIRECTION")) { + wmin_wrongdir = v; + } else { + wmin = v; + } + } + + } else if (name == "LEF58_WIDTH") { + + // Cadence extension + tl::Extractor ex (value.c_str ()); + double v = 0.0; + if (ex.test ("WIDTH") && ex.try_read (v)) { + if (ex.test ("WRONGDIRECTION")) { + w_wrongdir = v; + } else { + w = v; + } + } + + } else if (name == "LEF58_WIDTHTABLE") { + + // Cadence extension + tl::Extractor ex (value.c_str ()); + while (! ex.at_end ()) { + + if (ex.test ("WIDTHTABLE")) { + + bool wrongdirection = false; + double v = 0.0; + double vv; + while (! ex.at_end () && *ex != ';') { + if (ex.try_read (vv)) { + if (v == 0.0 || vv < v) { + v = vv; + } + } else if (ex.test ("WRONGDIRECTION")) { + wrongdirection = true; + } else if (ex.test ("ORTHOGONAL")) { + // .. nothing yet .. + } else { + break; + } + } + + if (v > 0.0) { + if (wrongdirection) { + w_wrongdir = wmin_wrongdir = v; + } else { + w = wmin = v; + } + } + + } + + while (! ex.at_end () && *ex != ';') { + ++ex; + } + ex.test (";"); + + } + + } +} + void LEFImporter::read_layer (Layout & /*layout*/) { @@ -771,38 +845,9 @@ LEFImporter::read_layer (Layout & /*layout*/) } else if (test ("PROPERTY")) { while (! test (";") && ! at_end ()) { - std::string name = get (); - tl::Variant value = get (); - - if (name == "LEF58_MINWIDTH") { - - // Cadence extension - tl::Extractor ex (value.to_string ()); - double v = 0.0; - if (ex.test ("MINWIDTH") && ex.try_read (v)) { - if (ex.test ("WRONGDIRECTION")) { - wmin_wrongdir = v; - } else { - wmin = v; - } - } - - } else if (name == "LEF58_WIDTH") { - - // Cadence extension - tl::Extractor ex (value.to_string ()); - double v = 0.0; - if (ex.test ("WIDTH") && ex.try_read (v)) { - if (ex.test ("WRONGDIRECTION")) { - w_wrongdir = v; - } else { - w = v; - } - } - - } - + std::string value = get (); + read_width_property (name, value, w, w_wrongdir, wmin, wmin_wrongdir); } } else { diff --git a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc index 38962826f..89d07315c 100644 --- a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc +++ b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc @@ -1018,3 +1018,9 @@ TEST(210_overlaps) } +// issue-1528 +TEST(212_widthtable) +{ + run_test (_this, "issue-1528", "map:gds.map+lef:tech.lef+def:routed.def", "au.oas", default_options (), false); +} + diff --git a/testdata/lefdef/issue-1528/au.oas b/testdata/lefdef/issue-1528/au.oas new file mode 100644 index 000000000..7e9e9e5b4 Binary files /dev/null and b/testdata/lefdef/issue-1528/au.oas differ diff --git a/testdata/lefdef/issue-1528/gds.map b/testdata/lefdef/issue-1528/gds.map new file mode 100644 index 000000000..44d6538f8 --- /dev/null +++ b/testdata/lefdef/issue-1528/gds.map @@ -0,0 +1 @@ +mx NET 10 0 diff --git a/testdata/lefdef/issue-1528/routed.def b/testdata/lefdef/issue-1528/routed.def new file mode 100644 index 000000000..05306d7c4 --- /dev/null +++ b/testdata/lefdef/issue-1528/routed.def @@ -0,0 +1,13 @@ +VERSION 5.8 ; +DIVIDERCHAR "/" ; +BUSBITCHARS "[]" ; +DESIGN block ; +UNITS DISTANCE MICRONS 2000 ; +DIEAREA ( 0 0 ) ( 3000 1000 ) ; +NETS 1 ; + - n1 + USE SIGNAL + + ROUTED mx ( 1000 520 ) ( 2500 * ) + NEW mx ( 1000 520 ) ( * 880 ) + ; +END NETS +END DESIGN diff --git a/testdata/lefdef/issue-1528/tech.lef b/testdata/lefdef/issue-1528/tech.lef new file mode 100644 index 000000000..0242484ca --- /dev/null +++ b/testdata/lefdef/issue-1528/tech.lef @@ -0,0 +1,19 @@ +VERSION 5.8 ; + +BUSBITCHARS "[]" ; +DIVIDERCHAR "/" ; + +UNITS + DATABASE MICRONS 2000 ; +END UNITS + +LAYER mx + TYPE ROUTING ; + WIDTH 0.04 ; + DIRECTION HORIZONTAL ; + PROPERTY LEF58_WIDTHTABLE " + WIDTHTABLE 0.08 ; + WIDTHTABLE 0.12 WRONGDIRECTION ; + " ; +END mx +END LIBRARY