1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
# Moved implementation
source($drc_test_source)
target($drc_test_target)
if $drc_test_deep
deep
end
# properties on input
l1 = input(1, 0)
l2 = input(2, 0)
l3_wp = input(3, 0, enable_props)
l3_wp1_input = input(3, 0, select_props(1))
l3_wp2as1_input = input(3, 0, map_props({ 2 => 1 }))
l3 = input(3, 0)
l4_wp = input(4, 0, enable_props)
l4 = input(4, 0)
# derived properties
l3_wp1 = l3_wp.select_props(1)
l3_wp2as1 = l3_wp.map_props({ 2 => 1 })
l3_nowp = l3_wp.remove_props
# dump to output
l1.output(1, 0)
l2.output(2, 0)
l3.output(3, 0)
l4.output(4, 0)
l3_wp.output(10, 0)
l3_wp1.output(11, 0)
l3_wp2as1.output(12, 0)
l3_nowp.output(13, 0)
l3_wp1_input.output(14, 0)
l3_wp2as1_input.output(15, 0)
l4_wp.output(16, 0)
# booleans with properties constraints
l3_wp.and(l4_wp, props_eq + props_copy).output(20, 0)
l3_wp1.and(l4_wp, props_eq + props_copy).output(21, 0)
l3_wp2as1.and(l4_wp, props_eq + props_copy).output(22, 0)
l3_nowp.and(l4_wp, props_eq + props_copy).output(23, 0)
l3_wp.and(l4_wp, props_ne + props_copy).output(30, 0)
l3_wp1.and(l4_wp, props_ne + props_copy).output(31, 0)
l3_wp2as1.and(l4_wp, props_ne + props_copy).output(32, 0)
l3_nowp.and(l4_wp, props_ne + props_copy).output(33, 0)
l3_wp.and(l4_wp, props_copy).output(40, 0)
l3_wp1.and(l4_wp, props_copy).output(41, 0)
l3_wp2as1.and(l4_wp, props_copy).output(42, 0)
l3_nowp.and(l4_wp, props_copy).output(43, 0)
l3_wp.and(l4_wp).output(50, 0)
l3_wp1.and(l4_wp).output(51, 0)
l3_wp2as1.and(l4_wp).output(52, 0)
l3_nowp.and(l4_wp).output(53, 0)
connect(l1, l2)
l1.nets.output(100, 0)
l1.nets(self._netter).output(101, 0)
l1.nets(prop(1)).output(102, 0)
l1.nets(prop(nil)).output(103, 0)
x1 = l1.nets("X")
x1.output(110, 0)
l1.nets("TOP", "X").output(111, 0)
l1.nets("TOP", "NOTEXIST").output(112, 0)
l1.nets("NOTEXIST", "NOTEXIST").output(113, 0)
x2 = l1.nets(*netlist.nets_by_name("X"))
(x1 ^ x2).output(114, 0)
# checks with property constraints
l1_nets = l1.nets
l1_nets.space(1.0.um, projection).polygons.output(200, 0)
l1_nets.space(1.0.um, projection, props_eq + props_copy).polygons.output(201, 0)
l1_nets.space(1.0.um, projection, props_ne + props_copy).polygons.output(202, 0)
l1_nets.space(1.0.um, projection, props_copy).polygons.output(203, 0)
l1_nets.width(1.0.um, projection).polygons.output(204, 0)
l1_nets.width(1.0.um, projection, props_copy).polygons.output(205, 0)
l1_nets.space(1.0.um, projection, props_eq).polygons.output(206, 0)
l1_nets.space(1.0.um, projection, props_ne).polygons.output(207, 0)
l1_nets.drc(space(projection) < 1.0.um).polygons.output(210, 0)
l1_nets.drc(space(projection) < 1.0.um, props_eq + props_copy).polygons.output(211, 0)
l1_nets.drc(space(projection) < 1.0.um, props_ne + props_copy).polygons.output(212, 0)
l1_nets.drc(space(projection) < 1.0.um, props_copy).polygons.output(213, 0)
l1_nets.drc(width(projection) < 1.0.um).polygons.output(214, 0)
l1_nets.drc(width(projection) < 1.0.um, props_copy).polygons.output(215, 0)
l1_nets.drc(space(projection) < 1.0.um, props_eq).polygons.output(216, 0)
l1_nets.drc(space(projection) < 1.0.um, props_ne).polygons.output(217, 0)
# edge pair to edge/polygon conversion with properties
l1_nets.space(1.0.um, projection, props_copy).output(220, 0)
l1_nets.space(1.0.um, projection, props_copy).first_edges.output(221, 0)
l1_nets.space(1.0.um, projection, props_copy).second_edges.output(222, 0)
l1_nets.space(1.0.um, projection, props_copy).edges.output(223, 0)
l1_nets.space(1.0.um, projection, props_copy).edges.extended_in(10.nm).output(224, 0)
# sizing with properties
l1_nets_sized = l1_nets.sized(0.2.um)
l1_nets_sized.and(l1_nets_sized, props_ne + props_copy).output(300, 0) # overlap of different nets, same layer
l1_nets_sized.and(l1_nets_sized, props_ne).output(301, 0)
l1_nets.drc(primary.sized(0.2.um) & foreign.sized(0.2.um)).output(310, 0)
l1_nets.drc(primary.sized(0.2.um) & foreign.sized(0.2.um), props_ne + props_copy).output(311, 0)
l1_nets.drc(primary.sized(0.2.um) & foreign.sized(0.2.um), props_eq + props_copy).output(312, 0)
l1_nets.drc(primary.sized(0.2.um) & foreign.sized(0.2.um), props_copy).output(313, 0)
l1_nets.drc(primary.sized(0.2.um) & foreign.sized(0.2.um), props_ne).output(314, 0)
l1_nets.drc(primary.sized(0.2.um) & foreign.sized(0.2.um), props_eq).output(315, 0)
|