RBA tests, reproducible order of edge events, all edges are reported - even those which do not have neighbors.

This commit is contained in:
Matthias Koefferlein 2024-10-31 23:43:27 +01:00
parent 3073c1917f
commit 2629700566
6 changed files with 136 additions and 5 deletions

View File

@ -117,7 +117,7 @@ EdgeNeighborhoodCompoundOperationNode::EdgeNeighborhoodCompoundOperationNode (co
db::Coord
EdgeNeighborhoodCompoundOperationNode::computed_dist () const
{
return std::max (std::max (m_bext, m_eext), std::max (m_din, m_dout));
return std::max (std::max (m_bext, m_eext), std::max (m_din, m_dout)) + 1;
}
std::string
@ -140,25 +140,41 @@ public:
// .. nothing yet ..
}
void add (const db::Edge *o1, const unsigned int & /*p1*/, const db::Polygon *o2, const unsigned int &p2)
void add (const db::Edge *o1, const unsigned int &p1, const db::Polygon *o2, const unsigned int &p2)
{
m_edge_neighbors[o1][p2].push_back (o2);
m_edge_neighbors[p1][p2].push_back (o2);
enter_edge (o1, p1);
}
void finish1 (const db::Edge *o1, const unsigned int &p1)
{
m_edge_neighbors[p1];
enter_edge (o1, p1);
}
void finalize (bool)
{
for (auto en = m_edge_neighbors.begin (); en != m_edge_neighbors.end (); ++en) {
commit_edge (*en->first, en->second);
commit_edge (m_edges[en->first], en->second);
}
}
private:
std::map<const db::Edge *, std::map<unsigned int, std::vector<const db::Polygon *> > > m_edge_neighbors;
std::map<unsigned int, std::map<unsigned int, std::vector<const db::Polygon *> > > m_edge_neighbors;
std::vector<db::Edge> m_edges;
db::EdgeNeighborhoodVisitor *mp_visitor;
const db::Layout *mp_layout;
const db::Cell *mp_cell;
db::Coord m_bext, m_eext, m_din, m_dout;
void enter_edge (const db::Edge *o1, const unsigned int &p1)
{
while (size_t (p1) >= m_edges.size ()) {
m_edges.push_back (db::Edge ());
}
m_edges[p1] = *o1;
}
void commit_edge (const db::Edge &edge, const std::map<unsigned int, std::vector<const db::Polygon *> > &neighbors) const
{
if (edge.is_degenerate ()) {

View File

@ -101,6 +101,7 @@ RUBYTEST (dbEdgePairsTest, "dbEdgePairsTest.rb")
RUBYTEST (dbEdgePairTest, "dbEdgePairTest.rb")
RUBYTEST (dbEdgesTest, "dbEdgesTest.rb")
RUBYTEST (dbEdgeTest, "dbEdgeTest.rb")
RUBYTEST (dbEdgeNeighborhood, "dbEdgeNeighborhood.rb")
RUBYTEST (dbGlyphs, "dbGlyphs.rb")
RUBYTEST (dbHierNetworkProcessorTests, "dbHierNetworkProcessorTests.rb")
RUBYTEST (dbInstanceTest, "dbInstanceTest.rb")

Binary file not shown.

Binary file not shown.

Binary file not shown.

114
testdata/ruby/dbEdgeNeighborhood.rb vendored Normal file
View File

@ -0,0 +1,114 @@
# encoding: UTF-8
# KLayout Layout Viewer
# Copyright (C) 2006-2024 Matthias Koefferlein
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
if !$:.member?(File::dirname($0))
$:.push(File::dirname($0))
end
load("test_prologue.rb")
class MyVisitor < RBA::EdgeNeighborhoodVisitor
def initialize
@log = ""
end
def log
@log
end
def begin_polygon(layout, cell, polygon)
output(polygon)
@log += "Polygon: #{polygon}\n"
end
def end_polygon
@log += "/Polygon\n"
end
def on_edge(layout, cell, edge, neighborhood)
@log += "edge = #{edge}\n"
neighborhood.each do |n|
x1, x2 = n[0]
polygons = n[1]
polygons.each do |inp, poly|
poly_str = poly.collect { |p| p.to_s }.join("/")
@log += " #{x1},#{x2} -> #{inp}: #{poly_str}\n"
end
end
end
end
class DBEdgeNeighborhood_TestClass < TestBase
def test_1
ly = RBA::Layout::new
l1 = ly.layer(1, 0)
cell = ly.create_cell("TOP")
cell.shapes(l1).insert(RBA::Box::new(0, 0, 1000, 1000))
cell.shapes(l1).insert(RBA::Box::new(-1100, 0, -100, 1000))
prim = RBA::Region::new(cell.begin_shapes_rec(l1))
visitor = MyVisitor::new
visitor.result_type = RBA::CompoundRegionOperationNode::ResultType::Region
assert_equal(visitor.result_type, RBA::CompoundRegionOperationNode::ResultType::Region)
bext = 0
eext = 0
din = 10
dout = 100
children = [
RBA::CompoundRegionOperationNode::new_foreign
]
node = RBA::CompoundRegionOperationNode::new_edge_neighborhood(children, visitor, bext, eext, din, dout)
res = prim.complex_op(node)
assert_equal(visitor.log,
"Polygon: (0,0;0,1000;1000,1000;1000,0)\n" +
"edge = (0,0;0,1000)\n" +
" 0.0,1000.0 -> 0: (0,100;0,101;1000,101;1000,100)\n" +
"edge = (0,1000;1000,1000)\n" +
"edge = (1000,1000;1000,0)\n" +
"edge = (1000,0;0,0)\n" +
"/Polygon\n" +
"Polygon: (-1100,0;-1100,1000;-100,1000;-100,0)\n" +
"edge = (-1100,0;-1100,1000)\n" +
"edge = (-1100,1000;-100,1000)\n" +
"edge = (-100,1000;-100,0)\n" +
" 0.0,1000.0 -> 0: (0,100;0,101;1000,101;1000,100)\n" +
"edge = (-100,0;-1100,0)\n" +
"/Polygon\n"
)
assert_equal(res.to_s, "(-1100,0;-1100,1000;-100,1000;-100,0);(0,0;0,1000;1000,1000;1000,0)")
end
end
load("test_epilogue.rb")