mirror of https://github.com/KLayout/klayout.git
WIP
This commit is contained in:
parent
7881c0953c
commit
596080669d
|
|
@ -1697,7 +1697,7 @@ struct array
|
||||||
* an appropriate basic_array object using a complex transformation.
|
* an appropriate basic_array object using a complex transformation.
|
||||||
*/
|
*/
|
||||||
array (const Obj &obj, const complex_trans_type &ct, const vector_type &a, const vector_type &b, unsigned long amax, unsigned long bmax)
|
array (const Obj &obj, const complex_trans_type &ct, const vector_type &a, const vector_type &b, unsigned long amax, unsigned long bmax)
|
||||||
: m_obj (obj), m_trans (ct), mp_base (new regular_complex_array <coord_type> (ct.rcos (), ct.mag (), a, b, amax, bmax))
|
: m_obj (obj), m_trans (ct), mp_base (ct.is_complex () ? new regular_complex_array <coord_type> (ct.rcos (), ct.mag (), a, b, amax, bmax) : new regular_array <coord_type> (a, b, amax, bmax))
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
@ -1725,7 +1725,7 @@ struct array
|
||||||
* it's own storage.
|
* it's own storage.
|
||||||
*/
|
*/
|
||||||
array (const Obj &obj, const complex_trans_type &ct, ArrayRepository &rep, const vector_type &a, const vector_type &b, unsigned long amax, unsigned long bmax)
|
array (const Obj &obj, const complex_trans_type &ct, ArrayRepository &rep, const vector_type &a, const vector_type &b, unsigned long amax, unsigned long bmax)
|
||||||
: m_obj (obj), m_trans (ct), mp_base (rep.insert (regular_complex_array <coord_type> (ct.rcos (), ct.mag (), a, b, amax, bmax)))
|
: m_obj (obj), m_trans (ct), mp_base (ct.is_complex () ? rep.insert (regular_complex_array <coord_type> (ct.rcos (), ct.mag (), a, b, amax, bmax)) : rep.insert (regular_array <coord_type> (a, b, amax, bmax)))
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
@ -1764,7 +1764,7 @@ struct array
|
||||||
*/
|
*/
|
||||||
template <class Iter>
|
template <class Iter>
|
||||||
array (const Obj &obj, const complex_trans_type &ct, Iter from, Iter to)
|
array (const Obj &obj, const complex_trans_type &ct, Iter from, Iter to)
|
||||||
: m_obj (obj), m_trans (ct), mp_base (new iterated_complex_array <coord_type> (ct.rcos (), ct.mag (), from, to))
|
: m_obj (obj), m_trans (ct), mp_base (ct.is_complex () ? new iterated_complex_array <coord_type> (ct.rcos (), ct.mag (), from, to) : new iterated_array <coord_type> (from, to))
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
@ -1777,7 +1777,7 @@ struct array
|
||||||
*/
|
*/
|
||||||
explicit
|
explicit
|
||||||
array (const Obj &obj, const complex_trans_type &ct)
|
array (const Obj &obj, const complex_trans_type &ct)
|
||||||
: m_obj (obj), m_trans (ct), mp_base (new single_complex_inst <coord_type> (ct.rcos (), ct.mag ()))
|
: m_obj (obj), m_trans (ct), mp_base (ct.is_complex () ? new single_complex_inst <coord_type> (ct.rcos (), ct.mag ()) : 0)
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
@ -1807,7 +1807,7 @@ struct array
|
||||||
*/
|
*/
|
||||||
explicit
|
explicit
|
||||||
array (const Obj &obj, const complex_trans_type &ct, ArrayRepository &rep)
|
array (const Obj &obj, const complex_trans_type &ct, ArrayRepository &rep)
|
||||||
: m_obj (obj), m_trans (ct), mp_base (rep.insert (single_complex_inst <coord_type> (ct.rcos (), ct.mag ())))
|
: m_obj (obj), m_trans (ct), mp_base (ct.is_complex () ? rep.insert (single_complex_inst <coord_type> (ct.rcos (), ct.mag ())) : 0)
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
@ -1888,17 +1888,13 @@ struct array
|
||||||
array_iterator <coord_type, Trans> begin_touching (const box_type &b, const BoxConv &bc) const
|
array_iterator <coord_type, Trans> begin_touching (const box_type &b, const BoxConv &bc) const
|
||||||
{
|
{
|
||||||
if (b.empty ()) {
|
if (b.empty ()) {
|
||||||
if (mp_base) {
|
return array_iterator <coord_type, Trans> (m_trans, true);
|
||||||
return array_iterator <coord_type, Trans> (m_trans, mp_base->begin_touching (box_type ()));
|
|
||||||
} else {
|
|
||||||
return array_iterator <coord_type, Trans> (m_trans, true);
|
|
||||||
}
|
|
||||||
} else if (b == box_type::world ()) {
|
} else if (b == box_type::world ()) {
|
||||||
return begin ();
|
return begin ();
|
||||||
} else if (mp_base) {
|
} else if (mp_base) {
|
||||||
box_type ob (bc (m_obj));
|
box_type ob (bc (m_obj));
|
||||||
if (ob.empty ()) {
|
if (ob.empty ()) {
|
||||||
return array_iterator <coord_type, Trans> (m_trans, mp_base->begin_touching (box_type ()));
|
return array_iterator <coord_type, Trans> (m_trans, true);
|
||||||
} else {
|
} else {
|
||||||
if (mp_base->is_complex ()) {
|
if (mp_base->is_complex ()) {
|
||||||
complex_trans_type ct = mp_base->complex_trans (simple_trans_type (m_trans));
|
complex_trans_type ct = mp_base->complex_trans (simple_trans_type (m_trans));
|
||||||
|
|
|
||||||
|
|
@ -1076,6 +1076,9 @@ printf("@@@ check instance interactions %s (#%d, %s) <-> %s (#%d, %s)\n",
|
||||||
|
|
||||||
std::unordered_map<db::ICplxTrans, std::list<std::pair<db::cell_index_type, db::ICplxTrans> > > interactions_cache;
|
std::unordered_map<db::ICplxTrans, std::list<std::pair<db::cell_index_type, db::ICplxTrans> > > interactions_cache;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
printf("@@@ -> #%d\n", int(inst1->size()));
|
||||||
|
#endif
|
||||||
for (db::CellInstArray::iterator n = inst1->begin (); ! n.at_end (); ++n) {
|
for (db::CellInstArray::iterator n = inst1->begin (); ! n.at_end (); ++n) {
|
||||||
|
|
||||||
db::ICplxTrans tn1 = inst1->complex_trans (*n);
|
db::ICplxTrans tn1 = inst1->complex_trans (*n);
|
||||||
|
|
@ -1131,51 +1134,8 @@ printf("@@@ check instance interactions %s (#%d, %s) <-> %s (#%d, %s)\n",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// @@@
|
|
||||||
bool has_intruder_tree_interactions (const db::Cell &subject_cell, const db::Cell &intruder_cell, const db::ICplxTrans &tni1, const db::ICplxTrans &tn21, const db::Box &cbox)
|
|
||||||
{
|
|
||||||
db::ICplxTrans tni2 = tn21.inverted () * tni1;
|
|
||||||
db::Box tbox2 = safe_box_enlarged (tni2 * cbox, -1, -1);
|
|
||||||
|
|
||||||
if (! intruder_cell.shapes (m_intruder_layer).begin_touching (tbox2, ShapeIterator::All).at_end ()) {
|
|
||||||
|
|
||||||
// we're overlapping with shapes from the intruder - do not recursive further
|
|
||||||
return true;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
for (db::Cell::touching_iterator i = intruder_cell.begin_touching (tbox2); ! i.at_end (); ++i) {
|
|
||||||
|
|
||||||
const db::Cell &ic = mp_intruder_layout->cell (i->cell_index ());
|
|
||||||
|
|
||||||
for (db::CellInstArray::iterator ia = i->begin_touching (tbox2, mp_intruder_layout); ! ia.at_end (); ++ia) {
|
|
||||||
|
|
||||||
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 ccbox = cbox & ibox2;
|
|
||||||
|
|
||||||
if (! ccbox.empty () && ! db::RecursiveShapeIterator (*mp_subject_layout, subject_cell, m_subject_layer, safe_box_enlarged (tni1 * ccbox, -1, -1), false).at_end ()) {
|
|
||||||
if (has_intruder_tree_interactions (subject_cell, ic, tni1, tn21 * it, ccbox)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// @@@
|
|
||||||
|
|
||||||
void collect_intruder_tree_interactions (const db::Cell &subject_cell, const db::Cell &intruder_cell, const db::ICplxTrans &tni1, const db::ICplxTrans &tn21, const db::Box &cbox, std::list<std::pair<db::cell_index_type, db::ICplxTrans> > &interactions)
|
void collect_intruder_tree_interactions (const db::Cell &subject_cell, const db::Cell &intruder_cell, const db::ICplxTrans &tni1, const db::ICplxTrans &tn21, const db::Box &cbox, std::list<std::pair<db::cell_index_type, db::ICplxTrans> > &interactions)
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
if (has_intruder_tree_interactions (subject_cell, intruder_cell, tni1, tn21, cbox)) {
|
|
||||||
interactions.push_back (std::make_pair (intruder_cell.cell_index (), tn21));
|
|
||||||
}
|
|
||||||
#elif 1
|
|
||||||
db::ICplxTrans tni2 = tn21.inverted () * tni1;
|
db::ICplxTrans tni2 = tn21.inverted () * tni1;
|
||||||
db::Box tbox2 = safe_box_enlarged (tni2 * cbox, -1, -1);
|
db::Box tbox2 = safe_box_enlarged (tni2 * cbox, -1, -1);
|
||||||
|
|
||||||
|
|
@ -1205,20 +1165,6 @@ printf("@@@ check instance interactions %s (#%d, %s) <-> %s (#%d, %s)\n",
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
// not very strong, but already useful: the cells interact if there is a layer1 in cell1
|
|
||||||
// in the common box and a layer2 in the cell2 in the common box
|
|
||||||
// NOTE: don't use overlap mode for the RecursiveShapeIterator as this would not capture dot-like
|
|
||||||
// objects like texts. Instead safe-shrink the search box and use touching mode ("false" for the last
|
|
||||||
// argument)
|
|
||||||
db::ICplxTrans tni2 = tn21.inverted () * tni1;
|
|
||||||
bool interacts = (! db::RecursiveShapeIterator (*mp_subject_layout, subject_cell, m_subject_layer, safe_box_enlarged (tni1 * cbox, -1, -1), false).at_end () &&
|
|
||||||
! db::RecursiveShapeIterator (*mp_intruder_layout, intruder_cell, m_intruder_layer, safe_box_enlarged (tni2 * cbox, -1, -1), false).at_end ());
|
|
||||||
|
|
||||||
if (interacts) {
|
|
||||||
interactions.push_back (std::make_pair (intruder_cell.cell_index (), tn21));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1669,8 +1615,6 @@ printf("@@@ --- compute_contexts (%s @ %s)\n", mp_subject_layout->cell_name (sub
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::list<db::CellInstArray> instance_heap;
|
|
||||||
|
|
||||||
for (std::set<db::CellInstArray>::const_iterator i = intruders.first.begin (); i != intruders.first.end (); ++i) {
|
for (std::set<db::CellInstArray>::const_iterator i = intruders.first.begin (); i != intruders.first.end (); ++i) {
|
||||||
if (! inst_bci (*i).empty ()) {
|
if (! inst_bci (*i).empty ()) {
|
||||||
scanner.insert2 (i.operator-> (), ++id);
|
scanner.insert2 (i.operator-> (), ++id);
|
||||||
|
|
|
||||||
|
|
@ -2011,6 +2011,15 @@ public:
|
||||||
m_mag = m_mag < 0.0 ? -m : m;
|
m_mag = m_mag < 0.0 ? -m : m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns a value indicating whether the transformation is a complex one
|
||||||
|
* The transformation can safely be converted to a simple transformation if this value is false.
|
||||||
|
*/
|
||||||
|
bool is_complex () const
|
||||||
|
{
|
||||||
|
return is_mag () || ! is_ortho ();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Test, if the transformation is mirroring
|
* @brief Test, if the transformation is mirroring
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -916,7 +916,7 @@ struct cplx_trans_defs
|
||||||
"@brief Gets the magnification\n"
|
"@brief Gets the magnification\n"
|
||||||
) +
|
) +
|
||||||
method ("is_mag?", &C::is_mag,
|
method ("is_mag?", &C::is_mag,
|
||||||
"@brief Test, if the transformation is a magnifying one\n"
|
"@brief Tests, if the transformation is a magnifying one\n"
|
||||||
"\n"
|
"\n"
|
||||||
"This is the recommended test for checking if the transformation represents\n"
|
"This is the recommended test for checking if the transformation represents\n"
|
||||||
"a magnification.\n"
|
"a magnification.\n"
|
||||||
|
|
@ -925,6 +925,14 @@ struct cplx_trans_defs
|
||||||
"@brief Sets the magnification\n"
|
"@brief Sets the magnification\n"
|
||||||
"@param m The new magnification"
|
"@param m The new magnification"
|
||||||
) +
|
) +
|
||||||
|
method ("is_complex?", &C::is_complex,
|
||||||
|
"@brief Return true if the transformation is a complex one\n"
|
||||||
|
"\n"
|
||||||
|
"If this value is false, the transformation can safely be converted to a simple transformation.\n"
|
||||||
|
"The return value is equivalent to 'is_mag || !is_ortho'.\n"
|
||||||
|
"\n"
|
||||||
|
"This method has been introduced in version 0.27.5."
|
||||||
|
) +
|
||||||
method ("R0", &trans_r0,
|
method ("R0", &trans_r0,
|
||||||
"@brief A constant giving \"unrotated\" (unit) transformation\n"
|
"@brief A constant giving \"unrotated\" (unit) transformation\n"
|
||||||
"The previous integer constant has been turned into a transformation in version 0.25."
|
"The previous integer constant has been turned into a transformation in version 0.25."
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue