mirror of
https://github.com/KLayout/klayout.git
synced 2026-09-03 08:26:27 +02:00
Fixed #807 - now supporting incremental connect and clear_connections in DRC/LVS
This commit is contained in:
Vendored
+13
-1
@@ -1,5 +1,5 @@
|
||||
|
||||
# Hierarchical antenna check
|
||||
# Flat antenna check
|
||||
|
||||
source($drc_test_source, "RINGO")
|
||||
target($drc_test_target)
|
||||
@@ -14,6 +14,17 @@ metal2 = input(8, 0)
|
||||
|
||||
gate = diff & poly
|
||||
|
||||
connect(gate, poly)
|
||||
connect(poly, poly_cont)
|
||||
connect(poly_cont, metal1)
|
||||
|
||||
antenna_check(gate, metal1, 1.0).output(201)
|
||||
antenna_check(gate, metal1, 2.0).output(202)
|
||||
antenna_check(gate, metal1, 3.0).output(203)
|
||||
antenna_check(gate, metal1, 4.0).output(204)
|
||||
|
||||
clear_connections
|
||||
|
||||
connect(gate, poly)
|
||||
connect(poly, poly_cont)
|
||||
connect(poly_cont, metal1)
|
||||
@@ -24,3 +35,4 @@ antenna_check(gate, metal2, 1.0).output(101)
|
||||
antenna_check(gate, metal2, 5.0).output(105)
|
||||
antenna_check(gate, metal2, 10.0).output(110)
|
||||
antenna_check(gate, metal2, 50.0).output(150)
|
||||
|
||||
|
||||
Vendored
+33
@@ -0,0 +1,33 @@
|
||||
|
||||
# Flat antenna check
|
||||
|
||||
source($drc_test_source, "RINGO")
|
||||
target($drc_test_target)
|
||||
|
||||
diff = input(2, 0)
|
||||
poly = input(3, 0)
|
||||
contact = input(4, 0)
|
||||
poly_cont = input(5, 0)
|
||||
metal1 = input(6, 0)
|
||||
via1 = input(7, 0)
|
||||
metal2 = input(8, 0)
|
||||
|
||||
gate = diff & poly
|
||||
|
||||
connect(gate, poly)
|
||||
connect(poly, poly_cont)
|
||||
connect(poly_cont, metal1)
|
||||
|
||||
antenna_check(gate, metal1, 1.0).output(201)
|
||||
antenna_check(gate, metal1, 2.0).output(202)
|
||||
antenna_check(gate, metal1, 3.0).output(203)
|
||||
antenna_check(gate, metal1, 4.0).output(204)
|
||||
|
||||
connect(metal1, via1)
|
||||
connect(via1, metal2)
|
||||
|
||||
antenna_check(gate, metal2, 1.0).output(101)
|
||||
antenna_check(gate, metal2, 5.0).output(105)
|
||||
antenna_check(gate, metal2, 10.0).output(110)
|
||||
antenna_check(gate, metal2, 50.0).output(150)
|
||||
|
||||
Vendored
BIN
Binary file not shown.
Vendored
+48
@@ -576,6 +576,54 @@ end;
|
||||
self.assertEqual(str(a1_10.flatten() ^ pya.Region(ly_au.top_cell().begin_shapes_rec(ly_au.layer(101, 0)))), "")
|
||||
self.assertEqual(str(a1_30.flatten() ^ pya.Region(ly_au.top_cell().begin_shapes_rec(ly_au.layer(102, 0)))), "")
|
||||
|
||||
# --- simple incremental antenna check with metal1 + metal2
|
||||
|
||||
l2n._destroy()
|
||||
l2n = pya.LayoutToNetlist(dss)
|
||||
|
||||
l2n.register(rdiode, "diode")
|
||||
l2n.register(rpoly, "poly")
|
||||
l2n.register(rcont, "cont")
|
||||
l2n.register(rmetal1, "metal1")
|
||||
l2n.register(rvia1, "via1")
|
||||
l2n.register(rmetal2, "metal2")
|
||||
|
||||
l2n.connect(rpoly)
|
||||
l2n.connect(rcont)
|
||||
l2n.connect(rmetal1)
|
||||
l2n.connect(rmetal2)
|
||||
l2n.connect(rpoly, rcont)
|
||||
l2n.connect(rcont, rmetal1)
|
||||
|
||||
self.assertEqual(l2n.is_extracted(), False)
|
||||
l2n.extract_netlist()
|
||||
self.assertEqual(l2n.is_extracted(), True)
|
||||
|
||||
a1_3 = l2n.antenna_check(rpoly, rmetal1, 3)
|
||||
a1_10 = l2n.antenna_check(rpoly, rmetal1, 10)
|
||||
a1_30 = l2n.antenna_check(rpoly, rmetal1, 30)
|
||||
|
||||
# Note: flatten.merged performs some normalization
|
||||
self.assertEqual(str(a1_3.flatten() ^ pya.Region(ly_au.top_cell().begin_shapes_rec(ly_au.layer(100, 0)))), "")
|
||||
self.assertEqual(str(a1_10.flatten() ^ pya.Region(ly_au.top_cell().begin_shapes_rec(ly_au.layer(101, 0)))), "")
|
||||
self.assertEqual(str(a1_30.flatten() ^ pya.Region(ly_au.top_cell().begin_shapes_rec(ly_au.layer(102, 0)))), "")
|
||||
|
||||
l2n.connect(rmetal1, rvia1)
|
||||
l2n.connect(rvia1, rmetal2)
|
||||
|
||||
self.assertEqual(l2n.is_extracted(), False)
|
||||
l2n.extract_netlist()
|
||||
self.assertEqual(l2n.is_extracted(), True)
|
||||
|
||||
a2_5 = l2n.antenna_check(rpoly, rmetal2, 5)
|
||||
a2_10 = l2n.antenna_check(rpoly, rmetal2, 10)
|
||||
a2_17 = l2n.antenna_check(rpoly, rmetal2, 17)
|
||||
|
||||
# Note: flatten.merged performs some normalization
|
||||
self.assertEqual(str(a2_5.flatten() ^ pya.Region(ly_au.top_cell().begin_shapes_rec(ly_au.layer(200, 0)))), "")
|
||||
self.assertEqual(str(a2_10.flatten() ^ pya.Region(ly_au.top_cell().begin_shapes_rec(ly_au.layer(201, 0)))), "")
|
||||
self.assertEqual(str(a2_17.flatten() ^ pya.Region(ly_au.top_cell().begin_shapes_rec(ly_au.layer(202, 0)))), "")
|
||||
|
||||
# --- simple antenna check with metal2
|
||||
|
||||
l2n._destroy()
|
||||
|
||||
Vendored
+59
-1
@@ -170,7 +170,8 @@ class DBLayoutToNetlist_TestClass < TestBase
|
||||
# Perform netlist extraction
|
||||
l2n.extract_netlist
|
||||
|
||||
assert_equal(l2n.netlist.to_s, <<END)
|
||||
nl_string = l2n.netlist.to_s
|
||||
assert_equal(nl_string, <<END)
|
||||
circuit TRANS ($1=$1,$2=$2);
|
||||
end;
|
||||
circuit INV2 (OUT=OUT,$2=$3,$3=$4);
|
||||
@@ -218,6 +219,15 @@ END
|
||||
assert_equal(r.to_s,
|
||||
"(-980,-420;-980,2420;-620,2420;-620,-420);(-800,820;-800,1180;580,1180;580,820);(-980,2420;-980,3180;-620,3180;-620,2420);(-980,-380;-980,380;-620,380;-620,-380)")
|
||||
|
||||
assert_equal(l2n.is_extracted?, true)
|
||||
l2n.reset_extracted
|
||||
assert_equal(l2n.is_extracted?, false)
|
||||
assert_equal(l2n.netlist.inspect, "nil")
|
||||
|
||||
l2n.extract_netlist
|
||||
assert_equal(l2n.is_extracted?, true)
|
||||
assert_equal(l2n.netlist.to_s, nl_string)
|
||||
|
||||
end
|
||||
|
||||
def test_10_LayoutToNetlistExtractionWithoutDevices
|
||||
@@ -755,6 +765,54 @@ END
|
||||
assert_equal((a2_10.flatten ^ RBA::Region::new(ly_au.top_cell.begin_shapes_rec(ly_au.layer(201, 0)))).to_s, "")
|
||||
assert_equal((a2_17.flatten ^ RBA::Region::new(ly_au.top_cell.begin_shapes_rec(ly_au.layer(202, 0)))).to_s, "")
|
||||
|
||||
# --- simple incremental antenna check with metal1 + metal2
|
||||
|
||||
l2n._destroy
|
||||
l2n = RBA::LayoutToNetlist::new(dss)
|
||||
|
||||
l2n.register(rdiode, "diode")
|
||||
l2n.register(rpoly, "poly")
|
||||
l2n.register(rcont, "cont")
|
||||
l2n.register(rmetal1, "metal1")
|
||||
l2n.register(rvia1, "via1")
|
||||
l2n.register(rmetal2, "metal2")
|
||||
|
||||
l2n.connect(rpoly)
|
||||
l2n.connect(rcont)
|
||||
l2n.connect(rmetal1)
|
||||
l2n.connect(rmetal2)
|
||||
l2n.connect(rpoly, rcont)
|
||||
l2n.connect(rcont, rmetal1)
|
||||
|
||||
assert_equal(l2n.is_extracted?, false)
|
||||
l2n.extract_netlist
|
||||
assert_equal(l2n.is_extracted?, true)
|
||||
|
||||
a1_3 = l2n.antenna_check(rpoly, rmetal1, 3)
|
||||
a1_10 = l2n.antenna_check(rpoly, rmetal1, 10)
|
||||
a1_30 = l2n.antenna_check(rpoly, rmetal1, 30)
|
||||
|
||||
# Note: flatten.merged performs some normalization
|
||||
assert_equal((a1_3.flatten ^ RBA::Region::new(ly_au.top_cell.begin_shapes_rec(ly_au.layer(100, 0)))).to_s, "")
|
||||
assert_equal((a1_10.flatten ^ RBA::Region::new(ly_au.top_cell.begin_shapes_rec(ly_au.layer(101, 0)))).to_s, "")
|
||||
assert_equal((a1_30.flatten ^ RBA::Region::new(ly_au.top_cell.begin_shapes_rec(ly_au.layer(102, 0)))).to_s, "")
|
||||
|
||||
l2n.connect(rmetal1, rvia1)
|
||||
l2n.connect(rvia1, rmetal2)
|
||||
|
||||
assert_equal(l2n.is_extracted?, false)
|
||||
l2n.extract_netlist
|
||||
assert_equal(l2n.is_extracted?, true)
|
||||
|
||||
a2_5 = l2n.antenna_check(rpoly, rmetal2, 5)
|
||||
a2_10 = l2n.antenna_check(rpoly, rmetal2, 10)
|
||||
a2_17 = l2n.antenna_check(rpoly, rmetal2, 17)
|
||||
|
||||
# Note: flatten.merged performs some normalization
|
||||
assert_equal((a2_5.flatten ^ RBA::Region::new(ly_au.top_cell.begin_shapes_rec(ly_au.layer(200, 0)))).to_s, "")
|
||||
assert_equal((a2_10.flatten ^ RBA::Region::new(ly_au.top_cell.begin_shapes_rec(ly_au.layer(201, 0)))).to_s, "")
|
||||
assert_equal((a2_17.flatten ^ RBA::Region::new(ly_au.top_cell.begin_shapes_rec(ly_au.layer(202, 0)))).to_s, "")
|
||||
|
||||
# --- antenna check with diodes and antenna effect reduction
|
||||
|
||||
l2n._destroy
|
||||
|
||||
Reference in New Issue
Block a user