Ejemplo n.º 1
0
    def create_elementals(self, elems):

        jj = Junction()

        jj.center = (0, 0)

        s1 = spira.SRef(jj, midpoint=self.m1, rotation=self.rotation)
        s2 = spira.SRef(jj, midpoint=self.m2, rotation=-self.rotation)

        r1 = RouteManhattan(port1=s1.ports['Output'],
                            port2=s2.ports['Output'],
                            radius=1,
                            length=1)
        r2 = RouteManhattan(port1=s1.ports['Input'],
                            port2=s2.ports['Input'],
                            radius=1,
                            length=1)

        s3 = spira.SRef(r1)
        elems += s3

        s4 = spira.SRef(r2)
        elems += s4

        elems += [s1, s2]

        return elems
Ejemplo n.º 2
0
    def create_elementals(self, elems):

        s1 = self.jj1
        s2 = self.jj2

        if self.quadrant in ['Q1', 'Q4']:
            route = RouteManhattan(port1=s1.ports['Output'],
                                   port2=s2.ports['Input'],
                                   radius=3,
                                   length=1,
                                   gdslayer=RDD.COU.LAYER)
        if self.quadrant in ['Q2', 'Q3']:
            route = RouteManhattan(port1=s2.ports['Output'],
                                   port2=s1.ports['Input'],
                                   radius=3,
                                   length=1,
                                   gdslayer=RDD.COU.LAYER)

        s3 = spira.SRef(route)
        s3.move(midpoint=s3.ports['T1'], destination=route.port1)

        r1 = Route(port1=self.term_ports['T1'],
                   port2=s1.ports['Input'],
                   player=RDD.PLAYER.COU)
        elems += spira.SRef(r1)

        r2 = Route(port1=self.term_ports['T2'],
                   port2=s2.ports['Output'],
                   player=RDD.PLAYER.COU)
        elems += spira.SRef(r2)

        elems += [s1, s2, s3]

        return elems
Ejemplo n.º 3
0
 def test_q1_parallel(self):
     # p1 = spira.Term(name='P1', midpoint=(0,0), orientation=0, width=2)
     # p2 = spira.Term(name='P2', midpoint=(50,50), orientation=0, width=2)
     p1 = spira.Term(name='P1', midpoint=(0, 0), orientation=180, width=2)
     p2 = spira.Term(name='P2', midpoint=(50, 50), orientation=180, width=2)
     rm = RouteManhattan(port1=p1, port2=p2, radius=8)
     return spira.SRef(rm, midpoint=(150, 0))
Ejemplo n.º 4
0
    def create_elementals(self, elems):

        self.angular_coverage = np.deg2rad(self.angular_coverage)
        inc_rad = (self.radius**-1) / self.num_steps
        angle_step = self.angular_coverage / self.num_steps

        print('inc_rad: {}'.format(inc_rad))
        print('angle_step: {}'.format(angle_step))

        arcs = []
        for x in range(self.num_steps):
            A = Arc(shape=ArcRoute(radius=1 / ((x + 1) * inc_rad),
                                   width=self.width,
                                   theta=np.rad2deg(angle_step),
                                   start_angle=x * np.rad2deg(angle_step),
                                   angle_resolution=self.angle_resolution,
                                   gdslayer=self.gdslayer))

            a = spira.SRef(A)
            elems += a
            arcs.append(a)
            if x > 0:
                a.connect(port='P1', destination=prevPort)
            prevPort = a.ports['P2']

        self.port1 = arcs[0].ports['P1']

        elems += self._regular_bend(prevPort)

        return elems
Ejemplo n.º 5
0
    def create_quadrant_three(self):

        self.b1.connect(port=self.b1.ports['P2'],
                        destination=self.term_ports['T1'])
        # h = self.p2[1] + (self.p1[1]-self.p2[1])/2 + self.radius
        h = (self.p1[1] - self.p2[1]) / 2 + self.radius
        self.b1.move(midpoint=self.b1.ports['P2'], destination=[0, h])

        self.b2.connect(port=self.b2.ports['P2'],
                        destination=self.b1.ports['P1'])
        # h = self.p2[1] + (self.p1[1]-self.p2[1])/2 - self.radius
        h = (self.p1[1] - self.p2[1]) / 2 - self.radius
        self.b2.move(midpoint=self.b2.ports['P1'],
                     destination=[self.term_ports['T2'].midpoint[0], h])

        r1 = self._generate_route(self.b2.ports['P1'], self.term_ports['T2'])
        r2 = self._generate_route(self.b1.ports['P2'], self.term_ports['T1'])
        r3 = self._generate_route(self.b2.ports['P2'], self.b1.ports['P1'])

        D = spira.Cell(name='Q3')
        D += [self.b1, self.b2, r1, r2, r3]

        D += self.term_ports['T1']
        D += self.term_ports['T2']

        D.rotate(angle=self.port1.orientation, center=self.p1)
        D.move(midpoint=self.term_ports['T1'], destination=self.port1)

        return spira.SRef(D)
Ejemplo n.º 6
0
    def get_subarc_routes(self):
        D = SubArcSeries(gdslayer=self.gdslayer,
                         radius=self.radius,
                         width=self.width,
                         angular_coverage=self.angular_coverage,
                         num_steps=self.num_steps,
                         angle_resolution=self.angle_resolution,
                         start_angle=self.start_angle)

        s1 = spira.SRef(D)
        s2 = spira.SRef(D)

        s2.reflect(p1=[0, 0], p2=[1, 1])
        s2.connect(port='P2', destination=s1.ports['P2'])

        return s1, s2
Ejemplo n.º 7
0
    def create_q4_180(self):

        b1 = self.b1
        b2 = self.b2

        b2.connect(port=b2.ports['P1'], destination=self.term_ports['T1'])
        h = self.p1[1] + self.radius + self.length
        b2.move(midpoint=b2.ports['P1'], destination=[0, h])

        b1.connect(port=b1.ports['P2'], destination=b2.ports['P2'])
        b1.move(midpoint=b1.ports['P1'],
                destination=[self.term_ports['T2'].midpoint[0], h])

        r1 = self._generate_route(b2.ports['P1'], self.term_ports['T1'])
        r2 = self._generate_route(b1.ports['P1'], self.term_ports['T2'])
        r3 = self._generate_route(b1.ports['P2'], b2.ports['P2'])

        D = spira.Cell(name='SameQ4')
        D += [self.b1, self.b2, r1, r2, r3]

        D += self.term_ports['T1']
        D += self.term_ports['T2']

        D.rotate(angle=self.port1.orientation, center=self.p1)
        D.move(midpoint=self.term_ports['T1'], destination=self.port1)

        return spira.SRef(D)
Ejemplo n.º 8
0
 def test_q3_90(self):
     p1 = spira.Term(name='P1', midpoint=(0, 0), orientation=180, width=2)
     p2 = spira.Term(name='P2',
                     midpoint=(-40, -20),
                     orientation=-90,
                     width=2)
     rm = RouteManhattan(port1=p1, port2=p2, radius=8)
     return spira.SRef(rm, midpoint=(-50, -50))
Ejemplo n.º 9
0
 def test_q1_180(self):
     p1 = spira.Term(name='P1', midpoint=(0, 0), orientation=0, width=2)
     p2 = spira.Term(name='P2',
                     midpoint=(40, 20),
                     orientation=180,
                     width=1.5)
     rm = RouteManhattan(port1=p1, port2=p2, radius=8)
     return spira.SRef(rm, midpoint=(0, 50))
Ejemplo n.º 10
0
    def create_mlayers(self):
        elems = spira.ElementList()
        # players = RDD.PLAYER.get_physical_layers(purpose_symbol=['METAL', 'GROUND', 'MOAT'])
        flat_elems = self.cell_elems.flat_copy()
        for pl in RDD.PLAYER.get_physical_layers(purposes='METAL'):

            metal_elems = flat_elems.get_polygons(layer=pl.layer)

            if metal_elems:
                c_mlayer = CMLayers(layer=pl.layer)
                for i, ply in enumerate(self._merge_layers(metal_elems)):
                    ml = MLayer(name='MLayer_{}_{}_{}_{}'.format(
                        pl.layer.number, self.cell.name, self.cell.id, i),
                                points=ply.polygons,
                                number=pl.layer.number)
                    c_mlayer += spira.SRef(ml)
                elems += spira.SRef(c_mlayer)
        return elems
Ejemplo n.º 11
0
 def _generate_route(self, p1, p2):
     route = RouteShape(port1=p1,
                        port2=p2,
                        path_type='straight',
                        width_type='straight')
     R1 = RouteBasic(route=route, connect_layer=self.gdslayer)
     r1 = spira.SRef(R1)
     r1.rotate(angle=p2.orientation - 180, center=R1.port1.midpoint)
     r1.move(midpoint=(0, 0), destination=p1.midpoint)
     return r1
Ejemplo n.º 12
0
 def create_arc_bend_2(self):
     if self.bend_type == 'circular':
         B2 = Arc(shape=ArcRoute(
             radius=self.radius,
             width=self.port1.width,
             gdslayer=self.gdslayer,
             # gdslayer=spira.Layer(number=18),
             start_angle=0,
             theta=-90))
         return spira.SRef(B2)
Ejemplo n.º 13
0
def wrap_references(cell, c2dmap):
    for e in cell.elements:
        if isinstance(e, gdspy.CellReference):
            D = c2dmap[cell]
            ref_device = c2dmap[e.ref_cell]
            D += spira.SRef(structure=ref_device,
                            midpoint=scd(e.midpoint),
                            rotation=e.rotation,
                            magnification=e.magnification,
                            reflection=e.x_reflection)
Ejemplo n.º 14
0
    def create_elementals(self, elems):

        jj = Junction()

        # FIXME: Automate this movement.
        jj.move(origin=jj.center, destination=(0, 0))

        # FIXME: Rotation applies to parent cell.
        j1 = spira.SRef(jj, origin=(-1, 0), rotation=90)
        # j1.move(origin=j1.ref.center, destination=(0,0))
        j2 = spira.SRef(jj, origin=(10.5, 0), rotation=180)

        elems += j1
        elems += j2

        elems += self.top_routing
        elems += self.bot_routing

        return elems
Ejemplo n.º 15
0
    def create_elementals(self, elems):

        super().create_elementals(elems)

        if self.level == 1:
            if self.ground_layer:
                box = self.cell.bbox
                # box.move(midpoint=box.center, destination=(0,0))

                gnd = self.ground_layer | box
                if gnd:
                    c_glayer = CGLayers(layer=gnd.gdslayer)
                    name = 'GLayer_{}_{}'.format(self.cell.name,
                                                 gnd.gdslayer.number)
                    gnd_layer = GLayer(name=name,
                                       layer=gnd.gdslayer,
                                       player=gnd)
                    c_glayer += spira.SRef(gnd_layer)
                    elems += spira.SRef(c_glayer)

        return elems
Ejemplo n.º 16
0
def test_elem_sref():
    class CellB(spira.Cell):
        def create_elementals(self, elems):
            elems += spira.Polygons(shape=[[[0, 0], [3, 0], [3, 1], [0, 1]]],
                                    gdslayer=spira.Layer(number=77))
            return elems

    c2 = CellB()
    s1 = spira.SRef(structure=c2)
    assert all([a == b for a, b in zip(s1.midpoint, [0, 0])])
    assert s1.rotation == 0
    assert s1.magnification == 1
    assert s1.reflection == False
Ejemplo n.º 17
0
    def create_elementals(self, elems):

        route = RouteShape(port1=self.port1,
                           port2=self.port2,
                           path_type='straight',
                           width_type='straight')

        R1 = RouteBasic(route=route, connect_layer=self.player.layer)
        r1 = spira.SRef(R1)
        r1.rotate(angle=self.port2.orientation - 180, center=R1.port1.midpoint)
        r1.move(midpoint=(0, 0), destination=self.port1.midpoint)

        elems += r1

        return elems
Ejemplo n.º 18
0
    def create_nlayers(self):
        elems = ElementList()
        flat_elems = self.cell_elems.flat_copy()
        for pl in RDD.PLAYER.get_physical_layers(purposes='VIA'):

            via_elems = flat_elems.get_polygons(layer=pl.layer)

            if via_elems:
                c_nlayer = CNLayers(layer=pl.layer)
                for i, ply in enumerate(via_elems):
                    ml = NLayer(name='Via_NLayer_{}_{}_{}'.format(
                        pl.layer.number, self.cell.name, i),
                                points=ply.polygons,
                                midpoint=ply.center,
                                number=pl.layer.number)
                    c_nlayer += spira.SRef(ml)
                elems += SRef(c_nlayer)

        return elems
Ejemplo n.º 19
0
    def create_elementals(self, elems):

        D = ArcSeries(gdslayer=self.gdslayer,
                      radius=self.radius,
                      width=self.width,
                      angular_coverage=self.angular_coverage,
                      num_steps=self.num_steps,
                      angle_resolution=self.angle_resolution,
                      start_angle=self.start_angle)

        # D.xmin, D.ymin = 0, 0

        # Orient to default settings...
        # D.reflect(p1=[0,0], p2=[1,1])
        # D.reflect(p1=[0,0], p2=[1,0])

        # D.rotate(angle=self.start_angle, center=D.center)
        # D.center = [0, 0]

        s1 = spira.SRef(D)
        elems += s1

        return elems
Ejemplo n.º 20
0
    def _regular_bend(self, prev_port):
        """ Now connect a regular bend for
        the normal curved portion. """
        B = Arc(shape=ArcRoute(radius=self.radius,
                               width=self.width,
                               theta=45 - np.rad2deg(self.angular_coverage),
                               start_angle=self.angular_coverage,
                               angle_resolution=self.angle_resolution,
                               gdslayer=spira.Layer(number=88)))

        b = spira.SRef(B)

        b.connect(port='P1', destination=prev_port)

        p0 = b.ports['P2']

        self.port2 = spira.Term(
            name='P2',
            midpoint=p0.midpoint,
            #             midpoint=scu(p0.midpoint),
            width=p0.width,
            orientation=p0.orientation)

        return b
Ejemplo n.º 21
0
        s3 = spira.SRef(r1)
        elems += s3

        s4 = spira.SRef(r2)
        elems += s4

        elems += [s1, s2]

        return elems


if __name__ == '__main__':

    name = 'SQUID PCell'
    spira.LOG.header('Running example: {}'.format(name))

    squid = spira.Cell(name='SQUID')

    # s5 = Squid(m2=(30,30), rotation=0)
    # s6 = Squid(m2=(-30,30), rotation=0)
    s7 = Squid(m2=(30, -30), rotation=0)

    # squid += spira.SRef(s5, midpoint=(0,0))
    # squid += spira.SRef(s6, midpoint=(50,0))
    squid += spira.SRef(s7, midpoint=(100, 0))

    squid.output(name=name)

    spira.LOG.end_print('SQUID example finished')
Ejemplo n.º 22
0
 def create_junction_two(self):
     jj = Junction()
     jj.center = (0, 0)
     return spira.SRef(jj, midpoint=self.m2, rotation=-self.rotation)
Ejemplo n.º 23
0
            ports += spira.Term(name='T1',
                                midpoint=self.jj1.ports['Input'] + [10, 0],
                                orientation=-90)
            ports += spira.Term(name='T2',
                                midpoint=self.jj2.ports['Output'] + [-10, 0],
                                orientation=90)

        return ports


if __name__ == '__main__':

    name = 'JTL PCell'
    spira.LOG.header('Running example: {}'.format(name))

    jtl = spira.Cell(name='JTL')

    # jj_q1 = Jtl(m2=(30,30), rotation=0)
    # jj_q2 = Jtl(m2=(-30,30), rotation=0)
    # jj_q3 = Jtl(m2=(-30,-30), rotation=0)
    jj_q4 = Jtl(m2=(30, -30), rotation=0)

    # jtl += spira.SRef(jj_q1, midpoint=(0,0))
    # jtl += spira.SRef(jj_q2, midpoint=(100,0))
    # jtl += spira.SRef(jj_q3, midpoint=(100,0))
    jtl += spira.SRef(jj_q4, midpoint=(100, 0))

    jtl.output(name=name)

    spira.LOG.end_print('JTL example finished')
Ejemplo n.º 24
0
 def test_p1p2_180_horizontal(self):
     p1 = spira.Term(name='P1', midpoint=(0, 0), orientation=0, width=2)
     p2 = spira.Term(name='P2', midpoint=(40, 0), orientation=0, width=2)
     rm = RouteManhattan(port1=p1, port2=p2, radius=8)
     return spira.SRef(rm, midpoint=(150, 0))
Ejemplo n.º 25
0
 def test_p2p1_180_vertical_bot(self):
     p1 = spira.Term(name='P1', midpoint=(0, 0), orientation=-90, width=2)
     p2 = spira.Term(name='P2', midpoint=(0, 40), orientation=-90, width=2)
     rm = RouteManhattan(port1=p1, port2=p2, radius=8)
     return spira.SRef(rm, midpoint=(150, 0))