diff --git a/src/db/db/dbHierarchyBuilder.cc b/src/db/db/dbHierarchyBuilder.cc index 838e93243..fe48fd086 100644 --- a/src/db/db/dbHierarchyBuilder.cc +++ b/src/db/db/dbHierarchyBuilder.cc @@ -381,14 +381,16 @@ HierarchyBuilder::new_inst_member (const RecursiveShapeIterator *iter, const db: } else { - db::Box cell_bbox = iter->layout ()->cell (inst.object ().cell_index ()).bbox (); + db::cell_index_type inst_cell = inst.object ().cell_index (); + + db::Box cell_bbox = iter->cell_bbox (inst_cell); std::pair > clip_variant = compute_clip_variant (cell_bbox, trans, region, complex_region); if (! clip_variant.first) { return false; } - CellMapKey key (inst.object ().cell_index (), iter->is_child_inactive (inst.object ().cell_index ()), clip_variant.second); - db::cell_index_type new_cell = make_cell_variant (key, iter->layout ()->cell_name (inst.object ().cell_index ())); + CellMapKey key (inst.object ().cell_index (), iter->is_child_inactive (inst_cell), clip_variant.second); + db::cell_index_type new_cell = make_cell_variant (key, iter->layout ()->cell_name (inst_cell)); // for a new cell, create this instance if (m_cell_stack.back ().first) { diff --git a/src/db/db/dbRecursiveShapeIterator.cc b/src/db/db/dbRecursiveShapeIterator.cc index 6c89c76f3..df95d9201 100644 --- a/src/db/db/dbRecursiveShapeIterator.cc +++ b/src/db/db/dbRecursiveShapeIterator.cc @@ -775,7 +775,7 @@ RecursiveShapeIterator::down (RecursiveShapeReceiver *receiver) const // compute the region inside the new cell if (new_region != m_region) { new_region = m_trans.inverted () * m_region; - new_region &= m_box_convert (db::CellInst (cell ()->cell_index ())); + new_region &= cell_bbox (cell_index ()); } m_local_region_stack.push_back (new_region); @@ -969,7 +969,7 @@ RecursiveShapeIterator::new_inst_member (RecursiveShapeReceiver *receiver) const // skip instance array members not part of the complex region while (! m_inst_array.at_end ()) { - db::Box ia_box = m_inst->complex_trans (*m_inst_array) * m_box_convert (m_inst->cell_inst ().object ()); + db::Box ia_box = m_inst->complex_trans (*m_inst_array) * cell_bbox (m_inst->cell_index ()); if (! is_outside_complex_region (ia_box)) { break; } else { diff --git a/src/db/db/dbRecursiveShapeIterator.h b/src/db/db/dbRecursiveShapeIterator.h index 5537619c6..ee70e8538 100644 --- a/src/db/db/dbRecursiveShapeIterator.h +++ b/src/db/db/dbRecursiveShapeIterator.h @@ -665,6 +665,16 @@ public: return reinterpret_cast (c - (c & size_t (3))); } + /** + * @brief Gets the current cell's bounding box + * + * The returned box is limited to the selected layer if applicable. + */ + box_type cell_bbox (db::cell_index_type cell_index) const + { + return m_box_convert (db::CellInst (cell_index)); + } + /** * @brief Increments the iterator (operator version) */ diff --git a/testdata/algo/hierarchy_builder_au2a.gds b/testdata/algo/hierarchy_builder_au2a.gds index 9d556aed6..0f6afd622 100644 Binary files a/testdata/algo/hierarchy_builder_au2a.gds and b/testdata/algo/hierarchy_builder_au2a.gds differ diff --git a/testdata/algo/hierarchy_builder_au2b.gds b/testdata/algo/hierarchy_builder_au2b.gds index 66a8a6d76..e5e3ad445 100644 Binary files a/testdata/algo/hierarchy_builder_au2b.gds and b/testdata/algo/hierarchy_builder_au2b.gds differ diff --git a/testdata/algo/hierarchy_builder_au2c.gds b/testdata/algo/hierarchy_builder_au2c.gds index 85f5d6082..d822f9a7a 100644 Binary files a/testdata/algo/hierarchy_builder_au2c.gds and b/testdata/algo/hierarchy_builder_au2c.gds differ diff --git a/testdata/algo/hierarchy_builder_au2d.gds b/testdata/algo/hierarchy_builder_au2d.gds index 9589536ac..e5e3ad445 100644 Binary files a/testdata/algo/hierarchy_builder_au2d.gds and b/testdata/algo/hierarchy_builder_au2d.gds differ diff --git a/testdata/algo/hierarchy_builder_au2f.gds b/testdata/algo/hierarchy_builder_au2f.gds index 7d244fcf7..369ee7d65 100644 Binary files a/testdata/algo/hierarchy_builder_au2f.gds and b/testdata/algo/hierarchy_builder_au2f.gds differ diff --git a/testdata/algo/hierarchy_builder_au4a.gds b/testdata/algo/hierarchy_builder_au4a.gds index 504df9920..8c9f4d9ce 100644 Binary files a/testdata/algo/hierarchy_builder_au4a.gds and b/testdata/algo/hierarchy_builder_au4a.gds differ