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
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
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]
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
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]
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
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
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]
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
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
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
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)
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
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
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
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
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
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
def create_p1_out(self): return spira.Port(name='M0:T4', midpoint=(0, 500), orientation=270, width=20)
def get_ports(self): p1 = spira.Port(name='P1_M1', midpoint=(50, 0), orientation=330, width=10) return [p1]
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]
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)
def create_d2(self): return spira.Port(name='Al:D2', midpoint=(-1000, -5000), orientation=0, width=20)
def create_p1(self): return spira.Port(name='Al:T1', midpoint=(-2000, 0), orientation=0, width=20)
def create_p2(self): return spira.Port(name='Al:T2', midpoint=(2000, 0), orientation=180, width=20)