From 86c1e6ad2b0e3e85d2b812e02d60ec70cc064bf8 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 19 Nov 2023 00:14:46 +0100 Subject: [PATCH] Some more refactoring --- src/db/db/dbCellVariants.cc | 63 +++++++++++------------- src/db/db/dbCellVariants.h | 10 ++-- src/db/db/dbDeepEdgePairs.cc | 8 +-- src/db/db/dbDeepEdges.cc | 21 ++++---- src/db/db/dbDeepRegion.cc | 58 +++++++++------------- src/db/db/dbDeepShapeStore.cc | 7 --- src/db/db/dbDeepShapeStore.h | 56 --------------------- src/db/db/dbDeepTexts.cc | 8 +-- src/db/db/dbHierProcessor.cc | 7 +-- src/db/db/dbLayout.cc | 9 ---- src/db/db/dbLayout.h | 9 ---- src/db/db/dbLayoutUtils.cc | 4 +- src/db/db/dbShapeCollectionUtils.h | 10 ++-- src/db/unit_tests/dbCellVariantsTests.cc | 55 ++++++++++----------- 14 files changed, 115 insertions(+), 210 deletions(-) diff --git a/src/db/db/dbCellVariants.cc b/src/db/db/dbCellVariants.cc index 419d0fcfc..5a4b1ff83 100644 --- a/src/db/db/dbCellVariants.cc +++ b/src/db/db/dbCellVariants.cc @@ -220,22 +220,23 @@ VariantsCollectorBase::VariantsCollectorBase () } VariantsCollectorBase::VariantsCollectorBase (const TransformationReducer *red) - : mp_red (red) + : mp_red (red), mp_layout (0) { // .. nothing yet .. } void -VariantsCollectorBase::collect (const db::Layout &layout, const db::Cell &top_cell) +VariantsCollectorBase::collect (Layout *layout, db::cell_index_type initial_cell) { tl_assert (mp_red != 0); + mp_layout = layout; m_called.clear (); - m_called.insert (top_cell.cell_index ()); + m_called.insert (initial_cell); - top_cell.collect_called_cells (m_called); + layout->cell (initial_cell).collect_called_cells (m_called); - for (db::Layout::top_down_const_iterator c = layout.begin_top_down (); c != layout.end_top_down (); ++c) { + for (db::Layout::top_down_const_iterator c = layout->begin_top_down (); c != layout->end_top_down (); ++c) { if (m_called.find (*c) == m_called.end ()) { continue; @@ -244,7 +245,7 @@ VariantsCollectorBase::collect (const db::Layout &layout, const db::Cell &top_ce // collect the parent variants per parent cell std::map > variants_per_parent_cell; - for (db::Cell::parent_inst_iterator pi = layout.cell (*c).begin_parent_insts (); ! pi.at_end (); ++pi) { + for (db::Cell::parent_inst_iterator pi = layout->cell (*c).begin_parent_insts (); ! pi.at_end (); ++pi) { std::set &variants = variants_per_parent_cell [pi->inst ().object ().cell_index ()]; add_variant (variants, pi->child_inst ().cell_inst (), mp_red->is_translation_invariant ()); } @@ -275,15 +276,11 @@ VariantsCollectorBase::collect (const db::Layout &layout, const db::Cell &top_ce } void -VariantsCollectorBase::separate_variants (db::Layout &layout, db::Cell &top_cell, std::map > *var_table) +VariantsCollectorBase::separate_variants (std::map > *var_table) { tl_assert (mp_red != 0); - db::LayoutLocker locker (&layout); - - std::set called; - top_cell.collect_called_cells (called); - called.insert (top_cell.cell_index ()); + db::LayoutLocker locker (mp_layout); // create new cells for the variants @@ -292,13 +289,13 @@ VariantsCollectorBase::separate_variants (db::Layout &layout, db::Cell &top_cell var_table = &var_table_intern; } - for (db::Layout::bottom_up_const_iterator c = layout.begin_bottom_up (); c != layout.end_bottom_up (); ++c) { + for (db::Layout::bottom_up_const_iterator c = mp_layout->begin_bottom_up (); c != mp_layout->end_bottom_up (); ++c) { - if (called.find (*c) == called.end ()) { + if (m_called.find (*c) == m_called.end ()) { continue; } - db::Cell &cell = layout.cell (*c); + db::Cell &cell = mp_layout->cell (*c); auto vc = m_variants.find (*c); if (vc != m_variants.end () && vc->second.size () > 1) { @@ -321,13 +318,13 @@ VariantsCollectorBase::separate_variants (db::Layout &layout, db::Cell &top_cell if (v != vc->second.begin ()) { - std::string var_name = layout.cell_name (*c); + std::string var_name = mp_layout->cell_name (*c); var_name += "$VAR" + tl::to_string (index); - ci_var = layout.add_cell (var_name.c_str ()); + ci_var = mp_layout->add_cell (var_name.c_str ()); m_called.insert (ci_var); - layout.add_meta_info (ci_var, layout.begin_meta (*c), layout.end_meta (*c)); - copy_shapes (layout, ci_var, *c); + mp_layout->add_meta_info (ci_var, mp_layout->begin_meta (*c), mp_layout->end_meta (*c)); + copy_shapes (*mp_layout, ci_var, *c); // a new entry for the variant if (! v->is_unity ()) { @@ -339,7 +336,7 @@ VariantsCollectorBase::separate_variants (db::Layout &layout, db::Cell &top_cell } vt.insert (std::make_pair (*v, ci_var)); - create_var_instances (layout.cell (ci_var), inst, *v, *var_table, mp_red->is_translation_invariant ()); + create_var_instances (mp_layout->cell (ci_var), inst, *v, *var_table, mp_red->is_translation_invariant ()); } @@ -384,10 +381,12 @@ VariantsCollectorBase::separate_variants (db::Layout &layout, db::Cell &top_cell } } + + mp_layout->variants_created_event (var_table); } void -VariantsCollectorBase::commit_shapes (db::Layout &layout, db::Cell &top_cell, unsigned int layer, std::map > &to_commit) +VariantsCollectorBase::commit_shapes (unsigned int layer, std::map > &to_commit) { tl_assert (mp_red != 0); @@ -398,19 +397,15 @@ VariantsCollectorBase::commit_shapes (db::Layout &layout, db::Cell &top_cell, un // NOTE: this implementation suffers from accumulation of propagated shapes: we add more levels of propagated // shapes if required. We don't clean up, because we do not know when a shape collection stops being required. - db::LayoutLocker locker (&layout); + db::LayoutLocker locker (mp_layout); - std::set called; - top_cell.collect_called_cells (called); - called.insert (top_cell.cell_index ()); + for (db::Layout::bottom_up_const_iterator c = mp_layout->begin_bottom_up (); c != mp_layout->end_bottom_up (); ++c) { - for (db::Layout::bottom_up_const_iterator c = layout.begin_bottom_up (); c != layout.end_bottom_up (); ++c) { - - if (called.find (*c) == called.end ()) { + if (m_called.find (*c) == m_called.end ()) { continue; } - db::Cell &cell = layout.cell (*c); + db::Cell &cell = mp_layout->cell (*c); auto vvc = m_variants.find (*c); if (vvc != m_variants.end () && vvc->second.size () > 1) { @@ -722,17 +717,17 @@ VariantStatistics::VariantStatistics (const TransformationReducer *red) } void -VariantStatistics::collect (const db::Layout &layout, const db::Cell &top_cell) +VariantStatistics::collect (const db::Layout *layout, db::cell_index_type initial_cell) { tl_assert (mp_red != 0); // The top cell gets a "variant" with unit transformation - m_variants [top_cell.cell_index ()].insert (std::make_pair (db::ICplxTrans (), 1)); + m_variants [initial_cell].insert (std::make_pair (db::ICplxTrans (), 1)); std::set called; - top_cell.collect_called_cells (called); + layout->cell (initial_cell).collect_called_cells (called); - for (db::Layout::top_down_const_iterator c = layout.begin_top_down (); c != layout.end_top_down (); ++c) { + for (db::Layout::top_down_const_iterator c = layout->begin_top_down (); c != layout->end_top_down (); ++c) { if (called.find (*c) == called.end ()) { continue; @@ -741,7 +736,7 @@ VariantStatistics::collect (const db::Layout &layout, const db::Cell &top_cell) // collect the parent variants per parent cell std::map > variants_per_parent_cell; - for (db::Cell::parent_inst_iterator pi = layout.cell (*c).begin_parent_insts (); ! pi.at_end (); ++pi) { + for (db::Cell::parent_inst_iterator pi = layout->cell (*c).begin_parent_insts (); ! pi.at_end (); ++pi) { std::map &variants = variants_per_parent_cell [pi->inst ().object ().cell_index ()]; add_variant (variants, pi->child_inst ().cell_inst (), mp_red->is_translation_invariant ()); } diff --git a/src/db/db/dbCellVariants.h b/src/db/db/dbCellVariants.h index f7a938501..a1a871c1d 100644 --- a/src/db/db/dbCellVariants.h +++ b/src/db/db/dbCellVariants.h @@ -188,7 +188,7 @@ public: /** * @brief Collects cell variants for the given layout starting from the top cell */ - void collect (const db::Layout &layout, const db::Cell &top_cell); + void collect (Layout *layout, cell_index_type initial_cell); /** * @brief Creates cell variants for singularization of the different variants @@ -199,7 +199,7 @@ public: * If given, *var_table will be filled with a map giving the new cell and variant against * the old cell for all cells with more than one variant. */ - void separate_variants (db::Layout &layout, db::Cell &top_cell, std::map > *var_table = 0); + void separate_variants (std::map > *var_table = 0); /** * @brief Commits the shapes for different variants to the current cell hierarchy @@ -208,7 +208,7 @@ public: * "to_commit" initially is a set of shapes to commit for the given cell and variant. * This map is modified during the algorithm and should be discarded later. */ - void commit_shapes (db::Layout &layout, db::Cell &top_cell, unsigned int layer, std::map > &to_commit); + void commit_shapes (unsigned int layer, std::map > &to_commit); /** * @brief Gets the variants for a given cell @@ -240,6 +240,7 @@ private: std::map > m_variants; std::set m_called; const TransformationReducer *mp_red; + db::Layout *mp_layout; void add_variant (std::set &variants, const db::CellInstArray &inst, bool tl_invariant) const; void add_variant_non_tl_invariant (std::set &variants, const db::CellInstArray &inst) const; @@ -304,7 +305,8 @@ public: /** * @brief Collects cell variants for the given layout starting from the top cell */ - void collect (const db::Layout &layout, const db::Cell &top_cell); + void collect (const db::Layout *layout, db::cell_index_type initial_cell); + /** * @brief Gets the variants for a given cell * diff --git a/src/db/db/dbDeepEdgePairs.cc b/src/db/db/dbDeepEdgePairs.cc index 783727fa7..62f3ff6ca 100644 --- a/src/db/db/dbDeepEdgePairs.cc +++ b/src/db/db/dbDeepEdgePairs.cc @@ -386,21 +386,21 @@ DeepEdgePairs * DeepEdgePairs::apply_filter (const EdgePairFilterBase &filter) const { const db::DeepLayer &edge_pairs = deep_layer (); + db::Layout &layout = const_cast (edge_pairs.layout ()); std::unique_ptr vars; if (filter.vars ()) { vars.reset (new db::VariantsCollectorBase (filter.vars ())); - vars->collect (edge_pairs.layout (), edge_pairs.initial_cell ()); + vars->collect (&layout, edge_pairs.initial_cell ().cell_index ()); if (filter.wants_variants ()) { - const_cast (edge_pairs).separate_variants (*vars); + vars->separate_variants (); } } - db::Layout &layout = const_cast (edge_pairs.layout ()); std::map > to_commit; std::unique_ptr res (new db::DeepEdgePairs (edge_pairs.derived ())); @@ -445,7 +445,7 @@ DeepEdgePairs::apply_filter (const EdgePairFilterBase &filter) const } if (! to_commit.empty () && vars.get ()) { - res->deep_layer ().commit_shapes (*vars, to_commit); + vars->commit_shapes (res->deep_layer ().layer (), to_commit); } return res.release (); diff --git a/src/db/db/dbDeepEdges.cc b/src/db/db/dbDeepEdges.cc index e5c935c68..12b9a1774 100644 --- a/src/db/db/dbDeepEdges.cc +++ b/src/db/db/dbDeepEdges.cc @@ -244,15 +244,16 @@ static void transform_deep_layer (db::DeepLayer &deep_layer, const Trans &t) // Plain move + db::Layout &layout = deep_layer.layout (); + // build cell variants for different orientations db::OrientationReducer same_orientation; db::VariantsCollectorBase vars (&same_orientation); - vars.collect (deep_layer.layout (), deep_layer.initial_cell ()); - deep_layer.separate_variants (vars); + vars.collect (&layout, deep_layer.initial_cell ().cell_index ()); + vars.separate_variants (); // process the variants - db::Layout &layout = deep_layer.layout (); for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) { @@ -738,7 +739,7 @@ DeepEdges::length_type DeepEdges::length (const db::Box &box) const db::MagnificationReducer red; db::cell_variants_statistics vars (red); - vars.collect (edges.layout (), edges.initial_cell ()); + vars.collect (&edges.layout (), edges.initial_cell ().cell_index ()); DeepEdges::length_type l = 0; @@ -810,21 +811,21 @@ DeepEdges * DeepEdges::apply_filter (const EdgeFilterBase &filter) const { const db::DeepLayer &edges = filter.requires_raw_input () ? deep_layer () : merged_deep_layer (); + db::Layout &layout = const_cast (edges.layout ()); std::unique_ptr vars; if (filter.vars ()) { vars.reset (new db::VariantsCollectorBase (filter.vars ())); - vars->collect (edges.layout (), edges.initial_cell ()); + vars->collect (&layout, edges.initial_cell ().cell_index ()); if (filter.wants_variants ()) { - const_cast (edges).separate_variants (*vars); + vars->separate_variants (); } } - db::Layout &layout = const_cast (edges.layout ()); std::map > to_commit; std::unique_ptr res (new db::DeepEdges (edges.derived ())); @@ -867,7 +868,7 @@ DeepEdges::apply_filter (const EdgeFilterBase &filter) const } if (! to_commit.empty () && vars.get ()) { - res->deep_layer ().commit_shapes (*vars, to_commit); + vars->commit_shapes (res->deep_layer ().layer (), to_commit); } if (! filter.requires_raw_input ()) { @@ -1258,7 +1259,7 @@ RegionDelegate *DeepEdges::extended (coord_type ext_b, coord_type ext_e, coord_t // dots formally don't have an orientation, hence the interpretation is x and y. db::MagnificationReducer red; db::cell_variants_collector vars (red); - vars.collect (edges.layout (), edges.initial_cell ()); + vars.collect (&layout, edges.initial_cell ().cell_index ()); std::map > to_commit; @@ -1337,7 +1338,7 @@ RegionDelegate *DeepEdges::extended (coord_type ext_b, coord_type ext_e, coord_t } // propagate results from variants - vars.commit_shapes (layout, top_cell, res->deep_layer ().layer (), to_commit); + vars.commit_shapes (res->deep_layer ().layer (), to_commit); return res.release (); } diff --git a/src/db/db/dbDeepRegion.cc b/src/db/db/dbDeepRegion.cc index 09f7485b3..b6e04023a 100644 --- a/src/db/db/dbDeepRegion.cc +++ b/src/db/db/dbDeepRegion.cc @@ -256,8 +256,8 @@ static void transform_deep_layer (db::DeepLayer &deep_layer, const Trans &t) db::MagnificationAndOrientationReducer same_orientation; db::VariantsCollectorBase vars (&same_orientation); - vars.collect (deep_layer.layout (), deep_layer.initial_cell ()); - deep_layer.separate_variants (vars); + vars.collect (&deep_layer.layout (), deep_layer.initial_cell ().cell_index ()); + vars.separate_variants (); // process the variants db::Layout &layout = deep_layer.layout (); @@ -1110,7 +1110,7 @@ DeepRegion::area (const db::Box &box) const const db::DeepLayer &polygons = merged_deep_layer (); db::cell_variants_statistics vars; - vars.collect (polygons.layout (), polygons.initial_cell ()); + vars.collect (&polygons.layout (), polygons.initial_cell ().cell_index ()); DeepRegion::area_type a = 0; @@ -1147,7 +1147,7 @@ DeepRegion::perimeter (const db::Box &box) const const db::DeepLayer &polygons = merged_deep_layer (); db::cell_variants_statistics vars; - vars.collect (polygons.layout (), polygons.initial_cell ()); + vars.collect (&polygons.layout (), polygons.initial_cell ().cell_index ()); DeepRegion::perimeter_type p = 0; @@ -1208,7 +1208,7 @@ DeepRegion::grid_check (db::Coord gx, db::Coord gy) const db::Layout &layout = const_cast (polygons.layout ()); db::cell_variants_collector vars (gx); - vars.collect (layout, polygons.initial_cell ()); + vars.collect (&layout, polygons.initial_cell ().cell_index ()); std::map > to_commit; std::unique_ptr res (new db::DeepEdgePairs (polygons.derived ())); @@ -1241,7 +1241,7 @@ DeepRegion::grid_check (db::Coord gx, db::Coord gy) const } // propagate the markers with a similar algorithm used for producing the variants - res->deep_layer ().commit_shapes (vars, to_commit); + vars.commit_shapes (res->deep_layer ().layer (), to_commit); return res.release (); } @@ -1295,15 +1295,13 @@ DeepRegion::snapped (db::Coord gx, db::Coord gy) } const db::DeepLayer &polygons = merged_deep_layer (); + db::Layout &layout = const_cast (polygons.layout ()); db::cell_variants_collector vars (gx); - vars.collect (polygons.layout (), polygons.initial_cell ()); + vars.collect (&layout, polygons.initial_cell ().cell_index ()); + vars.separate_variants (); - // NOTE: m_merged_polygons is mutable, so why is the const_cast needed? - const_cast (polygons).separate_variants (vars); - - db::Layout &layout = const_cast (polygons.layout ()); std::vector heap; std::unique_ptr res (new db::DeepRegion (polygons.derived ())); @@ -1363,20 +1361,17 @@ DeepRegion::edges (const EdgeFilterBase *filter) const db::PropertyMapper pm (res->properties_repository (), &polygons.layout ().properties_repository ()); std::unique_ptr vars; + db::Layout &layout = const_cast (polygons.layout ()); if (filter && filter->vars ()) { vars.reset (new db::VariantsCollectorBase (filter->vars ())); - vars->collect (polygons.layout (), polygons.initial_cell ()); - - // NOTE: m_merged_polygons is mutable, so why is the const_cast needed? - const_cast (polygons).separate_variants (*vars); + vars->collect (&layout, polygons.initial_cell ().cell_index ()); + vars->separate_variants (); } - db::Layout &layout = const_cast (polygons.layout ()); - for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) { db::ICplxTrans tr; @@ -1476,21 +1471,21 @@ DeepRegion * DeepRegion::apply_filter (const PolygonFilterBase &filter) const { const db::DeepLayer &polygons = filter.requires_raw_input () ? deep_layer () : merged_deep_layer (); + db::Layout &layout = const_cast (polygons.layout ()); std::unique_ptr vars; if (filter.vars ()) { vars.reset (new db::VariantsCollectorBase (filter.vars ())); - vars->collect (polygons.layout (), polygons.initial_cell ()); + vars->collect (&layout, polygons.initial_cell ().cell_index ()); if (filter.wants_variants ()) { - const_cast (polygons).separate_variants (*vars); + vars->separate_variants (); } } - db::Layout &layout = const_cast (polygons.layout ()); std::map > to_commit; std::unique_ptr res (new db::DeepRegion (polygons.derived ())); @@ -1537,7 +1532,7 @@ DeepRegion::apply_filter (const PolygonFilterBase &filter) const } if (! to_commit.empty () && vars.get ()) { - res->deep_layer ().commit_shapes (*vars, to_commit); + vars->commit_shapes (res->deep_layer ().layer (), to_commit); } if (! filter.requires_raw_input ()) { @@ -1647,10 +1642,8 @@ DeepRegion::sized (coord_type d, unsigned int mode) const db::Layout &layout = const_cast (polygons.layout ()); db::cell_variants_collector vars; - vars.collect (polygons.layout (), polygons.initial_cell ()); - - // NOTE: m_merged_polygons is mutable, so why is the const_cast needed? - const_cast (polygons).separate_variants (vars); + vars.collect (&layout, polygons.initial_cell ().cell_index ()); + vars.separate_variants (); std::unique_ptr res (new db::DeepRegion (polygons.derived ())); for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) { @@ -1702,10 +1695,8 @@ DeepRegion::sized (coord_type dx, coord_type dy, unsigned int mode) const db::Layout &layout = const_cast (polygons.layout ()); db::cell_variants_collector vars; - vars.collect (polygons.layout (), polygons.initial_cell ()); - - // NOTE: m_merged_polygons is mutable, so why is the const_cast needed? - const_cast (polygons).separate_variants (vars); + vars.collect (&layout, polygons.initial_cell ().cell_index ()); + vars.separate_variants (); std::unique_ptr res (new db::DeepRegion (polygons.derived ())); for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) { @@ -1998,14 +1989,11 @@ DeepRegion::run_single_polygon_check (db::edge_relation_type rel, db::Coord d, c } const db::DeepLayer &polygons = merged_deep_layer (); + db::Layout &layout = const_cast (polygons.layout ()); db::cell_variants_collector vars; - vars.collect (polygons.layout (), polygons.initial_cell ()); - - // NOTE: m_merged_polygons is mutable, so why is the const_cast needed? - const_cast (polygons).separate_variants (vars); - - db::Layout &layout = const_cast (polygons.layout ()); + vars.collect (&layout, polygons.initial_cell ().cell_index ()); + vars.separate_variants (); std::unique_ptr res (new db::DeepEdgePairs (polygons.derived ())); for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) { diff --git a/src/db/db/dbDeepShapeStore.cc b/src/db/db/dbDeepShapeStore.cc index 620c5f2fa..81ff9c327 100644 --- a/src/db/db/dbDeepShapeStore.cc +++ b/src/db/db/dbDeepShapeStore.cc @@ -1283,13 +1283,6 @@ namespace }; } -void -DeepShapeStore::separate_variants (unsigned int layout_index, db::VariantsCollectorBase &coll) -{ - tl_assert (is_valid_layout_index (layout_index)); - layout (layout_index).separate_variants (coll, initial_cell (layout_index).cell_index ()); -} - void DeepShapeStore::insert (const DeepLayer &deep_layer, db::Layout *into_layout, db::cell_index_type into_cell, unsigned int into_layer) { diff --git a/src/db/db/dbDeepShapeStore.h b/src/db/db/dbDeepShapeStore.h index c53cc37d6..1e6e0aaaa 100644 --- a/src/db/db/dbDeepShapeStore.h +++ b/src/db/db/dbDeepShapeStore.h @@ -193,25 +193,6 @@ public: */ void add_from (const DeepLayer &dl); - /** - * @brief Separates cell variants (see DeepShapeStore::separate_variants) - */ - template - void separate_variants (VarCollector &collector); - - /** - * @brief Commits shapes for variants to the existing cell hierarchy - * - * The "to_propagate" collection is a set of shapes per cell and variant. The - * algorithm will put these shapes into the existing hierarchy putting the - * shapes into the proper parent cells to resolve variants. - * - * This map will be modified by the algorithm and should be discarded - * later. - */ - template - void commit_shapes (VarCollector &collector, std::map > &to_propagate); - /** * @brief Gets the shape store object * This is a pure const version to prevent manipulation of the store. @@ -556,29 +537,6 @@ public: */ const db::CellMapping &internal_cell_mapping (unsigned int from_layout_index, unsigned int into_layout_index); - /** - * @brief Create cell variants from the given variant collector - * - * To use this method, first create a variant collector (db::cell_variant_collector) with the required - * reducer and collect the variants. Then call this method on the desired layout index to create the variants. - */ - void separate_variants (unsigned int layout_index, db::VariantsCollectorBase &coll); - - /** - * @brief Commits shapes for variants to the existing cell hierarchy - * - * To use this method, first create a variant collector (db::cell_variant_collector) with the required - * reducer and collect the variants. Then call this method on the desired layout index to commit the shapes for the - * respective variants. - */ - template - void commit_shapes (unsigned int layout_index, VarCollector &coll, unsigned int layer, std::map > &to_commit) - { - tl_assert (is_valid_layout_index (layout_index)); - - coll.commit_shapes (layout (layout_index), initial_cell (layout_index), layer, to_commit); - } - /** * @brief For testing */ @@ -916,20 +874,6 @@ private: std::map, CellMappingWithGenerationIds> m_internal_mapping_cache; }; -template -void DeepLayer::separate_variants (VarCollector &collector) -{ - check_dss (); - mp_store->separate_variants (m_layout, collector); -} - -template -void DeepLayer::commit_shapes (VarCollector &collector, std::map > &to_commit) -{ - check_dss (); - mp_store->commit_shapes (m_layout, collector, layer (), to_commit); -} - } #endif diff --git a/src/db/db/dbDeepTexts.cc b/src/db/db/dbDeepTexts.cc index 1fcac0e00..6845964f4 100644 --- a/src/db/db/dbDeepTexts.cc +++ b/src/db/db/dbDeepTexts.cc @@ -407,21 +407,21 @@ TextsDelegate *DeepTexts::filtered (const TextFilterBase &filter) const DeepTexts *DeepTexts::apply_filter (const TextFilterBase &filter) const { const db::DeepLayer &texts = deep_layer (); + db::Layout &layout = const_cast (texts.layout ()); std::unique_ptr vars; if (filter.vars ()) { vars.reset (new db::VariantsCollectorBase (filter.vars ())); - vars->collect (texts.layout (), texts.initial_cell ()); + vars->collect (&layout, texts.initial_cell ().cell_index ()); if (filter.wants_variants ()) { - const_cast (texts).separate_variants (*vars); + vars->separate_variants (); } } - db::Layout &layout = const_cast (texts.layout ()); std::map > to_commit; std::unique_ptr res (new db::DeepTexts (texts.derived ())); @@ -468,7 +468,7 @@ DeepTexts *DeepTexts::apply_filter (const TextFilterBase &filter) const } if (! to_commit.empty () && vars.get ()) { - res->deep_layer ().commit_shapes (*vars, to_commit); + vars->commit_shapes (res->deep_layer ().layer (), to_commit); } return res.release (); diff --git a/src/db/db/dbHierProcessor.cc b/src/db/db/dbHierProcessor.cc index bc3b890be..bf6cea016 100644 --- a/src/db/db/dbHierProcessor.cc +++ b/src/db/db/dbHierProcessor.cc @@ -1591,12 +1591,13 @@ void local_processor::run (local_operation *op, unsigned db::VariantsCollectorBase *coll = new db::VariantsCollectorBase (op_vars); set_vars_owned (coll); - coll->collect (*mp_subject_layout, *mp_subject_top); - mp_subject_layout->separate_variants (*coll, mp_subject_top->cell_index ()); + coll->collect (mp_subject_layout, mp_subject_top->cell_index ()); + coll->separate_variants (); if (mp_intruder_layout != mp_subject_layout) { db::VariantsCollectorBase vci (op_vars); - vci.collect (*mp_intruder_layout, *mp_intruder_top); + // NOTE: we don't plan to use separate_variants, so the const cast is in order + vci.collect (const_cast (mp_intruder_layout), mp_intruder_top->cell_index ()); if (vci.has_variants ()) { // intruder layout needs to be the same one in that case - we do not want the secondary layout to be modified throw tl::Exception (tl::to_string (tr ("Can't modify second layout for cell variant formation - this case is not supported as of now"))); diff --git a/src/db/db/dbLayout.cc b/src/db/db/dbLayout.cc index 5ae8af700..ab60ae787 100644 --- a/src/db/db/dbLayout.cc +++ b/src/db/db/dbLayout.cc @@ -1812,15 +1812,6 @@ Layout::do_update () delete pr; } -void -Layout::separate_variants (db::VariantsCollectorBase &coll, cell_index_type initial_cell) -{ - std::map > var_table; - coll.separate_variants (*this, cell (initial_cell), &var_table); - - variants_created_event (&var_table); -} - static Layout::meta_info_map s_empty_meta; Layout::meta_info_iterator diff --git a/src/db/db/dbLayout.h b/src/db/db/dbLayout.h index 1ba18bdbd..d85c5976f 100644 --- a/src/db/db/dbLayout.h +++ b/src/db/db/dbLayout.h @@ -1658,15 +1658,6 @@ public: */ void update () const; - /** - * @brief Separates cell variants as given by the cell variant collector - * - * The cell variant collector must have been setup with the desired variants - * using "collect". The new cell variants will be created and a "variants_created" - * event is issued. - */ - void separate_variants (db::VariantsCollectorBase &coll, cell_index_type initial_cell); - /** * @brief Forces an update even if the layout is under construction * diff --git a/src/db/db/dbLayoutUtils.cc b/src/db/db/dbLayoutUtils.cc index 266424ab1..ef45cc2fb 100644 --- a/src/db/db/dbLayoutUtils.cc +++ b/src/db/db/dbLayoutUtils.cc @@ -521,8 +521,8 @@ scale_and_snap (db::Layout &layout, db::Cell &cell, db::Coord g, db::Coord m, db { tl::SelfTimer timer1 (tl::verbosity () >= 41, tl::to_string (tr ("scale_and_snap: variant formation"))); - vars.collect (layout, cell); - vars.separate_variants (layout, cell); + vars.collect (&layout, cell.cell_index ()); + vars.separate_variants (); } std::set called_cells; diff --git a/src/db/db/dbShapeCollectionUtils.h b/src/db/db/dbShapeCollectionUtils.h index 02092030f..954efc628 100644 --- a/src/db/db/dbShapeCollectionUtils.h +++ b/src/db/db/dbShapeCollectionUtils.h @@ -169,21 +169,21 @@ DB_PUBLIC_TEMPLATE OutputContainer * shape_collection_processed_impl (const db::DeepLayer &input, const shape_collection_processor &filter) { + db::Layout &layout = const_cast (input.layout ()); + std::unique_ptr vars; if (filter.vars ()) { vars.reset (new db::VariantsCollectorBase (filter.vars ())); - vars->collect (input.layout (), input.initial_cell ()); + vars->collect (&layout, input.initial_cell ().cell_index ()); if (filter.wants_variants ()) { - const_cast (input).separate_variants (*vars); + vars->separate_variants (); } } - db::Layout &layout = const_cast (input.layout ()); - std::vector heap; std::map > to_commit; @@ -256,7 +256,7 @@ shape_collection_processed_impl (const db::DeepLayer &input, const shape_collect } if (! to_commit.empty () && vars.get ()) { - res->deep_layer ().commit_shapes (*vars, to_commit); + vars->commit_shapes (res->deep_layer ().layer (), to_commit); } if (filter.result_is_merged ()) { diff --git a/src/db/unit_tests/dbCellVariantsTests.cc b/src/db/unit_tests/dbCellVariantsTests.cc index 8775743e2..a508f2a25 100644 --- a/src/db/unit_tests/dbCellVariantsTests.cc +++ b/src/db/unit_tests/dbCellVariantsTests.cc @@ -105,14 +105,14 @@ TEST(1_Trivial) db::OrientationReducer red; db::cell_variants_collector vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0"); EXPECT_EQ (var2str (vb.variants (c.cell_index ())), ""); EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); std::map > vm; - vb.separate_variants (ly, a, &vm); + vb.separate_variants (&vm); EXPECT_EQ (vm.empty (), true); EXPECT_EQ (vm2str (ly, vm), ""); } @@ -130,7 +130,7 @@ TEST(2_TwoVariants) db::OrientationReducer red; db::cell_variants_collector vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "m0 *1 0,0;r0 *1 0,0"); EXPECT_EQ (var2str (vb.variants (c.cell_index ())), ""); @@ -139,7 +139,7 @@ TEST(2_TwoVariants) EXPECT_EQ (inst2str (ly, a), "B:r0 *1 1,10;B:m0 *1 1,100"); std::map > vm; - vb.separate_variants (ly, a, &vm); + vb.separate_variants (&vm); EXPECT_EQ (vm2str (ly, vm), "B:B[m0 *1 0,0],B$VAR1[r0 *1 0,0]"); EXPECT_EQ (inst2str (ly, a), "B$VAR1:r0 *1 1,10;B:m0 *1 1,100"); } @@ -159,7 +159,7 @@ TEST(3_TwoLevels) db::OrientationReducer red; db::cell_variants_collector vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0;r90 *1 0,0"); EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0;r0 *1 0,0;m45 *1 0,0;r90 *1 0,0"); @@ -169,7 +169,7 @@ TEST(3_TwoLevels) EXPECT_EQ (inst2str (ly, b), "C:r0 *1 2,10;C:m0 *1 2,100"); std::map > vm; - vb.separate_variants (ly, a, &vm); + vb.separate_variants (&vm); EXPECT_EQ (vm2str (ly, vm), "B:B[r0 *1 0,0],B$VAR1[r90 *1 0,0];C:C[m0 *1 0,0],C$VAR1[r0 *1 0,0],C$VAR2[m45 *1 0,0],C$VAR3[r90 *1 0,0]"); EXPECT_EQ (inst2str (ly, a), "B:r0 *1 1,10;B$VAR1:r90 *1 1,100"); @@ -193,7 +193,7 @@ TEST(4_ThreeLevels) db::OrientationReducer red; db::cell_variants_collector vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0;r90 *1 0,0"); EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0;r0 *1 0,0;m45 *1 0,0;r90 *1 0,0"); @@ -204,7 +204,7 @@ TEST(4_ThreeLevels) EXPECT_EQ (inst2str (ly, c), "D:m45 *1 0,0"); std::map > vm; - vb.separate_variants (ly, a, &vm); + vb.separate_variants (&vm); EXPECT_EQ (vm2str (ly, vm), "B:B[r0 *1 0,0],B$VAR1[r90 *1 0,0];C:C[m0 *1 0,0],C$VAR1[r0 *1 0,0],C$VAR2[m45 *1 0,0],C$VAR3[r90 *1 0,0];D:D[r270 *1 0,0],D$VAR1[m90 *1 0,0],D$VAR2[r0 *1 0,0],D$VAR3[m45 *1 0,0]"); EXPECT_EQ (inst2str (ly, a), "B:r0 *1 1,10;B$VAR1:r90 *1 1,100"); @@ -231,7 +231,7 @@ TEST(5_ComplexTrans) db::OrientationReducer red; db::cell_variants_collector vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0;r90 *1 0,0"); EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0;r0 *1 0,0;m45 *1 0,0;r90 *1 0,0"); @@ -240,7 +240,6 @@ TEST(5_ComplexTrans) TEST(6_Arrays) { - db::Layout ly; db::Cell &a = ly.cell (ly.add_cell ("A")); db::Cell &b = ly.cell (ly.add_cell ("B")); @@ -254,7 +253,7 @@ TEST(6_Arrays) db::OrientationReducer red; db::cell_variants_collector vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0;r90 *1 0,0"); EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0;r0 *1 0,0;m45 *1 0,0;r90 *1 0,0"); @@ -276,7 +275,7 @@ TEST(7_ScalingVariants) db::MagnificationReducer red; db::cell_variants_collector vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0;r0 *1.5 0,0"); EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "r0 *1 0,0;r0 *1.5 0,0;r0 *2 0,0;r0 *3 0,0"); @@ -296,7 +295,7 @@ TEST(8_GridVariants) db::GridReducer red (10); db::cell_variants_collector vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 1,0;r0 *1 3,0;r0 *1 1,1;r0 *1 3,1"); @@ -317,7 +316,7 @@ TEST(8_GridVariants) EXPECT_EQ (inst2str (ly, c), ""); std::map > vm; - vb.separate_variants (ly, a, &vm); + vb.separate_variants (&vm); EXPECT_EQ (vm2str (ly, vm), "B:B[r0 *1 1,0],B$VAR1[r0 *1 3,0],B$VAR2[r0 *1 1,1],B$VAR3[r0 *1 3,1];C:C[r0 *1 -5,3],C$VAR1[r0 *1 3,3],C$VAR2[r0 *1 -5,4],C$VAR3[r0 *1 3,4]"); EXPECT_EQ (inst2str (ly, a), "B:r0 *1 1,10;B$VAR2:r0 *1 1,111;B$VAR1:r0 *1 103,10;B$VAR3:r0 *1 103,111"); @@ -343,7 +342,7 @@ TEST(9_ComplexGridVariants) db::GridReducer red (10); db::cell_variants_collector vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *2 1,0;r90 *1 1,0;r0 *2 3,0;r0 *2 1,1;r0 *2 3,1"); @@ -398,8 +397,8 @@ TEST(100_OrientationVariantsWithLayout) db::OrientationReducer red; db::cell_variants_collector vb (red); - vb.collect (ly, top_cell); - vb.separate_variants (ly, top_cell); + vb.collect (&ly, top_cell.cell_index ()); + vb.separate_variants (); CHECKPOINT(); db::compare_layouts (_this, ly, tl::testdata () + "/algo/cell_variants_au1.gds"); @@ -417,7 +416,7 @@ TEST(10_TrivialStatistics) db::OrientationReducer red; db::cell_variants_statistics vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0[1]"); EXPECT_EQ (var2str (vb.variants (c.cell_index ())), ""); @@ -437,7 +436,7 @@ TEST(11_TwoVariantsStatistics) db::OrientationReducer red; db::cell_variants_statistics vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "m0 *1 0,0[1];r0 *1 0,0[1]"); EXPECT_EQ (var2str (vb.variants (c.cell_index ())), ""); @@ -461,7 +460,7 @@ TEST(12_TwoLevelsStatistics) db::OrientationReducer red; db::cell_variants_statistics vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0[1];r90 *1 0,0[1]"); EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0[1];r0 *1 0,0[1];m45 *1 0,0[1];r90 *1 0,0[1]"); @@ -487,7 +486,7 @@ TEST(13_ThreeLevelsStatistics) db::OrientationReducer red; db::cell_variants_statistics vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0[1];r90 *1 0,0[1]"); EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0[1];r0 *1 0,0[1];m45 *1 0,0[1];r90 *1 0,0[1]"); @@ -513,7 +512,7 @@ TEST(14_ComplexTransStatistics) db::OrientationReducer red; db::cell_variants_statistics vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0[1];r90 *1 0,0[1]"); EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0[1];r0 *1 0,0[1];m45 *1 0,0[1];r90 *1 0,0[1]"); @@ -536,7 +535,7 @@ TEST(15_ArraysStatistics) db::OrientationReducer red; db::cell_variants_statistics vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0[100];r90 *1 0,0[1]"); EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0[100];r0 *1 0,0[10000];m45 *1 0,0[1];r90 *1 0,0[100]"); @@ -558,7 +557,7 @@ TEST(16_ScalingVariantsStatistics) db::MagnificationReducer red; db::cell_variants_statistics vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0[1];r0 *1.5 0,0[100]"); EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "r0 *1 0,0[1];r0 *1.5 0,0[100];r0 *2 0,0[100];r0 *3 0,0[10000]"); @@ -578,7 +577,7 @@ TEST(17_GridVariantsStatistics) db::GridReducer red (10); db::cell_variants_statistics vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 1,0[1];r0 *1 3,0[1];r0 *1 1,1[1];r0 *1 3,1[1]"); @@ -614,7 +613,7 @@ TEST(18_ComplexGridVariantsStatistics) db::GridReducer red (10); db::cell_variants_statistics vb (red); - vb.collect (ly, a); + vb.collect (&ly, a.cell_index ()); EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]"); EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *2 1,0[1];r90 *1 1,0[1];r0 *2 3,0[1];r0 *2 1,1[1];r0 *2 3,1[1]"); @@ -673,7 +672,7 @@ TEST(101_Propagation) unsigned int l2 = ly.insert_layer (db::LayerProperties (2, 0)); db::cell_variants_collector vb; - vb.collect (ly, top_cell); + vb.collect (&ly, top_cell.cell_index ()); for (db::Layout::const_iterator c = ly.begin (); c != ly.end (); ++c) { @@ -691,7 +690,7 @@ TEST(101_Propagation) } - vb.commit_shapes (ly, top_cell, l2, to_commit); + vb.commit_shapes (l2, to_commit); CHECKPOINT(); db::compare_layouts (_this, ly, tl::testdata () + "/algo/cell_variants_au2.gds");