Some more refactoring

This commit is contained in:
Matthias Koefferlein 2023-11-19 00:14:46 +01:00
parent c2df163b8a
commit 86c1e6ad2b
14 changed files with 115 additions and 210 deletions

View File

@ -220,22 +220,23 @@ VariantsCollectorBase::VariantsCollectorBase ()
}
VariantsCollectorBase::VariantsCollectorBase (const TransformationReducer *red)
: mp_red (red)
: mp_red (red), mp_layout (0)
{
// .. nothing yet ..
}
void
VariantsCollectorBase::collect (const db::Layout &layout, const db::Cell &top_cell)
VariantsCollectorBase::collect (Layout *layout, db::cell_index_type initial_cell)
{
tl_assert (mp_red != 0);
mp_layout = layout;
m_called.clear ();
m_called.insert (top_cell.cell_index ());
m_called.insert (initial_cell);
top_cell.collect_called_cells (m_called);
layout->cell (initial_cell).collect_called_cells (m_called);
for (db::Layout::top_down_const_iterator c = layout.begin_top_down (); c != layout.end_top_down (); ++c) {
for (db::Layout::top_down_const_iterator c = layout->begin_top_down (); c != layout->end_top_down (); ++c) {
if (m_called.find (*c) == m_called.end ()) {
continue;
@ -244,7 +245,7 @@ VariantsCollectorBase::collect (const db::Layout &layout, const db::Cell &top_ce
// collect the parent variants per parent cell
std::map<db::cell_index_type, std::set<db::ICplxTrans> > variants_per_parent_cell;
for (db::Cell::parent_inst_iterator pi = layout.cell (*c).begin_parent_insts (); ! pi.at_end (); ++pi) {
for (db::Cell::parent_inst_iterator pi = layout->cell (*c).begin_parent_insts (); ! pi.at_end (); ++pi) {
std::set<db::ICplxTrans> &variants = variants_per_parent_cell [pi->inst ().object ().cell_index ()];
add_variant (variants, pi->child_inst ().cell_inst (), mp_red->is_translation_invariant ());
}
@ -275,15 +276,11 @@ VariantsCollectorBase::collect (const db::Layout &layout, const db::Cell &top_ce
}
void
VariantsCollectorBase::separate_variants (db::Layout &layout, db::Cell &top_cell, std::map<db::cell_index_type, std::map<db::ICplxTrans, db::cell_index_type> > *var_table)
VariantsCollectorBase::separate_variants (std::map<db::cell_index_type, std::map<db::ICplxTrans, db::cell_index_type> > *var_table)
{
tl_assert (mp_red != 0);
db::LayoutLocker locker (&layout);
std::set<db::cell_index_type> called;
top_cell.collect_called_cells (called);
called.insert (top_cell.cell_index ());
db::LayoutLocker locker (mp_layout);
// create new cells for the variants
@ -292,13 +289,13 @@ VariantsCollectorBase::separate_variants (db::Layout &layout, db::Cell &top_cell
var_table = &var_table_intern;
}
for (db::Layout::bottom_up_const_iterator c = layout.begin_bottom_up (); c != layout.end_bottom_up (); ++c) {
for (db::Layout::bottom_up_const_iterator c = mp_layout->begin_bottom_up (); c != mp_layout->end_bottom_up (); ++c) {
if (called.find (*c) == called.end ()) {
if (m_called.find (*c) == m_called.end ()) {
continue;
}
db::Cell &cell = layout.cell (*c);
db::Cell &cell = mp_layout->cell (*c);
auto vc = m_variants.find (*c);
if (vc != m_variants.end () && vc->second.size () > 1) {
@ -321,13 +318,13 @@ VariantsCollectorBase::separate_variants (db::Layout &layout, db::Cell &top_cell
if (v != vc->second.begin ()) {
std::string var_name = layout.cell_name (*c);
std::string var_name = mp_layout->cell_name (*c);
var_name += "$VAR" + tl::to_string (index);
ci_var = layout.add_cell (var_name.c_str ());
ci_var = mp_layout->add_cell (var_name.c_str ());
m_called.insert (ci_var);
layout.add_meta_info (ci_var, layout.begin_meta (*c), layout.end_meta (*c));
copy_shapes (layout, ci_var, *c);
mp_layout->add_meta_info (ci_var, mp_layout->begin_meta (*c), mp_layout->end_meta (*c));
copy_shapes (*mp_layout, ci_var, *c);
// a new entry for the variant
if (! v->is_unity ()) {
@ -339,7 +336,7 @@ VariantsCollectorBase::separate_variants (db::Layout &layout, db::Cell &top_cell
}
vt.insert (std::make_pair (*v, ci_var));
create_var_instances (layout.cell (ci_var), inst, *v, *var_table, mp_red->is_translation_invariant ());
create_var_instances (mp_layout->cell (ci_var), inst, *v, *var_table, mp_red->is_translation_invariant ());
}
@ -384,10 +381,12 @@ VariantsCollectorBase::separate_variants (db::Layout &layout, db::Cell &top_cell
}
}
mp_layout->variants_created_event (var_table);
}
void
VariantsCollectorBase::commit_shapes (db::Layout &layout, db::Cell &top_cell, unsigned int layer, std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > &to_commit)
VariantsCollectorBase::commit_shapes (unsigned int layer, std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > &to_commit)
{
tl_assert (mp_red != 0);
@ -398,19 +397,15 @@ VariantsCollectorBase::commit_shapes (db::Layout &layout, db::Cell &top_cell, un
// NOTE: this implementation suffers from accumulation of propagated shapes: we add more levels of propagated
// shapes if required. We don't clean up, because we do not know when a shape collection stops being required.
db::LayoutLocker locker (&layout);
db::LayoutLocker locker (mp_layout);
std::set<db::cell_index_type> called;
top_cell.collect_called_cells (called);
called.insert (top_cell.cell_index ());
for (db::Layout::bottom_up_const_iterator c = mp_layout->begin_bottom_up (); c != mp_layout->end_bottom_up (); ++c) {
for (db::Layout::bottom_up_const_iterator c = layout.begin_bottom_up (); c != layout.end_bottom_up (); ++c) {
if (called.find (*c) == called.end ()) {
if (m_called.find (*c) == m_called.end ()) {
continue;
}
db::Cell &cell = layout.cell (*c);
db::Cell &cell = mp_layout->cell (*c);
auto vvc = m_variants.find (*c);
if (vvc != m_variants.end () && vvc->second.size () > 1) {
@ -722,17 +717,17 @@ VariantStatistics::VariantStatistics (const TransformationReducer *red)
}
void
VariantStatistics::collect (const db::Layout &layout, const db::Cell &top_cell)
VariantStatistics::collect (const db::Layout *layout, db::cell_index_type initial_cell)
{
tl_assert (mp_red != 0);
// The top cell gets a "variant" with unit transformation
m_variants [top_cell.cell_index ()].insert (std::make_pair (db::ICplxTrans (), 1));
m_variants [initial_cell].insert (std::make_pair (db::ICplxTrans (), 1));
std::set<db::cell_index_type> called;
top_cell.collect_called_cells (called);
layout->cell (initial_cell).collect_called_cells (called);
for (db::Layout::top_down_const_iterator c = layout.begin_top_down (); c != layout.end_top_down (); ++c) {
for (db::Layout::top_down_const_iterator c = layout->begin_top_down (); c != layout->end_top_down (); ++c) {
if (called.find (*c) == called.end ()) {
continue;
@ -741,7 +736,7 @@ VariantStatistics::collect (const db::Layout &layout, const db::Cell &top_cell)
// collect the parent variants per parent cell
std::map<db::cell_index_type, std::map<db::ICplxTrans, size_t> > variants_per_parent_cell;
for (db::Cell::parent_inst_iterator pi = layout.cell (*c).begin_parent_insts (); ! pi.at_end (); ++pi) {
for (db::Cell::parent_inst_iterator pi = layout->cell (*c).begin_parent_insts (); ! pi.at_end (); ++pi) {
std::map<db::ICplxTrans, size_t> &variants = variants_per_parent_cell [pi->inst ().object ().cell_index ()];
add_variant (variants, pi->child_inst ().cell_inst (), mp_red->is_translation_invariant ());
}

View File

@ -188,7 +188,7 @@ public:
/**
* @brief Collects cell variants for the given layout starting from the top cell
*/
void collect (const db::Layout &layout, const db::Cell &top_cell);
void collect (Layout *layout, cell_index_type initial_cell);
/**
* @brief Creates cell variants for singularization of the different variants
@ -199,7 +199,7 @@ public:
* If given, *var_table will be filled with a map giving the new cell and variant against
* the old cell for all cells with more than one variant.
*/
void separate_variants (db::Layout &layout, db::Cell &top_cell, std::map<db::cell_index_type, std::map<db::ICplxTrans, db::cell_index_type> > *var_table = 0);
void separate_variants (std::map<db::cell_index_type, std::map<db::ICplxTrans, db::cell_index_type> > *var_table = 0);
/**
* @brief Commits the shapes for different variants to the current cell hierarchy
@ -208,7 +208,7 @@ public:
* "to_commit" initially is a set of shapes to commit for the given cell and variant.
* This map is modified during the algorithm and should be discarded later.
*/
void commit_shapes (db::Layout &layout, db::Cell &top_cell, unsigned int layer, std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > &to_commit);
void commit_shapes (unsigned int layer, std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > &to_commit);
/**
* @brief Gets the variants for a given cell
@ -240,6 +240,7 @@ private:
std::map<db::cell_index_type, std::set<db::ICplxTrans> > m_variants;
std::set<db::cell_index_type> m_called;
const TransformationReducer *mp_red;
db::Layout *mp_layout;
void add_variant (std::set<ICplxTrans> &variants, const db::CellInstArray &inst, bool tl_invariant) const;
void add_variant_non_tl_invariant (std::set<db::ICplxTrans> &variants, const db::CellInstArray &inst) const;
@ -304,7 +305,8 @@ public:
/**
* @brief Collects cell variants for the given layout starting from the top cell
*/
void collect (const db::Layout &layout, const db::Cell &top_cell);
void collect (const db::Layout *layout, db::cell_index_type initial_cell);
/**
* @brief Gets the variants for a given cell
*

View File

@ -386,21 +386,21 @@ DeepEdgePairs *
DeepEdgePairs::apply_filter (const EdgePairFilterBase &filter) const
{
const db::DeepLayer &edge_pairs = deep_layer ();
db::Layout &layout = const_cast<db::Layout &> (edge_pairs.layout ());
std::unique_ptr<VariantsCollectorBase> 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<db::DeepLayer &> (edge_pairs).separate_variants (*vars);
vars->separate_variants ();
}
}
db::Layout &layout = const_cast<db::Layout &> (edge_pairs.layout ());
std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > to_commit;
std::unique_ptr<db::DeepEdgePairs> res (new db::DeepEdgePairs (edge_pairs.derived ()));
@ -445,7 +445,7 @@ DeepEdgePairs::apply_filter (const EdgePairFilterBase &filter) const
}
if (! to_commit.empty () && vars.get ()) {
res->deep_layer ().commit_shapes (*vars, to_commit);
vars->commit_shapes (res->deep_layer ().layer (), to_commit);
}
return res.release ();

View File

@ -244,15 +244,16 @@ static void transform_deep_layer (db::DeepLayer &deep_layer, const Trans &t)
// Plain move
db::Layout &layout = deep_layer.layout ();
// build cell variants for different orientations
db::OrientationReducer same_orientation;
db::VariantsCollectorBase vars (&same_orientation);
vars.collect (deep_layer.layout (), deep_layer.initial_cell ());
deep_layer.separate_variants (vars);
vars.collect (&layout, deep_layer.initial_cell ().cell_index ());
vars.separate_variants ();
// process the variants
db::Layout &layout = deep_layer.layout ();
for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) {
@ -738,7 +739,7 @@ DeepEdges::length_type DeepEdges::length (const db::Box &box) const
db::MagnificationReducer red;
db::cell_variants_statistics<db::MagnificationReducer> vars (red);
vars.collect (edges.layout (), edges.initial_cell ());
vars.collect (&edges.layout (), edges.initial_cell ().cell_index ());
DeepEdges::length_type l = 0;
@ -810,21 +811,21 @@ DeepEdges *
DeepEdges::apply_filter (const EdgeFilterBase &filter) const
{
const db::DeepLayer &edges = filter.requires_raw_input () ? deep_layer () : merged_deep_layer ();
db::Layout &layout = const_cast<db::Layout &> (edges.layout ());
std::unique_ptr<VariantsCollectorBase> 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<db::DeepLayer &> (edges).separate_variants (*vars);
vars->separate_variants ();
}
}
db::Layout &layout = const_cast<db::Layout &> (edges.layout ());
std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > to_commit;
std::unique_ptr<db::DeepEdges> res (new db::DeepEdges (edges.derived ()));
@ -867,7 +868,7 @@ DeepEdges::apply_filter (const EdgeFilterBase &filter) const
}
if (! to_commit.empty () && vars.get ()) {
res->deep_layer ().commit_shapes (*vars, to_commit);
vars->commit_shapes (res->deep_layer ().layer (), to_commit);
}
if (! filter.requires_raw_input ()) {
@ -1258,7 +1259,7 @@ RegionDelegate *DeepEdges::extended (coord_type ext_b, coord_type ext_e, coord_t
// dots formally don't have an orientation, hence the interpretation is x and y.
db::MagnificationReducer red;
db::cell_variants_collector<db::MagnificationReducer> vars (red);
vars.collect (edges.layout (), edges.initial_cell ());
vars.collect (&layout, edges.initial_cell ().cell_index ());
std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > to_commit;
@ -1337,7 +1338,7 @@ RegionDelegate *DeepEdges::extended (coord_type ext_b, coord_type ext_e, coord_t
}
// propagate results from variants
vars.commit_shapes (layout, top_cell, res->deep_layer ().layer (), to_commit);
vars.commit_shapes (res->deep_layer ().layer (), to_commit);
return res.release ();
}

View File

@ -256,8 +256,8 @@ static void transform_deep_layer (db::DeepLayer &deep_layer, const Trans &t)
db::MagnificationAndOrientationReducer same_orientation;
db::VariantsCollectorBase vars (&same_orientation);
vars.collect (deep_layer.layout (), deep_layer.initial_cell ());
deep_layer.separate_variants (vars);
vars.collect (&deep_layer.layout (), deep_layer.initial_cell ().cell_index ());
vars.separate_variants ();
// process the variants
db::Layout &layout = deep_layer.layout ();
@ -1110,7 +1110,7 @@ DeepRegion::area (const db::Box &box) const
const db::DeepLayer &polygons = merged_deep_layer ();
db::cell_variants_statistics<db::MagnificationReducer> vars;
vars.collect (polygons.layout (), polygons.initial_cell ());
vars.collect (&polygons.layout (), polygons.initial_cell ().cell_index ());
DeepRegion::area_type a = 0;
@ -1147,7 +1147,7 @@ DeepRegion::perimeter (const db::Box &box) const
const db::DeepLayer &polygons = merged_deep_layer ();
db::cell_variants_statistics<db::MagnificationReducer> vars;
vars.collect (polygons.layout (), polygons.initial_cell ());
vars.collect (&polygons.layout (), polygons.initial_cell ().cell_index ());
DeepRegion::perimeter_type p = 0;
@ -1208,7 +1208,7 @@ DeepRegion::grid_check (db::Coord gx, db::Coord gy) const
db::Layout &layout = const_cast<db::Layout &> (polygons.layout ());
db::cell_variants_collector<db::GridReducer> vars (gx);
vars.collect (layout, polygons.initial_cell ());
vars.collect (&layout, polygons.initial_cell ().cell_index ());
std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > to_commit;
std::unique_ptr<db::DeepEdgePairs> res (new db::DeepEdgePairs (polygons.derived ()));
@ -1241,7 +1241,7 @@ DeepRegion::grid_check (db::Coord gx, db::Coord gy) const
}
// propagate the markers with a similar algorithm used for producing the variants
res->deep_layer ().commit_shapes (vars, to_commit);
vars.commit_shapes (res->deep_layer ().layer (), to_commit);
return res.release ();
}
@ -1295,15 +1295,13 @@ DeepRegion::snapped (db::Coord gx, db::Coord gy)
}
const db::DeepLayer &polygons = merged_deep_layer ();
db::Layout &layout = const_cast<db::Layout &> (polygons.layout ());
db::cell_variants_collector<db::GridReducer> 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<db::DeepLayer &> (polygons).separate_variants (vars);
db::Layout &layout = const_cast<db::Layout &> (polygons.layout ());
std::vector<db::Point> heap;
std::unique_ptr<db::DeepRegion> res (new db::DeepRegion (polygons.derived ()));
@ -1363,20 +1361,17 @@ DeepRegion::edges (const EdgeFilterBase *filter) const
db::PropertyMapper pm (res->properties_repository (), &polygons.layout ().properties_repository ());
std::unique_ptr<VariantsCollectorBase> vars;
db::Layout &layout = const_cast<db::Layout &> (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<db::DeepLayer &> (polygons).separate_variants (*vars);
vars->collect (&layout, polygons.initial_cell ().cell_index ());
vars->separate_variants ();
}
db::Layout &layout = const_cast<db::Layout &> (polygons.layout ());
for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) {
db::ICplxTrans tr;
@ -1476,21 +1471,21 @@ DeepRegion *
DeepRegion::apply_filter (const PolygonFilterBase &filter) const
{
const db::DeepLayer &polygons = filter.requires_raw_input () ? deep_layer () : merged_deep_layer ();
db::Layout &layout = const_cast<db::Layout &> (polygons.layout ());
std::unique_ptr<VariantsCollectorBase> 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<db::DeepLayer &> (polygons).separate_variants (*vars);
vars->separate_variants ();
}
}
db::Layout &layout = const_cast<db::Layout &> (polygons.layout ());
std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > to_commit;
std::unique_ptr<db::DeepRegion> res (new db::DeepRegion (polygons.derived ()));
@ -1537,7 +1532,7 @@ DeepRegion::apply_filter (const PolygonFilterBase &filter) const
}
if (! to_commit.empty () && vars.get ()) {
res->deep_layer ().commit_shapes (*vars, to_commit);
vars->commit_shapes (res->deep_layer ().layer (), to_commit);
}
if (! filter.requires_raw_input ()) {
@ -1647,10 +1642,8 @@ DeepRegion::sized (coord_type d, unsigned int mode) const
db::Layout &layout = const_cast<db::Layout &> (polygons.layout ());
db::cell_variants_collector<db::MagnificationReducer> vars;
vars.collect (polygons.layout (), polygons.initial_cell ());
// NOTE: m_merged_polygons is mutable, so why is the const_cast needed?
const_cast<db::DeepLayer &> (polygons).separate_variants (vars);
vars.collect (&layout, polygons.initial_cell ().cell_index ());
vars.separate_variants ();
std::unique_ptr<db::DeepRegion> res (new db::DeepRegion (polygons.derived ()));
for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) {
@ -1702,10 +1695,8 @@ DeepRegion::sized (coord_type dx, coord_type dy, unsigned int mode) const
db::Layout &layout = const_cast<db::Layout &> (polygons.layout ());
db::cell_variants_collector<db::XYAnisotropyAndMagnificationReducer> vars;
vars.collect (polygons.layout (), polygons.initial_cell ());
// NOTE: m_merged_polygons is mutable, so why is the const_cast needed?
const_cast<db::DeepLayer &> (polygons).separate_variants (vars);
vars.collect (&layout, polygons.initial_cell ().cell_index ());
vars.separate_variants ();
std::unique_ptr<db::DeepRegion> res (new db::DeepRegion (polygons.derived ()));
for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) {
@ -1998,14 +1989,11 @@ DeepRegion::run_single_polygon_check (db::edge_relation_type rel, db::Coord d, c
}
const db::DeepLayer &polygons = merged_deep_layer ();
db::Layout &layout = const_cast<db::Layout &> (polygons.layout ());
db::cell_variants_collector<db::MagnificationReducer> vars;
vars.collect (polygons.layout (), polygons.initial_cell ());
// NOTE: m_merged_polygons is mutable, so why is the const_cast needed?
const_cast<db::DeepLayer &> (polygons).separate_variants (vars);
db::Layout &layout = const_cast<db::Layout &> (polygons.layout ());
vars.collect (&layout, polygons.initial_cell ().cell_index ());
vars.separate_variants ();
std::unique_ptr<db::DeepEdgePairs> res (new db::DeepEdgePairs (polygons.derived ()));
for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) {

View File

@ -1283,13 +1283,6 @@ namespace
};
}
void
DeepShapeStore::separate_variants (unsigned int layout_index, db::VariantsCollectorBase &coll)
{
tl_assert (is_valid_layout_index (layout_index));
layout (layout_index).separate_variants (coll, initial_cell (layout_index).cell_index ());
}
void
DeepShapeStore::insert (const DeepLayer &deep_layer, db::Layout *into_layout, db::cell_index_type into_cell, unsigned int into_layer)
{

View File

@ -193,25 +193,6 @@ public:
*/
void add_from (const DeepLayer &dl);
/**
* @brief Separates cell variants (see DeepShapeStore::separate_variants)
*/
template <class VarCollector>
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 <class VarCollector>
void commit_shapes (VarCollector &collector, std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > &to_propagate);
/**
* @brief Gets the shape store object
* This is a pure const version to prevent manipulation of the store.
@ -556,29 +537,6 @@ public:
*/
const db::CellMapping &internal_cell_mapping (unsigned int from_layout_index, unsigned int into_layout_index);
/**
* @brief Create cell variants from the given variant collector
*
* To use this method, first create a variant collector (db::cell_variant_collector) with the required
* reducer and collect the variants. Then call this method on the desired layout index to create the variants.
*/
void separate_variants (unsigned int layout_index, db::VariantsCollectorBase &coll);
/**
* @brief Commits shapes for variants to the existing cell hierarchy
*
* To use this method, first create a variant collector (db::cell_variant_collector) with the required
* reducer and collect the variants. Then call this method on the desired layout index to commit the shapes for the
* respective variants.
*/
template <class VarCollector>
void commit_shapes (unsigned int layout_index, VarCollector &coll, unsigned int layer, std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > &to_commit)
{
tl_assert (is_valid_layout_index (layout_index));
coll.commit_shapes (layout (layout_index), initial_cell (layout_index), layer, to_commit);
}
/**
* @brief For testing
*/
@ -916,20 +874,6 @@ private:
std::map<std::pair<unsigned int, unsigned int>, CellMappingWithGenerationIds> m_internal_mapping_cache;
};
template <class VarCollector>
void DeepLayer::separate_variants (VarCollector &collector)
{
check_dss ();
mp_store->separate_variants (m_layout, collector);
}
template <class VarCollector>
void DeepLayer::commit_shapes (VarCollector &collector, std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > &to_commit)
{
check_dss ();
mp_store->commit_shapes (m_layout, collector, layer (), to_commit);
}
}
#endif

View File

@ -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<db::Layout &> (texts.layout ());
std::unique_ptr<VariantsCollectorBase> 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<db::DeepLayer &> (texts).separate_variants (*vars);
vars->separate_variants ();
}
}
db::Layout &layout = const_cast<db::Layout &> (texts.layout ());
std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > to_commit;
std::unique_ptr<db::DeepTexts> res (new db::DeepTexts (texts.derived ()));
@ -468,7 +468,7 @@ DeepTexts *DeepTexts::apply_filter (const TextFilterBase &filter) const
}
if (! to_commit.empty () && vars.get ()) {
res->deep_layer ().commit_shapes (*vars, to_commit);
vars->commit_shapes (res->deep_layer ().layer (), to_commit);
}
return res.release ();

View File

@ -1591,12 +1591,13 @@ void local_processor<TS, TI, TR>::run (local_operation<TS, TI, TR> *op, unsigned
db::VariantsCollectorBase *coll = new db::VariantsCollectorBase (op_vars);
set_vars_owned (coll);
coll->collect (*mp_subject_layout, *mp_subject_top);
mp_subject_layout->separate_variants (*coll, mp_subject_top->cell_index ());
coll->collect (mp_subject_layout, mp_subject_top->cell_index ());
coll->separate_variants ();
if (mp_intruder_layout != mp_subject_layout) {
db::VariantsCollectorBase vci (op_vars);
vci.collect (*mp_intruder_layout, *mp_intruder_top);
// NOTE: we don't plan to use separate_variants, so the const cast is in order
vci.collect (const_cast<db::Layout *> (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")));

View File

@ -1812,15 +1812,6 @@ Layout::do_update ()
delete pr;
}
void
Layout::separate_variants (db::VariantsCollectorBase &coll, cell_index_type initial_cell)
{
std::map<db::cell_index_type, std::map<db::ICplxTrans, db::cell_index_type> > var_table;
coll.separate_variants (*this, cell (initial_cell), &var_table);
variants_created_event (&var_table);
}
static Layout::meta_info_map s_empty_meta;
Layout::meta_info_iterator

View File

@ -1658,15 +1658,6 @@ public:
*/
void update () const;
/**
* @brief Separates cell variants as given by the cell variant collector
*
* The cell variant collector must have been setup with the desired variants
* using "collect". The new cell variants will be created and a "variants_created"
* event is issued.
*/
void separate_variants (db::VariantsCollectorBase &coll, cell_index_type initial_cell);
/**
* @brief Forces an update even if the layout is under construction
*

View File

@ -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<db::cell_index_type> called_cells;

View File

@ -169,21 +169,21 @@ DB_PUBLIC_TEMPLATE
OutputContainer *
shape_collection_processed_impl (const db::DeepLayer &input, const shape_collection_processor<Shape, Result> &filter)
{
db::Layout &layout = const_cast<db::Layout &> (input.layout ());
std::unique_ptr<VariantsCollectorBase> 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<db::DeepLayer &> (input).separate_variants (*vars);
vars->separate_variants ();
}
}
db::Layout &layout = const_cast<db::Layout &> (input.layout ());
std::vector<Result> heap;
std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > to_commit;
@ -256,7 +256,7 @@ shape_collection_processed_impl (const db::DeepLayer &input, const shape_collect
}
if (! to_commit.empty () && vars.get ()) {
res->deep_layer ().commit_shapes (*vars, to_commit);
vars->commit_shapes (res->deep_layer ().layer (), to_commit);
}
if (filter.result_is_merged ()) {

View File

@ -105,14 +105,14 @@ TEST(1_Trivial)
db::OrientationReducer red;
db::cell_variants_collector<db::OrientationReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0");
EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "");
EXPECT_EQ (var2str (vb.variants (d.cell_index ())), "");
std::map<db::cell_index_type, std::map<db::ICplxTrans, db::cell_index_type> > vm;
vb.separate_variants (ly, a, &vm);
vb.separate_variants (&vm);
EXPECT_EQ (vm.empty (), true);
EXPECT_EQ (vm2str (ly, vm), "");
}
@ -130,7 +130,7 @@ TEST(2_TwoVariants)
db::OrientationReducer red;
db::cell_variants_collector<db::OrientationReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "m0 *1 0,0;r0 *1 0,0");
EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "");
@ -139,7 +139,7 @@ TEST(2_TwoVariants)
EXPECT_EQ (inst2str (ly, a), "B:r0 *1 1,10;B:m0 *1 1,100");
std::map<db::cell_index_type, std::map<db::ICplxTrans, db::cell_index_type> > vm;
vb.separate_variants (ly, a, &vm);
vb.separate_variants (&vm);
EXPECT_EQ (vm2str (ly, vm), "B:B[m0 *1 0,0],B$VAR1[r0 *1 0,0]");
EXPECT_EQ (inst2str (ly, a), "B$VAR1:r0 *1 1,10;B:m0 *1 1,100");
}
@ -159,7 +159,7 @@ TEST(3_TwoLevels)
db::OrientationReducer red;
db::cell_variants_collector<db::OrientationReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0;r90 *1 0,0");
EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0;r0 *1 0,0;m45 *1 0,0;r90 *1 0,0");
@ -169,7 +169,7 @@ TEST(3_TwoLevels)
EXPECT_EQ (inst2str (ly, b), "C:r0 *1 2,10;C:m0 *1 2,100");
std::map<db::cell_index_type, std::map<db::ICplxTrans, db::cell_index_type> > vm;
vb.separate_variants (ly, a, &vm);
vb.separate_variants (&vm);
EXPECT_EQ (vm2str (ly, vm), "B:B[r0 *1 0,0],B$VAR1[r90 *1 0,0];C:C[m0 *1 0,0],C$VAR1[r0 *1 0,0],C$VAR2[m45 *1 0,0],C$VAR3[r90 *1 0,0]");
EXPECT_EQ (inst2str (ly, a), "B:r0 *1 1,10;B$VAR1:r90 *1 1,100");
@ -193,7 +193,7 @@ TEST(4_ThreeLevels)
db::OrientationReducer red;
db::cell_variants_collector<db::OrientationReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0;r90 *1 0,0");
EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0;r0 *1 0,0;m45 *1 0,0;r90 *1 0,0");
@ -204,7 +204,7 @@ TEST(4_ThreeLevels)
EXPECT_EQ (inst2str (ly, c), "D:m45 *1 0,0");
std::map<db::cell_index_type, std::map<db::ICplxTrans, db::cell_index_type> > vm;
vb.separate_variants (ly, a, &vm);
vb.separate_variants (&vm);
EXPECT_EQ (vm2str (ly, vm), "B:B[r0 *1 0,0],B$VAR1[r90 *1 0,0];C:C[m0 *1 0,0],C$VAR1[r0 *1 0,0],C$VAR2[m45 *1 0,0],C$VAR3[r90 *1 0,0];D:D[r270 *1 0,0],D$VAR1[m90 *1 0,0],D$VAR2[r0 *1 0,0],D$VAR3[m45 *1 0,0]");
EXPECT_EQ (inst2str (ly, a), "B:r0 *1 1,10;B$VAR1:r90 *1 1,100");
@ -231,7 +231,7 @@ TEST(5_ComplexTrans)
db::OrientationReducer red;
db::cell_variants_collector<db::OrientationReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0;r90 *1 0,0");
EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0;r0 *1 0,0;m45 *1 0,0;r90 *1 0,0");
@ -240,7 +240,6 @@ TEST(5_ComplexTrans)
TEST(6_Arrays)
{
db::Layout ly;
db::Cell &a = ly.cell (ly.add_cell ("A"));
db::Cell &b = ly.cell (ly.add_cell ("B"));
@ -254,7 +253,7 @@ TEST(6_Arrays)
db::OrientationReducer red;
db::cell_variants_collector<db::OrientationReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0;r90 *1 0,0");
EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0;r0 *1 0,0;m45 *1 0,0;r90 *1 0,0");
@ -276,7 +275,7 @@ TEST(7_ScalingVariants)
db::MagnificationReducer red;
db::cell_variants_collector<db::MagnificationReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0;r0 *1.5 0,0");
EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "r0 *1 0,0;r0 *1.5 0,0;r0 *2 0,0;r0 *3 0,0");
@ -296,7 +295,7 @@ TEST(8_GridVariants)
db::GridReducer red (10);
db::cell_variants_collector<db::GridReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 1,0;r0 *1 3,0;r0 *1 1,1;r0 *1 3,1");
@ -317,7 +316,7 @@ TEST(8_GridVariants)
EXPECT_EQ (inst2str (ly, c), "");
std::map<db::cell_index_type, std::map<db::ICplxTrans, db::cell_index_type> > vm;
vb.separate_variants (ly, a, &vm);
vb.separate_variants (&vm);
EXPECT_EQ (vm2str (ly, vm), "B:B[r0 *1 1,0],B$VAR1[r0 *1 3,0],B$VAR2[r0 *1 1,1],B$VAR3[r0 *1 3,1];C:C[r0 *1 -5,3],C$VAR1[r0 *1 3,3],C$VAR2[r0 *1 -5,4],C$VAR3[r0 *1 3,4]");
EXPECT_EQ (inst2str (ly, a), "B:r0 *1 1,10;B$VAR2:r0 *1 1,111;B$VAR1:r0 *1 103,10;B$VAR3:r0 *1 103,111");
@ -343,7 +342,7 @@ TEST(9_ComplexGridVariants)
db::GridReducer red (10);
db::cell_variants_collector<db::GridReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *2 1,0;r90 *1 1,0;r0 *2 3,0;r0 *2 1,1;r0 *2 3,1");
@ -398,8 +397,8 @@ TEST(100_OrientationVariantsWithLayout)
db::OrientationReducer red;
db::cell_variants_collector<db::OrientationReducer> vb (red);
vb.collect (ly, top_cell);
vb.separate_variants (ly, top_cell);
vb.collect (&ly, top_cell.cell_index ());
vb.separate_variants ();
CHECKPOINT();
db::compare_layouts (_this, ly, tl::testdata () + "/algo/cell_variants_au1.gds");
@ -417,7 +416,7 @@ TEST(10_TrivialStatistics)
db::OrientationReducer red;
db::cell_variants_statistics<db::OrientationReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0[1]");
EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "");
@ -437,7 +436,7 @@ TEST(11_TwoVariantsStatistics)
db::OrientationReducer red;
db::cell_variants_statistics<db::OrientationReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "m0 *1 0,0[1];r0 *1 0,0[1]");
EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "");
@ -461,7 +460,7 @@ TEST(12_TwoLevelsStatistics)
db::OrientationReducer red;
db::cell_variants_statistics<db::OrientationReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0[1];r90 *1 0,0[1]");
EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0[1];r0 *1 0,0[1];m45 *1 0,0[1];r90 *1 0,0[1]");
@ -487,7 +486,7 @@ TEST(13_ThreeLevelsStatistics)
db::OrientationReducer red;
db::cell_variants_statistics<db::OrientationReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0[1];r90 *1 0,0[1]");
EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0[1];r0 *1 0,0[1];m45 *1 0,0[1];r90 *1 0,0[1]");
@ -513,7 +512,7 @@ TEST(14_ComplexTransStatistics)
db::OrientationReducer red;
db::cell_variants_statistics<db::OrientationReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0[1];r90 *1 0,0[1]");
EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0[1];r0 *1 0,0[1];m45 *1 0,0[1];r90 *1 0,0[1]");
@ -536,7 +535,7 @@ TEST(15_ArraysStatistics)
db::OrientationReducer red;
db::cell_variants_statistics<db::OrientationReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0[100];r90 *1 0,0[1]");
EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "m0 *1 0,0[100];r0 *1 0,0[10000];m45 *1 0,0[1];r90 *1 0,0[100]");
@ -558,7 +557,7 @@ TEST(16_ScalingVariantsStatistics)
db::MagnificationReducer red;
db::cell_variants_statistics<db::MagnificationReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 0,0[1];r0 *1.5 0,0[100]");
EXPECT_EQ (var2str (vb.variants (c.cell_index ())), "r0 *1 0,0[1];r0 *1.5 0,0[100];r0 *2 0,0[100];r0 *3 0,0[10000]");
@ -578,7 +577,7 @@ TEST(17_GridVariantsStatistics)
db::GridReducer red (10);
db::cell_variants_statistics<db::GridReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *1 1,0[1];r0 *1 3,0[1];r0 *1 1,1[1];r0 *1 3,1[1]");
@ -614,7 +613,7 @@ TEST(18_ComplexGridVariantsStatistics)
db::GridReducer red (10);
db::cell_variants_statistics<db::GridReducer> vb (red);
vb.collect (ly, a);
vb.collect (&ly, a.cell_index ());
EXPECT_EQ (var2str (vb.variants (a.cell_index ())), "r0 *1 0,0[1]");
EXPECT_EQ (var2str (vb.variants (b.cell_index ())), "r0 *2 1,0[1];r90 *1 1,0[1];r0 *2 3,0[1];r0 *2 1,1[1];r0 *2 3,1[1]");
@ -673,7 +672,7 @@ TEST(101_Propagation)
unsigned int l2 = ly.insert_layer (db::LayerProperties (2, 0));
db::cell_variants_collector<db::MagnificationAndOrientationReducer> vb;
vb.collect (ly, top_cell);
vb.collect (&ly, top_cell.cell_index ());
for (db::Layout::const_iterator c = ly.begin (); c != ly.end (); ++c) {
@ -691,7 +690,7 @@ TEST(101_Propagation)
}
vb.commit_shapes (ly, top_cell, l2, to_commit);
vb.commit_shapes (l2, to_commit);
CHECKPOINT();
db::compare_layouts (_this, ly, tl::testdata () + "/algo/cell_variants_au2.gds");