From e15d99e4dadba06d1b8b8394f5a8ea6770dd3d7c Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 29 Mar 2020 21:01:53 +0200 Subject: [PATCH] LEF reader fix: determine routing layers for vias without VIARULE from involved layers --- .../lefdef/db_plugin/dbLEFImporter.cc | 28 ++++++++++++++++++- .../lefdef/db_plugin/dbLEFImporter.h | 1 + 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc index 95506ff67..d39e27e84 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc @@ -602,7 +602,24 @@ LEFImporter::do_read (db::Layout &layout) test (";"); } - read_geometries (layout, cell, ViaGeometry); + std::map bboxes; + read_geometries (layout, cell, ViaGeometry, &bboxes); + + // determine m1 and m2 layers + + std::vector routing_layers; + for (std::map::const_iterator b = bboxes.begin (); b != bboxes.end (); ++b) { + if (m_routing_layers.find (b->first) != m_routing_layers.end ()) { + routing_layers.push_back (b->first); + } + } + + if (routing_layers.size () == 2) { + via_desc.m1 = routing_layers[0]; + via_desc.m2 = routing_layers[1]; + } else { + warn ("Can't determine routing layers for via: " + n); + } reset_cellname (); @@ -631,6 +648,15 @@ LEFImporter::do_read (db::Layout &layout) if (test ("END")) { expect (ln); break; + } else if (test ("TYPE")) { + if (test ("ROUTING")) { + m_routing_layers.insert (ln); + } else if (test ("CUT")) { + m_cut_layers.insert (ln); + } else { + get (); + } + expect (";"); } else if (test ("WIDTH")) { double w = get_double (); m_default_widths.insert (std::make_pair (ln, w)); diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h index 9811d9bfc..b07af42e7 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h @@ -106,6 +106,7 @@ private: std::map m_macros_by_name; std::map m_macro_bboxes_by_name; std::map m_vias; + std::set m_routing_layers, m_cut_layers; std::vector get_iteration (db::Layout &layout); void read_geometries (db::Layout &layout, db::Cell &cell, LayerPurpose purpose, std::map *collect_bboxes = 0, properties_id_type prop_id = 0);