diff --git a/src/pex/pex/pexSquareCountingRExtractor.cc b/src/pex/pex/pexSquareCountingRExtractor.cc index 97a96c1d1..0ad1bfa27 100644 --- a/src/pex/pex/pexSquareCountingRExtractor.cc +++ b/src/pex/pex/pexSquareCountingRExtractor.cc @@ -167,7 +167,7 @@ SquareCountingRExtractor::do_extract (const db::Polygon &db_poly, const std::vec if (r == 0) { rnetwork.create_element (pex::RElement::short_value (), pl->second, pl_next->second); } else { - rnetwork.create_element (r, pl->second, pl_next->second); + rnetwork.create_element (1.0 / r, pl->second, pl_next->second); } } diff --git a/src/pex/pex/pexTriangulationRExtractor.cc b/src/pex/pex/pexTriangulationRExtractor.cc index fabc3789e..e52a40f88 100644 --- a/src/pex/pex/pexTriangulationRExtractor.cc +++ b/src/pex/pex/pexTriangulationRExtractor.cc @@ -55,6 +55,8 @@ TriangulationRExtractor::extract (const db::Polygon &polygon, const std::vector< tri.triangulate (polygon, vertex_ports, m_tri_param, trans); + plc.dump ("debug.gds"); + } else { tl::SelfTimer timer_tri (tl::verbosity () >= m_tri_param.base_verbosity + 11, "Triangulation step"); diff --git a/src/pex/unit_tests/pexSquareCountingRExtractorTests.cc b/src/pex/unit_tests/pexSquareCountingRExtractorTests.cc index 77af14a1e..3da3d7b58 100644 --- a/src/pex/unit_tests/pexSquareCountingRExtractorTests.cc +++ b/src/pex/unit_tests/pexSquareCountingRExtractorTests.cc @@ -75,7 +75,7 @@ TEST(basic) rex.do_extract (poly, ports, rn); EXPECT_EQ (rn.to_string (), - "R $0 $1 0.390865\n" // w ramp w=100 to 1000 over x=0 to 1000 (squares = (x2-x1)/(w2-w1)*log(w2/w1) by integration) + "R $0 $1 2.55843\n" // w ramp w=100 to 1000 over x=0 to 1000 (squares = (x2-x1)/(w2-w1)*log(w2/w1) by integration) "R $1 $2 0\n" // transition from y=50 to y=500 parallel to current direction "R $2 $3 1" // 1 square between x=1000 and 2000 (w=1000) ); @@ -100,7 +100,7 @@ TEST(basic) EXPECT_EQ (rn.to_string (), "R $1 $3 1\n" "R $1 $2 0\n" - "R $0 $2 0.390865" + "R $0 $2 2.55843" ); } @@ -135,8 +135,54 @@ TEST(extraction) rex.extract (poly, vertex_ports, polygon_ports, rn); EXPECT_EQ (rn.to_string (), - "R $0 V0 0.0952381\n" - "R $0 V1 0.166667\n" - "R $0 P0 0.117647" + "R $0 V0 10.5\n" + "R $0 V1 6\n" + "R $0 P0 8.5" + ) +} + +TEST(extraction_meander) +{ + db::Point contour[] = { + db::Point (0, 0), + db::Point (0, 1000), + db::Point (1600, 1000), + db::Point (1600, 600), + db::Point (2000, 600), + db::Point (2000, 1000), + db::Point (3600, 1000), + db::Point (3600, 600), + db::Point (4000, 600), + db::Point (4000, 1000), + db::Point (4600, 1000), + db::Point (4600, 0), + db::Point (3000, 0), + db::Point (3000, 400), + db::Point (2600, 400), + db::Point (2600, 0), + db::Point (1000, 0), + db::Point (1000, 400), + db::Point (600, 400), + db::Point (600, 0) + }; + + db::Polygon poly; + poly.assign_hull (contour + 0, contour + sizeof (contour) / sizeof (contour[0])); + + double dbu = 0.001; + + pex::RNetwork rn; + pex::SquareCountingRExtractor rex (dbu); + + std::vector vertex_ports; + vertex_ports.push_back (db::Point (300, 0)); // V0 + vertex_ports.push_back (db::Point (4300, 1000)); // V1 + + std::vector polygon_ports; + + rex.extract (poly, vertex_ports, polygon_ports, rn); + + EXPECT_EQ (rn.to_string (), + "R V0 V1 10.0544" // that is pretty much the length of the center line / width :) ) } diff --git a/src/pex/unit_tests/pexTriangulationRExtractorTests.cc b/src/pex/unit_tests/pexTriangulationRExtractorTests.cc index b2bfff50c..09f1fce8f 100644 --- a/src/pex/unit_tests/pexTriangulationRExtractorTests.cc +++ b/src/pex/unit_tests/pexTriangulationRExtractorTests.cc @@ -313,3 +313,51 @@ TEST(extraction_analytic_disc) ) } +TEST(extraction_meander) +{ + db::Point contour[] = { + db::Point (0, 0), + db::Point (0, 1000), + db::Point (1600, 1000), + db::Point (1600, 600), + db::Point (2000, 600), + db::Point (2000, 1000), + db::Point (3600, 1000), + db::Point (3600, 600), + db::Point (4000, 600), + db::Point (4000, 1000), + db::Point (4600, 1000), + db::Point (4600, 0), + db::Point (3000, 0), + db::Point (3000, 400), + db::Point (2600, 400), + db::Point (2600, 0), + db::Point (1000, 0), + db::Point (1000, 400), + db::Point (600, 400), + db::Point (600, 0) + }; + + db::Polygon poly; + poly.assign_hull (contour + 0, contour + sizeof (contour) / sizeof (contour[0])); + + double dbu = 0.001; + + pex::RNetwork rn; + pex::TriangulationRExtractor rex (dbu); + rex.triangulation_parameters ().max_area = 10000 * dbu * dbu; + rex.triangulation_parameters ().min_b = 0.3; + + std::vector vertex_ports; + vertex_ports.push_back (db::Point (300, 0)); // V0 + vertex_ports.push_back (db::Point (4300, 1000)); // V1 + + std::vector polygon_ports; + + rex.extract (poly, vertex_ports, polygon_ports, rn); + + EXPECT_EQ (rn.to_string (), + "R V0 V1 8.75751" // what is the "real" value? + ) +} +