From bcaf28c94c9a5ea327031fcd5bb1ee2467a536b8 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Tue, 31 Mar 2020 23:07:42 +0200 Subject: [PATCH] Bugfix LEF/DEF reader: via needs to change the layer also if it's inside a DEF. Added more test cases. --- .../lefdef/db_plugin/dbDEFImporter.cc | 19 +++++++++++++ .../lefdef/db_plugin/dbLEFImporter.h | 16 +++++++++++ .../lefdef/unit_tests/dbLEFDEFImportTests.cc | 5 ++++ testdata/lefdef/doxy_vias/.test.def.swp | Bin 12288 -> 0 bytes testdata/lefdef/doxy_vias/test.def | 9 ++++++ testdata/lefdef/specialnets_geo/au.oas.gz | Bin 0 -> 337 bytes testdata/lefdef/specialnets_geo/test.def | 26 ++++++++++++++++++ testdata/lefdef/specialnets_geo/test.lef | 24 ++++++++++++++++ 8 files changed, 99 insertions(+) delete mode 100644 testdata/lefdef/doxy_vias/.test.def.swp create mode 100644 testdata/lefdef/specialnets_geo/au.oas.gz create mode 100644 testdata/lefdef/specialnets_geo/test.def create mode 100644 testdata/lefdef/specialnets_geo/test.lef diff --git a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc index 842b3287a..81dc153dd 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc @@ -967,6 +967,25 @@ DEFImporter::do_read (db::Layout &layout) } + if (vd.m1.empty () && vd.m2.empty ()) { + + // analyze the layers to find the metals + std::vector routing_layers; + for (std::map >::const_iterator b = geometry.begin (); b != geometry.end (); ++b) { + if (m_lef_importer.is_routing_layer (b->first)) { + routing_layers.push_back (b->first); + } + } + + if (routing_layers.size () == 2) { + vd.m1 = routing_layers[0]; + vd.m2 = routing_layers[1]; + } else { + warn ("Can't determine routing layers for via: " + n); + } + + } + test (";"); if (has_via_rule && top && cut && bottom) { diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h index b07af42e7..59ee3e5d2 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h @@ -86,6 +86,22 @@ public: */ double layer_ext (const std::string &layer, double def_ext = 0.0) const; + /** + * @brief Returns true if the given layer is a routing layer + */ + bool is_routing_layer (const std::string &layer) const + { + return m_routing_layers.find (layer) != m_routing_layers.end (); + } + + /** + * @brief Returns true if the given layer is a cut layer + */ + bool is_cut_layer (const std::string &layer) const + { + return m_cut_layers.find (layer) != m_cut_layers.end (); + } + /** * @brief Gets a map of the vias defined in this LEF file * diff --git a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc index 14cc6fcac..472a29f0b 100644 --- a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc +++ b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc @@ -274,3 +274,8 @@ TEST(104) { run_test (_this, "doxy_vias", "def:test.def", "au.oas.gz", default_options (), false); } + +TEST(105) +{ + run_test (_this, "specialnets_geo", "lef:test.lef+def:test.def", "au.oas.gz", default_options (), false); +} diff --git a/testdata/lefdef/doxy_vias/.test.def.swp b/testdata/lefdef/doxy_vias/.test.def.swp deleted file mode 100644 index fcf20729c47ae24ef815046334aa97146874bc6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2&yEs75XK9SCacDMff6sf*$guSyGp`oU^;FmGT_XBS^tqyAdrPH%3$Q8F}{LF z6W_y=M-M)LH{->-PoQ59kPr`ec2k{vJyX?RS9Sjq4g{V$UESnr$svquM8l8oo*cb> zRCu2eO_MAejgz@q+BHV0HA&KJmhLiP?e(UheLhK+vqff4lX*6HVP}JR)=#p;o(zWl z!O-r{UM+hs(K%l!A@z^SvMdCIz)k{-Y-m;Ys8V+GkNVBx4c@=r*||j)g@6zc0zyCt z2mv7=1cZPPxL5?Tv_NlgrAzB;?XRDOzn<$*9zs9}2mv7=1cZPP5CTF#2nYcoAOwWK ze@Gzd6aCyH3a;Sr`2BzL{r~q>qF>N==qvOI`T#wLM$iMO0$qlFVDC5R3-lQ}hsMwu zWa{37WC#HvAOwVf5D)@FKnMr{As_^Vzy%JUCcncx52cp?=sD$cSg=2kMp6)^LKc{;`ev0*$|hMV0#G{nc# z&y|^lnSlqH!_DMt$jk^7gwjC15i>KG52m?UK&CJ=0Y%^}UPe)CMg~SEn*dFDQA=h< zrj!(8V^K>cMkWmnQBht7!3T^d7)1`VFsxw`d&tPo#Q@~Ws55Xd@-v7kFfvVGKEWs} zYQVy>h;0Ge3btcBH&|rFHZt>zh%f>bg5)e%*iSJXVmiUpz<-YE7}FW1EsR%~K*C5` j)-b`lmY+%s4ADO literal 0 HcmV?d00001 diff --git a/testdata/lefdef/specialnets_geo/test.def b/testdata/lefdef/specialnets_geo/test.def new file mode 100644 index 000000000..2874f0491 --- /dev/null +++ b/testdata/lefdef/specialnets_geo/test.def @@ -0,0 +1,26 @@ + +VERSION 5.8 ; +DIVIDERCHAR "/" ; +BUSBITCHARS "[]" ; +DESIGN chip_top ; +UNITS DISTANCE MICRONS 1000 ; +DIEAREA ( 0 0 ) ( 300 300 ) ; +STYLES 2 ; +- STYLE 1 ( 30 10 ) ( 10 30 ) ( -10 30 ) ( -30 10 ) ( -30 -10 ) ( -10 -30 ) ( 10 -30 ) ( 30 -10 ) ; +END STYLES +VIAS 1 ; + - VIA1_dummy + + RECT M1 ( -20 -15 ) ( 20 15 ) + + RECT VIA1 ( -10 -10 ) ( 10 10 ) + + RECT M2 ( -25 -25 ) ( 25 25 ) ; +END VIAS +SPECIALNETS 1 ; +- dummy + + POLYGON M1 ( 300 0 ) ( 300 50 ) ( 350 50 ) ( 400 100 ) ( 400 0 ) + + POLYGON M2 ( 300 150 ) ( 300 200 ) ( 350 200 ) ( 400 250 ) ( 400 150 ) + + RECT M1 ( 0 0 ) ( 100 200 ) + + ROUTED M1 30 ( 0 0 15 ) ( 100 0 0 ) VIA1_dummy ( 100 100 10 ) + + ROUTED M2 50 + SHAPE RING + STYLE 1 ( 0 100 ) ( 100 200 ) ( 200 200 ) +; +END SPECIALNETS +END DESIGN diff --git a/testdata/lefdef/specialnets_geo/test.lef b/testdata/lefdef/specialnets_geo/test.lef new file mode 100644 index 000000000..da907c86d --- /dev/null +++ b/testdata/lefdef/specialnets_geo/test.lef @@ -0,0 +1,24 @@ +VERSION 5.8 ; +BUSBITCHARS "[]" ; +DIVIDERCHAR "/" ; + +UNITS + DATABASE MICRONS 1000 ; +END UNITS + +MANUFACTURINGGRID 0.001 ; + +LAYER M1 + TYPE ROUTING ; +END M1 + +LAYER VIA1 + TYPE CUT ; +END VIA1 + +LAYER M2 + TYPE ROUTING ; + WIDTH 0.05 ; +END M2 + +END LIBRARY