WIP: Bugfix - hierarchy was dropping instances.

This commit is contained in:
Matthias Koefferlein 2019-01-03 22:09:19 +01:00
parent 20799026d1
commit 62d9941c4a
5 changed files with 42 additions and 1 deletions

View File

@ -154,6 +154,7 @@ HierarchyBuilder::reset ()
m_initial_pass = true;
mp_initial_cell = 0;
m_cells_to_be_filled.clear ();
m_cell_map.clear ();
m_cells_seen.clear ();
m_cell_stack.clear ();
@ -206,9 +207,15 @@ void
HierarchyBuilder::enter_cell (const RecursiveShapeIterator * /*iter*/, const db::Cell * /*cell*/, const db::Box & /*region*/, const box_tree_type * /*complex_region*/)
{
tl_assert (m_cm_entry != m_cell_map.end () && m_cm_entry != cell_map_type::const_iterator ());
m_cells_seen.insert (m_cm_entry->first);
m_cell_stack.push_back (std::make_pair (m_cm_new_entry, &mp_target->cell (m_cm_entry->second)));
bool new_cell = (m_cells_to_be_filled.find (m_cm_entry->second) != m_cells_to_be_filled.end ());
if (new_cell) {
m_cells_to_be_filled.erase (m_cm_entry->second);
}
m_cell_stack.push_back (std::make_pair (new_cell, &mp_target->cell (m_cm_entry->second)));
}
void
@ -230,6 +237,7 @@ HierarchyBuilder::new_inst (const RecursiveShapeIterator *iter, const db::CellIn
db::cell_index_type new_cell = mp_target->add_cell (iter->layout ()->cell_name (inst.object ().cell_index ()));
m_cm_entry = m_cell_map.insert (std::make_pair (key, new_cell)).first;
m_cm_new_entry = true;
m_cells_to_be_filled.insert (new_cell);
}
// for new cells, create this instance
@ -277,6 +285,7 @@ HierarchyBuilder::new_inst_member (const RecursiveShapeIterator *iter, const db:
db::cell_index_type new_cell = mp_target->add_cell ((std::string (iter->layout ()->cell_name (inst.object ().cell_index ())) + suffix).c_str ());
m_cm_entry = m_cell_map.insert (std::make_pair (key, new_cell)).first;
m_cm_new_entry = true;
m_cells_to_be_filled.insert (new_cell);
}
// for a new cell, create this instance

View File

@ -248,6 +248,7 @@ private:
db::RecursiveShapeIterator m_source;
cell_map_type m_cell_map;
std::set<cell_map_type::key_type> m_cells_seen;
std::set<db::cell_index_type> m_cells_to_be_filled;
cell_map_type::const_iterator m_cm_entry;
bool m_cm_new_entry;
unsigned int m_target_layer;

View File

@ -467,3 +467,34 @@ TEST(5_CompareRecursiveShapeIterators)
}
}
TEST(6_DisjunctLayersPerHierarchyBranch)
{
db::Layout ly;
{
std::string fn (tl::testsrc ());
fn += "/testdata/algo/hierarchy_builder_l4.gds";
tl::InputStream stream (fn);
db::Reader reader (stream);
reader.read (ly);
}
db::Layout target;
db::HierarchyBuilder builder (&target);
for (db::Layout::layer_iterator li = ly.begin_layers (); li != ly.end_layers (); ++li) {
unsigned int li1 = (*li).first;
unsigned int target_layer = target.insert_layer (*(*li).second);
builder.set_target_layer (target_layer);
db::cell_index_type top_cell_index = *ly.begin_top_down ();
db::RecursiveShapeIterator iter (ly, ly.cell (top_cell_index), li1);
iter.push (&builder);
}
CHECKPOINT();
db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/hierarchy_builder_au_l4.gds");
}

Binary file not shown.

BIN
testdata/algo/hierarchy_builder_l4.gds vendored Normal file

Binary file not shown.