示例#1
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.Polygons(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.Polygons(shape=[[[0, 0], [3, 0], [3, 1], [0, 1]]],
                                    gdslayer=spira.Layer(number=77))
            return elems

    c2 = CellB()
    assert c2.name == 'CellB-0'
    assert len(c1.elementals) == 1
    assert isinstance(c2.elementals[0], spira.Polygons)
示例#2
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)
示例#3
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)
示例#4
0
def create_spira_cell(cell):
    # TODO: Detect cell type before assignment.
    if cell.name.startswith('jj'):
        D = spira.Junction(name=cell.name)
    elif cell.name.startswith('via'):
        D = spira.Via(name=cell.name)
    else:
        D = spira.Cell(name=cell.name)
    return D
示例#5
0
def test_cell_list():
    cl = spira.CellList()
    assert cl.is_empty() == True

    c1 = spira.Cell('C1')
    c2 = spira.Cell('C2')
    c3 = spira.Cell('C3')

    cl += c1
    cl += [c2, c3]

    assert len(cl) == 3
    assert cl['C2'] == c2
    assert cl.index('C2') == 1
    assert cl.index(c2) == 1

    del cl['C1']

    assert cl[0] == c2
    assert len(cl) == 2

    del cl[c3]

    assert len(cl) == 1
示例#6
0
def test_library():
    l1 = spira.Library()
    l2 = spira.Library(name='library')
    l3 = spira.Library()

    assert l1.is_empty() == True

    cell = spira.Cell(name='C1')
    l1 += cell
    l3 += cell

    assert l1 == l3
    assert l1 != l2
    assert len(l1) == 1
    assert l1.name == 'spira_library'
    assert l2.name == 'library'
    assert (cell in l1) == True
    assert l1['C1'] == cell

    l1.clear()

    assert len(l1) == 0
    assert l1 == l2
示例#7
0
        xc = self.rho * np.cos(theta)
        yc = self.rho * np.sin(theta)
        arm_x_left = self.arm_lengths[0] * np.sin(theta)
        arm_y_left = self.arm_lengths[0] * np.cos(theta)
        arm_x_right = self.arm_lengths[1] * np.sin(theta)
        arm_y_right = self.arm_lengths[1] * np.cos(theta)

        xpts = semicircle_x.tolist() + [
            xc + arm_x_right, xc + arm_x_right + self.arm_widths[1],
            xc + self.arm_widths[1], xc + self.arm_widths[1], 0,
            -(xc + self.arm_widths[0]), -(xc + self.arm_widths[0]),
            -(xc + arm_x_left + self.arm_widths[0]), -(xc + arm_x_left)
        ]
        ypts = semicircle_y.tolist() + [
            yc + arm_y_right, yc + arm_y_right, yc, yc - self.source_length,
            yc - self.source_length, yc - self.source_length, yc,
            yc + arm_y_left, yc + arm_y_left
        ]

        points = np.array([list(zip(xpts, ypts))])

        return points


if __name__ == "__main__":

    ytron = YtronShape()
    cell = spira.Cell(name='yTron')
    cell += spira.Polygons(shape=ytron)
    cell.output()
示例#8
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')
示例#9
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')
示例#10
0
def import_gds(filename, cellname=None, flatten=False, duplayer={}):
    """  """

    LOG.header('Imported GDS file -> \'{}\''.format(filename))

    gdsii_lib = gdspy.GdsLibrary(name='SPiRA-Cell')
    gdsii_lib.read_gds(filename)
    top_level_cells = gdsii_lib.top_level()

    if cellname is not None:
        if cellname not in gdsii_lib.cell_dict:
            raise ValueError("[SPiRA] import_gds() The requested cell " +
                             "(named {}) is not present in file {}".format(
                                 cellname, filename))
        topcell = gdsii_lib.cell_dict[cellname]
    elif cellname is None and len(top_level_cells) == 1:
        topcell = top_level_cells[0]
    elif cellname is None and len(top_level_cells) > 1:

        # TODO: Add this to logger.
        print('Multiple toplevel cells found:')
        for cell in top_level_cells:
            print(cell)

        raise ValueError('[SPiRA] import_gds() There are multiple' +
                         'top-level cells, you must specify cellname' +
                         'to select of one of them')

    cell_list = spira.ElementList()
    c2dmap = {}
    for cell in gdsii_lib.cell_dict.values():
        D = create_spira_cell(cell)

        for e in cell.elements:
            if isinstance(e, gdspy.PolygonSet):
                for points in e.polygons:
                    layer = spira.Layer(number=e.layers[0],
                                        datatype=e.datatypes[0])
                    ply = spira.Polygons(shape=spd([points]), gdslayer=layer)
                    D += ply
            elif isinstance(e, gdspy.Polygon):
                layer = spira.Layer(number=e.layers, datatype=e.datatype)
                ply = spira.Polygons(shape=spd([e.points]), gdslayer=layer)
                D += ply

        c2dmap.update({cell: D})
        cell_list += cell

    for cell in cell_list:
        wrap_references(cell, c2dmap)
        wrap_labels(cell, c2dmap)

    top_spira_cell = c2dmap[topcell]

    # print('Toplevel Cell: {}\n'.format(top_spira_cell))
    # print('\n---------- Cells --------------')
    # for i, D in enumerate(top_spira_cell.dependencies()):
    #     print('{}. {}'.format(i, D.name))
    # print('')

    if flatten == True:
        D = spira.Cell(name='import_gds')

        # for key, polygon in top_spira_cell.get_polygons(True).items():
        #     layer, datatype = key[0], key[1]
        #     for l1, l2 in duplayer.items():
        #         if layer == l1: layer = l2
        #     poly = spira.Polygons(polygons=polygon, gdslayer=layer, gdsdatatype=datatype)
        #     poly.scale_up()
        #     D += poly

        # for l in top_spira_cell.lbls:
        #     params = {}
        #     params['text'] = l.text
        #     params['gdslayer'] = l.gdslayer
        #     params['str_anchor'] = l.str_anchor

        #     D += spira.Label(position=scu(l.position), **params)
        return D
    else:
        return top_spira_cell
示例#11
0
        points.extend(box.points)
        return points


if __name__ == '__main__':
    circle_shape = CircleShape()
    hexagon_shape = ConvexPolygon()
    arrow_shape = ArrowShape()
    arrow_shape.apply_merge
    rect_shape = RectangleShape()
    box_shape = BoxShape()
    basic_tri_shape = BasicTriangle()
    tri_shape = TriangleShape()
    tri_shape.apply_merge

    cell = spira.Cell(name='Basic Shapes')

    circle = spira.Polygons(shape=circle_shape,
                            gdslayer=spira.Layer(number=13))
    circle.center = (0, 0)
    hexagon = spira.Polygons(shape=hexagon_shape,
                             gdslayer=spira.Layer(number=14))
    hexagon.center = (5, 0)
    arrow = spira.Polygons(shape=arrow_shape, gdslayer=spira.Layer(number=15))
    arrow.center = (10, 0)
    rect = spira.Polygons(shape=rect_shape, gdslayer=spira.Layer(number=16))
    rect.center = (15, 0)
    box = spira.Polygons(shape=box_shape, gdslayer=spira.Layer(number=17))
    box.center = (20, 0)
    basic = spira.Polygons(shape=basic_tri_shape,
                           gdslayer=spira.Layer(number=18))