Example #1
0
                            floor(0.5 + (y + yw) / dbu))
            if b.overlaps(top_bbox):
                colstart = colstart or ncolumns
                boxes.append(b)
            x += xw
            ncolumns += 1

        if colstart:

            col = colstart

            # Actually do the clip
            cells = main_layout.multi_clip_into(top_index, cl, boxes)

            ep = pya.ShapeProcessor()
            merged = pya.Shapes()

            # Compute the area within area box
            for c in cells:

                # merge the shapes to polygons and compute the area
                ep.merge(cl, cl.cell(c), input_layer, merged, True, 0, False,
                         False)
                a = 0
                for m in merged.each():
                    a += m.polygon.area()

                # compute and store the density
                a = a * dbu * dbu / (xw * xw)
                printstr = 'Region: (%08.3f,%08.3f) - (%08.3f,%08.3f): %06.3f%%' \
                  % ((col-1)*xw, y, col*xw, y+yw, 100*a)
Example #2
0
    def test_2_ShapesFromNet(self):

        ut_testsrc = os.getenv("TESTSRC")

        ly = pya.Layout()
        ly.read(
            os.path.join(ut_testsrc, "testdata", "algo",
                         "device_extract_l1.gds"))

        l2n = pya.LayoutToNetlist(
            pya.RecursiveShapeIterator(ly, ly.top_cell(), []))

        # only plain backend connectivity

        rmetal1 = l2n.make_polygon_layer(ly.layer(6, 0), "metal1")
        rmetal1_lbl = l2n.make_text_layer(ly.layer(6, 1), "metal1_lbl")
        rvia1 = l2n.make_polygon_layer(ly.layer(7, 0), "via1")
        rmetal2 = l2n.make_polygon_layer(ly.layer(8, 0), "metal2")
        rmetal2_lbl = l2n.make_text_layer(ly.layer(8, 1), "metal2_lbl")

        # Intra-layer
        l2n.connect(rmetal1)
        l2n.connect(rvia1)
        l2n.connect(rmetal2)

        # Inter-layer
        l2n.connect(rmetal1, rvia1)
        l2n.connect(rvia1, rmetal2)
        l2n.connect(rmetal1, rmetal1_lbl)  #  attaches labels
        l2n.connect(rmetal2, rmetal2_lbl)  #  attaches labels

        # Perform netlist extraction
        l2n.extract_netlist()

        self.assertEqual(
            str(l2n.netlist()), """circuit TRANS ($1=$1,$2=$2);
end;
circuit INV2 (OUT=OUT,$2=$2,$3=$3,$4=$4);
  subcircuit TRANS $1 ($1=$4,$2=OUT);
  subcircuit TRANS $2 ($1=$3,$2=OUT);
  subcircuit TRANS $3 ($1=$2,$2=$4);
  subcircuit TRANS $4 ($1=$2,$2=$3);
end;
circuit RINGO ();
  subcircuit INV2 $1 (OUT=OSC,$2=FB,$3=VSS,$4=VDD);
  subcircuit INV2 $2 (OUT=$I29,$2=$I20,$3=VSS,$4=VDD);
  subcircuit INV2 $3 (OUT=$I28,$2=$I19,$3=VSS,$4=VDD);
  subcircuit INV2 $4 (OUT=$I30,$2=$I21,$3=VSS,$4=VDD);
  subcircuit INV2 $5 (OUT=$I31,$2=$I22,$3=VSS,$4=VDD);
  subcircuit INV2 $6 (OUT=$I32,$2=$I23,$3=VSS,$4=VDD);
  subcircuit INV2 $7 (OUT=$I33,$2=$I24,$3=VSS,$4=VDD);
  subcircuit INV2 $8 (OUT=$I34,$2=$I25,$3=VSS,$4=VDD);
  subcircuit INV2 $9 (OUT=$I35,$2=$I26,$3=VSS,$4=VDD);
  subcircuit INV2 $10 (OUT=$I36,$2=$I27,$3=VSS,$4=VDD);
end;
""")

        self.assertEqual(repr(l2n.probe_net(rmetal2, pya.DPoint(0.0, 1.8))),
                         "RINGO:FB")
        self.assertEqual(repr(l2n.probe_net(rmetal2, pya.DPoint(-2.0, 1.8))),
                         "None")

        n = l2n.probe_net(rmetal1, pya.Point(2600, 1000))
        self.assertEqual(repr(n), "RINGO:$I20")

        self.assertEqual(
            str(l2n.shapes_of_net(n, rmetal1, True)),
            "(1660,-420;1660,2420;2020,2420;2020,-420);(1840,820;1840,1180;3220,1180;3220,820);(1660,2420;1660,3180;2020,3180;2020,2420);(1660,-380;1660,380;2020,380;2020,-380)"
        )

        shapes = pya.Shapes()
        l2n.shapes_of_net(n, rmetal1, True, shapes)
        r = pya.Region()
        for s in shapes.each():
            r.insert(s.polygon)
        self.assertEqual(
            str(r),
            "(1660,-420;1660,2420;2020,2420;2020,-420);(1840,820;1840,1180;3220,1180;3220,820);(1660,2420;1660,3180;2020,3180;2020,2420);(1660,-380;1660,380;2020,380;2020,-380)"
        )
Example #3
0
    def test_2_ShapesFromNet(self):

        ut_testsrc = os.getenv("TESTSRC")

        ly = pya.Layout()
        ly.read(
            os.path.join(ut_testsrc, "testdata", "algo",
                         "device_extract_l1_with_inv_nodes.gds"))

        l2n = pya.LayoutToNetlist(
            pya.RecursiveShapeIterator(ly, ly.top_cell(), []))

        # only plain backend connectivity

        rmetal1 = l2n.make_polygon_layer(ly.layer(6, 0), "metal1")
        rmetal1_lbl = l2n.make_text_layer(ly.layer(6, 1), "metal1_lbl")
        rvia1 = l2n.make_polygon_layer(ly.layer(7, 0), "via1")
        rmetal2 = l2n.make_polygon_layer(ly.layer(8, 0), "metal2")
        rmetal2_lbl = l2n.make_text_layer(ly.layer(8, 1), "metal2_lbl")

        # Intra-layer
        l2n.connect(rmetal1)
        l2n.connect(rvia1)
        l2n.connect(rmetal2)

        # Inter-layer
        l2n.connect(rmetal1, rvia1)
        l2n.connect(rvia1, rmetal2)
        l2n.connect(rmetal1, rmetal1_lbl)  #  attaches labels
        l2n.connect(rmetal2, rmetal2_lbl)  #  attaches labels

        # Perform netlist extraction
        l2n.extract_netlist()

        self.assertEqual(
            str(l2n.netlist()), """circuit TRANS ($1=$1,$2=$2);
end;
circuit INV2 (OUT=OUT,$2=$3,$3=$4);
  subcircuit TRANS $1 ($1=$4,$2=OUT);
  subcircuit TRANS $2 ($1=$3,$2=OUT);
  subcircuit TRANS $3 ($1=$2,$2=$4);
  subcircuit TRANS $4 ($1=$2,$2=$3);
end;
circuit RINGO ();
  subcircuit INV2 $1 (OUT='FB,OSC',$2=VSS,$3=VDD);
  subcircuit INV2 $2 (OUT=$I20,$2=VSS,$3=VDD);
  subcircuit INV2 $3 (OUT=$I19,$2=VSS,$3=VDD);
  subcircuit INV2 $4 (OUT=$I21,$2=VSS,$3=VDD);
  subcircuit INV2 $5 (OUT=$I22,$2=VSS,$3=VDD);
  subcircuit INV2 $6 (OUT=$I23,$2=VSS,$3=VDD);
  subcircuit INV2 $7 (OUT=$I24,$2=VSS,$3=VDD);
  subcircuit INV2 $8 (OUT=$I25,$2=VSS,$3=VDD);
  subcircuit INV2 $9 (OUT=$I26,$2=VSS,$3=VDD);
  subcircuit INV2 $10 (OUT=$I27,$2=VSS,$3=VDD);
end;
""")

        self.assertEqual(str(l2n.probe_net(rmetal2, pya.DPoint(0.0, 1.8))),
                         "RINGO:FB,OSC")
        sc_path = []
        self.assertEqual(
            str(l2n.probe_net(rmetal2, pya.DPoint(0.0, 1.8), sc_path)),
            "RINGO:FB,OSC")
        self.assertEqual(len(sc_path), 0)
        self.assertEqual(repr(l2n.probe_net(rmetal2, pya.DPoint(-2.0, 1.8))),
                         "None")

        n = l2n.probe_net(rmetal1, pya.Point(2600, 1000), None)
        self.assertEqual(str(n), "INV2:$2")
        sc_path = []
        n = l2n.probe_net(rmetal1, pya.Point(2600, 1000), sc_path)
        self.assertEqual(str(n), "INV2:$2")
        self.assertEqual(len(sc_path), 1)
        a = []
        t = pya.DCplxTrans()
        for sc in sc_path:
            a.append(sc.expanded_name())
            t = t * sc.trans
        self.assertEqual(",".join(a), "$2")
        self.assertEqual(str(t), "r0 *1 2.64,0")

        self.assertEqual(
            str(l2n.shapes_of_net(n, rmetal1, True)),
            "(-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)"
        )

        shapes = pya.Shapes()
        l2n.shapes_of_net(n, rmetal1, True, shapes)
        r = pya.Region()
        for s in shapes.each():
            r.insert(s.polygon)
        self.assertEqual(
            str(r),
            "(-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)"
        )