Beispiel #1
0
    def create_ports(self, ports):

        p1, p2 = self.p1, self.p2

        a1 = self.port1.orientation
        a2 = self.port2.orientation

        angle_diff = self.port2.orientation - self.port1.orientation
        angle = np.round(np.abs(np.mod(angle_diff, 360)), 3)
        a = np.mod(self.port1.orientation, 360)

        p1_angle = np.mod(self.port1.orientation, 360)

        if angle == 90:
            ports += spira.Port(name='T1',
                                width=self.port1.width,
                                orientation=90)
            ports += spira.Port(name='T2',
                                midpoint=list(np.subtract(p2, p1)),
                                width=self.port2.width,
                                orientation=180)
        else:
            ports += spira.Port(name='T1',
                                width=self.port1.width,
                                orientation=90)
            ports += spira.Port(name='T2',
                                midpoint=list(np.subtract(p2, p1)),
                                width=self.port2.width,
                                orientation=0)

        return ports
Beispiel #2
0
    def create_ports(self, ports):

        angle_diff = self.port1.orientation - self.port2.orientation
        if self.port1.orientation == self.port2.orientation:
            ports += spira.Port(name='T1',
                                width=self.port1.width,
                                orientation=0)
            ports += spira.Port(name='T2',
                                midpoint=list(np.subtract(self.p2, self.p1)),
                                width=self.port2.width,
                                orientation=0)
        elif np.round(np.abs(np.mod(angle_diff, 360)), 3) != 180:
            raise ValueError(
                "2. [DEVICE] route() error: Ports do not " +
                "face each other (orientations must be 180 apart)")
        else:
            ports += spira.Port(name='T1',
                                width=self.port1.width,
                                orientation=90
                                # orientation=0
                                )
            ports += spira.Port(name='T2',
                                midpoint=list(np.subtract(self.p2, self.p1)),
                                width=self.port2.width,
                                orientation=-90
                                # orientation=180
                                )

        return ports
Beispiel #3
0
 def get_ports(self):
     p1 = spira.Port(name='P1_M6', midpoint=(0, 0), orientation=0)
     p2 = spira.Port(name='P2_M6', midpoint=(5, 15), orientation=270)
     p3 = spira.Port(name='P3_M6', midpoint=(10, 0), orientation=180)
     p4 = spira.Port(name='P4_M6', midpoint=(2, 15), orientation=270)
     p5 = spira.Port(name='P5_M6', midpoint=(10, 8), orientation=180)
     return [p1, p2, p3, p4, p5]
Beispiel #4
0
 def get_io_ports(self):
     p1 = spira.Port(name='P1',
                     midpoint=(0, 0),
                     orientation=180,
                     process=spira.RDD.PROCESS.M1)
     p2 = spira.Port(name='P2',
                     midpoint=(20, 10),
                     orientation=0,
                     process=spira.RDD.PROCESS.M1)
     return [p1, p2]
 def create_ports(self, ports):
     ports += spira.Port(name='M1:P1',
                         midpoint=(-0.5, 0),
                         orientation=180,
                         width=1)
     ports += spira.Port(name='M1:P2',
                         midpoint=(0.5, 0),
                         orientation=0,
                         width=1)
     return ports
Beispiel #6
0
 def get_io_ports(self):
     p1 = spira.Port(name='P1_M1', midpoint=(-10, 10), orientation=0)
     p2 = spira.Port(name='P2_M1',
                     midpoint=(5, 10),
                     width=0.5,
                     orientation=270)
     p3 = spira.Port(name='P3_M1',
                     midpoint=(0, -10),
                     width=1,
                     orientation=90)
     return [p1, p2, p3]
Beispiel #7
0
 def create_ports(self, ports):
     ports += spira.Port(name='P1',
                         midpoint=(-0.5, 0),
                         orientation=180,
                         width=1,
                         process=spira.RDD.PROCESS.M1)
     ports += spira.Port(name='P2',
                         midpoint=(0.5, 0),
                         orientation=0,
                         width=1,
                         process=spira.RDD.PROCESS.M1)
     return ports
Beispiel #8
0
 def create_ports(self, ports):
     w, l = self.width, self.length
     ports += spira.Port(name='P1_R1',
                         midpoint=(-l / 2, 0),
                         orientation=180,
                         width=self.width)
     ports += spira.Port(name='P2',
                         midpoint=(l / 2, 0),
                         orientation=0,
                         width=self.width,
                         process=spira.RDD.PROCESS.R1)
     return ports
Beispiel #9
0
 def get_ports(self):
     p1 = spira.Port(name='P1',
                     midpoint=(-self.length / 2, 0),
                     orientation=180,
                     width=self.width,
                     process=spira.RDD.PROCESS.R1)
     p2 = spira.Port(name='P2',
                     midpoint=(self.length / 2, 0),
                     orientation=0,
                     width=self.width,
                     process=spira.RDD.PROCESS.R1)
     return [p1, p2]
Beispiel #10
0
 def create_ports(self, ports):
     T = self.get_transforms()
     p1 = spira.Port(name='P1_M1',
                     midpoint=(self.width / 2, 0),
                     orientation=-90,
                     width=self.width)
     p2 = spira.Port(name='P2_M1',
                     midpoint=(self.width / 2, self.length),
                     orientation=90,
                     width=self.width)
     ports += p1.transform_copy(T)
     ports += p2.transform_copy(T)
     return ports
Beispiel #11
0
 def create_ports(self, ports):
     ports += spira.Port(process=RDD.PROCESS.M2,
                         midpoint=(-28, 0),
                         orientation=180,
                         width=8)
     ports += spira.Port(process=RDD.PROCESS.M2,
                         midpoint=(180, 0),
                         orientation=0,
                         width=8)
     ports += spira.Port(process=RDD.PROCESS.M2,
                         midpoint=(70, 50),
                         orientation=90,
                         width=20)
     return ports
Beispiel #12
0
    def create_elements(self, elems):

        r1 = Row()

        s1 = spira.SRef(r1)
        # s2 = spira.SRef(r1, midpoint=(2000, -1000))
        s2 = spira.SRef(r1, transformation=spira.Translation((2000, -1000)))

        elems += s1
        elems += s2

        print(s1.ports['Al:T2'])
        print(s2.ports['Al:T2'])

        d1 = spira.Port(name='Al:D1',
                        midpoint=(1000, 7000),
                        orientation=180,
                        width=20)
        # d2 = spira.Port(name='Al:D2', midpoint=(-1000, -5000), orientation=0, width=20)

        elems += spira.RouteManhattan(
            ports=[s1.ports['Al:T2'], d1, s2.ports['Al:T2']],
            width=20,
            layer=RDD.PLAYER.Al.METAL)

        elems += spira.RouteManhattan(ports=[s1.ports['Al:T1'], self.d2],
                                      width=20,
                                      layer=RDD.PLAYER.Al.METAL)

        return elems
Beispiel #13
0
def test_elem_cell():
    c1 = spira.Cell(name='CellA')
    assert c1.name == 'CellA'
    assert len(c1.ports) == 0
    assert len(c1.elementals) == 0

    c1.ports += spira.Port(name='P1')
    assert len(c1.ports) == 1

    c1.elementals += spira.Polygon(shape=[[[0, 0], [1, 0], [1, 1], [0, 1]]])
    assert len(c1.elementals) == 1

    c1.center = (0, 0)
    np.testing.assert_array_equal(c1.center, [0, 0])

    c1.move(midpoint=c1.center, destination=(5, 0))
    np.testing.assert_array_equal(c1.center, [5, 0])

    class CellB(spira.Cell):
        def create_elementals(self, elems):
            elems += spira.Polygon(shape=[[[0, 0], [3, 0], [3, 1], [0, 1]]],
                                   gds_layer=spira.Layer(number=77))
            return elems

    c2 = CellB()
    assert c2.name == 'CellB-0'
    assert len(c1.elementals) == 1
    assert isinstance(c2.elementals[0], spira.Polygon)
Beispiel #14
0
 def create_port_input(self):
     term = spira.Port(
         name='P1',
         midpoint=self.route_shape.m1,
         width=self.route_shape.w1,
         orientation=self.route_shape.o1,
         # gds_layer=self.gds_layer
     )
     return term
Beispiel #15
0
 def create_port_gdsii_output(self):
     term = spira.Port(
         name='P2',
         midpoint=self.route_shape.m2,
         width=self.route_shape.w2,
         orientation=self.route_shape.o2,
         # gds_layer=self.gds_layer
     )
     return term
Beispiel #16
0
    def create_elements(self, elems):
        elems += [self.via_left, self.via_right]

        d1 = spira.Port(name='Al:D1',
                        midpoint=(-1000, 0),
                        orientation=180,
                        width=20)
        d11 = spira.Port(name='M0:D3',
                         midpoint=(-1000, 0),
                         orientation=0,
                         width=20)
        d2 = spira.Port(name='Al:D2',
                        midpoint=(1000, 0),
                        orientation=0,
                        width=20)
        d12 = spira.Port(name='M0:D4',
                         midpoint=(1000, 0),
                         orientation=180,
                         width=20)
        d3 = spira.Port(name='M0:D5',
                        midpoint=(0, 0),
                        orientation=90,
                        width=20)

        # FIXME: Throughs out with a wierd angle.
        # elems += spira.RouteManhattan(
        #     ports=[self.p1, d1],
        #     width=5, layer=RDD.PLAYER.Al.METAL)

        elems += spira.RouteStraight(p1=self.p1,
                                     p2=d1,
                                     layer=RDD.PLAYER.Al.METAL)
        elems += spira.RouteStraight(p1=d11, p2=d12, layer=RDD.PLAYER.M0.METAL)
        elems += spira.RouteStraight(p1=self.p2,
                                     p2=d2,
                                     layer=RDD.PLAYER.Al.METAL)
        elems += spira.RouteStraight(p1=self.p1_out,
                                     p2=d3,
                                     layer=RDD.PLAYER.M0.METAL)

        return elems
Beispiel #17
0
    def create_ports(self, ports):

        left_arm_width = self.shape.arm_widths[0]
        rigth_arm_width = self.shape.arm_widths[1]
        src_arm_width = self.shape.arm_widths[0] + self.shape.arm_widths[
            1] + 2 * self.shape.xc

        ports += spira.Port(name='Pl_M1',
                            midpoint=self.shape.ml,
                            width=left_arm_width,
                            orientation=90)
        ports += spira.Port(name='Pr_M1',
                            midpoint=self.shape.mr,
                            width=rigth_arm_width,
                            orientation=90)
        ports += spira.Port(name='Psrc_M1',
                            midpoint=self.shape.ms,
                            width=src_arm_width,
                            orientation=270)

        return ports
Beispiel #18
0
 def create_ports(self, ports):
     ports += spira.Port(name='P1',
                         process=RDD.PROCESS.M2,
                         midpoint=(-28, 0),
                         orientation=180,
                         width=8)
     ports += spira.Port(name='P2',
                         process=RDD.PROCESS.M2,
                         midpoint=(180, 0),
                         orientation=0,
                         width=8)
     ports += spira.Port(name='P3',
                         process=RDD.PROCESS.M2,
                         midpoint=(100, 65),
                         orientation=0,
                         width=20)
     ports += spira.Port(name='P4',
                         process=RDD.PROCESS.M2,
                         midpoint=(70, 100),
                         orientation=90,
                         width=20)
     return ports
Beispiel #19
0
 def create_connected_elements(self):
     """ Adds contact ports to each metal polygon connected by a 
     contact layer and return a list of the updated elements. """
     for e1 in self.__make_polygons__():
         for e2 in self.device.elements:
             for m in ['BOT_LAYER', 'TOP_LAYER']:
                 if e2.layer == RDD.VIAS[e1.process].LAYER_STACK[m]:
                     if e2.encloses(e1.center):
                         e2.ports += spira.Port(name=e1.process,
                                                midpoint=e1.center,
                                                process=e1.layer.process,
                                                purpose=e1.layer.purpose,
                                                port_type='contact')
     return self.device.elements
Beispiel #20
0
 def create_p1_out(self):
     return spira.Port(name='M0:T4',
                       midpoint=(0, 500),
                       orientation=270,
                       width=20)
Beispiel #21
0
 def get_ports(self):
     p1 = spira.Port(name='P1_M1',
                     midpoint=(50, 0),
                     orientation=330,
                     width=10)
     return [p1]
Beispiel #22
0
 def create_ports(self, ports):
     ports += spira.Port(name='P1',
                         midpoint=(10, 0),
                         width=self.height,
                         orientation=180)
     return ports
 def create_ports(self, ports):
     ports += spira.Port(name='P1', midpoint=(0,2.5), orientation=180)
     ports += spira.Port(name='P2', midpoint=(20,2.5), orientation=0)
     return ports
 def get_io_ports(self):
     p1 = spira.Port(name='P1_M1', midpoint=(0,0), orientation=180)
     p2 = spira.Port(name='P2_M1', midpoint=(20,10), orientation=0)
     return [p1, p2]
Beispiel #25
0
 def create_p2(self):
     return spira.Port(name='P2',
                       midpoint=(self.length / 2, 0),
                       orientation=0,
                       width=self.width,
                       process=spira.RDD.PROCESS.R1)
 def create_p1(self):
     return spira.Port(name='P1', midpoint=(0,0), orientation=180, process=self.layer.process)
 def create_p2(self):
     return spira.Port(name='P2', midpoint=(20,10), orientation=0, process=self.layer.process)
Beispiel #28
0
 def create_d2(self):
     return spira.Port(name='Al:D2',
                       midpoint=(-1000, -5000),
                       orientation=0,
                       width=20)
Beispiel #29
0
 def create_p1(self):
     return spira.Port(name='Al:T1',
                       midpoint=(-2000, 0),
                       orientation=0,
                       width=20)
Beispiel #30
0
 def create_p2(self):
     return spira.Port(name='Al:T2',
                       midpoint=(2000, 0),
                       orientation=180,
                       width=20)