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 fcf20729c..000000000 Binary files a/testdata/lefdef/doxy_vias/.test.def.swp and /dev/null differ diff --git a/testdata/lefdef/doxy_vias/test.def b/testdata/lefdef/doxy_vias/test.def index 58efeb9c0..6381b8523 100644 --- a/testdata/lefdef/doxy_vias/test.def +++ b/testdata/lefdef/doxy_vias/test.def @@ -16,4 +16,13 @@ SPECIALNETS 1 ; + ROUTED M1 150 + SHAPE IOWIRE ( 40000 3600 ) VIA1_dummy DO 16000 BY 1 STEP 700 0 ; END SPECIALNETS +SCANCHAINS 77 ; +- chain1_clock1 ++ PARTITION clock1 ++ START block1/bsr_reg_0 Q ++ FLOATING +block1/pgm_cgm_en_reg_reg ( IN SD ) ( OUT QZ ) +block1/start_reset_dd_reg ( IN SD ) ( OUT QZ ) ++ STOP block1/start_reset_d_reg SD ; +END SCANCHAINS END DESIGN diff --git a/testdata/lefdef/specialnets_geo/au.oas.gz b/testdata/lefdef/specialnets_geo/au.oas.gz new file mode 100644 index 000000000..994644702 Binary files /dev/null and b/testdata/lefdef/specialnets_geo/au.oas.gz differ 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