mirror of https://github.com/KLayout/klayout.git
Fixed #277 (min_coherence not recognized by region size)
This commit is contained in:
parent
f59e49d678
commit
303cda6981
|
|
@ -764,7 +764,7 @@ AsIfFlatRegion::sized (coord_type dx, coord_type dy, unsigned int mode) const
|
||||||
db::Box b = bbox ().enlarged (db::Vector (dx, dy));
|
db::Box b = bbox ().enlarged (db::Vector (dx, dy));
|
||||||
return region_from_box (b);
|
return region_from_box (b);
|
||||||
|
|
||||||
} else if (! merged_semantics ()) {
|
} else if (! merged_semantics () || is_merged ()) {
|
||||||
|
|
||||||
// Generic case
|
// Generic case
|
||||||
std::auto_ptr<FlatRegion> new_region (new FlatRegion (false /*output isn't merged*/));
|
std::auto_ptr<FlatRegion> new_region (new FlatRegion (false /*output isn't merged*/));
|
||||||
|
|
@ -801,7 +801,7 @@ AsIfFlatRegion::sized (coord_type dx, coord_type dy, unsigned int mode) const
|
||||||
db::ShapeGenerator pc (new_region->raw_polygons (), true /*clear*/);
|
db::ShapeGenerator pc (new_region->raw_polygons (), true /*clear*/);
|
||||||
db::PolygonGenerator pg2 (pc, false /*don't resolve holes*/, true /*min. coherence*/);
|
db::PolygonGenerator pg2 (pc, false /*don't resolve holes*/, true /*min. coherence*/);
|
||||||
db::SizingPolygonFilter siz (pg2, dx, dy, mode);
|
db::SizingPolygonFilter siz (pg2, dx, dy, mode);
|
||||||
db::PolygonGenerator pg (siz, false /*don't resolve holes*/, false /*min. coherence*/);
|
db::PolygonGenerator pg (siz, false /*don't resolve holes*/, min_coherence () /*min. coherence*/);
|
||||||
db::BooleanOp op (db::BooleanOp::Or);
|
db::BooleanOp op (db::BooleanOp::Or);
|
||||||
ep.process (pg, op);
|
ep.process (pg, op);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -160,6 +160,11 @@ void DeepRegion::merged_semantics_changed ()
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DeepRegion::min_coherence_changed ()
|
||||||
|
{
|
||||||
|
set_is_merged (false);
|
||||||
|
}
|
||||||
|
|
||||||
RegionIteratorDelegate *
|
RegionIteratorDelegate *
|
||||||
DeepRegion::begin () const
|
DeepRegion::begin () const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -220,6 +220,7 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void merged_semantics_changed ();
|
virtual void merged_semantics_changed ();
|
||||||
|
virtual void min_coherence_changed ();
|
||||||
void set_is_merged (bool f);
|
void set_is_merged (bool f);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
|
|
@ -94,6 +94,13 @@ void FlatRegion::merged_semantics_changed ()
|
||||||
m_merged_polygons_valid = false;
|
m_merged_polygons_valid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FlatRegion::min_coherence_changed ()
|
||||||
|
{
|
||||||
|
m_is_merged = false;
|
||||||
|
m_merged_polygons.clear ();
|
||||||
|
m_merged_polygons_valid = false;
|
||||||
|
}
|
||||||
|
|
||||||
void FlatRegion::reserve (size_t n)
|
void FlatRegion::reserve (size_t n)
|
||||||
{
|
{
|
||||||
m_polygons.reserve (db::Polygon::tag (), n);
|
m_polygons.reserve (db::Polygon::tag (), n);
|
||||||
|
|
|
||||||
|
|
@ -180,6 +180,7 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void merged_semantics_changed ();
|
virtual void merged_semantics_changed ();
|
||||||
|
virtual void min_coherence_changed ();
|
||||||
virtual Box compute_bbox () const;
|
virtual Box compute_bbox () const;
|
||||||
void invalidate_cache ();
|
void invalidate_cache ();
|
||||||
void set_is_merged (bool m);
|
void set_is_merged (bool m);
|
||||||
|
|
|
||||||
|
|
@ -151,6 +151,14 @@ OriginalLayerRegion::merged_semantics_changed ()
|
||||||
m_merged_polygons_valid = false;
|
m_merged_polygons_valid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
OriginalLayerRegion::min_coherence_changed ()
|
||||||
|
{
|
||||||
|
m_is_merged = false;
|
||||||
|
m_merged_polygons.clear ();
|
||||||
|
m_merged_polygons_valid = false;
|
||||||
|
}
|
||||||
|
|
||||||
RegionIteratorDelegate *
|
RegionIteratorDelegate *
|
||||||
OriginalLayerRegion::begin () const
|
OriginalLayerRegion::begin () const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,7 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void merged_semantics_changed ();
|
virtual void merged_semantics_changed ();
|
||||||
|
virtual void min_coherence_changed ();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
OriginalLayerRegion &operator= (const OriginalLayerRegion &other);
|
OriginalLayerRegion &operator= (const OriginalLayerRegion &other);
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,10 @@ void RegionDelegate::set_base_verbosity (int vb)
|
||||||
|
|
||||||
void RegionDelegate::set_min_coherence (bool f)
|
void RegionDelegate::set_min_coherence (bool f)
|
||||||
{
|
{
|
||||||
m_merge_min_coherence = f;
|
if (f != m_merge_min_coherence) {
|
||||||
|
m_merge_min_coherence = f;
|
||||||
|
min_coherence_changed ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegionDelegate::set_merged_semantics (bool f)
|
void RegionDelegate::set_merged_semantics (bool f)
|
||||||
|
|
|
||||||
|
|
@ -319,6 +319,7 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void merged_semantics_changed () { }
|
virtual void merged_semantics_changed () { }
|
||||||
|
virtual void min_coherence_changed () { }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_merged_semantics;
|
bool m_merged_semantics;
|
||||||
|
|
|
||||||
|
|
@ -1406,3 +1406,30 @@ TEST(101_DeepFlatCollaboration)
|
||||||
db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_region_au101.gds");
|
db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_region_au101.gds");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(issue_277)
|
||||||
|
{
|
||||||
|
db::Layout ly;
|
||||||
|
db::cell_index_type top_cell_index = ly.add_cell ("TOP");
|
||||||
|
db::Cell &top_cell = ly.cell (top_cell_index);
|
||||||
|
unsigned int l1 = ly.insert_layer ();
|
||||||
|
|
||||||
|
db::Shapes &s = top_cell.shapes (l1);
|
||||||
|
s.insert (db::Box (0, 0, 400, 400));
|
||||||
|
s.insert (db::Box (400, 400, 800, 800));
|
||||||
|
|
||||||
|
|
||||||
|
db::DeepShapeStore dss;
|
||||||
|
|
||||||
|
db::Region r (db::RecursiveShapeIterator (ly, top_cell, l1), dss);
|
||||||
|
|
||||||
|
EXPECT_EQ (r.sized (1).merged (false, 1).to_string (), "");
|
||||||
|
|
||||||
|
r.set_min_coherence (true);
|
||||||
|
EXPECT_EQ (r.sized (1).merged (false, 1).to_string (), "(399,399;399,401;401,401;401,399)");
|
||||||
|
|
||||||
|
r.merge ();
|
||||||
|
EXPECT_EQ (r.sized (1).merged (false, 1).to_string (), "(399,399;399,401;401,401;401,399)");
|
||||||
|
|
||||||
|
r.set_min_coherence (false); // needs to merge again
|
||||||
|
EXPECT_EQ (r.sized (1).merged (false, 1).to_string (), "");
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1397,3 +1397,21 @@ TEST(issue_228)
|
||||||
EXPECT_EQ (r.selected_interacting (rr).to_string (), r.to_string ());
|
EXPECT_EQ (r.selected_interacting (rr).to_string (), r.to_string ());
|
||||||
EXPECT_EQ (rr.selected_interacting (r).to_string (), rr.to_string ());
|
EXPECT_EQ (rr.selected_interacting (r).to_string (), rr.to_string ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(issue_277)
|
||||||
|
{
|
||||||
|
db::Region r;
|
||||||
|
r.insert (db::Box (0, 0, 400, 400));
|
||||||
|
r.insert (db::Box (400, 400, 800, 800));
|
||||||
|
|
||||||
|
EXPECT_EQ (r.sized (1).merged (false, 1).to_string (), "");
|
||||||
|
|
||||||
|
r.set_min_coherence (true);
|
||||||
|
EXPECT_EQ (r.sized (1).merged (false, 1).to_string (), "(399,399;399,401;401,401;401,399)");
|
||||||
|
|
||||||
|
r.merge ();
|
||||||
|
EXPECT_EQ (r.sized (1).merged (false, 1).to_string (), "(399,399;399,401;401,401;401,399)");
|
||||||
|
|
||||||
|
r.set_min_coherence (false); // needs to merge again
|
||||||
|
EXPECT_EQ (r.sized (1).merged (false, 1).to_string (), "");
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue