mirror of https://github.com/KLayout/klayout.git
WIP
This commit is contained in:
parent
1b01d6e20a
commit
37334d40b9
|
|
@ -1298,6 +1298,16 @@ CompoundRegionProcessingOperationNode::processed (db::Layout *layout, const db::
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CompoundRegionProcessingOperationNode::processed (db::Layout *layout, const db::polygon_ref<db::Polygon, db::ICplxTrans> &p, std::vector<db::PolygonRef> &res) const
|
||||||
|
{
|
||||||
|
std::vector<db::Polygon> poly;
|
||||||
|
mp_proc->process (p.obj ().transformed (p.trans ()), poly);
|
||||||
|
for (std::vector<db::Polygon>::const_iterator p = poly.begin (); p != poly.end (); ++p) {
|
||||||
|
res.push_back (db::PolygonRef (*p, layout->shape_repository ()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
CompoundRegionToEdgeProcessingOperationNode::CompoundRegionToEdgeProcessingOperationNode (PolygonToEdgeProcessorBase *proc, CompoundRegionOperationNode *input, bool owns_proc)
|
CompoundRegionToEdgeProcessingOperationNode::CompoundRegionToEdgeProcessingOperationNode (PolygonToEdgeProcessorBase *proc, CompoundRegionOperationNode *input, bool owns_proc)
|
||||||
|
|
@ -1338,6 +1348,12 @@ CompoundRegionToEdgeProcessingOperationNode::processed (db::Layout *, const db::
|
||||||
mp_proc->process (p.obj ().transformed (p.trans ()), res);
|
mp_proc->process (p.obj ().transformed (p.trans ()), res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CompoundRegionToEdgeProcessingOperationNode::processed (db::Layout *, const db::polygon_ref<db::Polygon, db::ICplxTrans> &p, std::vector<db::Edge> &res) const
|
||||||
|
{
|
||||||
|
mp_proc->process (p.obj ().transformed (p.trans ()), res);
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
CompoundRegionEdgeProcessingOperationNode::CompoundRegionEdgeProcessingOperationNode (EdgeProcessorBase *proc, CompoundRegionOperationNode *input, bool owns_proc)
|
CompoundRegionEdgeProcessingOperationNode::CompoundRegionEdgeProcessingOperationNode (EdgeProcessorBase *proc, CompoundRegionOperationNode *input, bool owns_proc)
|
||||||
|
|
@ -1456,6 +1472,12 @@ CompoundRegionToEdgePairProcessingOperationNode::processed (db::Layout *, const
|
||||||
mp_proc->process (p.obj ().transformed (p.trans ()), res);
|
mp_proc->process (p.obj ().transformed (p.trans ()), res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CompoundRegionToEdgePairProcessingOperationNode::processed (db::Layout *, const db::polygon_ref<db::Polygon, db::ICplxTrans> &p, std::vector<db::EdgePair> &res) const
|
||||||
|
{
|
||||||
|
mp_proc->process (p.obj ().transformed (p.trans ()), res);
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
CompoundRegionEdgePairToPolygonProcessingOperationNode::CompoundRegionEdgePairToPolygonProcessingOperationNode (EdgePairToPolygonProcessorBase *proc, CompoundRegionOperationNode *input, bool owns_proc)
|
CompoundRegionEdgePairToPolygonProcessingOperationNode::CompoundRegionEdgePairToPolygonProcessingOperationNode (EdgePairToPolygonProcessorBase *proc, CompoundRegionOperationNode *input, bool owns_proc)
|
||||||
|
|
@ -1593,9 +1615,13 @@ CompoundRegionCheckOperationNode::computed_dist () const
|
||||||
void
|
void
|
||||||
CompoundRegionCheckOperationNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *layout, db::Cell *cell, const shape_interactions<db::Polygon, db::Polygon> &interactions, std::vector<std::unordered_set<db::EdgePair> > &results, const db::LocalProcessorBase *proc) const
|
CompoundRegionCheckOperationNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *layout, db::Cell *cell, const shape_interactions<db::Polygon, db::Polygon> &interactions, std::vector<std::unordered_set<db::EdgePair> > &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
|
// TODO: needs a concept to deal with merged/non-merged inputs
|
||||||
bool is_merged = true;
|
bool is_merged = true;
|
||||||
db::check_local_operation<db::Polygon, db::Polygon> op (m_check, m_different_polygons, is_merged, m_has_other, m_is_other_merged, m_options);
|
db::check_local_operation<db::Polygon, db::Polygon> op (check, m_different_polygons, is_merged, m_has_other, m_is_other_merged, m_options);
|
||||||
|
|
||||||
tl_assert (results.size () == 1);
|
tl_assert (results.size () == 1);
|
||||||
if (results.front ().empty ()) {
|
if (results.front ().empty ()) {
|
||||||
|
|
@ -1611,9 +1637,13 @@ CompoundRegionCheckOperationNode::do_compute_local (CompoundRegionOperationCache
|
||||||
void
|
void
|
||||||
CompoundRegionCheckOperationNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *layout, db::Cell *cell, const shape_interactions<db::PolygonRef, db::PolygonRef> &interactions, std::vector<std::unordered_set<db::EdgePair> > &results, const db::LocalProcessorBase *proc) const
|
CompoundRegionCheckOperationNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *layout, db::Cell *cell, const shape_interactions<db::PolygonRef, db::PolygonRef> &interactions, std::vector<std::unordered_set<db::EdgePair> > &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
|
// TODO: needs a concept to deal with merged/non-merged inputs
|
||||||
bool is_merged = true;
|
bool is_merged = true;
|
||||||
db::check_local_operation<db::PolygonRef, db::PolygonRef> op (m_check, m_different_polygons, is_merged, m_has_other, m_is_other_merged, m_options);
|
db::check_local_operation<db::PolygonRef, db::PolygonRef> op (check, m_different_polygons, is_merged, m_has_other, m_is_other_merged, m_options);
|
||||||
|
|
||||||
tl_assert (results.size () == 1);
|
tl_assert (results.size () == 1);
|
||||||
if (results.front ().empty ()) {
|
if (results.front ().empty ()) {
|
||||||
|
|
|
||||||
|
|
@ -1138,6 +1138,7 @@ private:
|
||||||
|
|
||||||
void processed (db::Layout *, const db::Polygon &p, std::vector<db::Polygon> &res) const;
|
void processed (db::Layout *, const db::Polygon &p, std::vector<db::Polygon> &res) const;
|
||||||
void processed (db::Layout *, const db::PolygonRef &p, std::vector<db::PolygonRef> &res) const;
|
void processed (db::Layout *, const db::PolygonRef &p, std::vector<db::PolygonRef> &res) const;
|
||||||
|
void processed (db::Layout *, const db::polygon_ref<db::Polygon, db::ICplxTrans> &p, std::vector<db::PolygonRef> &res) const;
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions<T, T> &interactions, std::vector<std::unordered_set<T> > &results, const db::LocalProcessorBase *proc) const
|
void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions<T, T> &interactions, std::vector<std::unordered_set<T> > &results, const db::LocalProcessorBase *proc) const
|
||||||
|
|
@ -1149,9 +1150,33 @@ private:
|
||||||
|
|
||||||
std::vector<T> res;
|
std::vector<T> res;
|
||||||
for (typename std::unordered_set<T>::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) {
|
for (typename std::unordered_set<T>::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) {
|
||||||
|
|
||||||
res.clear ();
|
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 std::map<db::ICplxTrans, size_t> &vv = proc->vars ()->variants (cell->cell_index ());
|
||||||
|
tl_assert (vv.size () == 1);
|
||||||
|
const db::ICplxTrans &tr = vv.begin ()->first;
|
||||||
|
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 ());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -1175,7 +1200,6 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
db::PolygonSizer m_proc;
|
db::PolygonSizer m_proc;
|
||||||
CompoundTransformationReducer m_vars;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class DB_PUBLIC CompoundRegionMergeOperationNode
|
class DB_PUBLIC CompoundRegionMergeOperationNode
|
||||||
|
|
@ -1286,9 +1310,33 @@ private:
|
||||||
|
|
||||||
std::vector<T> res;
|
std::vector<T> res;
|
||||||
for (typename std::unordered_set<db::Edge>::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) {
|
for (typename std::unordered_set<db::Edge>::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) {
|
||||||
|
|
||||||
res.clear ();
|
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 std::map<db::ICplxTrans, size_t> &vv = proc->vars ()->variants (cell->cell_index ());
|
||||||
|
tl_assert (vv.size () == 1);
|
||||||
|
const db::ICplxTrans &tr = vv.begin ()->first;
|
||||||
|
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 ());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -1331,9 +1379,33 @@ private:
|
||||||
|
|
||||||
std::vector<db::Edge> res;
|
std::vector<db::Edge> res;
|
||||||
for (typename std::unordered_set<db::Edge>::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) {
|
for (typename std::unordered_set<db::Edge>::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) {
|
||||||
|
|
||||||
res.clear ();
|
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 std::map<db::ICplxTrans, size_t> &vv = proc->vars ()->variants (cell->cell_index ());
|
||||||
|
tl_assert (vv.size () == 1);
|
||||||
|
const db::ICplxTrans &tr = vv.begin ()->first;
|
||||||
|
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 ());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -1377,9 +1449,33 @@ private:
|
||||||
|
|
||||||
std::vector<T> res;
|
std::vector<T> res;
|
||||||
for (typename std::unordered_set<db::EdgePair>::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) {
|
for (typename std::unordered_set<db::EdgePair>::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) {
|
||||||
|
|
||||||
res.clear ();
|
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 std::map<db::ICplxTrans, size_t> &vv = proc->vars ()->variants (cell->cell_index ());
|
||||||
|
tl_assert (vv.size () == 1);
|
||||||
|
const db::ICplxTrans &tr = vv.begin ()->first;
|
||||||
|
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 ());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -1420,9 +1516,33 @@ private:
|
||||||
|
|
||||||
std::vector<db::Edge> res;
|
std::vector<db::Edge> res;
|
||||||
for (typename std::unordered_set<db::EdgePair>::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) {
|
for (typename std::unordered_set<db::EdgePair>::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) {
|
||||||
|
|
||||||
res.clear ();
|
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 std::map<db::ICplxTrans, size_t> &vv = proc->vars ()->variants (cell->cell_index ());
|
||||||
|
tl_assert (vv.size () == 1);
|
||||||
|
const db::ICplxTrans &tr = vv.begin ()->first;
|
||||||
|
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 ());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -1455,6 +1575,7 @@ private:
|
||||||
|
|
||||||
void processed (db::Layout *, const db::Polygon &p, std::vector<db::Edge> &res) const;
|
void processed (db::Layout *, const db::Polygon &p, std::vector<db::Edge> &res) const;
|
||||||
void processed (db::Layout *layout, const db::PolygonRef &p, std::vector<db::Edge> &res) const;
|
void processed (db::Layout *layout, const db::PolygonRef &p, std::vector<db::Edge> &res) const;
|
||||||
|
void processed (db::Layout *, const db::polygon_ref<db::Polygon, db::ICplxTrans> &p, std::vector<db::Edge> &res) const;
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions<T, T> &interactions, std::vector<std::unordered_set<db::Edge> > &results, const db::LocalProcessorBase *proc) const
|
void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions<T, T> &interactions, std::vector<std::unordered_set<db::Edge> > &results, const db::LocalProcessorBase *proc) const
|
||||||
|
|
@ -1466,9 +1587,33 @@ private:
|
||||||
|
|
||||||
std::vector<db::Edge> res;
|
std::vector<db::Edge> res;
|
||||||
for (typename std::unordered_set<T>::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) {
|
for (typename std::unordered_set<T>::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) {
|
||||||
|
|
||||||
res.clear ();
|
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 std::map<db::ICplxTrans, size_t> &vv = proc->vars ()->variants (cell->cell_index ());
|
||||||
|
tl_assert (vv.size () == 1);
|
||||||
|
const db::ICplxTrans &tr = vv.begin ()->first;
|
||||||
|
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 ());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -1506,11 +1651,12 @@ public:
|
||||||
virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions<db::PolygonRef, db::PolygonRef> & /*interactions*/, std::vector<std::unordered_set<db::Edge> > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { }
|
virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions<db::PolygonRef, db::PolygonRef> & /*interactions*/, std::vector<std::unordered_set<db::Edge> > & /*results*/, const db::LocalProcessorBase * /*proc*/) const { }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PolygonToEdgePairProcessorBase *mp_proc;
|
PolygonToEdgePairProcessorBase *mp_proc;
|
||||||
bool m_owns_proc;
|
bool m_owns_proc;
|
||||||
|
|
||||||
void processed (db::Layout *, const db::Polygon &p, std::vector<db::EdgePair> &res) const;
|
void processed (db::Layout *, const db::Polygon &p, std::vector<db::EdgePair> &res) const;
|
||||||
void processed (db::Layout *layout, const db::PolygonRef &p, std::vector<db::EdgePair> &res) const;
|
void processed (db::Layout *layout, const db::PolygonRef &p, std::vector<db::EdgePair> &res) const;
|
||||||
|
void processed (db::Layout *, const db::polygon_ref<db::Polygon, db::ICplxTrans> &p, std::vector<db::EdgePair> &res) const;
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions<T, T> &interactions, std::vector<std::unordered_set<db::EdgePair> > &results, const db::LocalProcessorBase *proc) const
|
void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions<T, T> &interactions, std::vector<std::unordered_set<db::EdgePair> > &results, const db::LocalProcessorBase *proc) const
|
||||||
|
|
@ -1522,9 +1668,33 @@ private:
|
||||||
|
|
||||||
std::vector<db::EdgePair> res;
|
std::vector<db::EdgePair> res;
|
||||||
for (typename std::unordered_set<T>::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) {
|
for (typename std::unordered_set<T>::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) {
|
||||||
|
|
||||||
res.clear ();
|
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 std::map<db::ICplxTrans, size_t> &vv = proc->vars ()->variants (cell->cell_index ());
|
||||||
|
tl_assert (vv.size () == 1);
|
||||||
|
const db::ICplxTrans &tr = vv.begin ()->first;
|
||||||
|
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 ());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -1560,6 +1730,9 @@ public:
|
||||||
virtual OnEmptyIntruderHint on_empty_intruder_hint () const;
|
virtual OnEmptyIntruderHint on_empty_intruder_hint () const;
|
||||||
virtual db::Coord computed_dist () const;
|
virtual db::Coord computed_dist () 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<db::Polygon, db::Polygon> &interactions, std::vector<std::unordered_set<db::EdgePair> > &results, const LocalProcessorBase *proc) const;
|
virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions<db::Polygon, db::Polygon> &interactions, std::vector<std::unordered_set<db::EdgePair> > &results, const LocalProcessorBase *proc) const;
|
||||||
virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions<db::PolygonRef, db::PolygonRef> &interactions, std::vector<std::unordered_set<db::EdgePair> > &results, const LocalProcessorBase *proc) const;
|
virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, db::Cell *cell, const shape_interactions<db::PolygonRef, db::PolygonRef> &interactions, std::vector<std::unordered_set<db::EdgePair> > &results, const LocalProcessorBase *proc) const;
|
||||||
|
|
||||||
|
|
@ -1575,6 +1748,7 @@ private:
|
||||||
db::RegionCheckOptions m_options;
|
db::RegionCheckOptions m_options;
|
||||||
bool m_has_other;
|
bool m_has_other;
|
||||||
bool m_is_other_merged;
|
bool m_is_other_merged;
|
||||||
|
db::MagnificationReducer m_vars;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1599,6 +1773,9 @@ public:
|
||||||
: mp_node (node)
|
: mp_node (node)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
const TransformationReducer *vars () const { return mp_node->vars (); }
|
||||||
|
bool wants_variants () const { return mp_node->wants_variants (); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void do_compute_local (db::Layout *layout, db::Cell *cell, const shape_interactions<TS, TI> &interactions, std::vector<std::unordered_set<TR> > &results, const db::LocalProcessorBase *proc) const
|
virtual void do_compute_local (db::Layout *layout, db::Cell *cell, const shape_interactions<TS, TI> &interactions, std::vector<std::unordered_set<TR> > &results, const db::LocalProcessorBase *proc) const
|
||||||
{
|
{
|
||||||
|
|
@ -1611,8 +1788,6 @@ protected:
|
||||||
virtual bool requests_single_subjects () const { return true; }
|
virtual bool requests_single_subjects () const { return true; }
|
||||||
virtual std::string description () const { return mp_node->description (); }
|
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<db::Region *> inputs () const { return mp_node->inputs (); }
|
std::vector<db::Region *> inputs () const { return mp_node->inputs (); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -1645,6 +1820,9 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const TransformationReducer *vars () const { return mp_node->vars (); }
|
||||||
|
bool wants_variants () const { return mp_node->wants_variants (); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void do_compute_local (db::Layout *layout, db::Cell *cell, const shape_interactions<db::object_with_properties<TS>, db::object_with_properties<TI> > &interactions, std::vector<std::unordered_set<db::object_with_properties<TR> > > &results, const db::LocalProcessorBase *proc) const
|
virtual void do_compute_local (db::Layout *layout, db::Cell *cell, const shape_interactions<db::object_with_properties<TS>, db::object_with_properties<TI> > &interactions, std::vector<std::unordered_set<db::object_with_properties<TR> > > &results, const db::LocalProcessorBase *proc) const
|
||||||
{
|
{
|
||||||
|
|
@ -1671,8 +1849,6 @@ protected:
|
||||||
virtual bool requests_single_subjects () const { return true; }
|
virtual bool requests_single_subjects () const { return true; }
|
||||||
virtual std::string description () const { return mp_node->description (); }
|
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<db::Region *> inputs () const { return mp_node->inputs (); }
|
std::vector<db::Region *> inputs () const { return mp_node->inputs (); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
|
|
@ -1941,12 +1941,16 @@ public:
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void do_compute_local (db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions<db::Edge, db::Edge> &interactions, std::vector<std::unordered_set<db::EdgePair> > &results, const db::LocalProcessorBase * /*proc*/) const
|
virtual void do_compute_local (db::Layout * /*layout*/, db::Cell *cell, const shape_interactions<db::Edge, db::Edge> &interactions, std::vector<std::unordered_set<db::EdgePair> > &results, const db::LocalProcessorBase *proc) const
|
||||||
{
|
{
|
||||||
tl_assert (results.size () == 1);
|
tl_assert (results.size () == 1);
|
||||||
std::unordered_set<db::EdgePair> &result = results.front ();
|
std::unordered_set<db::EdgePair> &result = results.front ();
|
||||||
|
|
||||||
edge2edge_check_for_edges<std::unordered_set<db::EdgePair> > 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<std::unordered_set<db::EdgePair> > edge_check (check, result, m_has_other);
|
||||||
|
|
||||||
db::box_scanner<db::Edge, size_t> scanner;
|
db::box_scanner<db::Edge, size_t> scanner;
|
||||||
std::set<db::Edge> others;
|
std::set<db::Edge> others;
|
||||||
|
|
@ -1989,7 +1993,7 @@ public:
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
scanner.process (edge_check, m_check.distance (), db::box_convert<db::Edge> ());
|
scanner.process (edge_check, check.distance (), db::box_convert<db::Edge> ());
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual db::Coord dist () const
|
virtual db::Coord dist () const
|
||||||
|
|
@ -2028,6 +2032,28 @@ DeepEdges::run_check (db::edge_relation_type rel, const Edges *other, db::Coord
|
||||||
|
|
||||||
const db::DeepLayer &edges = merged_deep_layer ();
|
const db::DeepLayer &edges = merged_deep_layer ();
|
||||||
|
|
||||||
|
// create cell variants for magnification if needed
|
||||||
|
|
||||||
|
db::cell_variants_collector<db::MagnificationReducer> vars;
|
||||||
|
vars.collect (edges.layout (), edges.initial_cell ());
|
||||||
|
|
||||||
|
// NOTE: m_merged_polygons is mutable, so why is the const_cast needed?
|
||||||
|
const_cast<db::DeepLayer &> (edges).separate_variants (vars);
|
||||||
|
|
||||||
|
if (other_deep && &other_deep->deep_layer ().layout () != &edges.layout ()) {
|
||||||
|
|
||||||
|
// create cell variants for magnification for the other input if needed
|
||||||
|
|
||||||
|
const db::DeepLayer &other_layer = other_deep->deep_layer ();
|
||||||
|
|
||||||
|
db::cell_variants_collector<db::MagnificationReducer> vars;
|
||||||
|
vars.collect (other_layer.layout (), other_layer.initial_cell ());
|
||||||
|
|
||||||
|
// NOTE: m_merged_polygons is mutable, so why is the const_cast needed?
|
||||||
|
const_cast<db::DeepLayer &> (other_layer).separate_variants (vars);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
EdgeRelationFilter check (rel, d, options.metrics);
|
EdgeRelationFilter check (rel, d, options.metrics);
|
||||||
check.set_include_zero (false);
|
check.set_include_zero (false);
|
||||||
check.set_whole_edges (options.whole_edges);
|
check.set_whole_edges (options.whole_edges);
|
||||||
|
|
@ -2045,6 +2071,7 @@ DeepEdges::run_check (db::edge_relation_type rel, const Edges *other, db::Coord
|
||||||
other_deep ? &other_deep->deep_layer ().initial_cell () : const_cast<db::Cell *> (&edges.initial_cell ()));
|
other_deep ? &other_deep->deep_layer ().initial_cell () : const_cast<db::Cell *> (&edges.initial_cell ()));
|
||||||
|
|
||||||
proc.set_base_verbosity (base_verbosity ());
|
proc.set_base_verbosity (base_verbosity ());
|
||||||
|
proc.set_vars (&vars);
|
||||||
proc.set_threads (edges.store ()->threads ());
|
proc.set_threads (edges.store ()->threads ());
|
||||||
|
|
||||||
proc.run (&op, edges.layer (), other_deep ? other_deep->deep_layer ().layer () : edges.layer (), res->deep_layer ().layer ());
|
proc.run (&op, edges.layer (), other_deep ? other_deep->deep_layer ().layer () : edges.layer (), res->deep_layer ().layer ());
|
||||||
|
|
|
||||||
|
|
@ -1799,6 +1799,16 @@ Output *region_cop_impl (DeepRegion *region, db::CompoundRegionOperationNode &no
|
||||||
}
|
}
|
||||||
|
|
||||||
compound_local_operation<db::PolygonRef, db::PolygonRef, TR> op (&node);
|
compound_local_operation<db::PolygonRef, db::PolygonRef, TR> op (&node);
|
||||||
|
|
||||||
|
// Prepare cell variants if needed
|
||||||
|
db::VariantsCollectorBase vc (op.vars ());
|
||||||
|
if (op.wants_variants ()) {
|
||||||
|
vc.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 (vc);
|
||||||
|
proc.set_vars (&vc);
|
||||||
|
}
|
||||||
|
|
||||||
proc.run (&op, polygons.layer (), other_layers, res->deep_layer ().layer ());
|
proc.run (&op, polygons.layer (), other_layers, res->deep_layer ().layer ());
|
||||||
|
|
||||||
return res.release ();
|
return res.release ();
|
||||||
|
|
@ -1852,6 +1862,16 @@ Output *region_cop_with_properties_impl (DeepRegion *region, db::CompoundRegionO
|
||||||
}
|
}
|
||||||
|
|
||||||
compound_local_operation_with_properties<db::PolygonRef, db::PolygonRef, TR> op (&node, prop_constraint, res->properties_repository (), subject_pr, intruder_prs);
|
compound_local_operation_with_properties<db::PolygonRef, db::PolygonRef, TR> op (&node, prop_constraint, res->properties_repository (), subject_pr, intruder_prs);
|
||||||
|
|
||||||
|
// Prepare cell variants if needed
|
||||||
|
db::VariantsCollectorBase vc (op.vars ());
|
||||||
|
if (op.wants_variants ()) {
|
||||||
|
vc.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 (vc);
|
||||||
|
proc.set_vars (&vc);
|
||||||
|
}
|
||||||
|
|
||||||
proc.run (&op, polygons.layer (), other_layers, res->deep_layer ().layer ());
|
proc.run (&op, polygons.layer (), other_layers, res->deep_layer ().layer ());
|
||||||
|
|
||||||
return res.release ();
|
return res.release ();
|
||||||
|
|
|
||||||
|
|
@ -1143,7 +1143,7 @@ public:
|
||||||
db::Box ref_box = db::box_convert<TS> () (*ref);
|
db::Box ref_box = db::box_convert<TS> () (*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) {
|
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::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) /*.enlarged (db::Vector (m_dist, m_dist))@@@*/;
|
||||||
if (! region.empty ()) {
|
if (! region.empty ()) {
|
||||||
add_shapes_from_intruder_inst (id1, intruder_cell, tn, inst_id, region);
|
add_shapes_from_intruder_inst (id1, intruder_cell, tn, inst_id, region);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -490,6 +490,11 @@ public:
|
||||||
mp_vars = 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 (db::cell_index_type cell_index, db::Coord dist) const;
|
||||||
db::Coord dist_for_cell (const db::Cell *cell, db::Coord dist) const;
|
db::Coord dist_for_cell (const db::Cell *cell, db::Coord dist) const;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -593,11 +593,14 @@ public:
|
||||||
SinglePolygonCheck (db::edge_relation_type rel, db::Coord d, const RegionCheckOptions &options);
|
SinglePolygonCheck (db::edge_relation_type rel, db::Coord d, const RegionCheckOptions &options);
|
||||||
|
|
||||||
virtual void process (const db::Polygon &polygon, std::vector<db::EdgePair> &res) const;
|
virtual void process (const db::Polygon &polygon, std::vector<db::EdgePair> &res) const;
|
||||||
|
virtual const TransformationReducer *vars () const { return &m_vars; }
|
||||||
|
virtual bool wants_variants () const { return true; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
db::edge_relation_type m_relation;
|
db::edge_relation_type m_relation;
|
||||||
db::Coord m_d;
|
db::Coord m_d;
|
||||||
db::RegionCheckOptions m_options;
|
db::RegionCheckOptions m_options;
|
||||||
|
db::MagnificationReducer m_vars;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace db
|
} // namespace db
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue