From f4e75aaa74464ee354152da3f162fe46aca1549f Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 30 Jul 2020 23:53:34 +0200 Subject: [PATCH] WIP: reworked layer mapping scheme, needs fixing --- src/db/db/dbStreamLayers.cc | 11 +++ src/db/db/dbStreamLayers.h | 7 ++ .../lefdef/db_plugin/dbLEFDEFImporter.cc | 74 ++++++++----------- 3 files changed, 47 insertions(+), 45 deletions(-) diff --git a/src/db/db/dbStreamLayers.cc b/src/db/db/dbStreamLayers.cc index aa916b30e..fb33f3ac7 100644 --- a/src/db/db/dbStreamLayers.cc +++ b/src/db/db/dbStreamLayers.cc @@ -137,6 +137,17 @@ LayerMap::is_placeholder (unsigned int l) const return (m_placeholders.size () > std::numeric_limits::max () - l); } +const db::LayerProperties * +LayerMap::target (unsigned int l) const +{ + std::map::const_iterator i = m_target_layers.find (l); + if (i != m_target_layers.end ()) { + return & i->second; + } else { + return 0; + } +} + std::pair LayerMap::logical (const db::LayerProperties &p, db::Layout &layout) const { diff --git a/src/db/db/dbStreamLayers.h b/src/db/db/dbStreamLayers.h index efc80b45b..b142d7d95 100644 --- a/src/db/db/dbStreamLayers.h +++ b/src/db/db/dbStreamLayers.h @@ -236,6 +236,13 @@ public: */ std::pair logical (const db::LDPair &p, db::Layout &layout) const; + /** + * @brief Gets the target layer for a given logical layer + * + * Returns 0 if no target layer mapping is supplied. + */ + const db::LayerProperties *target (unsigned int l) const; + /** * @brief String description for the mapping of a logical layer * diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc index 4b33bd657..e8e5f6d7e 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc @@ -668,8 +668,6 @@ LEFDEFReaderState::LEFDEFReaderState (const LEFDEFReaderOptions *tc, db::Layout m_create_layers = tc->read_all_layers (); } - m_layer_map.prepare (layout); - } } @@ -884,24 +882,14 @@ LEFDEFReaderState::open_layer_uncached (db::Layout &layout, const std::string &n lp.datatype = 0; } - std::pair ll = m_layer_map.logical (lp, layout); - - if (ll.first) { - - return ll; - - } else if (! m_create_layers) { - - return std::pair (false, 0); - - } else { - - unsigned int ll = layout.insert_layer (lp); - m_layer_map.map (lp, ll); - return std::pair (true, ll); - + for (db::Layout::layer_iterator l = layout.begin_layers (); l != layout.end_layers (); ++l) { + if ((*l).second->log_equal (lp)) { + return std::make_pair (true, (*l).first); + } } + return std::make_pair (true, layout.insert_layer (lp)); + } else { if (mp_tech_comp) { @@ -981,49 +969,45 @@ LEFDEFReaderState::open_layer_uncached (db::Layout &layout, const std::string &n } } - if (dt > 0 && name_suffix.empty ()) { - name_suffix = "#" + tl::to_string (dt); - } - std::string name = n + name_suffix; - std::pair ll = m_layer_map.logical (name, layout); + db::LayerProperties lp (name); + std::pair ll = m_layer_map.logical (name, layout); if (ll.first) { - return ll; + const db::LayerProperties *lpp = m_layer_map.target (ll.second); + if (lpp) { + lp = *lpp; + } } else { ll = m_layer_map.logical (n, layout); - int ln = -1; + if (ll.first) { - if (ll.first && (ln = layout.get_properties (ll.second).layer) >= 0) { - - m_layer_map.map (db::LayerProperties (name), layout.layers (), db::LayerProperties (ln, dt, name)); - m_layer_map.prepare (layout); - return m_layer_map.logical (name, layout); - - } else if (! m_create_layers) { - - return std::pair (false, 0); - - } else { - - std::map >, unsigned int>::const_iterator l = m_unassigned_layers.find (std::make_pair (n, std::make_pair (purpose, mask))); - if (l != m_unassigned_layers.end ()) { - return std::pair (true, l->second); - } else { - unsigned int li = layout.insert_layer (db::LayerProperties (name)); - m_unassigned_layers.insert (std::make_pair (std::make_pair (n, std::make_pair (purpose, mask)), li)); - m_layer_map.map (db::LayerProperties (name), li); - return std::pair (true, li); + const db::LayerProperties *lpp = m_layer_map.target (ll.second); + if (lpp) { + lp = *lpp; + if (lp.datatype >= 0) { + lp.datatype += dt; + } } + } else if (! m_create_layers) { + return std::make_pair (false, 0); } } + for (db::Layout::layer_iterator l = layout.begin_layers (); l != layout.end_layers (); ++l) { + if ((*l).second->log_equal (lp)) { + return std::make_pair (true, (*l).first); + } + } + + return std::make_pair (true, layout.insert_layer (lp)); + } }