mirror of https://github.com/KLayout/klayout.git
Some tests, smooth and round method of deep region
This commit is contained in:
parent
404f0f8328
commit
e8e45b7272
|
|
@ -947,6 +947,7 @@ DeepRegion::holes () const
|
|||
|
||||
const db::Shapes &s = c->shapes (m_merged_polygons.layer ());
|
||||
db::Shapes &st = c->shapes (res->deep_layer ().layer ());
|
||||
db::PolygonRefToShapesGenerator pr (&layout, &st);
|
||||
|
||||
for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::All); ! si.at_end (); ++si) {
|
||||
for (size_t i = 0; i < si->holes (); ++i) {
|
||||
|
|
@ -956,7 +957,7 @@ DeepRegion::holes () const
|
|||
pts.push_back (*p);
|
||||
}
|
||||
h.assign_hull (pts.begin (), pts.end ());
|
||||
st.insert (h);
|
||||
pr.put (h);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -979,6 +980,7 @@ DeepRegion::hulls () const
|
|||
|
||||
const db::Shapes &s = c->shapes (m_merged_polygons.layer ());
|
||||
db::Shapes &st = c->shapes (res->deep_layer ().layer ());
|
||||
db::PolygonRefToShapesGenerator pr (&layout, &st);
|
||||
|
||||
for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::All); ! si.at_end (); ++si) {
|
||||
db::Polygon h;
|
||||
|
|
@ -987,7 +989,7 @@ DeepRegion::hulls () const
|
|||
pts.push_back (*p);
|
||||
}
|
||||
h.assign_hull (pts.begin (), pts.end ());
|
||||
st.insert (h);
|
||||
pr.put (h);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1007,20 +1009,32 @@ DeepRegion::rounded_corners (double rinner, double router, unsigned int n) const
|
|||
{
|
||||
ensure_merged_polygons_valid ();
|
||||
|
||||
// @@@ scaled instances
|
||||
db::MagnificationReducer red;
|
||||
db::cell_variants_collector<db::MagnificationReducer> vars (red);
|
||||
vars.collect (m_merged_polygons.layout (), m_merged_polygons.initial_cell ());
|
||||
|
||||
// NOTE: m_merged_polygons is mutable, so why is the const_cast needed?
|
||||
const_cast<db::DeepLayer &> (m_merged_polygons).separate_variants (vars);
|
||||
|
||||
db::Layout &layout = m_merged_polygons.layout ();
|
||||
|
||||
std::auto_ptr<db::DeepRegion> res (new db::DeepRegion (m_merged_polygons.new_layer ()));
|
||||
for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) {
|
||||
|
||||
const std::map<db::ICplxTrans, size_t> &v = vars.variants (c->cell_index ());
|
||||
tl_assert (v.size () == size_t (1));
|
||||
double mag = v.begin ()->first.mag ();
|
||||
db::Coord rinner_with_mag = db::coord_traits<db::Coord>::rounded (rinner / mag);
|
||||
db::Coord router_with_mag = db::coord_traits<db::Coord>::rounded (router / mag);
|
||||
|
||||
const db::Shapes &s = c->shapes (m_merged_polygons.layer ());
|
||||
db::Shapes &st = c->shapes (res->deep_layer ().layer ());
|
||||
db::PolygonRefToShapesGenerator pr (&layout, &st);
|
||||
|
||||
for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::All); ! si.at_end (); ++si) {
|
||||
db::Polygon poly;
|
||||
si->polygon (poly);
|
||||
st.insert (db::compute_rounded (poly, rinner, router, n));
|
||||
pr.put (db::compute_rounded (poly, rinner_with_mag, router_with_mag, n));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1033,20 +1047,31 @@ DeepRegion::smoothed (coord_type d) const
|
|||
{
|
||||
ensure_merged_polygons_valid ();
|
||||
|
||||
// @@@ scaled instances
|
||||
db::MagnificationReducer red;
|
||||
db::cell_variants_collector<db::MagnificationReducer> vars (red);
|
||||
vars.collect (m_merged_polygons.layout (), m_merged_polygons.initial_cell ());
|
||||
|
||||
// NOTE: m_merged_polygons is mutable, so why is the const_cast needed?
|
||||
const_cast<db::DeepLayer &> (m_merged_polygons).separate_variants (vars);
|
||||
|
||||
db::Layout &layout = m_merged_polygons.layout ();
|
||||
|
||||
std::auto_ptr<db::DeepRegion> res (new db::DeepRegion (m_merged_polygons.new_layer ()));
|
||||
for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) {
|
||||
|
||||
const std::map<db::ICplxTrans, size_t> &v = vars.variants (c->cell_index ());
|
||||
tl_assert (v.size () == size_t (1));
|
||||
double mag = v.begin ()->first.mag ();
|
||||
db::Coord d_with_mag = db::coord_traits<db::Coord>::rounded (d / mag);
|
||||
|
||||
const db::Shapes &s = c->shapes (m_merged_polygons.layer ());
|
||||
db::Shapes &st = c->shapes (res->deep_layer ().layer ());
|
||||
db::PolygonRefToShapesGenerator pr (&layout, &st);
|
||||
|
||||
for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::All); ! si.at_end (); ++si) {
|
||||
db::Polygon poly;
|
||||
si->polygon (poly);
|
||||
st.insert (db::smooth (poly, d));
|
||||
pr.put (db::smooth (poly, d_with_mag));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -573,6 +573,82 @@ TEST(9_SizingWithBoolean)
|
|||
db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_region_au9e.gds");
|
||||
}
|
||||
|
||||
TEST(10_HullsAndHoles)
|
||||
{
|
||||
db::Layout ly;
|
||||
{
|
||||
std::string fn (tl::testsrc ());
|
||||
fn += "/testdata/algo/deep_region_area_peri_l1.gds";
|
||||
tl::InputStream stream (fn);
|
||||
db::Reader reader (stream);
|
||||
reader.read (ly);
|
||||
}
|
||||
|
||||
db::cell_index_type top_cell_index = *ly.begin_top_down ();
|
||||
db::Cell &top_cell = ly.cell (top_cell_index);
|
||||
|
||||
db::DeepShapeStore dss;
|
||||
dss.set_max_vertex_count (4);
|
||||
dss.set_threads (0);
|
||||
|
||||
unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0));
|
||||
|
||||
db::Region r1 (db::RecursiveShapeIterator (ly, top_cell, l1), dss);
|
||||
db::Region r1_sized = r1.sized (2000);
|
||||
r1_sized -= r1;
|
||||
|
||||
db::Region hulls = r1_sized.hulls ();
|
||||
db::Region holes = r1_sized.holes ();
|
||||
|
||||
db::Layout target;
|
||||
unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index));
|
||||
|
||||
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (10, 0)), r1_sized);
|
||||
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), hulls);
|
||||
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (12, 0)), holes);
|
||||
|
||||
CHECKPOINT();
|
||||
db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_region_au10.gds");
|
||||
}
|
||||
|
||||
TEST(11_RoundAndSmoothed)
|
||||
{
|
||||
db::Layout ly;
|
||||
{
|
||||
std::string fn (tl::testsrc ());
|
||||
fn += "/testdata/algo/deep_region_area_peri_l1.gds";
|
||||
tl::InputStream stream (fn);
|
||||
db::Reader reader (stream);
|
||||
reader.read (ly);
|
||||
}
|
||||
|
||||
db::cell_index_type top_cell_index = *ly.begin_top_down ();
|
||||
db::Cell &top_cell = ly.cell (top_cell_index);
|
||||
|
||||
db::DeepShapeStore dss;
|
||||
dss.set_max_vertex_count (4);
|
||||
dss.set_threads (0);
|
||||
|
||||
unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0));
|
||||
|
||||
db::Region r1 (db::RecursiveShapeIterator (ly, top_cell, l1), dss);
|
||||
db::Region r1_sized = r1.sized (2000);
|
||||
r1_sized -= r1;
|
||||
|
||||
db::Region rounded = r1_sized.rounded_corners (3000, 5000, 100);
|
||||
db::Region smoothed = rounded.smoothed (100);
|
||||
|
||||
db::Layout target;
|
||||
unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index));
|
||||
|
||||
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (10, 0)), r1_sized);
|
||||
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), rounded);
|
||||
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (12, 0)), smoothed);
|
||||
|
||||
CHECKPOINT();
|
||||
db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_region_au11.gds");
|
||||
}
|
||||
|
||||
TEST(100_Integration)
|
||||
{
|
||||
db::Layout ly;
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue