mirror of https://github.com/KLayout/klayout.git
WIP: reworked layer mapping scheme, needs fixing
This commit is contained in:
parent
5e1eb08ea9
commit
f4e75aaa74
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue