Implemented a solution for issue #1528 (LEF WIDTHTABLE)

The WIDTHTABLE is evaluated for normal and WRONGDIRECTION.
The first value is taken as min width and as default width.
This commit is contained in:
Matthias Koefferlein 2023-12-02 22:55:51 +01:00
parent 5b4473e37c
commit 1017026362
6 changed files with 115 additions and 31 deletions

View File

@ -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 {

View File

@ -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);
}

BIN
testdata/lefdef/issue-1528/au.oas vendored Normal file

Binary file not shown.

1
testdata/lefdef/issue-1528/gds.map vendored Normal file
View File

@ -0,0 +1 @@
mx NET 10 0

13
testdata/lefdef/issue-1528/routed.def vendored Normal file
View File

@ -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

19
testdata/lefdef/issue-1528/tech.lef vendored Normal file
View File

@ -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