Beispiel #1
0
    def create_graph(self, elems):

        prim_elems = ElementList()
        for S in elems.sref:
            if isinstance(S.ref, (NLayer, TLayer, DLayer)):
                prim_elems += S

        for layer in RDD.METALS.layers:
            L = Cell(name='{}'.format(layer))

            # ply_elems = D.get_mlayers(layer=layer)

            ply_elems = ElementList()
            for S in elems.sref:
                if isinstance(S.ref, CMLayers):
                    # print(S.ref.layer)
                    if S.ref.layer.number == layer:
                        # print(S)
                        for p in S.ref.elementals:
                            # print(p.ref.player)
                            # FIXME!!!
                            # if isinstance(p, ELayers):
                            # raise Errors
                            if isinstance(p.ref.player, Polygons):
                                ply_elems += p.ref.player

            if ply_elems:
                geom = Geometry(name='{}'.format(layer),
                                lcar=self.lcar,
                                algorithm=self.algorithm,
                                layer=layer,
                                polygons=ply_elems)

                mesh_data = geom.create_mesh

                params = {
                    'name': '{}'.format(layer),
                    'layer': Layer(number=layer),
                    'point_data': [mesh_data[2]],
                    'cell_data': [mesh_data[3]],
                    'field_data': [mesh_data[4]]
                }

                mesh = Mesh(polygons=ply_elems,
                            primitives=prim_elems,
                            points=mesh_data[0],
                            cells=mesh_data[1],
                            **params)

                L += mesh
                elems += SRef(L)

                sg = {}
                subgraphs = elems.subgraphs
                for name, g in subgraphs.items():
                    graph = Graph(subgraphs={name: g})
                    sg[name] = graph.g
                ng = Graph(subgraphs=sg)
                ng.write_graph(graphname='{}'.format(layer))
                elems += ng
Beispiel #2
0
 def terms(self):
     from spira.gdsii.elemental.term import Term
     terms = ElementList()
     for p in self.ports:
         if isinstance(p, Term):
             terms += p
     return terms
Beispiel #3
0
 def create_box_layer(self):
     elems = ElementList()
     for p in self.device_elems.polygons:
         layer = p.gdslayer.number
         # if layer in RDD.GROUND.layers:
         if layer == RDD.GDSII.GPLAYER:
             l1 = Layer(name='BoundingBox', number=layer, datatype=5)
             elems += Polygons(polygons=self.blayer.polygons, gdslayer=l1)
     return elems
Beispiel #4
0
 def create_labels(self):
     elems = ElementList()
     for p in self.device_elems.polygons:
         layer = p.gdslayer.number
         # if layer in RDD.GROUND.layers:
         if layer == RDD.GDSII.GPLAYER:
             l2 = Layer(name='BoundingBox', number=layer, datatype=5)
             elems += Port(name='P{}'.format(layer), midpoint=self.blayer.center, gdslayer=l2)
     return elems
Beispiel #5
0
 def create_labels(self):
     elems = ElementList()
     for p in self.device_elems.polygons:
         layer = p.gdslayer.number
         players = RDD.PLAYER.get_physical_layers(purposes='METAL')
         if layer in players:
             l2 = Layer(name='BoundingBox', number=layer, datatype=8)
             # FIXME: Ports with the same name overrides eachother.
             elems += Port(name='P{}'.format(layer), midpoint=self.blayer.center, gdslayer=l2)
     return elems
Beispiel #6
0
    def create_box_layer(self):
        elems = ElementList()
        setter = {}

        for p in self.device_elems.polygons:
            layer = p.gdslayer.number
            setter[layer] = 'not_set'

        for p in self.device_elems.polygons:
            layer = p.gdslayer.number
            players = RDD.PLAYER.get_physical_layers(purposes=['METAL'])
            if layer in players and setter[layer] == 'not_set':
                l1 = Layer(name='BoundingBox', number=layer, datatype=8)
                elems += Polygons(polygons=self.blayer.polygons, gdslayer=l1)
                setter[layer] = 'already_set'
        return elems
Beispiel #7
0
 def rotate(self, angle=45, center=(0, 0)):
     """ Rotates the cell with angle around a center. """
     if angle == 0:
         return self
     for e in self.elementals:
         if issubclass(type(e), PolygonAbstract):
             e.rotate(angle=angle, center=center)
         elif isinstance(e, SRef):
             e.rotate(angle, center)
     ports = self.ports
     self.ports = ElementList()
     for p in ports:
         if issubclass(type(p), __Port__):
             p.midpoint = self.__rotate__(p.midpoint, angle, center)
             p.orientation = np.mod(p.orientation + angle, 360)
             self.ports += p
     return self
Beispiel #8
0
    def create_devices(self):
        deps = self.cell.dependencies()
        c2dmap = {}
        # for DeviceTCell in self.library.pcells:
        # print(RDD.DEVICES.JJ.PCELL)
        # for DeviceTCell in RDD.DEVICES.JJ.PCELL:
        #     print(type(DeviceTCell))
        #     for C in deps:

        #         plane_elems = ElementList()
        #         plane_elems += self.cell.get_purpose_layers(purpose_symbol='GROUND')
        #         # plane_elems += self.cell.elementals[(RDD.GDSII.GPLAYER, 0)]

        #         D = Device(cell=C, cell_elems=C.elementals, plane_elems=plane_elems)

        #         for PrimTCell in DeviceTCell.elementals.sref:
        #             PrimTCell.ref.create_elementals(D.elementals)
        #         c2dmap.update({C: D})

        for key in RDD.DEVICES.keys:
            DeviceTCell = RDD.DEVICES[key].PCELL
            for C in deps:

                plane_elems = ElementList()
                # from spira.gdsii import utils
                # players = RDD.PLAYER.get_physical_layers(purposes='GROUND')
                # plane_elems += utils.get_purpose_layers(self.cell, players)
                # # plane_elems += self.cell.elementals[(RDD.GDSII.GPLAYER, 0)]

                D = Device(cell=C,
                           cell_elems=C.elementals,
                           plane_elems=plane_elems)

                for PrimTCell in DeviceTCell.elementals.sref:
                    PrimTCell.ref.create_elementals(D.elementals)
                c2dmap.update({C: D})

        for c in self.cell.dependencies():
            self.wrap_references(c, c2dmap)

        return SRef(self.cell)
Beispiel #9
0
    def create_pygmsh_elements(self):
        print('number of polygons {}'.format(len(self.polygons)))

        height = 0.0
        holes = None

        elems = ElementList()
        for ply in self.polygons:
            for i, points in enumerate(ply.polygons):
                pp = numpy_to_list(points, height, unit=10e-9)
                surface_label = '{}_{}_{}_{}'.format(ply.gdslayer.number,
                                                     ply.gdslayer.datatype,
                                                     GeometryAbstract._ID, i)
                gp = self.geom.add_polygon(pp,
                                           lcar=1.0,
                                           make_surface=True,
                                           holes=holes)
                self.geom.add_physical_surface(gp.surface, label=surface_label)
                elems += [gp.surface, gp.line_loop]
                GeometryAbstract._ID += 1

        return elems
Beispiel #10
0
 def create_elementals(self, elems):
     result = ElementList()
     return result