diff --git a/src/db/db/dbCellVariants.cc b/src/db/db/dbCellVariants.cc index a71d9eb52..5a4b1ff83 100644 --- a/src/db/db/dbCellVariants.cc +++ b/src/db/db/dbCellVariants.cc @@ -43,6 +43,11 @@ db::Trans OrientationReducer::reduce (const db::Trans &trans) const return db::Trans (trans.fp_trans ()); } +bool OrientationReducer::equals (const TransformationReducer *other) const +{ + return dynamic_cast (other) != 0; +} + // ------------------------------------------------------------------------------------------ db::ICplxTrans OrthogonalTransformationReducer::reduce (const db::ICplxTrans &trans) const @@ -63,6 +68,11 @@ db::Trans OrthogonalTransformationReducer::reduce (const db::Trans &) const return db::Trans (); } +bool OrthogonalTransformationReducer::equals (const TransformationReducer *other) const +{ + return dynamic_cast (other) != 0; +} + // ------------------------------------------------------------------------------------------ db::ICplxTrans MagnificationReducer::reduce (const db::ICplxTrans &trans) const @@ -75,6 +85,11 @@ db::Trans MagnificationReducer::reduce (const db::Trans &) const return db::Trans (); } +bool MagnificationReducer::equals (const TransformationReducer *other) const +{ + return dynamic_cast (other) != 0; +} + // ------------------------------------------------------------------------------------------ db::ICplxTrans XYAnisotropyAndMagnificationReducer::reduce (const db::ICplxTrans &trans) const @@ -91,6 +106,11 @@ db::Trans XYAnisotropyAndMagnificationReducer::reduce (const db::Trans &trans) c return db::Trans (trans.angle () % 2, false, db::Vector ()); } +bool XYAnisotropyAndMagnificationReducer::equals (const TransformationReducer *other) const +{ + return dynamic_cast (other) != 0; +} + // ------------------------------------------------------------------------------------------ db::ICplxTrans MagnificationAndOrientationReducer::reduce (const db::ICplxTrans &trans) const @@ -105,6 +125,11 @@ db::Trans MagnificationAndOrientationReducer::reduce (const db::Trans &trans) co return db::Trans (trans.fp_trans ()); } +bool MagnificationAndOrientationReducer::equals (const TransformationReducer *other) const +{ + return dynamic_cast (other) != 0; +} + // ------------------------------------------------------------------------------------------ GridReducer::GridReducer (db::Coord grid) @@ -130,6 +155,12 @@ db::Trans GridReducer::reduce (const db::Trans &trans) const return res; } +bool GridReducer::equals (const TransformationReducer *other) const +{ + const GridReducer *red = dynamic_cast (other); + return red != 0 && red->m_grid == m_grid; +} + // ------------------------------------------------------------------------------------------ ScaleAndGridReducer::ScaleAndGridReducer (db::Coord grid, db::Coord mult, db::Coord div) @@ -174,6 +205,12 @@ db::Trans ScaleAndGridReducer::reduce (const db::Trans &trans) const return res; } +bool ScaleAndGridReducer::equals (const TransformationReducer *other) const +{ + const ScaleAndGridReducer *red = dynamic_cast (other); + return red != 0 && red->m_grid == m_grid && red->m_mult == m_mult; +} + // ------------------------------------------------------------------------------------------ VariantsCollectorBase::VariantsCollectorBase () @@ -183,57 +220,67 @@ 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; - // The top cell gets a "variant" with unit transformation - m_variants [top_cell.cell_index ()].insert (std::make_pair (db::ICplxTrans (), 1)); + m_called.clear (); + m_called.insert (initial_cell); - std::set called; - top_cell.collect_called_cells (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 (called.find (*c) == called.end ()) { + if (m_called.find (*c) == m_called.end ()) { continue; } // 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) { - std::map &variants = variants_per_parent_cell [pi->inst ().object ().cell_index ()]; + std::map > variants_per_parent_cell; + 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 ()); } // compute the resulting variants - std::map &new_variants = m_variants [*c]; + std::set new_variants; - for (std::map >::const_iterator pv = variants_per_parent_cell.begin (); pv != variants_per_parent_cell.end (); ++pv) { - product (variants (pv->first), pv->second, new_variants); + auto vc = m_variants.find (*c); + if (vc != m_variants.end ()) { + new_variants = vc->second; + } + + for (auto pv = variants_per_parent_cell.begin (); pv != variants_per_parent_cell.end (); ++pv) { + auto v = m_variants.find (pv->first); + if (v != m_variants.end ()) { + product (v->second, pv->second, new_variants); + } else { + new_variants.insert (pv->second.begin (), pv->second.end ()); + } + } + + if (new_variants.size () > 1 || (new_variants.size () == 1 && ! new_variants.begin ()->is_unity ())) { + m_variants [*c] = std::move (new_variants); } } } 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 @@ -242,16 +289,16 @@ 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); - std::map &vv = m_variants [*c]; - if (vv.size () > 1) { + auto vc = m_variants.find (*c); + if (vc != m_variants.end () && vc->second.size () > 1) { std::map &vt = (*var_table) [*c]; @@ -265,35 +312,42 @@ VariantsCollectorBase::separate_variants (db::Layout &layout, db::Cell &top_cell cell.clear_insts (); int index = 0; - for (std::map::const_iterator v = vv.begin (); v != vv.end (); ++v, ++index) { + for (auto v = vc->second.begin (); v != vc->second.end (); ++v, ++index) { db::cell_index_type ci_var; - if (v != vv.begin ()) { + 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 ()); - layout.add_meta_info (ci_var, layout.begin_meta (*c), layout.end_meta (*c)); - copy_shapes (layout, ci_var, *c); + ci_var = mp_layout->add_cell (var_name.c_str ()); + m_called.insert (ci_var); + 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 - m_variants [ci_var].insert (*v); + if (! v->is_unity ()) { + m_variants [ci_var].insert (*v); + } } else { ci_var = *c; } - vt.insert (std::make_pair (v->first, ci_var)); - create_var_instances (layout.cell (ci_var), inst, v->first, *var_table, mp_red->is_translation_invariant ()); + vt.insert (std::make_pair (*v, ci_var)); + create_var_instances (mp_layout->cell (ci_var), inst, *v, *var_table, mp_red->is_translation_invariant ()); } // correct the first (remaining) entry - std::pair v1 = *vt.begin (); - vv.clear (); - vv.insert (v1); + if (! vt.begin ()->first.is_unity ()) { + std::set &tv = m_variants [*c]; + tv.clear (); + tv.insert (vt.begin ()->first); + } else { + m_variants.erase (*c); + } } else { @@ -315,17 +369,24 @@ VariantsCollectorBase::separate_variants (db::Layout &layout, db::Cell &top_cell } cell.clear_insts (); - create_var_instances (cell, inst, vv.begin ()->first, *var_table, mp_red->is_translation_invariant ()); + + if (vc != m_variants.end ()) { + create_var_instances (cell, inst, *vc->second.begin (), *var_table, mp_red->is_translation_invariant ()); + } else { + create_var_instances (cell, inst, db::ICplxTrans (), *var_table, mp_red->is_translation_invariant ()); + } } } } + + 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); @@ -336,28 +397,24 @@ 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); - std::map &vvc = m_variants [*c]; - if (vvc.size () > 1) { + auto vvc = m_variants.find (*c); + if (vvc != m_variants.end () && vvc->second.size () > 1) { - for (std::map::const_iterator vc = vvc.begin (); vc != vvc.end (); ++vc) { + for (auto vc = vvc->second.begin (); vc != vvc->second.end (); ++vc) { for (db::Cell::const_iterator i = cell.begin (); ! i.at_end (); ++i) { - std::map >::const_iterator tc = to_commit.find (i->cell_index ()); + auto tc = to_commit.find (i->cell_index ()); if (tc != to_commit.end ()) { const std::map &vt = tc->second; @@ -369,11 +426,11 @@ VariantsCollectorBase::commit_shapes (db::Layout &layout, db::Cell &top_cell, un for (db::CellInstArray::iterator ia = i->begin (); ! ia.at_end (); ++ia) { db::ICplxTrans t = i->complex_trans (*ia); - db::ICplxTrans rt = mp_red->reduce (vc->first * mp_red->reduce_trans (t)); + db::ICplxTrans rt = mp_red->reduce (*vc * mp_red->reduce_trans (t)); std::map::const_iterator v = vt.find (rt); if (v != vt.end ()) { - db::Shapes &ps = propagated [vc->first]; + db::Shapes &ps = propagated [*vc]; tl::ident_map pm; for (db::Shapes::shape_iterator si = v->second.begin (db::ShapeIterator::All); ! si.at_end (); ++si) { @@ -394,7 +451,7 @@ VariantsCollectorBase::commit_shapes (db::Layout &layout, db::Cell &top_cell, un // single variant -> we can commit any shapes we have kept for this cell directly to the cell - std::map >::iterator l = to_commit.find (*c); + auto l = to_commit.find (*c); if (l != to_commit.end ()) { tl_assert (l->second.size () == 1); cell.shapes (layer).insert (l->second.begin ()->second); @@ -405,7 +462,7 @@ VariantsCollectorBase::commit_shapes (db::Layout &layout, db::Cell &top_cell, un for (db::Cell::const_iterator i = cell.begin (); ! i.at_end (); ++i) { - std::map >::const_iterator tc = to_commit.find (i->cell_index ()); + auto tc = to_commit.find (i->cell_index ()); if (tc != to_commit.end ()) { const std::map &vt = tc->second; @@ -413,7 +470,10 @@ VariantsCollectorBase::commit_shapes (db::Layout &layout, db::Cell &top_cell, un for (db::CellInstArray::iterator ia = i->begin (); ! ia.at_end (); ++ia) { db::ICplxTrans t = i->complex_trans (*ia); - db::ICplxTrans rt = mp_red->reduce (vvc.begin ()->first * mp_red->reduce_trans (t)); + db::ICplxTrans rt = mp_red->reduce_trans (t); + if (vvc != m_variants.end ()) { + rt = mp_red->reduce (*vvc->second.begin () * rt); + } std::map::const_iterator v = vt.find (rt); if (v != vt.end ()) { @@ -437,22 +497,49 @@ VariantsCollectorBase::commit_shapes (db::Layout &layout, db::Cell &top_cell, un } } -const std::map & +static std::set make_once () +{ + std::set res; + res.insert (db::ICplxTrans ()); + return res; +} + +static std::set s_once (make_once ()); + +const std::set & VariantsCollectorBase::variants (db::cell_index_type ci) const { - std::map >::const_iterator v = m_variants.find (ci); - static std::map empty_set; + if (m_called.find (ci) == m_called.end ()) { + static std::set empty; + return empty; + } + + auto v = m_variants.find (ci); if (v == m_variants.end ()) { - return empty_set; + return s_once; } else { return v->second; } } +const db::ICplxTrans & +VariantsCollectorBase::single_variant_transformation (db::cell_index_type ci) const +{ + auto v = m_variants.find (ci); + + if (v == m_variants.end ()) { + static db::ICplxTrans tr1; + return tr1; + } else { + tl_assert (v->second.size () == 1); + return *v->second.begin (); + } +} + bool VariantsCollectorBase::has_variants () const { - for (std::map >::const_iterator i = m_variants.begin (); i != m_variants.end (); ++i) { + for (auto i = m_variants.begin (); i != m_variants.end (); ++i) { if (i->second.size () > 1) { return true; } @@ -461,7 +548,7 @@ VariantsCollectorBase::has_variants () const } void -VariantsCollectorBase::add_variant (std::map &variants, const db::CellInstArray &inst, bool tl_invariant) const +VariantsCollectorBase::add_variant (std::set &variants, const db::CellInstArray &inst, bool tl_invariant) const { if (tl_invariant) { add_variant_tl_invariant (variants, inst); @@ -471,35 +558,35 @@ VariantsCollectorBase::add_variant (std::map &variants, } void -VariantsCollectorBase::add_variant_non_tl_invariant (std::map &variants, const db::CellInstArray &inst) const +VariantsCollectorBase::add_variant_non_tl_invariant (std::set &variants, const db::CellInstArray &inst) const { if (inst.is_complex ()) { for (db::CellInstArray::iterator i = inst.begin (); ! i.at_end (); ++i) { - variants [mp_red->reduce_trans (inst.complex_trans (*i))] += 1; + variants.insert (mp_red->reduce_trans (inst.complex_trans (*i))); } } else { for (db::CellInstArray::iterator i = inst.begin (); ! i.at_end (); ++i) { - variants [db::ICplxTrans (mp_red->reduce_trans (*i))] += 1; + variants.insert (db::ICplxTrans (mp_red->reduce_trans (*i))); } } } void -VariantsCollectorBase::add_variant_tl_invariant (std::map &variants, const db::CellInstArray &inst) const +VariantsCollectorBase::add_variant_tl_invariant (std::set &variants, const db::CellInstArray &inst) const { if (inst.is_complex ()) { - variants [mp_red->reduce_trans (inst.complex_trans ())] += inst.size (); + variants.insert (mp_red->reduce_trans (inst.complex_trans ())); } else { - variants [db::ICplxTrans (mp_red->reduce_trans (inst.front ()))] += inst.size (); + variants.insert (db::ICplxTrans (mp_red->reduce_trans (inst.front ()))); } } void -VariantsCollectorBase::product (const std::map &v1, const std::map &v2, std::map &prod) const +VariantsCollectorBase::product (const std::set &v1, const std::set &v2, std::set &prod) const { - for (std::map::const_iterator i = v1.begin (); i != v1.end (); ++i) { - for (std::map::const_iterator j = v2.begin (); j != v2.end (); ++j) { - prod [mp_red->reduce (i->first * j->first)] += i->second * j->second; + for (auto i = v1.begin (); i != v1.end (); ++i) { + for (auto j = v2.begin (); j != v2.end (); ++j) { + prod.insert (mp_red->reduce (*i * *j)); } } } @@ -527,9 +614,9 @@ VariantsCollectorBase::create_var_instances (db::Cell &in_cell, std::vector &inst, const db::ICplxTrans &for_var, const std::map > &var_table) const { - for (std::vector::const_iterator i = inst.begin (); i != inst.end (); ++i) { + for (auto i = inst.begin (); i != inst.end (); ++i) { - std::map >::const_iterator f = var_table.find (i->object ().cell_index ()); + auto f = var_table.find (i->object ().cell_index ()); if (f == var_table.end ()) { in_cell.insert (*i); @@ -589,9 +676,9 @@ VariantsCollectorBase::create_var_instances_non_tl_invariant (db::Cell &in_cell, void VariantsCollectorBase::create_var_instances_tl_invariant (db::Cell &in_cell, std::vector &inst, const db::ICplxTrans &for_var, const std::map > &var_table) const { - for (std::vector::const_iterator i = inst.begin (); i != inst.end (); ++i) { + for (auto i = inst.begin (); i != inst.end (); ++i) { - std::map >::const_iterator f = var_table.find (i->object ().cell_index ()); + auto f = var_table.find (i->object ().cell_index ()); if (f == var_table.end ()) { in_cell.insert (*i); @@ -615,5 +702,122 @@ VariantsCollectorBase::create_var_instances_tl_invariant (db::Cell &in_cell, std } } +// ------------------------------------------------------------------------------------------ + +VariantStatistics::VariantStatistics () + : mp_red () +{ + // .. nothing yet .. +} + +VariantStatistics::VariantStatistics (const TransformationReducer *red) + : mp_red (red) +{ + // .. nothing yet .. +} + +void +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 [initial_cell].insert (std::make_pair (db::ICplxTrans (), 1)); + + std::set 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) { + + if (called.find (*c) == called.end ()) { + continue; + } + + // 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) { + 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 ()); + } + + // compute the resulting variants + + std::map &new_variants = m_variants [*c]; + + for (std::map >::const_iterator pv = variants_per_parent_cell.begin (); pv != variants_per_parent_cell.end (); ++pv) { + product (variants (pv->first), pv->second, new_variants); + } + + } +} + +const std::map & +VariantStatistics::variants (db::cell_index_type ci) const +{ + std::map >::const_iterator v = m_variants.find (ci); + static std::map empty_set; + if (v == m_variants.end ()) { + return empty_set; + } else { + return v->second; + } +} + +bool +VariantStatistics::has_variants () const +{ + for (std::map >::const_iterator i = m_variants.begin (); i != m_variants.end (); ++i) { + if (i->second.size () > 1) { + return true; + } + } + return false; +} + +void +VariantStatistics::add_variant (std::map &variants, const db::CellInstArray &inst, bool tl_invariant) const +{ + if (tl_invariant) { + add_variant_tl_invariant (variants, inst); + } else { + add_variant_non_tl_invariant (variants, inst); + } +} + +void +VariantStatistics::add_variant_non_tl_invariant (std::map &variants, const db::CellInstArray &inst) const +{ + if (inst.is_complex ()) { + for (db::CellInstArray::iterator i = inst.begin (); ! i.at_end (); ++i) { + variants [mp_red->reduce_trans (inst.complex_trans (*i))] += 1; + } + } else { + for (db::CellInstArray::iterator i = inst.begin (); ! i.at_end (); ++i) { + variants [db::ICplxTrans (mp_red->reduce_trans (*i))] += 1; + } + } +} + +void +VariantStatistics::add_variant_tl_invariant (std::map &variants, const db::CellInstArray &inst) const +{ + if (inst.is_complex ()) { + variants [mp_red->reduce_trans (inst.complex_trans ())] += inst.size (); + } else { + variants [db::ICplxTrans (mp_red->reduce_trans (inst.front ()))] += inst.size (); + } +} + +void +VariantStatistics::product (const std::map &v1, const std::map &v2, std::map &prod) const +{ + for (std::map::const_iterator i = v1.begin (); i != v1.end (); ++i) { + for (std::map::const_iterator j = v2.begin (); j != v2.end (); ++j) { + prod [mp_red->reduce (i->first * j->first)] += i->second * j->second; + } + } +} + } diff --git a/src/db/db/dbCellVariants.h b/src/db/db/dbCellVariants.h index aebbfd5b1..a1a871c1d 100644 --- a/src/db/db/dbCellVariants.h +++ b/src/db/db/dbCellVariants.h @@ -54,6 +54,7 @@ public: virtual db::ICplxTrans reduce_trans (const db::ICplxTrans &trans) const { return reduce (trans); } virtual db::Trans reduce (const db::Trans &trans) const = 0; virtual db::ICplxTrans reduce (const db::ICplxTrans &trans) const = 0; + virtual bool equals (const TransformationReducer *other) const = 0; virtual bool is_translation_invariant () const { return true; } }; @@ -67,6 +68,7 @@ struct DB_PUBLIC OrientationReducer { db::ICplxTrans reduce (const db::ICplxTrans &trans) const; db::Trans reduce (const db::Trans &trans) const; + virtual bool equals (const TransformationReducer *other) const; }; /** @@ -77,6 +79,7 @@ struct DB_PUBLIC OrthogonalTransformationReducer { db::ICplxTrans reduce (const db::ICplxTrans &trans) const; db::Trans reduce (const db::Trans &trans) const; + virtual bool equals (const TransformationReducer *other) const; }; /** @@ -89,6 +92,7 @@ struct DB_PUBLIC MagnificationReducer { db::ICplxTrans reduce (const db::ICplxTrans &trans) const; db::Trans reduce (const db::Trans &) const; + virtual bool equals (const TransformationReducer *other) const; }; /** @@ -101,6 +105,7 @@ struct DB_PUBLIC XYAnisotropyAndMagnificationReducer { db::ICplxTrans reduce (const db::ICplxTrans &trans) const; db::Trans reduce (const db::Trans &trans) const; + virtual bool equals (const TransformationReducer *other) const; }; /** @@ -113,6 +118,7 @@ struct DB_PUBLIC MagnificationAndOrientationReducer { db::ICplxTrans reduce (const db::ICplxTrans &trans) const; db::Trans reduce (const db::Trans &trans) const; + virtual bool equals (const TransformationReducer *other) const; }; /** @@ -127,6 +133,7 @@ struct DB_PUBLIC GridReducer db::ICplxTrans reduce (const db::ICplxTrans &trans) const; db::Trans reduce (const db::Trans &trans) const; + virtual bool equals (const TransformationReducer *other) const; bool is_translation_invariant () const { return false; } @@ -150,6 +157,7 @@ struct DB_PUBLIC ScaleAndGridReducer virtual db::Trans reduce_trans (const db::Trans &trans) const; virtual db::ICplxTrans reduce (const db::ICplxTrans &trans) const; virtual db::Trans reduce (const db::Trans &trans) const; + virtual bool equals (const TransformationReducer *other) const; bool is_translation_invariant () const { return false; } @@ -180,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 @@ -191,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 @@ -200,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 @@ -208,7 +216,15 @@ public: * The keys of the map are the variants, the values is the instance count of the variant * (as seen from the top cell). */ - const std::map &variants (db::cell_index_type ci) const; + const std::set &variants (db::cell_index_type ci) const; + + /** + * @brief Gets the transformation for a single variant + * + * This requires the cell not to be a variant (i.e. already separated). + * It returns the corresponding transformation. + */ + const db::ICplxTrans &single_variant_transformation (db::cell_index_type ci) const; /** * @brief Returns true, if variants have been built @@ -221,13 +237,15 @@ public: static void copy_shapes (db::Layout &layout, db::cell_index_type ci_to, db::cell_index_type ci_from); private: - std::map > m_variants; + std::map > m_variants; + std::set m_called; const TransformationReducer *mp_red; + db::Layout *mp_layout; - void add_variant (std::map &variants, const db::CellInstArray &inst, bool tl_invariant) const; - void add_variant_non_tl_invariant (std::map &variants, const db::CellInstArray &inst) const; - void add_variant_tl_invariant (std::map &variants, const db::CellInstArray &inst) const; - void product (const std::map &v1, const std::map &v2, std::map &prod) const; + 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; + void add_variant_tl_invariant (std::set &variants, const db::CellInstArray &inst) const; + void product (const std::set &v1, const std::set &v2, std::set &prod) const; void create_var_instances (db::Cell &in_cell, std::vector &inst, const db::ICplxTrans &for_var, const std::map > &var_table, bool tl_invariant) const; void create_var_instances_non_tl_invariant (db::Cell &in_cell, std::vector &inst, const db::ICplxTrans &for_var, const std::map > &var_table) const; void create_var_instances_tl_invariant (db::Cell &in_cell, std::vector &inst, const db::ICplxTrans &for_var, const std::map > &var_table) const; @@ -265,6 +283,86 @@ private: RED m_red; }; +/** + * @brief A class computing variants for cells with statistics + * + * This version provides detailed information about the multiplicity of a certain variant. + * It does not offer a way to seperate variants. + */ +class DB_PUBLIC VariantStatistics +{ +public: + /** + * @brief Creates a variant collector without a transformation reducer + */ + VariantStatistics (); + + /** + * @brief Creates a variant collector with the given reducer + */ + VariantStatistics (const TransformationReducer *red); + + /** + * @brief Collects cell variants for the given layout starting from the top cell + */ + void collect (const db::Layout *layout, db::cell_index_type initial_cell); + + /** + * @brief Gets the variants for a given cell + * + * The keys of the map are the variants, the values is the instance count of the variant + * (as seen from the top cell). + */ + const std::map &variants (db::cell_index_type ci) const; + + /** + * @brief Returns true, if variants have been built + */ + bool has_variants () const; + +private: + std::map > m_variants; + const TransformationReducer *mp_red; + + void add_variant (std::map &variants, const db::CellInstArray &inst, bool tl_invariant) const; + void add_variant_non_tl_invariant (std::map &variants, const db::CellInstArray &inst) const; + void add_variant_tl_invariant (std::map &variants, const db::CellInstArray &inst) const; + void product (const std::map &v1, const std::map &v2, std::map &prod) const; +}; + +/** + * @brief A template using a specific transformation reducer + */ +template +class DB_PUBLIC_TEMPLATE cell_variants_statistics + : public VariantStatistics +{ +public: + /** + * @brief Creates a variant statistics without a transformation reducer + */ + cell_variants_statistics () + : VariantStatistics (&m_red) + { + // .. nothing yet .. + } + + /** + * @brief Creates a variant statistics with the given reducer + * + * The statistics object will take ownership over the reducer + */ + cell_variants_statistics (const RED &red) + : VariantStatistics (&m_red), m_red (red) + { + // .. nothing yet .. + } + +private: + RED m_red; +}; + + } // namespace db #endif diff --git a/src/db/db/dbCompoundOperation.cc b/src/db/db/dbCompoundOperation.cc index f63ca361d..2601d98ec 100644 --- a/src/db/db/dbCompoundOperation.cc +++ b/src/db/db/dbCompoundOperation.cc @@ -106,20 +106,20 @@ static void translate (db::Layout *, const std::vector &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionOperationNode::compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector > intermediate; intermediate.push_back (std::unordered_set ()); - implement_compute_local (cache, layout, interactions, intermediate, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, intermediate, proc); translate (layout, intermediate, results); } void -CompoundRegionOperationNode::compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionOperationNode::compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector > intermediate; intermediate.push_back (std::unordered_set ()); - implement_compute_local (cache, layout, interactions, intermediate, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, intermediate, proc); translate (layout, intermediate, results); } @@ -142,14 +142,14 @@ std::vector CompoundRegionOperationPrimaryNode::inputs () const return is; } -void CompoundRegionOperationPrimaryNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const +void CompoundRegionOperationPrimaryNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, db::Cell *, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *) const { for (shape_interactions::subject_iterator i = interactions.begin_subjects (); i != interactions.end_subjects (); ++i) { results.front ().insert (i->second); } } -void CompoundRegionOperationPrimaryNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const +void CompoundRegionOperationPrimaryNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, db::Cell *, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *) const { for (shape_interactions::subject_iterator i = interactions.begin_subjects (); i != interactions.end_subjects (); ++i) { results.front ().insert (i->second); @@ -177,14 +177,14 @@ std::vector CompoundRegionOperationSecondaryNode::inputs () const return iv; } -void CompoundRegionOperationSecondaryNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const +void CompoundRegionOperationSecondaryNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, db::Cell *, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *) const { for (shape_interactions::intruder_iterator i = interactions.begin_intruders (); i != interactions.end_intruders (); ++i) { results.front ().insert (i->second.second); } } -void CompoundRegionOperationSecondaryNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const +void CompoundRegionOperationSecondaryNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, db::Cell *, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *) const { for (shape_interactions::intruder_iterator i = interactions.begin_intruders (); i != interactions.end_intruders (); ++i) { results.front ().insert (i->second.second); @@ -211,14 +211,14 @@ std::vector CompoundRegionOperationForeignNode::inputs () const return iv; } -void CompoundRegionOperationForeignNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const +void CompoundRegionOperationForeignNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, db::Cell *, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *) const { for (shape_interactions::intruder_iterator i = interactions.begin_intruders (); i != interactions.end_intruders (); ++i) { results.front ().insert (i->second.second); } } -void CompoundRegionOperationForeignNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const +void CompoundRegionOperationForeignNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, db::Cell *, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *) const { for (shape_interactions::intruder_iterator i = interactions.begin_intruders (); i != interactions.end_intruders (); ++i) { results.front ().insert (i->second.second); @@ -236,7 +236,16 @@ void CompoundTransformationReducer::add (const db::TransformationReducer *reducer) { if (reducer) { + + // do not add the same reducer twice + for (auto v = m_vars.begin (); v != m_vars.end (); ++v) { + if (reducer->equals (*v)) { + return; + } + } + m_vars.push_back (reducer); + } } @@ -245,7 +254,7 @@ CompoundTransformationReducer::reduce_trans (const db::Trans &trans) const { db::Trans t = trans; for (std::vector::const_iterator v = m_vars.begin (); v != m_vars.end (); ++v) { - (*v)->reduce_trans (t); + t = (*v)->reduce_trans (t); } return t; } @@ -255,7 +264,7 @@ CompoundTransformationReducer::reduce_trans (const db::ICplxTrans &trans) const { db::ICplxTrans t = trans; for (std::vector::const_iterator v = m_vars.begin (); v != m_vars.end (); ++v) { - (*v)->reduce_trans (t); + t = (*v)->reduce_trans (t); } return t; } @@ -265,7 +274,7 @@ CompoundTransformationReducer::reduce (const db::Trans &trans) const { db::Trans t = trans; for (std::vector::const_iterator v = m_vars.begin (); v != m_vars.end (); ++v) { - (*v)->reduce (t); + t = (*v)->reduce (t); } return t; } @@ -275,7 +284,7 @@ CompoundTransformationReducer::reduce (const db::ICplxTrans &trans) const { db::ICplxTrans t = trans; for (std::vector::const_iterator v = m_vars.begin (); v != m_vars.end (); ++v) { - (*v)->reduce (t); + t = (*v)->reduce (t); } return t; } @@ -403,7 +412,7 @@ CompoundRegionMultiInputOperationNode::child (unsigned int index) const const TransformationReducer * CompoundRegionMultiInputOperationNode::vars () const { - return (m_vars.is_empty () ? &m_vars : 0); + return (m_vars.is_empty () ? 0 : &m_vars); } bool @@ -446,7 +455,7 @@ std::string CompoundRegionLogicalBoolOperationNode::generated_description () con } template -void CompoundRegionLogicalBoolOperationNode::implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +void CompoundRegionLogicalBoolOperationNode::implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { bool ok = (m_op == And ? true : false); @@ -459,7 +468,7 @@ void CompoundRegionLogicalBoolOperationNode::implement_compute_local (CompoundRe const CompoundRegionOperationNode *node = child (ci); - bool any = node->compute_local_bool (cache, layout, child_interactions, max_vertex_count, area_ratio); + bool any = node->compute_local_bool (cache, layout, cell, child_interactions, proc); if (m_op == And) { if (! any) { @@ -743,13 +752,13 @@ static void copy_results (std::vector > &, const std::vect template void -CompoundRegionGeometricalBoolOperationNode::implement_bool (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionGeometricalBoolOperationNode::implement_bool (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector > one_a; one_a.push_back (std::unordered_set ()); shape_interactions computed_a; - child (0)->compute_local (cache, layout, interactions_for_child (interactions, 0, computed_a), one_a, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, cell, interactions_for_child (interactions, 0, computed_a), one_a, proc); if (one_a.front ().empty ()) { @@ -763,7 +772,7 @@ CompoundRegionGeometricalBoolOperationNode::implement_bool (CompoundRegionOperat one_b.push_back (std::unordered_set ()); shape_interactions computed_b; - child (1)->compute_local (cache, layout, interactions_for_child (interactions, 1, computed_b), one_b, max_vertex_count, area_ratio); + child (1)->compute_local (cache, layout, cell, interactions_for_child (interactions, 1, computed_b), one_b, proc); copy_results (results, one_b); @@ -775,7 +784,7 @@ CompoundRegionGeometricalBoolOperationNode::implement_bool (CompoundRegionOperat one_b.push_back (std::unordered_set ()); shape_interactions computed_b; - child (1)->compute_local (cache, layout, interactions_for_child (interactions, 1, computed_b), one_b, max_vertex_count, area_ratio); + child (1)->compute_local (cache, layout, cell, interactions_for_child (interactions, 1, computed_b), one_b, proc); if (one_b.front ().empty ()) { @@ -794,44 +803,44 @@ CompoundRegionGeometricalBoolOperationNode::implement_bool (CompoundRegionOperat template void -CompoundRegionGeometricalBoolOperationNode::implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionGeometricalBoolOperationNode::implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { ResultType res_a = child (0)->result_type (); ResultType res_b = child (1)->result_type (); if (res_a == Region && res_b == Region) { - implement_bool (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_bool (cache, layout, cell, interactions, results, proc); } else if (res_a == Region && res_b == Edges) { - implement_bool (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_bool (cache, layout, cell, interactions, results, proc); } else if (res_a == Edges && res_b == Region) { - implement_bool (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_bool (cache, layout, cell, interactions, results, proc); } else if (res_a == Edges && res_b == Edges) { - implement_bool (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_bool (cache, layout, cell, interactions, results, proc); } } void -CompoundRegionGeometricalBoolOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionGeometricalBoolOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void -CompoundRegionGeometricalBoolOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionGeometricalBoolOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void -CompoundRegionGeometricalBoolOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionGeometricalBoolOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void -CompoundRegionGeometricalBoolOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionGeometricalBoolOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } // --------------------------------------------------------------------------------------------- @@ -900,7 +909,7 @@ namespace template template -void compound_region_generic_operation_node::implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +void compound_region_generic_operation_node::implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { generic_result_adaptor adaptor (&results); @@ -917,7 +926,7 @@ void compound_region_generic_operation_node::implement_compute_local shape_interactions self_interactions_heap; const shape_interactions &self_interactions = interactions_for_child (interactions, 0, self_interactions_heap); - self->compute_local (cache, layout, self_interactions, self_result, max_vertex_count, area_ratio); + self->compute_local (cache, layout, cell, self_interactions, self_result, proc); db::generic_shape_iterator is (self_result.front ().begin (), self_result.front ().end ()); @@ -934,7 +943,7 @@ void compound_region_generic_operation_node::implement_compute_local shape_interactions intruder_interactions_heap; const shape_interactions &intruder_interactions = interactions_for_child (interactions, ci, intruder_interactions_heap); - intruder->compute_local (cache, layout, intruder_interactions, intruder_result, max_vertex_count, area_ratio); + intruder->compute_local (cache, layout, cell, intruder_interactions, intruder_result, proc); intruder_results.push_back (std::unordered_set ()); intruder_results.back ().swap (intruder_result.front ()); @@ -943,21 +952,21 @@ void compound_region_generic_operation_node::implement_compute_local } - db::local_processor proc (layout); - proc.run_flat (is, iiv, std::vector (), m_op, adaptor.results ()); + db::local_processor lproc (layout); + lproc.run_flat (is, iiv, std::vector (), m_op, adaptor.results ()); adaptor.finish (layout); } // explicit instantiations -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; // --------------------------------------------------------------------------------------------- @@ -990,7 +999,7 @@ CompoundRegionLogicalCaseSelectOperationNode::result_type () const } template -void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { bool ok = false; @@ -1005,7 +1014,7 @@ void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db:: if (ci + 1 < children ()) { - ok = node->compute_local_bool (cache, layout, child_interactions, max_vertex_count, area_ratio); + ok = node->compute_local_bool (cache, layout, cell, child_interactions, proc); continue; } else { @@ -1021,12 +1030,12 @@ void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db:: std::vector > one; one.push_back (std::unordered_set ()); - node->compute_local (cache, layout, child_interactions, one, max_vertex_count, area_ratio); + node->compute_local (cache, layout, cell, child_interactions, one, proc); results[ci / 2].swap (one.front ()); } else { - node->compute_local (cache, layout, child_interactions, results, max_vertex_count, area_ratio); + node->compute_local (cache, layout, cell, child_interactions, results, proc); } @@ -1038,12 +1047,12 @@ void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db:: } -template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; // --------------------------------------------------------------------------------------------- @@ -1145,24 +1154,24 @@ CompoundRegionJoinOperationNode::result_type () const } template -void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { for (unsigned int ci = 0; ci < children (); ++ci) { shape_interactions computed; const shape_interactions &child_interactions = interactions_for_child (interactions, ci, computed); - child (ci)->compute_local (cache, layout, child_interactions, results, max_vertex_count, area_ratio); + child (ci)->compute_local (cache, layout, cell, child_interactions, results, proc); } } -template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; +template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, db::Cell *, const shape_interactions &, std::vector > &, const db::LocalProcessorBase *) const; // --------------------------------------------------------------------------------------------- @@ -1181,15 +1190,15 @@ CompoundRegionFilterOperationNode::~CompoundRegionFilterOperationNode () } void -CompoundRegionFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void -CompoundRegionFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } // --------------------------------------------------------------------------------------------- @@ -1209,15 +1218,15 @@ CompoundRegionEdgeFilterOperationNode::~CompoundRegionEdgeFilterOperationNode () } void -CompoundRegionEdgeFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgeFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void -CompoundRegionEdgeFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgeFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } // --------------------------------------------------------------------------------------------- @@ -1237,15 +1246,15 @@ CompoundRegionEdgePairFilterOperationNode::~CompoundRegionEdgePairFilterOperatio } void -CompoundRegionEdgePairFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgePairFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void -CompoundRegionEdgePairFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgePairFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } bool @@ -1271,15 +1280,15 @@ CompoundRegionProcessingOperationNode::~CompoundRegionProcessingOperationNode () } void -CompoundRegionProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void -CompoundRegionProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void @@ -1298,6 +1307,34 @@ CompoundRegionProcessingOperationNode::processed (db::Layout *layout, const db:: } } +void +CompoundRegionProcessingOperationNode::processed (db::Layout *, const db::Polygon &p, const db::ICplxTrans &tr, std::vector &res) const +{ + size_t n = res.size (); + mp_proc->process (tr * p, res); + + if (res.size () > n) { + db::ICplxTrans tri = tr.inverted (); + for (auto p = res.begin () + n; p != res.end (); ++p) { + p->transform (tri); + } + } +} + +void +CompoundRegionProcessingOperationNode::processed (db::Layout *layout, const db::PolygonRef &p, const db::ICplxTrans &tr, std::vector &res) const +{ + std::vector poly; + mp_proc->process (p.obj ().transformed (p.trans ()).transformed (tr), poly); + + if (! poly.empty ()) { + db::ICplxTrans tri = tr.inverted (); + for (std::vector::const_iterator p = poly.begin (); p != poly.end (); ++p) { + res.push_back (db::PolygonRef (tri * *p, layout->shape_repository ())); + } + } +} + // --------------------------------------------------------------------------------------------- CompoundRegionToEdgeProcessingOperationNode::CompoundRegionToEdgeProcessingOperationNode (PolygonToEdgeProcessorBase *proc, CompoundRegionOperationNode *input, bool owns_proc) @@ -1315,15 +1352,15 @@ CompoundRegionToEdgeProcessingOperationNode::~CompoundRegionToEdgeProcessingOper } void -CompoundRegionToEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionToEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void -CompoundRegionToEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionToEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void @@ -1338,6 +1375,34 @@ CompoundRegionToEdgeProcessingOperationNode::processed (db::Layout *, const db:: mp_proc->process (p.obj ().transformed (p.trans ()), res); } +void +CompoundRegionToEdgeProcessingOperationNode::processed (db::Layout *, const db::Polygon &p, const db::ICplxTrans &tr, std::vector &res) const +{ + size_t n = res.size (); + mp_proc->process (tr * p, res); + + if (res.size () > n) { + db::ICplxTrans tri = tr.inverted (); + for (auto p = res.begin () + n; p != res.end (); ++p) { + p->transform (tri); + } + } +} + +void +CompoundRegionToEdgeProcessingOperationNode::processed (db::Layout *, const db::PolygonRef &p, const db::ICplxTrans &tr, std::vector &res) const +{ + size_t n = res.size (); + mp_proc->process (p.obj ().transformed (p.trans ()).transformed (tr), res); + + if (res.size () > n) { + db::ICplxTrans tri = tr.inverted (); + for (auto p = res.begin () + n; p != res.end (); ++p) { + p->transform (tri); + } + } +} + // --------------------------------------------------------------------------------------------- CompoundRegionEdgeProcessingOperationNode::CompoundRegionEdgeProcessingOperationNode (EdgeProcessorBase *proc, CompoundRegionOperationNode *input, bool owns_proc) @@ -1355,15 +1420,15 @@ CompoundRegionEdgeProcessingOperationNode::~CompoundRegionEdgeProcessingOperatio } void -CompoundRegionEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void -CompoundRegionEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void CompoundRegionEdgeProcessingOperationNode::processed (db::Layout *, const db::Edge &p, std::vector &res) const @@ -1388,15 +1453,15 @@ CompoundRegionEdgeToPolygonProcessingOperationNode::~CompoundRegionEdgeToPolygon } void -CompoundRegionEdgeToPolygonProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgeToPolygonProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void -CompoundRegionEdgeToPolygonProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgeToPolygonProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void @@ -1433,15 +1498,15 @@ CompoundRegionToEdgePairProcessingOperationNode::~CompoundRegionToEdgePairProces } void -CompoundRegionToEdgePairProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionToEdgePairProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void -CompoundRegionToEdgePairProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionToEdgePairProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void @@ -1456,6 +1521,34 @@ CompoundRegionToEdgePairProcessingOperationNode::processed (db::Layout *, const mp_proc->process (p.obj ().transformed (p.trans ()), res); } +void +CompoundRegionToEdgePairProcessingOperationNode::processed (db::Layout *, const db::Polygon &p, const db::ICplxTrans &tr, std::vector &res) const +{ + size_t n = res.size (); + mp_proc->process (tr * p, res); + + if (res.size () > n) { + db::ICplxTrans tri = tr.inverted (); + for (auto p = res.begin () + n; p != res.end (); ++p) { + p->transform (tri); + } + } +} + +void +CompoundRegionToEdgePairProcessingOperationNode::processed (db::Layout *, const db::PolygonRef &p, const db::ICplxTrans &tr, std::vector &res) const +{ + size_t n = res.size (); + mp_proc->process (p.obj ().transformed (p.trans ()).transformed (tr), res); + + if (res.size () > n) { + db::ICplxTrans tri = tr.inverted (); + for (auto p = res.begin () + n; p != res.end (); ++p) { + p->transform (tri); + } + } +} + // --------------------------------------------------------------------------------------------- CompoundRegionEdgePairToPolygonProcessingOperationNode::CompoundRegionEdgePairToPolygonProcessingOperationNode (EdgePairToPolygonProcessorBase *proc, CompoundRegionOperationNode *input, bool owns_proc) @@ -1473,15 +1566,15 @@ CompoundRegionEdgePairToPolygonProcessingOperationNode::~CompoundRegionEdgePairT } void -CompoundRegionEdgePairToPolygonProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgePairToPolygonProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void -CompoundRegionEdgePairToPolygonProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgePairToPolygonProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void @@ -1518,15 +1611,15 @@ CompoundRegionEdgePairToEdgeProcessingOperationNode::~CompoundRegionEdgePairToEd } void -CompoundRegionEdgePairToEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgePairToEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } void -CompoundRegionEdgePairToEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgePairToEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } // --------------------------------------------------------------------------------------------- @@ -1591,37 +1684,45 @@ CompoundRegionCheckOperationNode::computed_dist () const } void -CompoundRegionCheckOperationNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionCheckOperationNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { + // consider magnification variants + db::EdgeRelationFilter check = m_check; + check.set_distance (proc->dist_for_cell (cell, check.distance ())); + // TODO: needs a concept to deal with merged/non-merged inputs bool is_merged = true; - db::check_local_operation op (m_check, m_different_polygons, is_merged, m_has_other, m_is_other_merged, m_options); + db::check_local_operation op (check, m_different_polygons, is_merged, m_has_other, m_is_other_merged, m_options); tl_assert (results.size () == 1); if (results.front ().empty ()) { - op.do_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + op.do_compute_local (layout, cell, interactions, results, proc); } else { std::vector > r; r.resize (1); - op.do_compute_local (layout, interactions, r, max_vertex_count, area_ratio); + op.do_compute_local (layout, cell, interactions, r, proc); results.front ().insert (r.front ().begin (), r.front ().end ()); } } void -CompoundRegionCheckOperationNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionCheckOperationNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { + // consider magnification variants + db::EdgeRelationFilter check = m_check; + check.set_distance (proc->dist_for_cell (cell, check.distance ())); + // TODO: needs a concept to deal with merged/non-merged inputs bool is_merged = true; - db::check_local_operation op (m_check, m_different_polygons, is_merged, m_has_other, m_is_other_merged, m_options); + db::check_local_operation op (check, m_different_polygons, is_merged, m_has_other, m_is_other_merged, m_options); tl_assert (results.size () == 1); if (results.front ().empty ()) { - op.do_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + op.do_compute_local (layout, cell, interactions, results, proc); } else { std::vector > r; r.resize (1); - op.do_compute_local (layout, interactions, r, max_vertex_count, area_ratio); + op.do_compute_local (layout, cell, interactions, r, proc); results.front ().insert (r.front ().begin (), r.front ().end ()); } } diff --git a/src/db/db/dbCompoundOperation.h b/src/db/db/dbCompoundOperation.h index 5c3c63c9d..39c2de489 100644 --- a/src/db/db/dbCompoundOperation.h +++ b/src/db/db/dbCompoundOperation.h @@ -191,62 +191,62 @@ public: */ virtual bool wants_variants () const { return false; } - void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; - void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; - void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } template - bool compute_local_bool (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, size_t max_vertex_count, double area_ratio) const + bool compute_local_bool (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, const db::LocalProcessorBase *proc) const { if (result_type () == Region) { std::vector > res; res.push_back (std::unordered_set ()); - compute_local (cache, layout, interactions, res, max_vertex_count, area_ratio); + compute_local (cache, layout, cell, interactions, res, proc); return ! res.front ().empty (); } else if (result_type () == Edges) { std::vector > res; res.push_back (std::unordered_set ()); - compute_local (cache, layout, interactions, res, max_vertex_count, area_ratio); + compute_local (cache, layout, cell, interactions, res, proc); return ! res.front ().empty (); } else if (result_type () == EdgePairs) { std::vector > res; res.push_back (std::unordered_set ()); - compute_local (cache, layout, interactions, res, max_vertex_count, area_ratio); + compute_local (cache, layout, cell, interactions, res, proc); return ! res.front ().empty (); } else { @@ -256,12 +256,12 @@ public: protected: // the different computation slots - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } virtual db::Coord computed_dist () const = 0; @@ -272,7 +272,7 @@ private: db::Coord m_dist; template - void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { // TODO: confine caching to those nodes which need it. @@ -283,7 +283,7 @@ private: std::vector > uncached_results; uncached_results.resize (results.size ()); - do_compute_local (cache, layout, interactions, uncached_results, max_vertex_count, area_ratio); + do_compute_local (cache, layout, cell, interactions, uncached_results, proc); cp.second->swap (uncached_results); @@ -360,14 +360,14 @@ public: virtual db::Coord computed_dist () const { return 0; } virtual ResultType result_type () const { return Region; } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } }; class DB_PUBLIC CompoundRegionOperationForeignNode @@ -381,14 +381,14 @@ public: virtual db::Coord computed_dist () const { return 0; } virtual ResultType result_type () const { return Region; } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } }; class DB_PUBLIC CompoundRegionOperationSecondaryNode @@ -402,14 +402,14 @@ public: virtual db::Coord computed_dist () const { return 0; } virtual ResultType result_type () const { return Region; } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } private: db::Region *mp_input; @@ -431,6 +431,9 @@ public: virtual db::ICplxTrans reduce (const db::ICplxTrans &trans) const; virtual bool is_translation_invariant () const; + // NOTE: equality does not really matter here as we use it only on leaf reducers + virtual bool equals (const TransformationReducer * /*other*/) const { return false; } + private: std::vector m_vars; }; @@ -532,28 +535,28 @@ public: virtual ResultType result_type () const; // the different computation slots - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } private: LogicalOp m_op; bool m_invert; template - void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; }; @@ -573,34 +576,34 @@ public: } // the different computation slots - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } private: @@ -608,12 +611,12 @@ private: bool m_invert; template - void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, cell, interactions, one, proc); if ((one.front ().size () >= m_min_count && one.front ().size () < m_max_count) != m_invert) { results.front ().insert (one.front ().begin (), one.front ().end ()); @@ -637,22 +640,22 @@ public: virtual db::Coord computed_dist () const; // the different computation slots - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } private: GeometricalOp m_op; template - void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; template - void implement_bool (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void implement_bool (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; }; template @@ -725,7 +728,7 @@ protected: } template - void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; private: const db::local_operation *m_op; @@ -745,21 +748,21 @@ public: std::string generated_description () const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } private: typedef db::interacting_local_operation op_type; @@ -774,21 +777,21 @@ public: std::string generated_description () const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } private: db::interacting_with_edge_local_operation m_op; @@ -803,21 +806,21 @@ public: std::string generated_description () const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } private: db::pull_local_operation m_op; @@ -831,21 +834,21 @@ public: std::string generated_description () const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } private: db::pull_with_edge_local_operation m_op; @@ -870,39 +873,39 @@ public: virtual ResultType result_type () const; // the different computation slots - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } private: template - void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; }; /** @@ -927,39 +930,39 @@ public: virtual ResultType result_type () const; // the different computation slots - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } private: template - void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; bool m_multi_layer; }; @@ -975,14 +978,14 @@ public: // specifies the result type virtual ResultType result_type () const { return Region; } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } virtual const TransformationReducer *vars () const { return mp_filter->vars (); } virtual bool wants_variants () const { return mp_filter->wants_variants (); } @@ -993,12 +996,12 @@ private: bool m_sum_of_set; template - void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, cell, interactions, one, proc); if (m_sum_of_set) { if (mp_filter->selected_set (one.front ())) { @@ -1024,14 +1027,14 @@ public: // specifies the result type virtual ResultType result_type () const { return Edges; } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } virtual const TransformationReducer *vars () const { return mp_filter->vars (); } virtual bool wants_variants () const { return mp_filter->wants_variants (); } @@ -1042,12 +1045,12 @@ private: bool m_sum_of; template - void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, cell, interactions, one, proc); if (m_sum_of) { if (mp_filter->selected (one.front ())) { @@ -1073,14 +1076,14 @@ public: // specifies the result type virtual ResultType result_type () const { return EdgePairs; } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } virtual const TransformationReducer *vars () const { return mp_filter->vars (); } virtual bool wants_variants () const { return mp_filter->wants_variants (); } @@ -1092,12 +1095,12 @@ private: bool is_selected (const db::EdgePair &p) const; template - void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, cell, interactions, one, proc); for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { if (is_selected (*p)) { @@ -1122,35 +1125,53 @@ public: virtual const TransformationReducer *vars () const { return mp_proc->vars (); } virtual bool wants_variants () const { return mp_proc->wants_variants (); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + private: PolygonProcessorBase *mp_proc; bool m_owns_proc; db::Coord m_dist_adder; void processed (db::Layout *, const db::Polygon &p, std::vector &res) const; - void processed (db::Layout *layout, const db::PolygonRef &p, std::vector &res) const; + void processed (db::Layout *, const db::PolygonRef &p, std::vector &res) const; + void processed (db::Layout *, const db::Polygon &p, const db::ICplxTrans &tr, std::vector &res) const; + void processed (db::Layout *, const db::PolygonRef &p, const db::ICplxTrans &tr, std::vector &res) const; template - void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, cell, interactions, one, proc); std::vector res; for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { + res.clear (); - processed (layout, *p, res); + + if (proc->vars ()) { + + // in the presence of variants, handle the object in top level space + + const db::ICplxTrans &tr = proc->vars ()->single_variant_transformation (cell->cell_index ()); + processed (layout, *p, tr, res); + + } else { + + processed (layout, *p, res); + + } + results.front ().insert (res.begin (), res.end ()); + } } }; @@ -1174,7 +1195,6 @@ public: private: db::PolygonSizer m_proc; - CompoundTransformationReducer m_vars; }; class DB_PUBLIC CompoundRegionMergeOperationNode @@ -1194,33 +1214,33 @@ public: return std::string ("merged") + CompoundRegionMultiInputOperationNode::generated_description (); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { - implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, cell, interactions, results, proc); } // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } private: bool m_min_coherence; unsigned int m_min_wc; template - void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, cell, interactions, one, proc); db::EdgeProcessor ep; @@ -1259,14 +1279,14 @@ public: virtual const TransformationReducer *vars () const { return mp_proc->vars (); } virtual bool wants_variants () const { return mp_proc->wants_variants (); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } private: EdgeToPolygonProcessorBase *mp_proc; @@ -1276,18 +1296,40 @@ private: void processed (db::Layout *layout, const db::Edge &p, std::vector &res) const; template - void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, cell, interactions, one, proc); std::vector res; for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { + res.clear (); - processed (layout, *p, res); - results.front ().insert (res.begin (), res.end ()); + + if (proc->vars ()) { + + // in the presence of variants, handle the object in top level space + + const db::ICplxTrans &tr = proc->vars ()->single_variant_transformation (cell->cell_index ()); + processed (layout, tr * *p, res); + + if (! res.empty ()) { + db::ICplxTrans tri = tr.inverted (); + for (auto r = res.begin (); r != res.end (); ++r) { + results.front ().insert (tri * *r); + } + } + + } else { + + processed (layout, *p, res); + + results.front ().insert (res.begin (), res.end ()); + + } + } } }; @@ -1305,14 +1347,14 @@ public: virtual const TransformationReducer *vars () const { return mp_proc->vars (); } virtual bool wants_variants () const { return mp_proc->wants_variants (); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } private: EdgeProcessorBase *mp_proc; @@ -1321,18 +1363,40 @@ private: void processed (db::Layout *, const db::Edge &p, std::vector &res) const; template - void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, cell, interactions, one, proc); std::vector res; for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { + res.clear (); - processed (layout, *p, res); - results.front ().insert (res.begin (), res.end ()); + + if (proc->vars ()) { + + // in the presence of variants, handle the object in top level space + + const db::ICplxTrans &tr = proc->vars ()->single_variant_transformation (cell->cell_index ()); + processed (layout, tr * *p, res); + + if (! res.empty ()) { + db::ICplxTrans tri = tr.inverted (); + for (auto r = res.begin (); r != res.end (); ++r) { + results.front ().insert (tri * *r); + } + } + + } else { + + processed (layout, *p, res); + + results.front ().insert (res.begin (), res.end ()); + + } + } } }; @@ -1350,14 +1414,14 @@ public: virtual const TransformationReducer *vars () const { return mp_proc->vars (); } virtual bool wants_variants () const { return mp_proc->wants_variants (); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } private: EdgePairToPolygonProcessorBase *mp_proc; @@ -1367,18 +1431,40 @@ private: void processed (db::Layout *layout, const db::EdgePair &p, std::vector &res) const; template - void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, cell, interactions, one, proc); std::vector res; for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { + res.clear (); - processed (layout, *p, res); - results.front ().insert (res.begin (), res.end ()); + + if (proc->vars ()) { + + // in the presence of variants, handle the object in top level space + + const db::ICplxTrans &tr = proc->vars ()->single_variant_transformation (cell->cell_index ()); + processed (layout, tr * *p, res); + + if (! res.empty ()) { + db::ICplxTrans tri = tr.inverted (); + for (auto r = res.begin (); r != res.end (); ++r) { + results.front ().insert (tri * *r); + } + } + + } else { + + processed (layout, *p, res); + + results.front ().insert (res.begin (), res.end ()); + + } + } } }; @@ -1396,32 +1482,54 @@ public: virtual const TransformationReducer *vars () const { return mp_proc->vars (); } virtual bool wants_variants () const { return mp_proc->wants_variants (); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } private: EdgePairToEdgeProcessorBase *mp_proc; bool m_owns_proc; template - void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, cell, interactions, one, proc); std::vector res; for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { + res.clear (); - mp_proc->process (*p, res); - results.front ().insert (res.begin (), res.end ()); + + if (proc->vars ()) { + + // in the presence of variants, handle the object in top level space + + const db::ICplxTrans &tr = proc->vars ()->single_variant_transformation (cell->cell_index ()); + mp_proc->process (tr * *p, res); + + if (! res.empty ()) { + db::ICplxTrans tri = tr.inverted (); + for (auto r = res.begin (); r != res.end (); ++r) { + results.front ().insert (tri * *r); + } + } + + } else { + + mp_proc->process (*p, res); + + results.front ().insert (res.begin (), res.end ()); + + } + } } }; @@ -1439,14 +1547,14 @@ public: virtual const TransformationReducer *vars () const { return mp_proc->vars (); } virtual bool wants_variants () const { return mp_proc->wants_variants (); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } private: PolygonToEdgeProcessorBase *mp_proc; @@ -1454,20 +1562,37 @@ private: void processed (db::Layout *, const db::Polygon &p, std::vector &res) const; void processed (db::Layout *layout, const db::PolygonRef &p, std::vector &res) const; + void processed (db::Layout *, const db::Polygon &p, const db::ICplxTrans &tr, std::vector &res) const; + void processed (db::Layout *, const db::PolygonRef &p, const db::ICplxTrans &tr, std::vector &res) const; template - void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, cell, interactions, one, proc); std::vector res; for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { + res.clear (); - processed (layout, *p, res); + + if (proc->vars ()) { + + // in the presence of variants, handle the object in top level space + + const db::ICplxTrans &tr = proc->vars ()->single_variant_transformation (cell->cell_index ()); + processed (layout, *p, tr, res); + + } else { + + processed (layout, *p, res); + + } + results.front ().insert (res.begin (), res.end ()); + } } }; @@ -1495,35 +1620,52 @@ public: virtual const TransformationReducer *vars () const { return mp_proc->vars (); } virtual bool wants_variants () const { return mp_proc->wants_variants (); } - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } private: - PolygonToEdgePairProcessorBase *mp_proc; + PolygonToEdgePairProcessorBase *mp_proc; bool m_owns_proc; void processed (db::Layout *, const db::Polygon &p, std::vector &res) const; void processed (db::Layout *layout, const db::PolygonRef &p, std::vector &res) const; + void processed (db::Layout *, const db::Polygon &p, const db::ICplxTrans &tr, std::vector &res) const; + void processed (db::Layout *layout, const db::PolygonRef &p, const db::ICplxTrans &tr, std::vector &res) const; template - void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, cell, interactions, one, proc); std::vector res; for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { + res.clear (); - processed (layout, *p, res); + + if (proc->vars ()) { + + // in the presence of variants, handle the object in top level space + + const db::ICplxTrans &tr = proc->vars ()->single_variant_transformation (cell->cell_index ()); + processed (layout, *p, tr, res); + + } else { + + processed (layout, *p, res); + + } + results.front ().insert (res.begin (), res.end ()); + } } }; @@ -1559,14 +1701,17 @@ public: virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual db::Coord computed_dist () const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual const TransformationReducer *vars () const { return &m_vars; } + virtual bool wants_variants () const { return true; } + + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const LocalProcessorBase *proc) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const LocalProcessorBase *proc) const; // non-implemented - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { } private: db::EdgeRelationFilter m_check; @@ -1574,6 +1719,7 @@ private: db::RegionCheckOptions m_options; bool m_has_other; bool m_is_other_merged; + db::MagnificationReducer m_vars; }; @@ -1598,11 +1744,16 @@ public: : mp_node (node) { } + virtual const TransformationReducer *vars () const + { + return mp_node->vars (); + } + protected: - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { CompoundRegionOperationCache cache; - mp_node->compute_local (&cache, layout, interactions, results, max_vertex_count, area_ratio); + mp_node->compute_local (&cache, layout, cell, interactions, results, proc); } virtual db::Coord dist () const { return mp_node->dist (); } @@ -1610,8 +1761,6 @@ protected: virtual bool requests_single_subjects () const { return true; } virtual std::string description () const { return mp_node->description (); } - const TransformationReducer *vars () const { return mp_node->vars (); } - bool wants_variants () const { return mp_node->wants_variants (); } std::vector inputs () const { return mp_node->inputs (); } private: @@ -1644,8 +1793,13 @@ public: } } + virtual const TransformationReducer *vars () const + { + return mp_node->vars (); + } + protected: - virtual void do_compute_local (db::Layout *layout, const shape_interactions, db::object_with_properties > &interactions, std::vector > > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (db::Layout *layout, db::Cell *cell, const shape_interactions, db::object_with_properties > &interactions, std::vector > > &results, const db::LocalProcessorBase *proc) const { auto interactions_by_prop_id = separate_interactions_to_interactions_by_properties (interactions, m_prop_constraint, m_pms, m_pmis); for (auto s2p = interactions_by_prop_id.begin (); s2p != interactions_by_prop_id.end (); ++s2p) { @@ -1654,7 +1808,7 @@ protected: results_wo_props.resize (results.size ()); CompoundRegionOperationCache cache; - mp_node->compute_local (&cache, layout, s2p->second, results_wo_props, max_vertex_count, area_ratio); + mp_node->compute_local (&cache, layout, cell, s2p->second, results_wo_props, proc); for (size_t n = 0; n < results.size (); ++n) { for (auto i = results_wo_props [n].begin (); i != results_wo_props [n].end (); ++i) { @@ -1670,8 +1824,6 @@ protected: virtual bool requests_single_subjects () const { return true; } virtual std::string description () const { return mp_node->description (); } - const TransformationReducer *vars () const { return mp_node->vars (); } - bool wants_variants () const { return mp_node->wants_variants (); } std::vector inputs () const { return mp_node->inputs (); } private: diff --git a/src/db/db/dbDeepEdgePairs.cc b/src/db/db/dbDeepEdgePairs.cc index 0884a3d41..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 ())); @@ -410,17 +410,17 @@ DeepEdgePairs::apply_filter (const EdgePairFilterBase &filter) const if (vars.get ()) { - const std::map &vv = vars->variants (c->cell_index ()); - for (std::map::const_iterator v = vv.begin (); v != vv.end (); ++v) { + const std::set &vv = vars->variants (c->cell_index ()); + for (auto v = vv.begin (); v != vv.end (); ++v) { db::Shapes *st; if (vv.size () == 1) { st = & c->shapes (res->deep_layer ().layer ()); } else { - st = & to_commit [c->cell_index ()] [v->first]; + st = & to_commit [c->cell_index ()] [*v]; } - const db::ICplxTrans &tr = v->first; + const db::ICplxTrans &tr = *v; for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::EdgePairs); ! si.at_end (); ++si) { if (filter.selected (si->edge_pair ().transformed (tr))) { @@ -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 4c80d42ae..12b9a1774 100644 --- a/src/db/db/dbDeepEdges.cc +++ b/src/db/db/dbDeepEdges.cc @@ -244,22 +244,21 @@ 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) { - const std::map &v = vars.variants (c->cell_index ()); - tl_assert (v.size () == size_t (1)); - - db::Trans tr (v.begin ()->first.inverted () * t.disp ()); + const db::ICplxTrans &tv = vars.single_variant_transformation (c->cell_index ()); + db::ICplxTrans tr (tv.inverted () * t.disp ()); db::Shapes &shapes = c->shapes (deep_layer.layer ()); db::Shapes new_shapes (layout.manager (), c.operator-> (), layout.is_editable ()); @@ -739,8 +738,8 @@ DeepEdges::length_type DeepEdges::length (const db::Box &box) const const db::DeepLayer &edges = merged_deep_layer (); db::MagnificationReducer red; - db::cell_variants_collector vars (red); - vars.collect (edges.layout (), edges.initial_cell ()); + db::cell_variants_statistics vars (red); + vars.collect (&edges.layout (), edges.initial_cell ().cell_index ()); DeepEdges::length_type l = 0; @@ -751,7 +750,7 @@ DeepEdges::length_type DeepEdges::length (const db::Box &box) const lc += s->edge ().length (); } const std::map &vv = vars.variants (*c); - for (std::map::const_iterator v = vv.begin (); v != vv.end (); ++v) { + for (auto v = vv.begin (); v != vv.end (); ++v) { double mag = v->first.mag (); l += v->second * lc * mag; } @@ -812,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 ())); @@ -836,20 +835,18 @@ DeepEdges::apply_filter (const EdgeFilterBase &filter) const if (vars.get ()) { - const std::map &vv = vars->variants (c->cell_index ()); - for (std::map::const_iterator v = vv.begin (); v != vv.end (); ++v) { + const std::set &vv = vars->variants (c->cell_index ()); + for (auto v = vv.begin (); v != vv.end (); ++v) { db::Shapes *st; if (vv.size () == 1) { st = & c->shapes (res->deep_layer ().layer ()); } else { - st = & to_commit [c->cell_index ()] [v->first]; + st = & to_commit [c->cell_index ()] [*v]; } - const db::ICplxTrans &tr = v->first; - for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::Edges); ! si.at_end (); ++si) { - if (filter.selected (si->edge ().transformed (tr))) { + if (filter.selected (si->edge ().transformed (*v))) { st->insert (*si); } } @@ -871,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 ()) { @@ -1262,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; @@ -1279,14 +1276,14 @@ RegionDelegate *DeepEdges::extended (coord_type ext_b, coord_type ext_e, coord_t // TODO: iterate only over the called cells? for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) { - const std::map &vv = vars.variants (c->cell_index ()); - for (std::map::const_iterator v = vv.begin (); v != vv.end (); ++v) { + const std::set &vv = vars.variants (c->cell_index ()); + for (auto v = vv.begin (); v != vv.end (); ++v) { db::Shapes *out; if (vv.size () == 1) { out = & c->shapes (res->deep_layer ().layer ()); } else { - out = & to_commit [c->cell_index ()][v->first]; + out = & to_commit [c->cell_index ()][*v]; } const db::connected_clusters &cc = hc.clusters_per_cell (c->cell_index ()); @@ -1295,12 +1292,12 @@ RegionDelegate *DeepEdges::extended (coord_type ext_b, coord_type ext_e, coord_t if (cc.is_root (*cl)) { PolygonRefToShapesGenerator prgen (&layout, out); - polygon_transformation_filter ptrans (&prgen, v->first.inverted ()); + polygon_transformation_filter ptrans (&prgen, v->inverted ()); JoinEdgesCluster jec (&ptrans, ext_b, ext_e, ext_o, ext_i); std::list heap; for (db::recursive_cluster_shape_iterator rcsi (hc, edges.layer (), c->cell_index (), *cl); ! rcsi.at_end (); ++rcsi) { - heap.push_back (rcsi->transformed (v->first * rcsi.trans ())); + heap.push_back (rcsi->transformed (*v * rcsi.trans ())); jec.add (&heap.back (), 0); } @@ -1318,20 +1315,20 @@ RegionDelegate *DeepEdges::extended (coord_type ext_b, coord_type ext_e, coord_t for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) { - const std::map &vv = vars.variants (c->cell_index ()); - for (std::map::const_iterator v = vv.begin (); v != vv.end (); ++v) { + const std::set &vv = vars.variants (c->cell_index ()); + for (auto v = vv.begin (); v != vv.end (); ++v) { db::Shapes *out; if (vv.size () == 1) { out = & c->shapes (res->deep_layer ().layer ()); } else { - out = & to_commit [c->cell_index ()][v->first]; + out = & to_commit [c->cell_index ()][*v]; } PolygonRefToShapesGenerator prgen (&layout, out); for (db::Shapes::shape_iterator si = c->shapes (edges.layer ()).begin (db::ShapeIterator::Edges); ! si.at_end (); ++si) { prgen.set_prop_id (si->prop_id ()); - prgen.put (extended_edge (si->edge ().transformed (v->first), ext_b, ext_e, ext_o, ext_i).transformed (v->first.inverted ())); + prgen.put (extended_edge (si->edge ().transformed (*v), ext_b, ext_e, ext_o, ext_i).transformed (v->inverted ())); } } @@ -1341,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 (); } @@ -1367,7 +1364,7 @@ public: return 1; } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const + virtual void do_compute_local (db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { tl_assert (results.size () == (m_output_mode == Both ? 2 : 1)); @@ -1460,7 +1457,7 @@ public: return 1; } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const + virtual void do_compute_local (db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { tl_assert (results.size () == 1); std::unordered_set &result = results.front (); @@ -1517,7 +1514,7 @@ public: return 1; } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const + virtual void do_compute_local (db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { tl_assert (results.size () == size_t (m_output_mode == Both ? 2 : 1)); @@ -1657,7 +1654,7 @@ public: return 1; } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const + virtual void do_compute_local (db::Layout *layout, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { tl_assert (results.size () == 1); std::unordered_set &result = results.front (); @@ -1941,12 +1938,16 @@ public: // .. nothing yet .. } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const + virtual void do_compute_local (db::Layout * /*layout*/, db::Cell *cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { tl_assert (results.size () == 1); std::unordered_set &result = results.front (); - edge2edge_check_for_edges > edge_check (m_check, result, m_has_other); + // implement check in local coordinates in the presence of magnification variants + EdgeRelationFilter check = m_check; + check.set_distance (proc->dist_for_cell (cell, check.distance ())); + + edge2edge_check_for_edges > edge_check (check, result, m_has_other); db::box_scanner scanner; std::set others; @@ -1989,7 +1990,7 @@ public: } - scanner.process (edge_check, m_check.distance (), db::box_convert ()); + scanner.process (edge_check, check.distance (), db::box_convert ()); } virtual db::Coord dist () const @@ -2008,9 +2009,15 @@ public: return tl::to_string (tr ("Generic DRC check")); } + virtual const db::TransformationReducer *vars () const + { + return &m_vars; + } + private: EdgeRelationFilter m_check; bool m_has_other; + db::MagnificationReducer m_vars; }; } diff --git a/src/db/db/dbDeepRegion.cc b/src/db/db/dbDeepRegion.cc index 6c2e2fe53..b6e04023a 100644 --- a/src/db/db/dbDeepRegion.cc +++ b/src/db/db/dbDeepRegion.cc @@ -256,18 +256,16 @@ 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 (); for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) { - const std::map &v = vars.variants (c->cell_index ()); - tl_assert (v.size () == size_t (1)); - - db::Trans tr (v.begin ()->first.inverted () * t.disp ()); + const db::ICplxTrans &tv = vars.single_variant_transformation (c->cell_index ()); + db::ICplxTrans tr (tv.inverted () * t.disp ()); db::Shapes &shapes = c->shapes (deep_layer.layer ()); db::Shapes new_shapes (layout.manager (), c.operator-> (), layout.is_editable ()); @@ -1111,8 +1109,8 @@ DeepRegion::area (const db::Box &box) const const db::DeepLayer &polygons = merged_deep_layer (); - db::cell_variants_collector vars; - vars.collect (polygons.layout (), polygons.initial_cell ()); + db::cell_variants_statistics vars; + vars.collect (&polygons.layout (), polygons.initial_cell ().cell_index ()); DeepRegion::area_type a = 0; @@ -1123,7 +1121,7 @@ DeepRegion::area (const db::Box &box) const ac += s->area (); } const std::map &vv = vars.variants (*c); - for (std::map::const_iterator v = vv.begin (); v != vv.end (); ++v) { + for (auto v = vv.begin (); v != vv.end (); ++v) { double mag = v->first.mag (); a += v->second * ac * mag * mag; } @@ -1148,8 +1146,8 @@ DeepRegion::perimeter (const db::Box &box) const const db::DeepLayer &polygons = merged_deep_layer (); - db::cell_variants_collector vars; - vars.collect (polygons.layout (), polygons.initial_cell ()); + db::cell_variants_statistics vars; + vars.collect (&polygons.layout (), polygons.initial_cell ().cell_index ()); DeepRegion::perimeter_type p = 0; @@ -1160,7 +1158,7 @@ DeepRegion::perimeter (const db::Box &box) const pc += s->perimeter (); } const std::map &vv = vars.variants (*c); - for (std::map::const_iterator v = vv.begin (); v != vv.end (); ++v) { + for (auto v = vv.begin (); v != vv.end (); ++v) { double mag = v->first.mag (); p += v->second * pc * mag; } @@ -1210,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 ())); @@ -1219,14 +1217,14 @@ DeepRegion::grid_check (db::Coord gx, db::Coord gy) const const db::Shapes &shapes = c->shapes (polygons.layer ()); - const std::map &vv = vars.variants (c->cell_index ()); - for (std::map::const_iterator v = vv.begin (); v != vv.end (); ++v) { + const std::set &vv = vars.variants (c->cell_index ()); + for (auto v = vv.begin (); v != vv.end (); ++v) { db::Shapes *markers; if (vv.size () == 1) { markers = & c->shapes (res->deep_layer ().layer ()); } else { - markers = & to_commit [c->cell_index ()] [v->first]; + markers = & to_commit [c->cell_index ()] [*v]; } for (db::Shapes::shape_iterator si = shapes.begin (db::ShapeIterator::All); ! si.at_end (); ++si) { @@ -1234,7 +1232,7 @@ DeepRegion::grid_check (db::Coord gx, db::Coord gy) const db::Polygon poly; si->polygon (poly); - AsIfFlatRegion::produce_markers_for_grid_check (poly, v->first, gx, gy, *markers); + AsIfFlatRegion::produce_markers_for_grid_check (poly, *v, gx, gy, *markers); } @@ -1243,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 (); } @@ -1297,23 +1295,19 @@ 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 ())); for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) { - const std::map &v = vars.variants (c->cell_index ()); - tl_assert (v.size () == size_t (1)); - const db::ICplxTrans &tr = v.begin ()->first; + const db::ICplxTrans &tr = vars.single_variant_transformation (c->cell_index ()); db::ICplxTrans trinv = tr.inverted (); const db::Shapes &s = c->shapes (polygons.layer ()); @@ -1367,27 +1361,22 @@ 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; if (vars.get ()) { - const std::map &v = vars->variants (c->cell_index ()); - tl_assert (v.size () == size_t (1)); - tr = v.begin ()->first; + tr = vars->single_variant_transformation (c->cell_index ()); } const db::Shapes &s = c->shapes (polygons.layer ()); @@ -1482,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 ())); @@ -1506,22 +1495,20 @@ DeepRegion::apply_filter (const PolygonFilterBase &filter) const if (vars.get ()) { - const std::map &vv = vars->variants (c->cell_index ()); - for (std::map::const_iterator v = vv.begin (); v != vv.end (); ++v) { + const std::set &vv = vars->variants (c->cell_index ()); + for (auto v = vv.begin (); v != vv.end (); ++v) { db::Shapes *st; if (vv.size () == 1) { st = & c->shapes (res->deep_layer ().layer ()); } else { - st = & to_commit [c->cell_index ()] [v->first]; + st = & to_commit [c->cell_index ()] [*v]; } - const db::ICplxTrans &tr = v->first; - for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::All); ! si.at_end (); ++si) { db::Polygon poly; si->polygon (poly); - if (filter.selected (poly.transformed (tr))) { + if (filter.selected (poly.transformed (*v))) { st->insert (*si); } } @@ -1545,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 ()) { @@ -1655,17 +1642,14 @@ 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) { - const std::map &v = vars.variants (c->cell_index ()); - tl_assert (v.size () == size_t (1)); - double mag = v.begin ()->first.mag (); + const db::ICplxTrans &tr = vars.single_variant_transformation (c->cell_index ()); + double mag = tr.mag (); db::Coord d_with_mag = db::coord_traits::rounded (d / mag); const db::Shapes &s = c->shapes (polygons.layer ()); @@ -1711,18 +1695,15 @@ 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) { - const std::map &v = vars.variants (c->cell_index ()); - tl_assert (v.size () == size_t (1)); - double mag = v.begin ()->first.mag (); - double angle = v.begin ()->first.angle (); + const db::ICplxTrans &tr = vars.single_variant_transformation (c->cell_index ()); + double mag = tr.mag (); + double angle = tr.angle (); db::Coord dx_with_mag = db::coord_traits::rounded (dx / mag); db::Coord dy_with_mag = db::coord_traits::rounded (dy / mag); @@ -1799,7 +1780,7 @@ Output *region_cop_impl (DeepRegion *region, db::CompoundRegionOperationNode &no } compound_local_operation op (&node); - proc.run (&op, polygons.layer (), other_layers, res->deep_layer ().layer ()); + proc.run (&op, polygons.layer (), other_layers, res->deep_layer ().layer (), true /*make_variants*/); return res.release (); } @@ -1852,7 +1833,7 @@ Output *region_cop_with_properties_impl (DeepRegion *region, db::CompoundRegionO } compound_local_operation_with_properties op (&node, prop_constraint, res->properties_repository (), subject_pr, intruder_prs); - proc.run (&op, polygons.layer (), other_layers, res->deep_layer ().layer ()); + proc.run (&op, polygons.layer (), other_layers, res->deep_layer ().layer (), true /*make_variants*/); return res.release (); } @@ -2008,19 +1989,26 @@ DeepRegion::run_single_polygon_check (db::edge_relation_type rel, db::Coord d, c } const db::DeepLayer &polygons = merged_deep_layer (); - - EdgeRelationFilter check (rel, d, options.metrics); - check.set_include_zero (false); - check.set_whole_edges (options.whole_edges); - check.set_ignore_angle (options.ignore_angle); - check.set_min_projection (options.min_projection); - check.set_max_projection (options.max_projection); - db::Layout &layout = const_cast (polygons.layout ()); + db::cell_variants_collector vars; + 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) { + const db::ICplxTrans &tr = vars.single_variant_transformation (c->cell_index ()); + double mag = tr.mag (); + db::Coord d_with_mag = db::coord_traits::rounded (d / mag); + + EdgeRelationFilter check (rel, d_with_mag, options.metrics); + check.set_include_zero (false); + check.set_whole_edges (options.whole_edges); + check.set_ignore_angle (options.ignore_angle); + check.set_min_projection (options.min_projection); + check.set_max_projection (options.max_projection); + const db::Shapes &shapes = c->shapes (polygons.layer ()); db::Shapes &result = c->shapes (res->deep_layer ().layer ()); diff --git a/src/db/db/dbDeepShapeStore.cc b/src/db/db/dbDeepShapeStore.cc index 7fb293523..81ff9c327 100644 --- a/src/db/db/dbDeepShapeStore.cc +++ b/src/db/db/dbDeepShapeStore.cc @@ -287,8 +287,31 @@ struct DeepShapeStore::LayoutHolder db::LayoutToNetlist *mp_l2n; }; + class VariantsCreatedListener + : public tl::Object + { + public: + VariantsCreatedListener (DeepShapeStore::LayoutHolder *lh, db::Layout *ly) + : mp_lh (lh) + { + ly->variants_created_event.add (this, &VariantsCreatedListener::variants_created); + } + + private: + void variants_created (const std::map > *var_map) + { + for (std::map >::const_iterator i = var_map->begin (); i != var_map->end (); ++i) { + for (std::map::const_iterator j = i->second.begin (); j != i->second.end (); ++j) { + mp_lh->builder.register_variant (i->first, j->second); + } + } + } + + DeepShapeStore::LayoutHolder *mp_lh; + }; + LayoutHolder (const db::ICplxTrans &trans) - : refs (0), layout (false), builder (&layout, trans) + : refs (0), layout (false), builder (&layout, trans), variants_created (this, &layout) { // .. nothing yet .. } @@ -337,6 +360,9 @@ struct DeepShapeStore::LayoutHolder int refs; db::Layout layout; db::HierarchyBuilder builder; + +private: + VariantsCreatedListener variants_created; std::map > net_builders; std::map layer_refs; }; @@ -1048,17 +1074,6 @@ DeepLayer DeepShapeStore::create_text_layer (const db::RecursiveShapeIterator &s return create_custom_layer (si, &refs, trans); } -void -DeepShapeStore::issue_variants (unsigned int layout_index, const std::map > &var_map) -{ - db::HierarchyBuilder &builder = m_layouts [layout_index]->builder; - for (std::map >::const_iterator i = var_map.begin (); i != var_map.end (); ++i) { - for (std::map::const_iterator j = i->second.begin (); j != i->second.end (); ++j) { - builder.register_variant (i->first, j->second); - } - } -} - const db::CellMapping & DeepShapeStore::internal_cell_mapping (unsigned int into_layout_index, unsigned int from_layout_index) { diff --git a/src/db/db/dbDeepShapeStore.h b/src/db/db/dbDeepShapeStore.h index 98c53c8fa..1e6e0aaaa 100644 --- a/src/db/db/dbDeepShapeStore.h +++ b/src/db/db/dbDeepShapeStore.h @@ -49,6 +49,7 @@ class Texts; class ShapeCollection; class NetBuilder; class LayoutToNetlist; +class VariantsCollectorBase; /** * @brief Represents a shape collection from the deep shape store @@ -192,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. @@ -555,42 +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. - */ - template - void separate_variants (unsigned int layout_index, VarCollector &coll) - { - tl_assert (is_valid_layout_index (layout_index)); - - std::map > var_map; - coll.separate_variants (layout (layout_index), initial_cell (layout_index), &var_map); - if (var_map.empty ()) { - // nothing to do. - return; - } - - issue_variants (layout_index, var_map); - } - - /** - * @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 */ @@ -928,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 e5e282f87..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 ())); @@ -431,22 +431,20 @@ DeepTexts *DeepTexts::apply_filter (const TextFilterBase &filter) const if (vars.get ()) { - const std::map &vv = vars->variants (c->cell_index ()); - for (std::map::const_iterator v = vv.begin (); v != vv.end (); ++v) { + const std::set &vv = vars->variants (c->cell_index ()); + for (auto v = vv.begin (); v != vv.end (); ++v) { db::Shapes *st; if (vv.size () == 1) { st = & c->shapes (res->deep_layer ().layer ()); } else { - st = & to_commit [c->cell_index ()] [v->first]; + st = & to_commit [c->cell_index ()] [*v]; } - const db::ICplxTrans &tr = v->first; - for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::Texts); ! si.at_end (); ++si) { db::Text text; si->text (text); - if (filter.selected (text.transformed (tr))) { + if (filter.selected (text.transformed (*v))) { st->insert (*si); } } @@ -470,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 (); @@ -571,7 +569,7 @@ public: return 1; } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const + virtual void do_compute_local (db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { tl_assert (results.size () == 1); std::unordered_set &result = results.front (); @@ -670,7 +668,7 @@ public: return 1; } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const + virtual void do_compute_local (db::Layout *layout, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { tl_assert (results.size () == 1); std::unordered_set &result = results.front (); diff --git a/src/db/db/dbEdgePairRelations.h b/src/db/db/dbEdgePairRelations.h index 1d9edf7e9..6a4041764 100644 --- a/src/db/db/dbEdgePairRelations.h +++ b/src/db/db/dbEdgePairRelations.h @@ -228,6 +228,14 @@ struct DB_PUBLIC EdgeRelationFilter return m_max_projection; } + /** + * @brief sets the check distance + */ + void set_distance (distance_type d) + { + m_d = d; + } + /** * @brief Gets the check distance */ @@ -236,6 +244,14 @@ struct DB_PUBLIC EdgeRelationFilter return m_d; } + /** + * @brief Sets the relation + */ + void set_relation (edge_relation_type r) + { + m_r = r; + } + /** * @brief Gets the relation */ diff --git a/src/db/db/dbEdgesLocalOperations.cc b/src/db/db/dbEdgesLocalOperations.cc index cd69d034f..9a43060a7 100644 --- a/src/db/db/dbEdgesLocalOperations.cc +++ b/src/db/db/dbEdgesLocalOperations.cc @@ -57,7 +57,7 @@ EdgeBoolAndOrNotLocalOperation::description () const } void -EdgeBoolAndOrNotLocalOperation::do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const +EdgeBoolAndOrNotLocalOperation::do_compute_local (db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { tl_assert (results.size () == size_t (m_op == EdgeAndNot ? 2 : 1)); @@ -140,7 +140,7 @@ EdgeToPolygonLocalOperation::description () const } void -EdgeToPolygonLocalOperation::do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const +EdgeToPolygonLocalOperation::do_compute_local (db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { tl_assert (results.size () == size_t (m_op == EdgePolygonOp::Both ? 2 : 1)); diff --git a/src/db/db/dbEdgesLocalOperations.h b/src/db/db/dbEdgesLocalOperations.h index 163bf5a59..a57a2e020 100644 --- a/src/db/db/dbEdgesLocalOperations.h +++ b/src/db/db/dbEdgesLocalOperations.h @@ -44,7 +44,7 @@ class DB_PUBLIC EdgeBoolAndOrNotLocalOperation public: EdgeBoolAndOrNotLocalOperation (db::EdgeBoolOp op); - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &result, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &result, const db::LocalProcessorBase *proc) const; virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; @@ -67,7 +67,7 @@ class DB_PUBLIC EdgeToPolygonLocalOperation public: EdgeToPolygonLocalOperation (EdgePolygonOp::mode_t op, bool include_borders); - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &result, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *cell, const shape_interactions &interactions, std::vector > &result, const db::LocalProcessorBase *proc) const; virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; diff --git a/src/db/db/dbHierProcessor.cc b/src/db/db/dbHierProcessor.cc index 9987451e2..bf6cea016 100644 --- a/src/db/db/dbHierProcessor.cc +++ b/src/db/db/dbHierProcessor.cc @@ -30,6 +30,7 @@ #include "dbPolygonGenerators.h" #include "dbLocalOperationUtils.h" #include "dbShapeFlags.h" +#include "dbCellVariants.h" #include "tlLog.h" #include "tlTimer.h" #include "tlInternational.h" @@ -1142,7 +1143,7 @@ public: db::Box ref_box = db::box_convert () (*ref); for (db::CellInstArray::iterator n = inst->begin_touching (safe_box_enlarged (ref_box, m_dist - 1, m_dist - 1), inst_bc); !n.at_end (); ++n) { db::ICplxTrans tn = inst->complex_trans (*n); - db::Box region = ref_box.transformed (tn.inverted ()).enlarged (db::Vector (m_dist, m_dist)) & intruder_cell.bbox (m_intruder_layer).enlarged (db::Vector (m_dist, m_dist)); + db::Box region = ref_box.enlarged (db::Vector (m_dist, m_dist)).transformed (tn.inverted ()) & intruder_cell.bbox (m_intruder_layer); if (! region.empty ()) { add_shapes_from_intruder_inst (id1, intruder_cell, tn, inst_id, region); } @@ -1258,7 +1259,7 @@ private: db::ICplxTrans tn1 = inst1->complex_trans (*n); db::ICplxTrans tni1 = tn1.inverted (); - db::Box ibox1 = tn1 * cell1.bbox (m_subject_layer).enlarged (db::Vector (m_dist, m_dist)); + db::Box ibox1 = (tn1 * cell1.bbox (m_subject_layer)).enlarged (db::Vector (m_dist, m_dist)); std::set *insts = 0; @@ -1276,7 +1277,7 @@ private: db::ICplxTrans tn2 = inst2->complex_trans (*k); // NOTE: we need to enlarge both subject *and* intruder boxes - either object comes close to intruder or the other way around - db::Box ibox2 = tn2 * cell2.bbox (m_intruder_layer).enlarged (db::Vector (m_dist, m_dist)); + db::Box ibox2 = (tn2 * cell2.bbox (m_intruder_layer)).enlarged (db::Vector (m_dist, m_dist)); db::Box cbox = ibox1 & ibox2; if (! cbox.empty () && (cbox == ibox1 || cell1.has_shapes_touching (m_subject_layer, safe_box_enlarged (tni1 * cbox, -1, -1)))) { @@ -1332,7 +1333,7 @@ private: db::ICplxTrans it = i->complex_trans (*ia); - db::Box ibox2 = tni2.inverted () * it * ic.bbox (m_intruder_layer).enlarged (db::Vector (m_dist, m_dist)); + db::Box ibox2 = (tni2.inverted () * it * ic.bbox (m_intruder_layer)).enlarged (db::Vector (m_dist, m_dist)); db::Box ccbox = cbox & ibox2; if (! ccbox.empty ()) { @@ -1469,6 +1470,36 @@ local_processor_result_computation_task::perform () } } +// --------------------------------------------------------------------------------------------- +// LocalProcessorBase implementation + +LocalProcessorBase::LocalProcessorBase () + : m_report_progress (true), m_nthreads (0), m_max_vertex_count (0), m_area_ratio (0.0), m_boolean_core (false), + m_base_verbosity (30), mp_vars (0), mp_current_cell (0) +{ + // .. nothing yet .. +} + +db::Coord +LocalProcessorBase::dist_for_cell (const db::Cell *cell, db::Coord dist) const +{ + return cell ? dist_for_cell (cell->cell_index (), dist) : dist; +} + +db::Coord +LocalProcessorBase::dist_for_cell (db::cell_index_type cell_index, db::Coord dist) const +{ + if (mp_vars) { + + const db::ICplxTrans &tr = mp_vars->single_variant_transformation (cell_index); + double mag = tr.mag (); + return db::coord_traits::rounded (dist / mag); + + } else { + return dist; + } +} + // --------------------------------------------------------------------------------------------- // LocalProcessor implementation @@ -1477,9 +1508,9 @@ local_processor::local_processor (db::Layout *layout, db::Cell *top, : mp_subject_layout (layout), mp_intruder_layout (layout), mp_subject_top (top), mp_intruder_top (top), mp_subject_breakout_cells (breakout_cells), mp_intruder_breakout_cells (breakout_cells), - m_report_progress (true), m_nthreads (0), m_max_vertex_count (0), m_area_ratio (0.0), m_boolean_core (default_boolean_core () ()), m_base_verbosity (30), m_progress (0), mp_progress (0) + m_progress (0), mp_progress (0) { - // .. nothing yet .. + set_boolean_core (default_boolean_core () ()); } template @@ -1487,19 +1518,9 @@ local_processor::local_processor (db::Layout *subject_layout, db::Ce : mp_subject_layout (subject_layout), mp_intruder_layout (intruder_layout), mp_subject_top (subject_top), mp_intruder_top (intruder_top), mp_subject_breakout_cells (subject_breakout_cells), mp_intruder_breakout_cells (intruder_breakout_cells), - m_report_progress (true), m_nthreads (0), m_max_vertex_count (0), m_area_ratio (0.0), m_boolean_core (default_boolean_core () ()), m_base_verbosity (30), m_progress (0), mp_progress (0) + m_progress (0), mp_progress (0) { - // .. nothing yet .. -} - -template -std::string local_processor::description (const local_operation *op) const -{ - if (op && m_description.empty ()) { - return op->description (); - } else { - return m_description; - } + set_boolean_core (default_boolean_core () ()); } template @@ -1528,34 +1549,64 @@ size_t local_processor::get_progress () const } template -void local_processor::run (local_operation *op, unsigned int subject_layer, unsigned int intruder_layer, unsigned int output_layer) +void local_processor::run (local_operation *op, unsigned int subject_layer, unsigned int intruder_layer, unsigned int output_layer, bool make_variants) { std::vector ol, il; ol.push_back (output_layer); il.push_back (intruder_layer); - run (op, subject_layer, il, ol); + run (op, subject_layer, il, ol, make_variants); } template -void local_processor::run (local_operation *op, unsigned int subject_layer, unsigned int intruder_layer, const std::vector &output_layers) +void local_processor::run (local_operation *op, unsigned int subject_layer, unsigned int intruder_layer, const std::vector &output_layers, bool make_variants) { std::vector ol, il; il.push_back (intruder_layer); - run (op, subject_layer, il, output_layers); + run (op, subject_layer, il, output_layers, make_variants); } template -void local_processor::run (local_operation *op, unsigned int subject_layer, const std::vector &intruder_layers, unsigned int output_layer) +void local_processor::run (local_operation *op, unsigned int subject_layer, const std::vector &intruder_layers, unsigned int output_layer, bool make_variants) { std::vector ol; ol.push_back (output_layer); - run (op, subject_layer, intruder_layers, ol); + run (op, subject_layer, intruder_layers, ol, make_variants); } template -void local_processor::run (local_operation *op, unsigned int subject_layer, const std::vector &intruder_layers, const std::vector &output_layers) +void local_processor::run (local_operation *op, unsigned int subject_layer, const std::vector &intruder_layers, const std::vector &output_layers, bool make_variants) { - tl::SelfTimer timer (tl::verbosity () > m_base_verbosity, tl::to_string (tr ("Executing ")) + description (op)); + tl::SelfTimer timer (tl::verbosity () > base_verbosity (), tl::to_string (tr ("Executing ")) + description (op)); + + set_vars_owned (0); + + // Prepare cell variants if needed + if (make_variants) { + + tl::SelfTimer timer (tl::verbosity () > base_verbosity () + 10, tl::to_string (tr ("Cell variant formation"))); + + auto op_vars = op->vars (); + if (op_vars) { + + db::VariantsCollectorBase *coll = new db::VariantsCollectorBase (op_vars); + set_vars_owned (coll); + + 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); + // 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"))); + } + } + + } + + } local_processor_contexts contexts; compute_contexts (contexts, op, subject_layer, intruder_layers); @@ -1576,10 +1627,10 @@ void local_processor::compute_contexts (local_processor_contexts m_base_verbosity + 10, tl::to_string (tr ("Computing contexts for ")) + description (op)); + tl::SelfTimer timer (tl::verbosity () > base_verbosity () + 10, tl::to_string (tr ("Computing contexts for ")) + description (op)); - if (m_nthreads > 0) { - mp_cc_job.reset (new tl::Job > (m_nthreads)); + if (threads () > 0) { + mp_cc_job.reset (new tl::Job > (threads ())); } else { mp_cc_job.reset (0); } @@ -1629,11 +1680,11 @@ void local_processor::compute_contexts (local_processor_contexts::context_key_type &intruders, - db::Coord dist) const + db::Coord dist_top) const { CRONOLOGY_COLLECTION_BRACKET(event_compute_contexts) - if (tl::verbosity () >= m_base_verbosity + 20) { + if (tl::verbosity () >= base_verbosity () + 20) { if (! subject_parent) { tl::log << tr ("Computing context for top cell ") << mp_subject_layout->cell_name (subject_cell->cell_index ()); } else { @@ -1641,6 +1692,8 @@ void local_processor::compute_contexts (local_processor_contextscell_index (), dist_top); + db::local_processor_cell_context *cell_context = 0; // prepare a new cell context: this has to happen in a thread-safe way as we share the contexts @@ -1821,7 +1874,7 @@ local_processor::compute_results (local_processor_contexts m_base_verbosity + 10, tl::to_string (tr ("Computing results for ")) + description (op)); + tl::SelfTimer timer (tl::verbosity () > base_verbosity () + 10, tl::to_string (tr ("Computing results for ")) + description (op)); // avoids updates while we work on the layout mp_subject_layout->update (); @@ -1829,7 +1882,7 @@ local_processor::compute_results (local_processor_contexts::iterator c = contexts.begin (); c != contexts.end (); ++c) { comp_effort += c->second.size (); } @@ -1839,9 +1892,9 @@ local_processor::compute_results (local_processor_contexts 0) { + if (threads () > 0) { - std::unique_ptr > > rc_job (new tl::Job > (m_nthreads)); + std::unique_ptr > > rc_job (new tl::Job > (threads ())); // schedule computation jobs in "waves": we need to make sure they are executed // bottom-up. So we identify a new bunch of cells each time we pass through the cell set @@ -1857,7 +1910,7 @@ local_processor::compute_results (local_processor_contexts m_base_verbosity + 10, tl::sprintf (tl::to_string (tr ("Computing results iteration #%d")), iter)); + tl::SelfTimer timer (tl::verbosity () > base_verbosity () + 10, tl::sprintf (tl::to_string (tr ("Computing results iteration #%d")), iter)); bool any = false; std::unordered_set later; @@ -1917,7 +1970,7 @@ local_processor::compute_results (local_processor_contextsbegin_bottom_up (); bu != mp_subject_layout->end_bottom_up (); ++bu) { @@ -2045,6 +2098,8 @@ template void local_processor::compute_local_cell (const db::local_processor_contexts &contexts, db::Cell *subject_cell, const db::Cell *intruder_cell, const local_operation *op, const typename local_processor_cell_contexts::context_key_type &intruders, std::vector > &result) const { + db::Coord dist = dist_for_cell (subject_cell->cell_index (), op->dist ()); + const db::Shapes *subject_shapes = &subject_cell->shapes (contexts.subject_layer ()); db::shape_to_object s2o; @@ -2091,12 +2146,12 @@ local_processor::compute_local_cell (const db::local_processor_conte if (subject_cell == intruder_cell && contexts.subject_layer () == ail && !foreign) { - scan_shape2shape_same_layer () (subject_shapes, subject_id0, ipl == intruders.second.end () ? empty_intruders : ipl->second, il_index, interactions, op->dist ()); + scan_shape2shape_same_layer () (subject_shapes, subject_id0, ipl == intruders.second.end () ? empty_intruders : ipl->second, il_index, interactions, dist); } else { db::Layout *target_layout = (mp_subject_layout == mp_intruder_layout ? 0 : mp_subject_layout); - scan_shape2shape_different_layers () (target_layout, subject_shapes, intruder_shapes, subject_id0, &(ipl == intruders.second.end () ? empty_intruders : ipl->second), il_index, interactions, op->dist ()); + scan_shape2shape_different_layers () (target_layout, subject_shapes, intruder_shapes, subject_id0, &(ipl == intruders.second.end () ? empty_intruders : ipl->second), il_index, interactions, dist); } @@ -2106,7 +2161,7 @@ local_processor::compute_local_cell (const db::local_processor_conte db::box_scanner2 scanner; db::addressable_object_from_shape heap; - interaction_registration_shape2inst rec (mp_subject_layout, mp_intruder_layout, ail, il_index, op->dist (), &interactions); + interaction_registration_shape2inst rec (mp_subject_layout, mp_intruder_layout, ail, il_index, dist, &interactions); unsigned int id = subject_id0; for (db::Shapes::shape_iterator i = subject_shapes->begin (shape_flags ()); !i.at_end (); ++i) { @@ -2137,7 +2192,7 @@ local_processor::compute_local_cell (const db::local_processor_conte } } - scanner.process (rec, op->dist (), db::box_convert (), inst_bci); + scanner.process (rec, dist, db::box_convert (), inst_bci); } @@ -2154,7 +2209,7 @@ local_processor::compute_local_cell (const db::local_processor_conte } - op->compute_local (mp_subject_layout, interactions, result, m_max_vertex_count, m_area_ratio); + op->compute_local (mp_subject_layout, subject_cell, interactions, result, this); } } @@ -2264,7 +2319,7 @@ local_processor::run_flat (const generic_shape_iterator &subject std::string process_description, scan_description; - if (m_report_progress) { + if (report_progress ()) { process_description = description (op); if (process_description.empty ()) { @@ -2327,7 +2382,7 @@ local_processor::run_flat (const generic_shape_iterator &subject if (*il == subjects && ! ff) { - interaction_registration_shape1_scanner_combo scanner (&interactions, il_index, m_report_progress, scan_description); + interaction_registration_shape1_scanner_combo scanner (&interactions, il_index, report_progress (), scan_description); for (typename shape_interactions::subject_iterator s = interactions.begin_subjects (); s != interactions.end_subjects (); ++s) { scanner.insert (&s->second, s->first); @@ -2337,7 +2392,7 @@ local_processor::run_flat (const generic_shape_iterator &subject } else { - db::box_scanner2 scanner (m_report_progress, scan_description); + db::box_scanner2 scanner (report_progress (), scan_description); interaction_registration_shape2shape rec (0 /*layout*/, &interactions, il_index); for (typename shape_interactions::subject_iterator s = interactions.begin_subjects (); s != interactions.end_subjects (); ++s) { @@ -2393,7 +2448,7 @@ local_processor::run_flat (const generic_shape_iterator &subject if (*il == subjects && ! ff) { - interaction_registration_shape1_scanner_combo scanner (&interactions, il_index, m_report_progress, scan_description); + interaction_registration_shape1_scanner_combo scanner (&interactions, il_index, report_progress (), scan_description); addressable_shape_delivery is (subjects.confined (common_box, false)); unsigned int id = id_first; @@ -2406,7 +2461,7 @@ local_processor::run_flat (const generic_shape_iterator &subject } else { - db::box_scanner2 scanner (m_report_progress, scan_description); + db::box_scanner2 scanner (report_progress (), scan_description); interaction_registration_shape2shape rec (0 /*layout*/, &interactions, il_index); if (*il == subjects) { @@ -2463,7 +2518,7 @@ local_processor::run_flat (const generic_shape_iterator &subject std::vector > result; result.resize (result_shapes.size ()); - op->compute_local (mp_subject_layout, interactions, result, m_max_vertex_count, m_area_ratio, m_report_progress, process_description); + op->compute_local (mp_subject_layout, 0, interactions, result, this); for (std::vector::const_iterator r = result_shapes.begin (); r != result_shapes.end (); ++r) { if (*r) { diff --git a/src/db/db/dbHierProcessor.h b/src/db/db/dbHierProcessor.h index 9bb95f18f..cffd05ee8 100644 --- a/src/db/db/dbHierProcessor.h +++ b/src/db/db/dbHierProcessor.h @@ -30,6 +30,7 @@ #include "dbLayout.h" #include "dbLocalOperation.h" #include "dbGenericShapeIterator.h" +#include "dbCellVariants.h" #include "tlThreadedWorkers.h" #include "tlProgress.h" @@ -413,22 +414,10 @@ public: } }; -template -class DB_PUBLIC local_processor +class DB_PUBLIC LocalProcessorBase { public: - local_processor (db::Layout *layout = 0, db::Cell *top = 0, const std::set *breakout_cells = 0); - local_processor (db::Layout *subject_layout, db::Cell *subject_top, const db::Layout *intruder_layout, const db::Cell *intruder_cell, const std::set *subject_breakout_cells = 0, const std::set *intruder_breakout_cells = 0); - void run (local_operation *op, unsigned int subject_layer, unsigned int intruder_layer, unsigned int output_layers); - void run (local_operation *op, unsigned int subject_layer, unsigned int intruder_layer, const std::vector &output_layers); - void run (local_operation *op, unsigned int subject_layer, const std::vector &intruder_layers, const std::vector &output_layers); - void run (local_operation *op, unsigned int subject_layer, const std::vector &intruder_layers, unsigned int output_layer); - void compute_contexts (local_processor_contexts &contexts, const local_operation *op, unsigned int subject_layer, const std::vector &intruder_layers) const; - void compute_results (local_processor_contexts &contexts, const local_operation *op, const std::vector &output_layers) const; - - void run_flat (const db::Shapes *subject_shapes, const db::Shapes *intruders, const local_operation *op, db::Shapes *result_shapes) const; - void run_flat (const db::Shapes *subjects, const std::vector &intruders, const local_operation *op, const std::vector &result_shapes) const; - void run_flat (const generic_shape_iterator &subjects, const std::vector > &intruders, const std::vector &foreign, const local_operation *op, const std::vector &result_shapes) const; + LocalProcessorBase (); void set_description (const std::string &d) { @@ -440,6 +429,11 @@ public: m_report_progress = rp; } + bool report_progress () const + { + return m_report_progress; + } + void set_base_verbosity (int vb) { m_base_verbosity = vb; @@ -490,6 +484,62 @@ public: return m_boolean_core; } + void set_vars_owned (db::VariantsCollectorBase *vars) + { + mp_vars_owned.reset (vars); + mp_vars = vars; + } + + const db::VariantsCollectorBase *vars () const + { + return mp_vars; + } + + db::Coord dist_for_cell (db::cell_index_type cell_index, db::Coord dist) const; + db::Coord dist_for_cell (const db::Cell *cell, db::Coord dist) const; + + template + std::string description (const local_operation *op) const + { + if (op && m_description.empty ()) { + return op->description (); + } else { + return m_description; + } + } + +private: + std::string m_description; + bool m_report_progress; + unsigned int m_nthreads; + size_t m_max_vertex_count; + double m_area_ratio; + bool m_boolean_core; + int m_base_verbosity; + const db::VariantsCollectorBase *mp_vars; + std::unique_ptr mp_vars_owned; + mutable const db::Cell *mp_current_cell; +}; + +template +class DB_PUBLIC local_processor + : public LocalProcessorBase +{ +public: + local_processor (db::Layout *layout = 0, db::Cell *top = 0, const std::set *breakout_cells = 0); + local_processor (db::Layout *subject_layout, db::Cell *subject_top, const db::Layout *intruder_layout, const db::Cell *intruder_cell, const std::set *subject_breakout_cells = 0, const std::set *intruder_breakout_cells = 0); + + void run (local_operation *op, unsigned int subject_layer, unsigned int intruder_layer, unsigned int output_layers, bool make_variants = true); + void run (local_operation *op, unsigned int subject_layer, unsigned int intruder_layer, const std::vector &output_layers, bool make_variants = true); + void run (local_operation *op, unsigned int subject_layer, const std::vector &intruder_layers, const std::vector &output_layers, bool make_variants = true); + void run (local_operation *op, unsigned int subject_layer, const std::vector &intruder_layers, unsigned int output_layer, bool make_variants = true); + void compute_contexts (local_processor_contexts &contexts, const local_operation *op, unsigned int subject_layer, const std::vector &intruder_layers) const; + void compute_results (local_processor_contexts &contexts, const local_operation *op, const std::vector &output_layers) const; + + void run_flat (const db::Shapes *subject_shapes, const db::Shapes *intruders, const local_operation *op, db::Shapes *result_shapes) const; + void run_flat (const db::Shapes *subjects, const std::vector &intruders, const local_operation *op, const std::vector &result_shapes) const; + void run_flat (const generic_shape_iterator &subjects, const std::vector > &intruders, const std::vector &foreign, const local_operation *op, const std::vector &result_shapes) const; + private: template friend class local_processor_cell_contexts; template friend class local_processor_context_computation_task; @@ -500,18 +550,10 @@ private: const db::Cell *mp_intruder_top; const std::set *mp_subject_breakout_cells; const std::set *mp_intruder_breakout_cells; - std::string m_description; - bool m_report_progress; - unsigned int m_nthreads; - size_t m_max_vertex_count; - double m_area_ratio; - bool m_boolean_core; - int m_base_verbosity; mutable std::unique_ptr > > mp_cc_job; mutable size_t m_progress; mutable tl::Progress *mp_progress; - std::string description (const local_operation *op) const; void next () const; size_t get_progress () const; void compute_contexts (db::local_processor_contexts &contexts, db::local_processor_cell_context *parent_context, db::Cell *subject_parent, db::Cell *subject_cell, const db::ICplxTrans &subject_cell_inst, const db::Cell *intruder_cell, const typename local_processor_cell_contexts::context_key_type &intruders, db::Coord dist) const; diff --git a/src/db/db/dbLayout.cc b/src/db/db/dbLayout.cc index a02ffa949..ab60ae787 100644 --- a/src/db/db/dbLayout.cc +++ b/src/db/db/dbLayout.cc @@ -33,6 +33,7 @@ #include "dbColdProxy.h" #include "dbLibraryManager.h" #include "dbLibrary.h" +#include "dbCellVariants.h" #include "dbRegion.h" #include "dbEdgePairs.h" #include "dbEdges.h" @@ -40,6 +41,7 @@ #include "dbCellMapping.h" #include "dbLayerMapping.h" #include "dbLayoutUtils.h" +#include "dbCellVariants.h" #include "tlTimer.h" #include "tlLog.h" #include "tlInternational.h" diff --git a/src/db/db/dbLayout.h b/src/db/db/dbLayout.h index 353ad2ad9..d85c5976f 100644 --- a/src/db/db/dbLayout.h +++ b/src/db/db/dbLayout.h @@ -71,6 +71,7 @@ class Texts; class Technology; class CellMapping; class LayerMapping; +class VariantsCollectorBase; template class generic_repository; typedef generic_repository GenericRepository; @@ -2068,6 +2069,12 @@ public: */ tl::Event technology_changed_event; + /** + * @brief This event is raised when cell variants are built + * It will specify a list of cells with their new variants. + */ + tl::event > *> variants_created_event; + protected: /** * @brief Establish the graph's internals according to the dirty flags diff --git a/src/db/db/dbLayoutUtils.cc b/src/db/db/dbLayoutUtils.cc index c3ec9efc2..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; @@ -543,9 +543,7 @@ scale_and_snap (db::Layout &layout, db::Cell &cell, db::Coord g, db::Coord m, db continue; } - const std::map &v = vars.variants (c->cell_index ()); - tl_assert (v.size () == size_t (1)); - db::ICplxTrans tr = v.begin ()->first; + db::ICplxTrans tr = vars.single_variant_transformation (c->cell_index ()); // NOTE: tr_disp is already multiplied with mag, so it can be an integer db::Vector tr_disp = tr.disp (); diff --git a/src/db/db/dbLocalOperation.cc b/src/db/db/dbLocalOperation.cc index 94eb19e29..5e7a98d1d 100644 --- a/src/db/db/dbLocalOperation.cc +++ b/src/db/db/dbLocalOperation.cc @@ -30,17 +30,17 @@ namespace db // local_operations implementation template -void local_operation::compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio, bool report_progress, const std::string &progress_desc) const +void local_operation::compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { if (interactions.num_subjects () <= 1 || ! requests_single_subjects ()) { - do_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + do_compute_local (layout, subject_cell, interactions, results, proc); } else { std::unique_ptr progress; - if (report_progress) { - progress.reset (new tl::RelativeProgress (progress_desc, interactions.size ())); + if (proc->report_progress ()) { + progress.reset (new tl::RelativeProgress (proc->description (this), interactions.size ())); } for (typename shape_interactions::iterator i = interactions.begin (); i != interactions.end (); ++i) { @@ -62,7 +62,7 @@ void local_operation::compute_local (db::Layout *layout, const shape single_interactions.add_interaction (i->first, *ii); } - do_compute_local (layout, single_interactions, results, max_vertex_count, area_ratio); + do_compute_local (layout, subject_cell, single_interactions, results, proc); if (progress.get ()) { ++*progress; diff --git a/src/db/db/dbLocalOperation.h b/src/db/db/dbLocalOperation.h index 87161fd20..96dee1656 100644 --- a/src/db/db/dbLocalOperation.h +++ b/src/db/db/dbLocalOperation.h @@ -37,6 +37,8 @@ namespace db { template class shape_interactions; +class LocalProcessorBase; +class TransformationReducer; /** * @brief Indicates the desired behaviour for subject shapes for which there is no intruder @@ -93,7 +95,7 @@ public: * * If the operation requests single subject mode, the interactions will be split into single subject/intruder clusters */ - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio, bool report_progress = false, const std::string &progress_desc = std::string ()) const; + void compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; /** * @brief Indicates the desired behaviour when a shape does not have an intruder @@ -116,6 +118,11 @@ public: */ virtual db::Coord dist () const { return 0; } + /** + * @brief Gets the cell variant reducer that indicates whether to build cell variants and which + */ + virtual const db::TransformationReducer *vars () const { return 0; } + protected: /** * @brief Computes the results from a given set of interacting shapes @@ -123,7 +130,7 @@ protected: * @param interactions The interaction set * @param result The container to which the results are written */ - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &result, size_t max_vertex_count, double area_ratio) const = 0; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &result, const db::LocalProcessorBase *proc) const = 0; }; } diff --git a/src/db/db/dbRegionLocalOperations.cc b/src/db/db/dbRegionLocalOperations.cc index aaaa73cf3..915763b5d 100644 --- a/src/db/db/dbRegionLocalOperations.cc +++ b/src/db/db/dbRegionLocalOperations.cc @@ -199,12 +199,16 @@ check_local_operation_base::check_local_operation_base (const EdgeRelati template void -check_local_operation_base::compute_results (db::Layout *layout, const std::vector &subjects, const std::set &intruders, std::unordered_set &result, std::unordered_set &intra_polygon_result) const +check_local_operation_base::compute_results (db::Layout *layout, db::Cell *subject_cell, const std::vector &subjects, const std::set &intruders, std::unordered_set &result, std::unordered_set &intra_polygon_result, const db::LocalProcessorBase *proc) const { // NOTE: the rectangle and opposite filters are unsymmetric bool symmetric_edge_pairs = ! m_has_other && m_options.opposite_filter == db::NoOppositeFilter && m_options.rect_filter == RectFilter::NoRectFilter; - edge2edge_check_negative_or_positive > edge_check (m_check, result, intra_polygon_result, m_options.negative, m_different_polygons, m_has_other, m_options.shielded, symmetric_edge_pairs); + // modify the check to take into account scaled cells + EdgeRelationFilter check = m_check; + check.set_distance (proc->dist_for_cell (subject_cell, check.distance ())); + + edge2edge_check_negative_or_positive > edge_check (check, result, intra_polygon_result, m_options.negative, m_different_polygons, m_has_other, m_options.shielded, symmetric_edge_pairs); poly2poly_check poly_check (edge_check); std::unordered_set polygons; @@ -677,7 +681,7 @@ check_local_operation::check_local_operation (const EdgeRelationFilter & template void -check_local_operation::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const +check_local_operation::do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { std::vector subjects; subjects.reserve (interactions.size ()); @@ -696,7 +700,7 @@ check_local_operation::do_compute_local (db::Layout *layout, const shape std::unordered_set result, intra_polygon_result; // perform the basic check - check_local_operation_base::compute_results (layout, subjects, intruders, result, intra_polygon_result); + check_local_operation_base::compute_results (layout, subject_cell, subjects, intruders, result, intra_polygon_result, proc); // detect and remove parts of the result which have or do not have results "opposite" // ("opposite" is defined by the projection of edges "through" the subject shape) @@ -752,7 +756,7 @@ check_local_operation_with_properties::check_local_operation_with_proper template void -check_local_operation_with_properties::do_compute_local (db::Layout *layout, const shape_interactions, db::object_with_properties > &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const +check_local_operation_with_properties::do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions, db::object_with_properties > &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { tl_assert (results.size () == 1); @@ -766,7 +770,7 @@ check_local_operation_with_properties::do_compute_local (db::Layout *lay const std::set &intruders = s2p->second.second; // perform the basic check - check_local_operation_base::compute_results (layout, subjects, intruders, result, intra_polygon_result); + check_local_operation_base::compute_results (layout, subject_cell, subjects, intruders, result, intra_polygon_result, proc); // detect and remove parts of the result which have or do not have results "opposite" // ("opposite" is defined by the projection of edges "through" the subject shape) @@ -852,7 +856,7 @@ db::Coord interacting_local_operation::dist () const } template -void interacting_local_operation::do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const +void interacting_local_operation::do_compute_local (db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { if (m_output_mode == None) { return; @@ -1031,7 +1035,7 @@ db::Coord contained_local_operation::dist () const } template -void contained_local_operation::do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const +void contained_local_operation::do_compute_local (db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { if (m_output_mode == None) { return; @@ -1106,7 +1110,7 @@ db::Coord pull_local_operation::dist () const } template -void pull_local_operation::do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const +void pull_local_operation::do_compute_local (db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { tl_assert (results.size () == 1); std::unordered_set &result = results.front (); @@ -1186,7 +1190,7 @@ db::Coord interacting_with_edge_local_operation::dist () const } template -void interacting_with_edge_local_operation::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const +void interacting_with_edge_local_operation::do_compute_local (db::Layout *layout, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { if (m_output_mode == None) { return; @@ -1313,7 +1317,7 @@ db::Coord pull_with_edge_local_operation::dist () const } template -void pull_with_edge_local_operation::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const +void pull_with_edge_local_operation::do_compute_local (db::Layout *layout, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { tl_assert (results.size () == 1); std::unordered_set &result = results.front (); @@ -1374,7 +1378,7 @@ db::Coord pull_with_text_local_operation::dist () const } template -void pull_with_text_local_operation::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const +void pull_with_text_local_operation::do_compute_local (db::Layout *layout, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { tl_assert (results.size () == 1); std::unordered_set &result = results.front (); @@ -1443,7 +1447,7 @@ db::Coord interacting_with_text_local_operation::dist () const template -void interacting_with_text_local_operation::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const +void interacting_with_text_local_operation::do_compute_local (db::Layout *layout, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { if (m_output_mode == None) { return; @@ -1555,7 +1559,7 @@ bool_and_or_not_local_operation::description () const template void -bool_and_or_not_local_operation::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +bool_and_or_not_local_operation::do_compute_local (db::Layout *layout, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { tl_assert (results.size () == 1); std::unordered_set &result = results.front (); @@ -1603,7 +1607,7 @@ bool_and_or_not_local_operation::do_compute_local (db::Layout *layou db::BooleanOp op (m_is_and ? db::BooleanOp::And : db::BooleanOp::ANotB); db::polygon_ref_generator pr (layout, result); - db::PolygonSplitter splitter (pr, area_ratio, max_vertex_count); + db::PolygonSplitter splitter (pr, proc->area_ratio (), proc->max_vertex_count ()); db::PolygonGenerator pg (splitter, true, true); ep.set_base_verbosity (50); ep.process (pg, op); @@ -1640,7 +1644,7 @@ bool_and_or_not_local_operation_with_properties::description () cons template void -bool_and_or_not_local_operation_with_properties::do_compute_local (db::Layout *layout, const shape_interactions, db::object_with_properties > &interactions, std::vector > > &results, size_t max_vertex_count, double area_ratio) const +bool_and_or_not_local_operation_with_properties::do_compute_local (db::Layout *layout, db::Cell * /*cell*/, const shape_interactions, db::object_with_properties > &interactions, std::vector > > &results, const db::LocalProcessorBase *proc) const { tl_assert (results.size () == 1); std::unordered_set > &result = results.front (); @@ -1717,7 +1721,7 @@ bool_and_or_not_local_operation_with_properties::do_compute_local (d db::BooleanOp op (m_is_and ? db::BooleanOp::And : db::BooleanOp::ANotB); db::polygon_ref_generator_with_properties > pr (layout, result, prop_id); - db::PolygonSplitter splitter (pr, area_ratio, max_vertex_count); + db::PolygonSplitter splitter (pr, proc->area_ratio (), proc->max_vertex_count ()); db::PolygonGenerator pg (splitter, true, true); ep.set_base_verbosity (50); ep.process (pg, op); @@ -1742,7 +1746,7 @@ two_bool_and_not_local_operation::two_bool_and_not_local_operation ( template void -two_bool_and_not_local_operation::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +two_bool_and_not_local_operation::do_compute_local (db::Layout *layout, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { tl_assert (results.size () == 2); @@ -1788,12 +1792,12 @@ two_bool_and_not_local_operation::do_compute_local (db::Layout *layo db::BooleanOp op0 (db::BooleanOp::And); db::polygon_ref_generator pr0 (layout, result0); - db::PolygonSplitter splitter0 (pr0, area_ratio, max_vertex_count); + db::PolygonSplitter splitter0 (pr0, proc->area_ratio (), proc->max_vertex_count ()); db::PolygonGenerator pg0 (splitter0, true, true); db::BooleanOp op1 (db::BooleanOp::ANotB); db::polygon_ref_generator pr1 (layout, result1); - db::PolygonSplitter splitter1 (pr1, area_ratio, max_vertex_count); + db::PolygonSplitter splitter1 (pr1, proc->area_ratio (), proc->max_vertex_count ()); db::PolygonGenerator pg1 (splitter1, true, true); ep.set_base_verbosity (50); @@ -1829,7 +1833,7 @@ two_bool_and_not_local_operation_with_properties::two_bool_and_not_l template void -two_bool_and_not_local_operation_with_properties::do_compute_local (db::Layout *layout, const shape_interactions, db::object_with_properties > &interactions, std::vector > > &results, size_t max_vertex_count, double area_ratio) const +two_bool_and_not_local_operation_with_properties::do_compute_local (db::Layout *layout, db::Cell * /*cell*/, const shape_interactions, db::object_with_properties > &interactions, std::vector > > &results, const db::LocalProcessorBase *proc) const { tl_assert (results.size () == 2); std::unordered_set > &result0 = results [0]; @@ -1904,12 +1908,12 @@ two_bool_and_not_local_operation_with_properties::do_compute_local ( db::BooleanOp op0 (db::BooleanOp::And); db::polygon_ref_generator pr0 (layout, result0_wo_props); - db::PolygonSplitter splitter0 (pr0, area_ratio, max_vertex_count); + db::PolygonSplitter splitter0 (pr0, proc->area_ratio (), proc->max_vertex_count ()); db::PolygonGenerator pg0 (splitter0, true, true); db::BooleanOp op1 (db::BooleanOp::ANotB); db::polygon_ref_generator pr1 (layout, result1_wo_props); - db::PolygonSplitter splitter1 (pr1, area_ratio, max_vertex_count); + db::PolygonSplitter splitter1 (pr1, proc->area_ratio (), proc->max_vertex_count ()); db::PolygonGenerator pg1 (splitter1, true, true); ep.set_base_verbosity (50); @@ -1949,7 +1953,7 @@ SelfOverlapMergeLocalOperation::SelfOverlapMergeLocalOperation (unsigned int wra } void -SelfOverlapMergeLocalOperation::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const +SelfOverlapMergeLocalOperation::do_compute_local (db::Layout *layout, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { tl_assert (results.size () == 1); std::unordered_set &result = results.front (); @@ -2021,7 +2025,7 @@ PolygonToEdgeLocalOperation::description () const } void -PolygonToEdgeLocalOperation::do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const +PolygonToEdgeLocalOperation::do_compute_local (db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const { db::EdgeProcessor ep; ep.set_base_verbosity (50); diff --git a/src/db/db/dbRegionLocalOperations.h b/src/db/db/dbRegionLocalOperations.h index f5e4a238a..b1ffc8785 100644 --- a/src/db/db/dbRegionLocalOperations.h +++ b/src/db/db/dbRegionLocalOperations.h @@ -236,7 +236,7 @@ protected: bool m_other_is_merged; db::RegionCheckOptions m_options; - void compute_results (db::Layout *layout, const std::vector &subjects, const std::set &intruders, std::unordered_set &result, std::unordered_set &intra_polygon_result) const; + void compute_results (db::Layout *layout, db::Cell *subject_cell, const std::vector &subjects, const std::set &intruders, std::unordered_set &result, std::unordered_set &intra_polygon_result, const LocalProcessorBase *proc) const; void apply_opposite_filter (const std::vector &subjects, std::unordered_set &result, std::unordered_set &intra_polygon_result) const; void apply_rectangle_filter (const std::vector &subjects, std::unordered_set &result) const; }; @@ -253,7 +253,12 @@ public: virtual bool requests_single_subjects () const { return true; } virtual std::string description () const; - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const; + + virtual const db::TransformationReducer *vars () const { return &m_vars; } + +private: + db::MagnificationReducer m_vars; }; template @@ -268,10 +273,13 @@ public: virtual bool requests_single_subjects () const { return true; } virtual std::string description () const; - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions, db::object_with_properties > &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions, db::object_with_properties > &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const; + + virtual const db::TransformationReducer *vars () const { return &m_vars; } private: mutable db::PropertyMapper m_pms, m_pmi; + db::MagnificationReducer m_vars; }; typedef check_local_operation CheckLocalOperation; @@ -288,7 +296,7 @@ public: interacting_local_operation (int mode, bool touching, InteractingOutputMode output_mode, size_t min_count, size_t max_count, bool other_is_merged); virtual db::Coord dist () const; - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const; virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; @@ -310,7 +318,7 @@ public: pull_local_operation (int mode, bool touching); virtual db::Coord dist () const; - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const; virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; @@ -329,7 +337,7 @@ public: interacting_with_edge_local_operation (InteractingOutputMode output_mode, size_t min_count, size_t max_count, bool other_is_merged); virtual db::Coord dist () const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const; virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; @@ -349,7 +357,7 @@ public: pull_with_edge_local_operation (); virtual db::Coord dist () const; - virtual void do_compute_local (db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const; virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; }; @@ -364,7 +372,7 @@ public: interacting_with_text_local_operation (InteractingOutputMode output_mode, size_t min_count, size_t max_count); virtual db::Coord dist () const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const; virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; @@ -383,7 +391,7 @@ public: pull_with_text_local_operation (); virtual db::Coord dist () const; - virtual void do_compute_local (db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase * /*proc*/) const; virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; }; @@ -398,7 +406,7 @@ public: contained_local_operation (InteractingOutputMode output_mode); virtual db::Coord dist () const; - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &results, const LocalProcessorBase * /*proc*/) const; virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; @@ -421,7 +429,7 @@ class DB_PUBLIC bool_and_or_not_local_operation public: bool_and_or_not_local_operation (bool is_and); - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &result, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &result, const db::LocalProcessorBase *proc) const; virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; @@ -441,7 +449,7 @@ class DB_PUBLIC bool_and_or_not_local_operation_with_properties public: bool_and_or_not_local_operation_with_properties (bool is_and, db::PropertiesRepository *target_pr, const db::PropertiesRepository *subject_pr, const db::PropertiesRepository *intruder_pr, db::PropertyConstraint property_constraint); - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions, db::object_with_properties > &interactions, std::vector > > &result, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions, db::object_with_properties > &interactions, std::vector > > &result, const db::LocalProcessorBase *proc) const; virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; @@ -468,7 +476,7 @@ class DB_PUBLIC two_bool_and_not_local_operation public: two_bool_and_not_local_operation (); - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &result, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &result, const db::LocalProcessorBase *proc) const; virtual std::string description () const; }; @@ -487,7 +495,7 @@ class DB_PUBLIC two_bool_and_not_local_operation_with_properties public: two_bool_and_not_local_operation_with_properties (db::PropertiesRepository *target1_pr, db::PropertiesRepository *target2_pr, const db::PropertiesRepository *subject_pr, const db::PropertiesRepository *intruder_pr, db::PropertyConstraint property_constraint); - virtual void do_compute_local (db::Layout *layout, const shape_interactions, db::object_with_properties > &interactions, std::vector > > &result, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions, db::object_with_properties > &interactions, std::vector > > &result, const db::LocalProcessorBase *proc) const; virtual std::string description () const; private: @@ -508,7 +516,7 @@ class DB_PUBLIC SelfOverlapMergeLocalOperation public: SelfOverlapMergeLocalOperation (unsigned int wrap_count); - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &result, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &result, const db::LocalProcessorBase *proc) const; virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; @@ -529,7 +537,7 @@ public: virtual bool requests_single_subjects () const { return true; } virtual std::string description () const; - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; + virtual void do_compute_local (db::Layout *layout, db::Cell *subject_cell, const shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const; private: mutable db::PropertyMapper m_pm; diff --git a/src/db/db/dbRegionProcessors.cc b/src/db/db/dbRegionProcessors.cc index 5931bf3da..529a66a0a 100644 --- a/src/db/db/dbRegionProcessors.cc +++ b/src/db/db/dbRegionProcessors.cc @@ -118,7 +118,13 @@ void RelativeExtentsAsEdges::process (const db::Polygon &poly, std::vector &res) const; + virtual const TransformationReducer *vars () const { return &m_vars; } + virtual bool wants_variants () const { return true; } private: db::edge_relation_type m_relation; db::Coord m_d; db::RegionCheckOptions m_options; + db::MagnificationReducer m_vars; }; } // namespace db diff --git a/src/db/db/dbShapeCollectionUtils.h b/src/db/db/dbShapeCollectionUtils.h index 817fd8d3f..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; @@ -198,20 +198,20 @@ shape_collection_processed_impl (const db::DeepLayer &input, const shape_collect if (vars.get ()) { - const std::map &vv = vars->variants (c->cell_index ()); - for (std::map::const_iterator v = vv.begin (); v != vv.end (); ++v) { + const std::set &vv = vars->variants (c->cell_index ()); + for (auto v = vv.begin (); v != vv.end (); ++v) { db::Shapes *st; if (vv.size () == 1) { st = & c->shapes (res->deep_layer ().layer ()); } else { - st = & to_commit [c->cell_index ()] [v->first]; + st = & to_commit [c->cell_index ()] [*v]; } shape_collection_processor_delivery delivery (&layout, st); shape_collection_processor_delivery > delivery_wp (&layout, st); - const db::ICplxTrans &tr = v->first; + const db::ICplxTrans &tr = *v; db::ICplxTrans trinv = tr.inverted (); for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::All); ! si.at_end (); ++si) { @@ -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 22212954a..a508f2a25 100644 --- a/src/db/unit_tests/dbCellVariantsTests.cc +++ b/src/db/unit_tests/dbCellVariantsTests.cc @@ -27,6 +27,18 @@ #include "tlUnitTest.h" #include "tlStream.h" +std::string var2str (const std::set &vars) +{ + std::string res; + for (auto i = vars.begin (); i != vars.end (); ++i) { + if (! res.empty ()) { + res += ";"; + } + res += i->to_string (); + } + return res; +} + std::string var2str (const std::map &vars) { std::string res; @@ -93,14 +105,14 @@ TEST(1_Trivial) db::OrientationReducer red; db::cell_variants_collector vb (red); - vb.collect (ly, a); - 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]"); + 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), ""); } @@ -118,16 +130,16 @@ TEST(2_TwoVariants) db::OrientationReducer red; db::cell_variants_collector vb (red); - vb.collect (ly, a); - 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]"); + 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 ())), ""); EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); 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"); } @@ -147,17 +159,17 @@ TEST(3_TwoLevels) db::OrientationReducer red; db::cell_variants_collector vb (red); - vb.collect (ly, a); - 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]"); + 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"); EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); EXPECT_EQ (inst2str (ly, a), "B:r0 *1 1,10;B:r90 *1 1,100"); 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"); @@ -181,18 +193,18 @@ TEST(4_ThreeLevels) db::OrientationReducer red; db::cell_variants_collector vb (red); - vb.collect (ly, a); - 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]"); - EXPECT_EQ (var2str (vb.variants (d.cell_index ())), "r270 *1 0,0[1];m90 *1 0,0[1];r0 *1 0,0[1];m45 *1 0,0[1]"); + 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"); + EXPECT_EQ (var2str (vb.variants (d.cell_index ())), "r270 *1 0,0;m90 *1 0,0;r0 *1 0,0;m45 *1 0,0"); EXPECT_EQ (inst2str (ly, a), "B:r0 *1 1,10;B:r90 *1 1,100"); EXPECT_EQ (inst2str (ly, b), "C:r0 *1 2,10;C:m0 *1 2,100"); 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"); @@ -219,16 +231,15 @@ TEST(5_ComplexTrans) db::OrientationReducer red; db::cell_variants_collector vb (red); - vb.collect (ly, a); - 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]"); + 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"); EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); } TEST(6_Arrays) { - db::Layout ly; db::Cell &a = ly.cell (ly.add_cell ("A")); db::Cell &b = ly.cell (ly.add_cell ("B")); @@ -242,10 +253,10 @@ TEST(6_Arrays) db::OrientationReducer red; db::cell_variants_collector vb (red); - vb.collect (ly, a); - 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]"); + 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"); EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); } @@ -264,10 +275,10 @@ TEST(7_ScalingVariants) db::MagnificationReducer red; db::cell_variants_collector vb (red); - vb.collect (ly, a); - 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]"); + 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"); EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); } @@ -284,9 +295,9 @@ TEST(8_GridVariants) db::GridReducer red (10); db::cell_variants_collector vb (red); - vb.collect (ly, a); - 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]"); + 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"); // placements are: // b in a: r0 *1 x=1,1+102 y=10,10+101 @@ -297,7 +308,7 @@ TEST(8_GridVariants) // expanded placements mod 10: // c in a: r0 *2 x=1,1+102 y=10,10+101 x r0 *1 x=2,y=3 // = (3,3),(5,3),(3,4),(5,4) - EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "r0 *1 -5,3[1];r0 *1 3,3[1];r0 *1 -5,4[1];r0 *1 3,4[1]"); + EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "r0 *1 -5,3;r0 *1 3,3;r0 *1 -5,4;r0 *1 3,4"); EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); EXPECT_EQ (inst2str (ly, a), "B:r0 *1 1,10;B:r0 *1 1,111;B:r0 *1 103,10;B:r0 *1 103,111"); @@ -305,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"); @@ -331,7 +342,278 @@ 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"); + + // placements are: + // b in a: r0 *2 x=1,1+102 y=10,10+101 + // r90 *1 x=1,y=100 + // c in b: r0 *2 x=2,2+105 y=10,10+103 + // m0 *1 x=2,y=100 + // expanded placements: + // c in a: r0 *2 x=1,1+102 y=10,10+101 x r0 *2 x=2,2+105 y=10,10+103 + // = (5,30),(215,30),(5,236),(215,236) + // (107,30),(317,30),(107,236),(317,236) + // (5,131),(215,131),(5,337),(215,337) + // (107,131),(317,131),(107,337),(317,337) + // r0 *2 x=1,1+102 y=10,10+101 x m0 *1 x=2,y=100 + // (5,210),(5,311),(107,210),(107,311) + // r90 *1 x=1,y=100 x r0 *2 x=2,2+105 y=10,10+103 + // (-9,102),(-9,207),(-112,102),(-112,207) + // r90 *1 x=1,y=100 x m0 *1 x=2,y=100 + // (-99,102) + // expanded ((placements + 5) mod 10) - placements + // c in a: r0 *2 x=1,1+102 y=10,10+101 x r0 *2 x=2,2+105 y=10,10+103 + // = (5,0),(5,0),(-5,-4),(-5,-4) + // (7,0),(7,0),(-3,-4),(-3,-4) + // (-5,1),(-5,1),(-5,-3),(-5,-3) + // (-3,1),(-3,1),(-3,-3),(-3,-3) + // r0 *2 x=1,1+102 y=10,10+101 x m0 *1 x=2,y=100 + // (-5,0),(-5,1),(-3,0),(-3,1) + // r90 *1 x=1,y=100 x r0 *2 x=2,2+105 y=10,10+103 + // (1,2),(1,-3),(-2,2),(-2,-3) + // r90 *1 x=1,y=100 x m0 *1 x=2,y=100 + // (1,2) + EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "r0 *4 -5,-4;r0 *4 -3,-4;r0 *4 -5,-3;r0 *4 -3,-3;r90 *2 -2,-3;" + "r90 *2 1,-3;m0 *2 -5,0;r0 *4 -5,0;m0 *2 -3,0;r0 *4 -3,0;" + "m0 *2 -5,1;r0 *4 -5,1;m0 *2 -3,1;r0 *4 -3,1;r90 *2 -2,2;m45 *1 1,2;r90 *2 1,2"); + EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); +} + +TEST(100_OrientationVariantsWithLayout) +{ + db::Layout ly; + { + std::string fn (tl::testdata ()); + fn += "/algo/deep_region_l1.gds"; + tl::InputStream stream (fn); + db::Reader reader (stream); + reader.read (ly); + } + + db::cell_index_type top_cell_index = *ly.begin_top_down (); + db::Cell &top_cell = ly.cell (top_cell_index); + + db::OrientationReducer red; + db::cell_variants_collector vb (red); + vb.collect (&ly, top_cell.cell_index ()); + vb.separate_variants (); + + CHECKPOINT(); + db::compare_layouts (_this, ly, tl::testdata () + "/algo/cell_variants_au1.gds"); +} + +TEST(10_TrivialStatistics) +{ + db::Layout ly; + db::Cell &a = ly.cell (ly.add_cell ("A")); + db::Cell &b = ly.cell (ly.add_cell ("B")); + db::Cell &c = ly.cell (ly.add_cell ("C")); + db::Cell &d = ly.cell (ly.add_cell ("D")); + + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::Trans (0, false, db::Vector (1, 10)))); + + db::OrientationReducer red; + db::cell_variants_statistics vb (red); + 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 ())), ""); + EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); +} + +TEST(11_TwoVariantsStatistics) +{ + db::Layout ly; + db::Cell &a = ly.cell (ly.add_cell ("A")); + db::Cell &b = ly.cell (ly.add_cell ("B")); + db::Cell &c = ly.cell (ly.add_cell ("C")); + db::Cell &d = ly.cell (ly.add_cell ("D")); + + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::Trans (0, false, db::Vector (1, 10)))); + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::Trans (0, true, db::Vector (1, 100)))); + + db::OrientationReducer red; + db::cell_variants_statistics vb (red); + 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 ())), ""); + EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); + + EXPECT_EQ (inst2str (ly, a), "B:r0 *1 1,10;B:m0 *1 1,100"); +} + +TEST(12_TwoLevelsStatistics) +{ + db::Layout ly; + db::Cell &a = ly.cell (ly.add_cell ("A")); + db::Cell &b = ly.cell (ly.add_cell ("B")); + db::Cell &c = ly.cell (ly.add_cell ("C")); + db::Cell &d = ly.cell (ly.add_cell ("D")); + + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::Trans (0, false, db::Vector (1, 10)))); + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::Trans (1, false, db::Vector (1, 100)))); + b.insert (db::CellInstArray (db::CellInst (c.cell_index ()), db::Trans (0, false, db::Vector (2, 10)))); + b.insert (db::CellInstArray (db::CellInst (c.cell_index ()), db::Trans (0, true, db::Vector (2, 100)))); + + db::OrientationReducer red; + db::cell_variants_statistics vb (red); + 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]"); + EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); + + EXPECT_EQ (inst2str (ly, a), "B:r0 *1 1,10;B:r90 *1 1,100"); + EXPECT_EQ (inst2str (ly, b), "C:r0 *1 2,10;C:m0 *1 2,100"); +} + +TEST(13_ThreeLevelsStatistics) +{ + db::Layout ly; + db::Cell &a = ly.cell (ly.add_cell ("A")); + db::Cell &b = ly.cell (ly.add_cell ("B")); + db::Cell &c = ly.cell (ly.add_cell ("C")); + db::Cell &d = ly.cell (ly.add_cell ("D")); + + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::Trans (0, false, db::Vector (1, 10)))); + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::Trans (1, false, db::Vector (1, 100)))); + b.insert (db::CellInstArray (db::CellInst (c.cell_index ()), db::Trans (0, false, db::Vector (2, 10)))); + b.insert (db::CellInstArray (db::CellInst (c.cell_index ()), db::Trans (0, true, db::Vector (2, 100)))); + c.insert (db::CellInstArray (db::CellInst (d.cell_index ()), db::Trans (1, true, db::Vector (0, 0)))); + + db::OrientationReducer red; + db::cell_variants_statistics vb (red); + 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]"); + EXPECT_EQ (var2str (vb.variants (d.cell_index ())), "r270 *1 0,0[1];m90 *1 0,0[1];r0 *1 0,0[1];m45 *1 0,0[1]"); + + EXPECT_EQ (inst2str (ly, a), "B:r0 *1 1,10;B:r90 *1 1,100"); + EXPECT_EQ (inst2str (ly, b), "C:r0 *1 2,10;C:m0 *1 2,100"); + EXPECT_EQ (inst2str (ly, c), "D:m45 *1 0,0"); +} + +TEST(14_ComplexTransStatistics) +{ + db::Layout ly; + db::Cell &a = ly.cell (ly.add_cell ("A")); + db::Cell &b = ly.cell (ly.add_cell ("B")); + db::Cell &c = ly.cell (ly.add_cell ("C")); + db::Cell &d = ly.cell (ly.add_cell ("D")); + + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::ICplxTrans (db::Trans (0, false, db::Vector (1, 10))))); + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::ICplxTrans (db::Trans (1, false, db::Vector (1, 100))))); + b.insert (db::CellInstArray (db::CellInst (c.cell_index ()), db::ICplxTrans (db::Trans (0, false, db::Vector (2, 10))))); + b.insert (db::CellInstArray (db::CellInst (c.cell_index ()), db::ICplxTrans (db::Trans (0, true, db::Vector (2, 100))))); + + db::OrientationReducer red; + db::cell_variants_statistics vb (red); + 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]"); + EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); +} + +TEST(15_ArraysStatistics) +{ + + db::Layout ly; + db::Cell &a = ly.cell (ly.add_cell ("A")); + db::Cell &b = ly.cell (ly.add_cell ("B")); + db::Cell &c = ly.cell (ly.add_cell ("C")); + db::Cell &d = ly.cell (ly.add_cell ("D")); + + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::Trans (0, false, db::Vector (1, 10)), db::Vector (0, 100), db::Vector (100, 0), 10, 10)); + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::Trans (1, false, db::Vector (1, 100)))); + b.insert (db::CellInstArray (db::CellInst (c.cell_index ()), db::Trans (0, false, db::Vector (2, 10)), db::Vector (0, 101), db::Vector (101, 0), 10, 10)); + b.insert (db::CellInstArray (db::CellInst (c.cell_index ()), db::Trans (0, true, db::Vector (2, 100)))); + + db::OrientationReducer red; + db::cell_variants_statistics vb (red); + 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]"); + EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); +} + +TEST(16_ScalingVariantsStatistics) +{ + db::Layout ly; + db::Cell &a = ly.cell (ly.add_cell ("A")); + db::Cell &b = ly.cell (ly.add_cell ("B")); + db::Cell &c = ly.cell (ly.add_cell ("C")); + db::Cell &d = ly.cell (ly.add_cell ("D")); + + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::ICplxTrans (1.5, 0, false, db::Vector (1, 10)), db::Vector (0, 100), db::Vector (100, 0), 10, 10)); + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::ICplxTrans (1.0, 90.0, false, db::Vector (1, 100)))); + b.insert (db::CellInstArray (db::CellInst (c.cell_index ()), db::ICplxTrans (2.0, 0, false, db::Vector (2, 10)), db::Vector (0, 101), db::Vector (101, 0), 10, 10)); + b.insert (db::CellInstArray (db::CellInst (c.cell_index ()), db::ICplxTrans (1.0, 0, true, db::Vector (2, 100)))); + + db::MagnificationReducer red; + db::cell_variants_statistics vb (red); + 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]"); + EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); +} + +TEST(17_GridVariantsStatistics) +{ + db::Layout ly; + db::Cell &a = ly.cell (ly.add_cell ("A")); + db::Cell &b = ly.cell (ly.add_cell ("B")); + db::Cell &c = ly.cell (ly.add_cell ("C")); + db::Cell &d = ly.cell (ly.add_cell ("D")); + + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::ICplxTrans (1.0, 0, false, db::Vector (1, 10)), db::Vector (0, 101), db::Vector (102, 0), 2, 2)); + b.insert (db::CellInstArray (db::CellInst (c.cell_index ()), db::ICplxTrans (1.0, 0, false, db::Vector (2, 3)))); + + db::GridReducer red (10); + db::cell_variants_statistics vb (red); + 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]"); + + // placements are: + // b in a: r0 *1 x=1,1+102 y=10,10+101 + // c in b: r0 *1 x=2,y=3 + // expanded placements: + // c in a: r0 *2 x=1,1+102 y=10,10+101 x r0 *1 x=2,y=3 + // = (3,13),(105,13),(3,114),(105,114) + // expanded placements mod 10: + // c in a: r0 *2 x=1,1+102 y=10,10+101 x r0 *1 x=2,y=3 + // = (3,3),(5,3),(3,4),(5,4) + EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "r0 *1 -5,3[1];r0 *1 3,3[1];r0 *1 -5,4[1];r0 *1 3,4[1]"); + EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); + + EXPECT_EQ (inst2str (ly, a), "B:r0 *1 1,10;B:r0 *1 1,111;B:r0 *1 103,10;B:r0 *1 103,111"); + EXPECT_EQ (inst2str (ly, b), "C:r0 *1 2,3"); + EXPECT_EQ (inst2str (ly, c), ""); +} + +TEST(18_ComplexGridVariantsStatistics) +{ + db::Layout ly; + db::Cell &a = ly.cell (ly.add_cell ("A")); + db::Cell &b = ly.cell (ly.add_cell ("B")); + db::Cell &c = ly.cell (ly.add_cell ("C")); + db::Cell &d = ly.cell (ly.add_cell ("D")); + + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::ICplxTrans (2.0, 0, false, db::Vector (1, 10)), db::Vector (0, 101), db::Vector (102, 0), 2, 2)); + a.insert (db::CellInstArray (db::CellInst (b.cell_index ()), db::ICplxTrans (1.0, 90.0, false, db::Vector (1, 100)))); + b.insert (db::CellInstArray (db::CellInst (c.cell_index ()), db::ICplxTrans (2.0, 0, false, db::Vector (2, 10)), db::Vector (0, 103), db::Vector (105, 0), 2, 2)); + b.insert (db::CellInstArray (db::CellInst (c.cell_index ()), db::ICplxTrans (1.0, 0, true, db::Vector (2, 100)))); + + db::GridReducer red (10); + db::cell_variants_statistics vb (red); + 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]"); @@ -370,29 +652,6 @@ TEST(9_ComplexGridVariants) EXPECT_EQ (var2str (vb.variants (d.cell_index ())), ""); } -TEST(100_OrientationVariantsWithLayout) -{ - db::Layout ly; - { - std::string fn (tl::testdata ()); - fn += "/algo/deep_region_l1.gds"; - tl::InputStream stream (fn); - db::Reader reader (stream); - reader.read (ly); - } - - db::cell_index_type top_cell_index = *ly.begin_top_down (); - db::Cell &top_cell = ly.cell (top_cell_index); - - db::OrientationReducer red; - db::cell_variants_collector vb (red); - vb.collect (ly, top_cell); - vb.separate_variants (ly, top_cell); - - CHECKPOINT(); - db::compare_layouts (_this, ly, tl::testdata () + "/algo/cell_variants_au1.gds"); -} - TEST(101_Propagation) { db::Layout ly; @@ -413,25 +672,25 @@ 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) { - const std::map &vv = vb.variants (c->cell_index ()); - for (std::map::const_iterator v = vv.begin (); v != vv.end (); ++v) { + const std::set &vv = vb.variants (c->cell_index ()); + for (auto v = vv.begin (); v != vv.end (); ++v) { - db::Shapes &out = to_commit [c->cell_index ()][v->first]; + db::Shapes &out = to_commit [c->cell_index ()][*v]; for (db::Shapes::shape_iterator s = c->shapes (l1).begin (db::ShapeIterator::All); ! s.at_end (); ++s) { - db::Box b = s->bbox ().transformed (v->first); + db::Box b = s->bbox ().transformed (*v); b.enlarge (db::Vector (-100, 0)); - out.insert (b.transformed (v->first.inverted ())); + out.insert (b.transformed (v->inverted ())); } } } - 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"); diff --git a/src/db/unit_tests/dbHierProcessorTests.cc b/src/db/unit_tests/dbHierProcessorTests.cc index 504f36c2e..36fe6b904 100644 --- a/src/db/unit_tests/dbHierProcessorTests.cc +++ b/src/db/unit_tests/dbHierProcessorTests.cc @@ -61,7 +61,7 @@ public: // .. nothing yet .. } - virtual void do_compute_local (db::Layout *layout, const db::shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (db::Layout *layout, db::Cell *cell, const db::shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { db::shape_interactions sized_interactions = interactions; for (db::shape_interactions::iterator i = sized_interactions.begin (); i != sized_interactions.end (); ++i) { @@ -73,7 +73,7 @@ public: } } - db::BoolAndOrNotLocalOperation::do_compute_local (layout, sized_interactions, results, max_vertex_count, area_ratio); + db::BoolAndOrNotLocalOperation::do_compute_local (layout, cell, sized_interactions, results, proc); } db::Coord dist () const @@ -98,7 +98,7 @@ public: // .. nothing yet .. } - virtual void do_compute_local (db::Layout *layout, const db::shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (db::Layout *layout, db::Cell *cell, const db::shape_interactions &interactions, std::vector > &results, const db::LocalProcessorBase *proc) const { db::shape_interactions sized_interactions = interactions; for (db::shape_interactions::iterator i = sized_interactions.begin (); i != sized_interactions.end (); ++i) { @@ -119,7 +119,7 @@ public: } - SelfOverlapMergeLocalOperation::do_compute_local (layout, sized_interactions, results, max_vertex_count, area_ratio); + SelfOverlapMergeLocalOperation::do_compute_local (layout, cell, sized_interactions, results, proc); } db::Coord dist () const diff --git a/src/drc/unit_tests/drcSimpleTests.cc b/src/drc/unit_tests/drcSimpleTests.cc index 3851b72ec..01254fabf 100644 --- a/src/drc/unit_tests/drcSimpleTests.cc +++ b/src/drc/unit_tests/drcSimpleTests.cc @@ -1566,3 +1566,54 @@ TEST(70d_props) { run_test (_this, "70", true); } + +TEST(80_deep_with_mag_width) +{ + run_test (_this, "80", true); +} + +TEST(81_deep_with_mag_space) +{ + run_test (_this, "81", true); +} + +TEST(82_deep_with_mag_cop_width) +{ + run_test (_this, "82", true); +} + +TEST(83_deep_with_mag_cop_space) +{ + run_test (_this, "83", true); +} + +TEST(84_deep_with_mag_edge_width) +{ + run_test (_this, "84", true); +} + +TEST(85_deep_with_mag_edge_space) +{ + run_test (_this, "85", true); +} + +TEST(86_deep_with_mag_size) +{ + run_test (_this, "86", true); +} + +TEST(87_deep_with_mag_size_aniso) +{ + run_test (_this, "87", true); +} + +TEST(88_deep_with_mag_cop_size) +{ + run_test (_this, "88", true); +} + +TEST(89_deep_with_mag_cop_size_aniso) +{ + run_test (_this, "89", true); +} + diff --git a/testdata/algo/deep_region_au15b.gds b/testdata/algo/deep_region_au15b.gds index da172280c..5c6489bb1 100644 Binary files a/testdata/algo/deep_region_au15b.gds and b/testdata/algo/deep_region_au15b.gds differ diff --git a/testdata/algo/deep_region_au21.gds b/testdata/algo/deep_region_au21.gds index 127919c7a..44396f32e 100644 Binary files a/testdata/algo/deep_region_au21.gds and b/testdata/algo/deep_region_au21.gds differ diff --git a/testdata/drc/drcGenericTests_6.drc b/testdata/drc/drcGenericTests_6.drc index 34eeb7d0c..4b49eab6d 100644 --- a/testdata/drc/drcGenericTests_6.drc +++ b/testdata/drc/drcGenericTests_6.drc @@ -28,5 +28,5 @@ l1.drc(middle).output(110, 0) l1.drc(middle(as_dots)).output(111, 0) l1.drc(middle(as_boxes)).output(112, 0) l1.drc(extent_refs(0.0, 0.0, 0.25, 0.5, as_edges)).output(113, 0) -l1.drc(extent_refs(0.0, 0.0, 0.25, 0.5, 0.5, 1.0, as_boxes)).output(114, 0) +l1.drc(extent_refs(0.0, 0.0, 0.25, 0.5, as_boxes)).output(114, 0) diff --git a/testdata/drc/drcGenericTests_au12d.gds b/testdata/drc/drcGenericTests_au12d.gds index 9a0de1bf2..b4412a56e 100644 Binary files a/testdata/drc/drcGenericTests_au12d.gds and b/testdata/drc/drcGenericTests_au12d.gds differ diff --git a/testdata/drc/drcGenericTests_au14d.gds b/testdata/drc/drcGenericTests_au14d.gds index 1b0f1b8ed..82510fd53 100644 Binary files a/testdata/drc/drcGenericTests_au14d.gds and b/testdata/drc/drcGenericTests_au14d.gds differ diff --git a/testdata/drc/drcGenericTests_au6d.gds b/testdata/drc/drcGenericTests_au6d.gds index 8bf276f1d..de48275c7 100644 Binary files a/testdata/drc/drcGenericTests_au6d.gds and b/testdata/drc/drcGenericTests_au6d.gds differ diff --git a/testdata/drc/drcSimpleTests_80.drc b/testdata/drc/drcSimpleTests_80.drc new file mode 100644 index 000000000..9946545a8 --- /dev/null +++ b/testdata/drc/drcSimpleTests_80.drc @@ -0,0 +1,14 @@ + +source $drc_test_source +target $drc_test_target + +deep + +l1 = input(1, 0) + +l1.output(1, 0) + +l1.width(0.4).output(100, 0) +l1.width(0.9).output(101, 0) +l1.width(1.1).output(102, 0) + diff --git a/testdata/drc/drcSimpleTests_80.gds b/testdata/drc/drcSimpleTests_80.gds new file mode 100644 index 000000000..e75eba2b2 Binary files /dev/null and b/testdata/drc/drcSimpleTests_80.gds differ diff --git a/testdata/drc/drcSimpleTests_81.drc b/testdata/drc/drcSimpleTests_81.drc new file mode 100644 index 000000000..a8e887744 --- /dev/null +++ b/testdata/drc/drcSimpleTests_81.drc @@ -0,0 +1,14 @@ + +source $drc_test_source +target $drc_test_target + +deep + +l1 = input(1, 0) + +l1.output(1, 0) + +l1.space(0.4, projection).output(100, 0) +l1.space(0.9, projection).output(101, 0) +l1.space(1.1, projection).output(102, 0) + diff --git a/testdata/drc/drcSimpleTests_81.gds b/testdata/drc/drcSimpleTests_81.gds new file mode 100644 index 000000000..e75eba2b2 Binary files /dev/null and b/testdata/drc/drcSimpleTests_81.gds differ diff --git a/testdata/drc/drcSimpleTests_82.drc b/testdata/drc/drcSimpleTests_82.drc new file mode 100644 index 000000000..7ef6bbfc1 --- /dev/null +++ b/testdata/drc/drcSimpleTests_82.drc @@ -0,0 +1,14 @@ + +source $drc_test_source +target $drc_test_target + +deep + +l1 = input(1, 0) + +l1.output(1, 0) + +l1.drc(width < 0.4).output(100, 0) +l1.drc(width < 0.9).output(101, 0) +l1.drc(width < 1.1).output(102, 0) + diff --git a/testdata/drc/drcSimpleTests_82.gds b/testdata/drc/drcSimpleTests_82.gds new file mode 100644 index 000000000..e75eba2b2 Binary files /dev/null and b/testdata/drc/drcSimpleTests_82.gds differ diff --git a/testdata/drc/drcSimpleTests_83.drc b/testdata/drc/drcSimpleTests_83.drc new file mode 100644 index 000000000..a7cd252ed --- /dev/null +++ b/testdata/drc/drcSimpleTests_83.drc @@ -0,0 +1,14 @@ + +source $drc_test_source +target $drc_test_target + +deep + +l1 = input(1, 0) + +l1.output(1, 0) + +l1.drc(space(projection) < 0.4).output(100, 0) +l1.drc(space(projection) < 0.9).output(101, 0) +l1.drc(space(projection) < 1.1).output(102, 0) + diff --git a/testdata/drc/drcSimpleTests_83.gds b/testdata/drc/drcSimpleTests_83.gds new file mode 100644 index 000000000..e75eba2b2 Binary files /dev/null and b/testdata/drc/drcSimpleTests_83.gds differ diff --git a/testdata/drc/drcSimpleTests_84.drc b/testdata/drc/drcSimpleTests_84.drc new file mode 100644 index 000000000..09b92ff10 --- /dev/null +++ b/testdata/drc/drcSimpleTests_84.drc @@ -0,0 +1,14 @@ + +source $drc_test_source +target $drc_test_target + +deep + +l1 = input(1, 0) + +l1.output(1, 0) + +l1.edges.width(0.4, projection).output(100, 0) +l1.edges.width(0.9, projection).output(101, 0) +l1.edges.width(1.1, projection).output(102, 0) + diff --git a/testdata/drc/drcSimpleTests_84.gds b/testdata/drc/drcSimpleTests_84.gds new file mode 100644 index 000000000..e75eba2b2 Binary files /dev/null and b/testdata/drc/drcSimpleTests_84.gds differ diff --git a/testdata/drc/drcSimpleTests_85.drc b/testdata/drc/drcSimpleTests_85.drc new file mode 100644 index 000000000..3e687fd35 --- /dev/null +++ b/testdata/drc/drcSimpleTests_85.drc @@ -0,0 +1,14 @@ + +source $drc_test_source +target $drc_test_target + +deep + +l1 = input(1, 0) + +l1.output(1, 0) + +l1.edges.space(0.4, projection).output(100, 0) +l1.edges.space(0.9, projection).output(101, 0) +l1.edges.space(1.1, projection).output(102, 0) + diff --git a/testdata/drc/drcSimpleTests_85.gds b/testdata/drc/drcSimpleTests_85.gds new file mode 100644 index 000000000..e75eba2b2 Binary files /dev/null and b/testdata/drc/drcSimpleTests_85.gds differ diff --git a/testdata/drc/drcSimpleTests_86.drc b/testdata/drc/drcSimpleTests_86.drc new file mode 100644 index 000000000..bbd8c275c --- /dev/null +++ b/testdata/drc/drcSimpleTests_86.drc @@ -0,0 +1,13 @@ + +source $drc_test_source +target $drc_test_target + +deep + +l1 = input(1, 0) + +l1.output(1, 0) + +l1.sized(0.2).output(100, 0) +l1.sized(-0.2).output(101, 0) + diff --git a/testdata/drc/drcSimpleTests_86.gds b/testdata/drc/drcSimpleTests_86.gds new file mode 100644 index 000000000..e75eba2b2 Binary files /dev/null and b/testdata/drc/drcSimpleTests_86.gds differ diff --git a/testdata/drc/drcSimpleTests_87.drc b/testdata/drc/drcSimpleTests_87.drc new file mode 100644 index 000000000..b62b98fc5 --- /dev/null +++ b/testdata/drc/drcSimpleTests_87.drc @@ -0,0 +1,15 @@ + +source $drc_test_source +target $drc_test_target + +deep + +l1 = input(1, 0) + +l1.output(1, 0) + +l1.sized(0.2, 0.0).output(100, 0) +l1.sized(0.0, 0.2).output(101, 0) +l1.sized(-0.2, 0.0).output(102, 0) +l1.sized(0.0, -0.2).output(103, 0) + diff --git a/testdata/drc/drcSimpleTests_87.gds b/testdata/drc/drcSimpleTests_87.gds new file mode 100644 index 000000000..e75eba2b2 Binary files /dev/null and b/testdata/drc/drcSimpleTests_87.gds differ diff --git a/testdata/drc/drcSimpleTests_88.drc b/testdata/drc/drcSimpleTests_88.drc new file mode 100644 index 000000000..3511ba220 --- /dev/null +++ b/testdata/drc/drcSimpleTests_88.drc @@ -0,0 +1,13 @@ + +source $drc_test_source +target $drc_test_target + +deep + +l1 = input(1, 0) + +l1.output(1, 0) + +l1.drc(sized(0.2)).output(100, 0) +l1.drc(sized(-0.2)).output(101, 0) + diff --git a/testdata/drc/drcSimpleTests_88.gds b/testdata/drc/drcSimpleTests_88.gds new file mode 100644 index 000000000..e75eba2b2 Binary files /dev/null and b/testdata/drc/drcSimpleTests_88.gds differ diff --git a/testdata/drc/drcSimpleTests_89.drc b/testdata/drc/drcSimpleTests_89.drc new file mode 100644 index 000000000..88bfc5616 --- /dev/null +++ b/testdata/drc/drcSimpleTests_89.drc @@ -0,0 +1,15 @@ + +source $drc_test_source +target $drc_test_target + +deep + +l1 = input(1, 0) + +l1.output(1, 0) + +l1.drc(sized(0.2, 0.0)).output(100, 0) +l1.drc(sized(0.0, 0.2)).output(101, 0) +l1.drc(sized(-0.2, 0.0)).output(102, 0) +l1.drc(sized(0.0, -0.2)).output(103, 0) + diff --git a/testdata/drc/drcSimpleTests_89.gds b/testdata/drc/drcSimpleTests_89.gds new file mode 100644 index 000000000..e75eba2b2 Binary files /dev/null and b/testdata/drc/drcSimpleTests_89.gds differ diff --git a/testdata/drc/drcSimpleTests_au26d.gds b/testdata/drc/drcSimpleTests_au26d.gds index 5e03be23d..d81c49afd 100644 Binary files a/testdata/drc/drcSimpleTests_au26d.gds and b/testdata/drc/drcSimpleTests_au26d.gds differ diff --git a/testdata/drc/drcSimpleTests_au80d.gds b/testdata/drc/drcSimpleTests_au80d.gds new file mode 100644 index 000000000..ab0ede5cf Binary files /dev/null and b/testdata/drc/drcSimpleTests_au80d.gds differ diff --git a/testdata/drc/drcSimpleTests_au81d.gds b/testdata/drc/drcSimpleTests_au81d.gds new file mode 100644 index 000000000..f77e37607 Binary files /dev/null and b/testdata/drc/drcSimpleTests_au81d.gds differ diff --git a/testdata/drc/drcSimpleTests_au82d.gds b/testdata/drc/drcSimpleTests_au82d.gds new file mode 100644 index 000000000..9dafc2419 Binary files /dev/null and b/testdata/drc/drcSimpleTests_au82d.gds differ diff --git a/testdata/drc/drcSimpleTests_au83d.gds b/testdata/drc/drcSimpleTests_au83d.gds new file mode 100644 index 000000000..e08d1822f Binary files /dev/null and b/testdata/drc/drcSimpleTests_au83d.gds differ diff --git a/testdata/drc/drcSimpleTests_au84d.gds b/testdata/drc/drcSimpleTests_au84d.gds new file mode 100644 index 000000000..2e953ee33 Binary files /dev/null and b/testdata/drc/drcSimpleTests_au84d.gds differ diff --git a/testdata/drc/drcSimpleTests_au85d.gds b/testdata/drc/drcSimpleTests_au85d.gds new file mode 100644 index 000000000..a2017414e Binary files /dev/null and b/testdata/drc/drcSimpleTests_au85d.gds differ diff --git a/testdata/drc/drcSimpleTests_au86d.gds b/testdata/drc/drcSimpleTests_au86d.gds new file mode 100644 index 000000000..57d031c71 Binary files /dev/null and b/testdata/drc/drcSimpleTests_au86d.gds differ diff --git a/testdata/drc/drcSimpleTests_au87d.gds b/testdata/drc/drcSimpleTests_au87d.gds new file mode 100644 index 000000000..7c21bafe5 Binary files /dev/null and b/testdata/drc/drcSimpleTests_au87d.gds differ diff --git a/testdata/drc/drcSimpleTests_au88d.gds b/testdata/drc/drcSimpleTests_au88d.gds new file mode 100644 index 000000000..dc6d85c8f Binary files /dev/null and b/testdata/drc/drcSimpleTests_au88d.gds differ diff --git a/testdata/drc/drcSimpleTests_au89d.gds b/testdata/drc/drcSimpleTests_au89d.gds new file mode 100644 index 000000000..30e6602d1 Binary files /dev/null and b/testdata/drc/drcSimpleTests_au89d.gds differ