diff --git a/src/db/db/dbHierarchyBuilder.cc b/src/db/db/dbHierarchyBuilder.cc index 88039a4b4..5dc23833d 100644 --- a/src/db/db/dbHierarchyBuilder.cc +++ b/src/db/db/dbHierarchyBuilder.cc @@ -242,7 +242,7 @@ HierarchyBuilder::new_inst (const RecursiveShapeIterator *iter, const db::CellIn // for new cells, create this instance if (m_cell_stack.back ().first) { - db::CellInstArray new_inst = inst; + db::CellInstArray new_inst (inst, &mp_target->array_repository ()); new_inst.object () = db::CellInst (m_cm_entry->second); m_cell_stack.back ().second->insert (new_inst); } diff --git a/src/db/unit_tests/dbHierarchyBuilderTests.cc b/src/db/unit_tests/dbHierarchyBuilderTests.cc index 317b5883f..54bc333d0 100644 --- a/src/db/unit_tests/dbHierarchyBuilderTests.cc +++ b/src/db/unit_tests/dbHierarchyBuilderTests.cc @@ -498,3 +498,40 @@ TEST(6_DisjunctLayersPerHierarchyBranch) db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/hierarchy_builder_au_l4.gds"); } +TEST(7_DetachFromOriginalLayout) +{ + // using OASIS means we create a lot of references to array + // and shape repo - we check here whether these references get + // translated or resolved in the hierarchy builder. + std::auto_ptr ly (new db::Layout (false)); + { + std::string fn (tl::testsrc ()); + fn += "/testdata/algo/hierarchy_builder_l5.oas.gz"; + 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); + + } + + // make sure there is no connection to original layout + ly.reset (0); + + CHECKPOINT(); + db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/hierarchy_builder_au_l5.gds"); +} + diff --git a/testdata/algo/hierarchy_builder_au_l5.gds b/testdata/algo/hierarchy_builder_au_l5.gds new file mode 100644 index 000000000..ecabac16a Binary files /dev/null and b/testdata/algo/hierarchy_builder_au_l5.gds differ diff --git a/testdata/algo/hierarchy_builder_l5.gds b/testdata/algo/hierarchy_builder_l5.gds new file mode 100644 index 000000000..f44e7261f Binary files /dev/null and b/testdata/algo/hierarchy_builder_l5.gds differ diff --git a/testdata/algo/hierarchy_builder_l5.oas.gz b/testdata/algo/hierarchy_builder_l5.oas.gz new file mode 100644 index 000000000..378380678 Binary files /dev/null and b/testdata/algo/hierarchy_builder_l5.oas.gz differ