mirror of https://github.com/KLayout/klayout.git
Merge pull request #1556 from KLayout/issue-1528
Implemented a solution for issue #1528 (LEF WIDTHTABLE)
This commit is contained in:
commit
b4a74821c4
|
|
@ -695,6 +695,80 @@ LEFImporter::read_viadef (Layout &layout, const std::string &nondefaultrule)
|
||||||
expect (n);
|
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
|
void
|
||||||
LEFImporter::read_layer (Layout & /*layout*/)
|
LEFImporter::read_layer (Layout & /*layout*/)
|
||||||
{
|
{
|
||||||
|
|
@ -771,38 +845,9 @@ LEFImporter::read_layer (Layout & /*layout*/)
|
||||||
} else if (test ("PROPERTY")) {
|
} else if (test ("PROPERTY")) {
|
||||||
|
|
||||||
while (! test (";") && ! at_end ()) {
|
while (! test (";") && ! at_end ()) {
|
||||||
|
|
||||||
std::string name = get ();
|
std::string name = get ();
|
||||||
tl::Variant value = get ();
|
std::string value = get ();
|
||||||
|
read_width_property (name, value, w, w_wrongdir, wmin, wmin_wrongdir);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
mx NET 10 0
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
Loading…
Reference in New Issue