WIP: reworked layer mapping scheme, needs fixing

This commit is contained in:
Matthias Koefferlein 2020-07-30 23:53:34 +02:00
parent 5e1eb08ea9
commit f4e75aaa74
3 changed files with 47 additions and 45 deletions

View File

@ -137,6 +137,17 @@ LayerMap::is_placeholder (unsigned int l) const
return (m_placeholders.size () > std::numeric_limits<unsigned int>::max () - l);
}
const db::LayerProperties *
LayerMap::target (unsigned int l) const
{
std::map<unsigned int, LayerProperties>::const_iterator i = m_target_layers.find (l);
if (i != m_target_layers.end ()) {
return & i->second;
} else {
return 0;
}
}
std::pair<bool, unsigned int>
LayerMap::logical (const db::LayerProperties &p, db::Layout &layout) const
{

View File

@ -236,6 +236,13 @@ public:
*/
std::pair<bool, unsigned int> 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
*

View File

@ -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<bool, unsigned int> ll = m_layer_map.logical (lp, layout);
if (ll.first) {
return ll;
} else if (! m_create_layers) {
return std::pair<bool, unsigned int> (false, 0);
} else {
unsigned int ll = layout.insert_layer (lp);
m_layer_map.map (lp, ll);
return std::pair<bool, unsigned int> (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<bool, unsigned int> ll = m_layer_map.logical (name, layout);
db::LayerProperties lp (name);
std::pair<bool, unsigned int> 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<bool, unsigned int> (false, 0);
} else {
std::map <std::pair<std::string, std::pair<LayerPurpose, unsigned int> >, 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<bool, unsigned int> (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<bool, unsigned int> (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));
}
}