LEF reader fix: determine routing layers for vias without VIARULE from involved layers

This commit is contained in:
Matthias Koefferlein 2020-03-29 21:01:53 +02:00
parent d328901799
commit e15d99e4da
2 changed files with 28 additions and 1 deletions

View File

@ -602,7 +602,24 @@ LEFImporter::do_read (db::Layout &layout)
test (";");
}
read_geometries (layout, cell, ViaGeometry);
std::map<std::string, db::Box> bboxes;
read_geometries (layout, cell, ViaGeometry, &bboxes);
// determine m1 and m2 layers
std::vector<std::string> routing_layers;
for (std::map<std::string, db::Box>::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));

View File

@ -106,6 +106,7 @@ private:
std::map<std::string, db::Cell *> m_macros_by_name;
std::map<std::string, db::Box> m_macro_bboxes_by_name;
std::map<std::string, ViaDesc> m_vias;
std::set<std::string> m_routing_layers, m_cut_layers;
std::vector <db::Trans> get_iteration (db::Layout &layout);
void read_geometries (db::Layout &layout, db::Cell &cell, LayerPurpose purpose, std::map<std::string, db::Box> *collect_bboxes = 0, properties_id_type prop_id = 0);