From 91005d5cb6896eb3862643f18b5d81ef3b1356e2 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 4 May 2025 20:42:12 +0200 Subject: [PATCH] Tests for RBA+pex, bug fixes --- src/pex/pex/gsiDeclRNetExtractor.cc | 4 +- testdata/ruby/pexTests.rb | 133 +++++++++++++++++++++++++++- 2 files changed, 134 insertions(+), 3 deletions(-) diff --git a/src/pex/pex/gsiDeclRNetExtractor.cc b/src/pex/pex/gsiDeclRNetExtractor.cc index 5a65f0367..3fff2dad5 100644 --- a/src/pex/pex/gsiDeclRNetExtractor.cc +++ b/src/pex/pex/gsiDeclRNetExtractor.cc @@ -315,7 +315,7 @@ Class decl_RExtractorTech ("pex", "RExtractorTech", "@brief Sets a value indicating whether to skip the simplify step\n" "See \\skip_simplify for a description of this attribute." ) + - gsi::method_ext ("each_via", &tech_begin_vias, &tech_end_vias, + gsi::iterator_ext ("each_via", &tech_begin_vias, &tech_end_vias, "@brief Iterates the list of via definitions\n" ) + gsi::method_ext ("clear_vias", &tech_clear_vias, @@ -324,7 +324,7 @@ Class decl_RExtractorTech ("pex", "RExtractorTech", gsi::method_ext ("add_via", &tech_add_via, gsi::arg ("via"), "@brief Adds the given via definition to the list of vias\n" ) + - gsi::method_ext ("each_conductor", &tech_begin_conductors, &tech_end_conductors, + gsi::iterator_ext ("each_conductor", &tech_begin_conductors, &tech_end_conductors, "@brief Iterates the list of conductor definitions\n" ) + gsi::method_ext ("clear_conductors", &tech_clear_conductors, diff --git a/testdata/ruby/pexTests.rb b/testdata/ruby/pexTests.rb index c18de6e03..477f07ed3 100644 --- a/testdata/ruby/pexTests.rb +++ b/testdata/ruby/pexTests.rb @@ -34,6 +34,7 @@ class PEX_TestClass < TestBase a = rn.create_node(RBA::RNode::VertexPort, 1) b = rn.create_node(RBA::RNode::Internal, 2) c = rn.create_node(RBA::RNode::PolygonPort, 3) + d = rn.create_node(RBA::RNode::PolygonPort, 3, 17) assert_equal(a.type, RBA::RNode::VertexPort) assert_equal(a.port_index, 1) @@ -43,6 +44,7 @@ class PEX_TestClass < TestBase assert_equal(b.to_s, "$2") assert_equal(c.to_s, "P3") + assert_equal(d.to_s, "P3.17") rab = rn.create_element(1.0, a, b) assert_equal(rab.a.object_id, a.object_id) @@ -58,7 +60,7 @@ class PEX_TestClass < TestBase assert_equal(b.each_element.collect(&:to_s).sort.join(";"), "R $2 P3 1;R $2 V1 0.5") assert_equal(rn.each_element.collect(&:to_s).sort.join(";"), "R $2 P3 1;R $2 V1 0.5") - assert_equal(rn.each_node.collect(&:to_s).sort.join(";"), "$2;P3;V1") + assert_equal(rn.each_node.collect(&:to_s).sort.join(";"), "$2;P3;P3.17;V1") rn.simplify assert_equal(rn.to_s, "R P3 V1 1.5") @@ -121,6 +123,135 @@ class PEX_TestClass < TestBase end + def test_4_ExtractorTech + + l1 = 1 + l2 = 2 + l3 = 3 + + tech = RBA::RExtractorTech::new + + tech.skip_simplify = true + assert_equal(tech.skip_simplify, true) + tech.skip_simplify = false + assert_equal(tech.skip_simplify, false) + + via1 = RBA::RExtractorTechVia::new + via1.bottom_conductor = l1 + via1.cut_layer = l2 + via1.top_conductor = l3 + via1.resistance = 2.0 + via1.merge_distance = 0.2 + + assert_equal(via1.bottom_conductor, l1) + assert_equal(via1.cut_layer, l2) + assert_equal(via1.top_conductor, l3) + assert_equal(via1.resistance, 2.0) + assert_equal(via1.merge_distance.to_s, "0.2") + + tech.add_via(via1) + assert_equal(tech.each_via.collect { |v| v.cut_layer }, [ l2 ]) + + tech.clear_vias + assert_equal(tech.each_via.collect { |v| v.cut_layer }, []) + + tech.add_via(via1) + assert_equal(tech.each_via.collect { |v| v.cut_layer }, [ l2 ]) + + cond1 = RBA::RExtractorTechConductor::new + cond1.layer = l1 + cond1.resistance = 0.5 + + assert_equal(cond1.layer, l1) + assert_equal(cond1.resistance, 0.5) + + cond2 = RBA::RExtractorTechConductor::new + cond2.layer = l3 + cond2.resistance = 0.25 + + tech.add_conductor(cond2) + assert_equal(tech.each_conductor.collect { |c| c.layer }, [ l3 ]) + + tech.clear_conductors + assert_equal(tech.each_conductor.collect { |c| c.layer }, []) + + tech.add_conductor(cond1) + tech.add_conductor(cond2) + assert_equal(tech.each_conductor.collect { |c| c.layer }, [ l1, l3 ]) + + end + + # A complete, small example for a R network extraction + + def test_5_NetEx + + ly = RBA::Layout::new + ly.read(File.join($ut_testsrc, "testdata", "pex", "netex_test1.gds")) + + rex = RBA::RNetExtractor::new(ly.dbu) + + tc = ly.top_cell + + l1 = ly.layer(1, 0) + l1p = ly.layer(1, 1) + l1v = ly.layer(1, 2) + l2 = ly.layer(2, 0) + l3 = ly.layer(3, 0) + l3p = ly.layer(3, 1) + l3v = ly.layer(3, 2) + + # That is coincidence, but it needs to be that way for the strings to match + assert_equal(l1, 1) + assert_equal(l2, 0) + assert_equal(l3, 2) + + geo = {} + [ l1, l2, l3 ].each do |l| + geo[l] = RBA::Region::new(tc.begin_shapes_rec(l)) + end + + tech = RBA::RExtractorTech::new + + via1 = RBA::RExtractorTechVia::new + via1.bottom_conductor = l1 + via1.cut_layer = l2 + via1.top_conductor = l3 + via1.resistance = 2.0 + via1.merge_distance = 0.2 + + tech.add_via(via1) + + cond1 = RBA::RExtractorTechConductor::new + cond1.layer = l1 + cond1.resistance = 0.5 + + cond2 = RBA::RExtractorTechConductor::new + cond2.layer = l3 + cond2.resistance = 0.25 + + tech.add_conductor(cond1) + tech.add_conductor(cond2) + + polygon_ports = { } + polygon_ports[l1] = RBA::Region::new(tc.begin_shapes_rec(l1p)).each_merged.to_a + polygon_ports[l3] = RBA::Region::new(tc.begin_shapes_rec(l3p)).each_merged.to_a + + vertex_ports = { } + vertex_ports[l1] = RBA::Region::new(tc.begin_shapes_rec(l1v)).each_merged.collect { |p| p.bbox.center } + vertex_ports[l3] = RBA::Region::new(tc.begin_shapes_rec(l3v)).each_merged.collect { |p| p.bbox.center } + + network = rex.extract(tech, geo, vertex_ports, polygon_ports) + + assert_equal(network.to_s(true) + "\n", <<"END") +R $2.1(9.3,-5.9;9.9,-5.3) P0.1(12.9,-5.9;13.5,-5.3) 2.25 +R $8.2(10,-3.5;10,-2.7) P0.2(12.9,-3.4;13.5,-2.8) 1 +R $2.1(9.3,-5.9;9.9,-5.3) V0.2(0.3,-5.7;0.5,-5.5) 55.75 +R $2.1(9.3,-5.9;9.9,-5.3) $8.2(10,-3.5;10,-2.7) 13.2813 +R $8.2(10,-3.5;10,-2.7) V0.1(5.2,0.4;5.2,0.4) 28.7812 +R V0.1(5.2,0.4;5.2,0.4) V0.2(0.3,-5.7;0.5,-5.5) 17.375 +END + end + end load("test_epilogue.rb")