From a2ac8d45de2e3bbf58b9456b3b488e068928003d Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 18 May 2025 22:16:13 +0200 Subject: [PATCH] Postpone decision about "invalid vias are errors." --- .../lefdef/db_plugin/dbDEFImporter.cc | 7 +- .../lefdef/unit_tests/dbLEFDEFImportTests.cc | 15 +++ .../lefdef/invalid_via/comp_invalid_via.def | 16 ++++ testdata/lefdef/invalid_via/tech.lef | 89 ++++++++++++++++++ testdata/lefdef/multi_def/au.oas | Bin 980 -> 1054 bytes 5 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 testdata/lefdef/invalid_via/comp_invalid_via.def create mode 100644 testdata/lefdef/invalid_via/tech.lef diff --git a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc index a47f99d32..b07a347b0 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc @@ -749,7 +749,12 @@ DEFImporter::read_single_net (std::string &nondefaultrule, Layout &layout, db::C } std::map::const_iterator vd = m_via_desc.find (vn); - if (vd != m_via_desc.end () && ! pts.empty ()) { + + if (vd == m_via_desc.end ()) { + + warn (tl::to_string (tr ("Invalid via name: ")) + vn); + + } else if (! pts.empty ()) { // For the via, the masks are encoded in a three-digit number ( ) unsigned int mask_top = (mask / 100) % 10; diff --git a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc index fb786413f..f430e4829 100644 --- a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc +++ b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc @@ -898,6 +898,21 @@ TEST(132_issue1307_pin_names) run_test (_this, "issue-1307c", "lef:in.lef+def:in.def", "au.oas", opt, false); } +/* +TODO: need to clarify first, if invalid via specs should be errors +TEST(133_unknown_vias_are_errors) +{ + db::LEFDEFReaderOptions opt = default_options (); + + try { + run_test (_this, "invalid_via", "lef:tech.lef+def:comp_invalid_via.def", "au.oas", opt, false); + EXPECT_EQ (true, false); + } catch (db::LEFDEFReaderException &ex) { + EXPECT_EQ (ex.msg ().find ("Invalid via name"), size_t (0)); + } +} +*/ + TEST(200_lefdef_plugin) { db::Layout ly; diff --git a/testdata/lefdef/invalid_via/comp_invalid_via.def b/testdata/lefdef/invalid_via/comp_invalid_via.def new file mode 100644 index 000000000..1eb475daf --- /dev/null +++ b/testdata/lefdef/invalid_via/comp_invalid_via.def @@ -0,0 +1,16 @@ +VERSION 5.8 ; +DIVIDERCHAR "/" ; +BUSBITCHARS "[]" ; +DESIGN comp_invalid_via ; +UNITS DISTANCE MICRONS 1000 ; +DIEAREA ( 0 0 ) ( 10000 2000 ) ; + +SPECIALNETS 2 ; + - VGND ( PIN VGND ) ( * VNB ) ( * VGND ) + USE GROUND + + ROUTED met1 480 + SHAPE FOLLOWPIN ( 0 1000 ) ( 2000 1000 ) + NEW met1 0 + SHAPE STRIPE ( 2000 1000 ) via1 + + ROUTED met2 480 + SHAPE FOLLOWPIN ( 2000 1000 ) ( 4000 1000 ) + NEW met2 0 + SHAPE STRIPE ( 4000 1000 ) invalid_via ; +END SPECIALNETS +END DESIGN + diff --git a/testdata/lefdef/invalid_via/tech.lef b/testdata/lefdef/invalid_via/tech.lef new file mode 100644 index 000000000..cae5bcd54 --- /dev/null +++ b/testdata/lefdef/invalid_via/tech.lef @@ -0,0 +1,89 @@ + +VERSION 5.7 ; + +BUSBITCHARS "[]" ; +DIVIDERCHAR "/" ; +USEMINSPACING OBS OFF ; + +UNITS + DATABASE MICRONS 1000 ; +END UNITS + +MANUFACTURINGGRID 0.005 ; + +LAYER met1 + TYPE ROUTING ; + DIRECTION HORIZONTAL ; + PITCH 0.34 ; + OFFSET 0.17 ; + WIDTH 0.14 ; +END met1 + +LAYER via + TYPE CUT ; + WIDTH 0.15 ; + SPACING 0.17 ; +END via + +LAYER met2 + TYPE ROUTING ; + DIRECTION VERTICAL ; + PITCH 0.46 ; + OFFSET 0.23 ; + WIDTH 0.14 ; +END met2 + +LAYER via2 + TYPE CUT ; + WIDTH 0.2 ; + SPACING 0.2 ; +END via2 + +LAYER met3 + TYPE ROUTING ; + DIRECTION HORIZONTAL ; + PITCH 0.68 ; + OFFSET 0.34 ; + WIDTH 0.3 ; +END met3 + +VIA via1 DEFAULT + LAYER via ; + RECT -0.075 -0.075 0.075 0.075 ; + LAYER met1 ; + RECT -0.16 -0.24 0.16 0.24 ; + LAYER met2 ; + RECT -0.13 -0.24 0.13 0.24 ; +END via1 + +VIARULE M1M2_PR GENERATE + LAYER met1 ; + ENCLOSURE 0.085 0.055 ; + LAYER met2 ; + ENCLOSURE 0.055 0.085 ; + LAYER via ; + RECT -0.075 -0.075 0.075 0.075 ; + SPACING 0.32 BY 0.32 ; +END M1M2_PR + +VIA via2 DEFAULT + LAYER via2 ; + RECT -0.1 -0.1 0.1 0.1 ; + LAYER met2 ; + RECT -0.14 -0.24 0.14 0.24 ; + LAYER met3 ; + RECT -0.165 -0.165 0.165 0.165 ; +END via2 + +VIARULE M2M3_PR GENERATE + LAYER met2 ; + ENCLOSURE 0.04 0.085 ; + LAYER met3 ; + ENCLOSURE 0.065 0.065 ; + LAYER via2 ; + RECT -0.1 -0.1 0.1 0.1 ; + SPACING 0.4 BY 0.4 ; +END M2M3_PR + +END LIBRARY + diff --git a/testdata/lefdef/multi_def/au.oas b/testdata/lefdef/multi_def/au.oas index 3b6e663675cd55e565e8efcce65c6a068de4517d..4f1002177a8d410edd5fe2bc9136b840a45c8f47 100644 GIT binary patch delta 304 zcmcb@K96HUv62#ly4>Rwe?J{B9q+RbQ#gyi7e7q#K6hTX!@uQ{XMmL?!^E1z$txJ; z8M!B)V3eKg%9uRyt~n#?WKl)~Zf3y`JO}J9@C!cRp8SDPj8{gTk%N(+QB06|fxPTw zZYCvu6cJv=$QTiQ1TQcju!D%P2wq@XATOf`G=y330wV*M#Uye#g<*o962of7 zwB$snOA{vurayR*l$r=}Y6?qX{$_`ro<0iiq$JE|N*?)p`phB0XD=nF@jUKUOyM(14VHWyzh=YNNaWg9; U1EVryG2>Lm$q$%5GBGd!0A&1IEC2ui delta 249 zcmbQoafN+CF()T`a$-?pS!&M2sfm-PF`6@SPd>+JFxi+fdEz&Dc~+5XMur1S510=! zJ!BRMWNu+vgO5b`olj%89{6%%A$AU|1$Nr@fI;$@utpHZP6!e$V>ze3?he97$*2BF-&GmNKW+k)A7>rKASi}F#W-flZOsXn=?OJVEze?M|n+! zlV>>G$&)ajDS4#!(3wL)(`IIz;Cdv}T+nmFVNU89og4*8QD;7Z@7BUIvX>;C;Cv*P w*mO#&uzAPi#7%BC3h#2=_!*cO-?K0>Fe)<^GuALNOg3bGJ=uYom5G4?0HlUf(*OVf