mirror of https://github.com/KLayout/klayout.git
More tests for area collector, debugging
This commit is contained in:
parent
9d45a01abf
commit
b7a2926f1f
|
|
@ -126,7 +126,7 @@ public:
|
||||||
* @brief Constructor
|
* @brief Constructor
|
||||||
*/
|
*/
|
||||||
tagged_area_collector<Value> (const tl::bit_set_map<Value> &bsm, tagged_area_receiver<Value> &receiver)
|
tagged_area_collector<Value> (const tl::bit_set_map<Value> &bsm, tagged_area_receiver<Value> &receiver)
|
||||||
: mp_bsm (&bsm), mp_receiver (&receiver)
|
: mp_bsm (&bsm), mp_receiver (&receiver), m_state_one_bits (0), m_prev_one_bits (0)
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
@ -136,11 +136,14 @@ public:
|
||||||
{
|
{
|
||||||
m_prev = tl::BitSet ();
|
m_prev = tl::BitSet ();
|
||||||
m_state = tl::BitSet ();
|
m_state = tl::BitSet ();
|
||||||
|
m_state_one_bits = 0;
|
||||||
|
m_prev_one_bits = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void begin_group ()
|
virtual void begin_group ()
|
||||||
{
|
{
|
||||||
m_prev = m_state;
|
m_prev = m_state;
|
||||||
|
m_prev_one_bits = m_state_one_bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int edge (bool north, bool enter, property_type p)
|
virtual int edge (bool north, bool enter, property_type p)
|
||||||
|
|
@ -155,12 +158,14 @@ public:
|
||||||
if (enter) {
|
if (enter) {
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
m_state.set (p);
|
m_state.set (p);
|
||||||
|
++m_state_one_bits;
|
||||||
}
|
}
|
||||||
++count;
|
++count;
|
||||||
} else {
|
} else {
|
||||||
--count;
|
--count;
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
m_state.reset (p);
|
m_state.reset (p);
|
||||||
|
--m_state_one_bits;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -174,12 +179,7 @@ public:
|
||||||
|
|
||||||
virtual bool is_reset () const
|
virtual bool is_reset () const
|
||||||
{
|
{
|
||||||
for (auto i = m_counts.begin (); i != m_counts.end (); ++i) {
|
return m_state_one_bits == 0;
|
||||||
if (*i) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool prefer_touch () const
|
virtual bool prefer_touch () const
|
||||||
|
|
@ -209,9 +209,13 @@ public:
|
||||||
virtual void put (const db::Edge &edge)
|
virtual void put (const db::Edge &edge)
|
||||||
{
|
{
|
||||||
area_type partial_area = area_type (edge.p1 ().x () + edge.p2 ().x ()) * area_type (edge.dy ()) * 0.5;
|
area_type partial_area = area_type (edge.p1 ().x () + edge.p2 ().x ()) * area_type (edge.dy ()) * 0.5;
|
||||||
|
if (m_prev_one_bits > 0) {
|
||||||
mp_bsm->lookup (m_prev, tagged_area_inserter<Value> (partial_area, mp_receiver));
|
mp_bsm->lookup (m_prev, tagged_area_inserter<Value> (partial_area, mp_receiver));
|
||||||
|
}
|
||||||
|
if (m_state_one_bits > 0) {
|
||||||
mp_bsm->lookup (m_state, tagged_area_inserter<Value> (-partial_area, mp_receiver));
|
mp_bsm->lookup (m_state, tagged_area_inserter<Value> (-partial_area, mp_receiver));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
area_type m_area_sum;
|
area_type m_area_sum;
|
||||||
|
|
@ -219,6 +223,7 @@ private:
|
||||||
tagged_area_receiver<Value> *mp_receiver;
|
tagged_area_receiver<Value> *mp_receiver;
|
||||||
tl::BitSet m_prev, m_state;
|
tl::BitSet m_prev, m_state;
|
||||||
std::vector<int> m_counts;
|
std::vector<int> m_counts;
|
||||||
|
unsigned int m_state_one_bits, m_prev_one_bits;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ private:
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(1)
|
TEST(1_Basic)
|
||||||
{
|
{
|
||||||
db::EdgeProcessor ep;
|
db::EdgeProcessor ep;
|
||||||
|
|
||||||
|
|
@ -74,3 +74,83 @@ TEST(1)
|
||||||
|
|
||||||
EXPECT_EQ (rec.get (), 4500000);
|
EXPECT_EQ (rec.get (), 4500000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(2_ShapesGetMerged)
|
||||||
|
{
|
||||||
|
db::EdgeProcessor ep;
|
||||||
|
|
||||||
|
ep.insert (db::SimplePolygon (db::Box (0, -1000, 1000, 1000)), 0);
|
||||||
|
ep.insert (db::SimplePolygon (db::Box (0, 0, 1000, 2000)), 0);
|
||||||
|
ep.insert (db::SimplePolygon (db::Box (500, 1000, 1500, 3000)), 1);
|
||||||
|
ep.insert (db::SimplePolygon (db::Box (0, 0, 1000, 2000)), 0);
|
||||||
|
ep.insert (db::SimplePolygon (db::Box (1000, 1000, 1500, 3000)), 1);
|
||||||
|
|
||||||
|
// set up an XOR mask where 1-vs-0 is counted twice
|
||||||
|
tl::bit_set_map<double> bsm;
|
||||||
|
tl::BitSetMask bs0;
|
||||||
|
bs0.set (0, tl::BitSetMask::True);
|
||||||
|
bs0.set (1, tl::BitSetMask::False);
|
||||||
|
tl::BitSetMask bs1;
|
||||||
|
bs1.set (0, tl::BitSetMask::False);
|
||||||
|
bs1.set (1, tl::BitSetMask::True);
|
||||||
|
bsm.insert (bs0, 1.0);
|
||||||
|
bsm.insert (bs1, 2.0);
|
||||||
|
bsm.sort ();
|
||||||
|
|
||||||
|
AreaReceiver rec;
|
||||||
|
db::tagged_area_collector<double> coll (bsm, rec);
|
||||||
|
ep.process (coll, coll);
|
||||||
|
|
||||||
|
EXPECT_EQ (rec.get (), 5500000);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(3_TouchingOnly)
|
||||||
|
{
|
||||||
|
db::EdgeProcessor ep;
|
||||||
|
|
||||||
|
ep.insert (db::SimplePolygon (db::Box (0, -1000, 1000, 1000)), 0);
|
||||||
|
ep.insert (db::SimplePolygon (db::Box (1000, 0, 2000, 2000)), 1);
|
||||||
|
ep.insert (db::SimplePolygon (db::Box (1000, 500, 1500, 1500)), 1);
|
||||||
|
ep.insert (db::SimplePolygon (db::Box (0, 0, 1000, 1000)), 0);
|
||||||
|
ep.insert (db::SimplePolygon (db::Box (1500, 500, 2000, 2000)), 1);
|
||||||
|
|
||||||
|
// set up an XOR mask where 1-vs-0 is counted twice
|
||||||
|
tl::bit_set_map<double> bsm;
|
||||||
|
tl::BitSetMask bs0;
|
||||||
|
bs0.set (0, tl::BitSetMask::True);
|
||||||
|
bs0.set (1, tl::BitSetMask::False);
|
||||||
|
tl::BitSetMask bs1;
|
||||||
|
bs1.set (0, tl::BitSetMask::False);
|
||||||
|
bs1.set (1, tl::BitSetMask::True);
|
||||||
|
bsm.insert (bs0, 1.0);
|
||||||
|
bsm.insert (bs1, 2.0);
|
||||||
|
bsm.sort ();
|
||||||
|
|
||||||
|
AreaReceiver rec;
|
||||||
|
db::tagged_area_collector<double> coll (bsm, rec);
|
||||||
|
ep.process (coll, coll);
|
||||||
|
|
||||||
|
EXPECT_EQ (rec.get (), 6000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(4_PlainAreaApproximation)
|
||||||
|
{
|
||||||
|
db::EdgeProcessor ep;
|
||||||
|
|
||||||
|
ep.insert (db::SimplePolygon (db::Box (0, -1000, 1000, 1000)), 0);
|
||||||
|
ep.insert (db::SimplePolygon (db::Box (0, 0, 1000, 2000)), 0);
|
||||||
|
ep.insert (db::SimplePolygon (db::Box (500, 1000, 1500, 3000)), 1);
|
||||||
|
ep.insert (db::SimplePolygon (db::Box (0, 0, 1000, 2000)), 0);
|
||||||
|
ep.insert (db::SimplePolygon (db::Box (1000, 1000, 1500, 3000)), 1);
|
||||||
|
|
||||||
|
tl::bit_set_map<double> bsm;
|
||||||
|
bsm.insert (tl::BitSetMask (), 1.0);
|
||||||
|
bsm.sort ();
|
||||||
|
|
||||||
|
AreaReceiver rec;
|
||||||
|
db::tagged_area_collector<double> coll (bsm, rec);
|
||||||
|
ep.process (coll, coll);
|
||||||
|
|
||||||
|
EXPECT_EQ (rec.get (), 4500000);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue