Exemple #1
0
 def get_oasis_cells(self, grid_steps_per_micron=1000, executor=None):
     import fatamorgana
     import fatamorgana.records
     if self.cell_oasis is None:
         self.cell_oasis = fatamorgana.Cell(fatamorgana.NString(self.name))
         for sub_cell in self.cells:
             x, y = sub_cell['origin']
             x, y = round(x * grid_steps_per_micron), round(y * grid_steps_per_micron)
             angle = np.rad2deg(sub_cell['angle']) if sub_cell['angle'] is not None else None
             repetition = None
             if not (sub_cell['columns'] == 1 and sub_cell['rows'] == 1 and not sub_cell['spacing']):
                 repetition = fatamorgana.basic.GridRepetition(
                     [round(sub_cell['spacing'][0] * grid_steps_per_micron), 0],
                     sub_cell['columns'],
                     [0, round(sub_cell['spacing'][1] * grid_steps_per_micron)],
                     sub_cell['rows'])
             self.cell_oasis.placements.append(
                 fatamorgana.records.Placement(False, name=fatamorgana.NString(sub_cell['cell'].name), x=x, y=y,
                                               angle=angle, repetition=repetition))
         for layer, geometries in self.layer_dict.items():
             for geometry in geometries:
                 if executor:
                     executor.submit(convert_to_layout_objs, geometry, layer, library='oasis',
                                     grid_steps_per_micron=grid_steps_per_micron, max_points=np.inf,
                                     max_points_line=np.inf) \
                         .add_done_callback(lambda future: self.cell_oasis.geometry.extend(future.result()))
                 else:
                     self.cell_oasis.geometry.extend(
                         convert_to_layout_objs(geometry, layer, library='oasis',
                                                grid_steps_per_micron=grid_steps_per_micron,
                                                max_points=np.inf, max_points_line=np.inf))
     return [self.cell_oasis] + [oasis_cell for sub_cell in self.cells for oasis_cell in
                                 sub_cell['cell'].get_oasis_cells(grid_steps_per_micron, executor)]
Exemple #2
0
 def get_gdspy_cell(self, executor=None):
     import gdspy
     if self.cell_gdspy is None:
         self.cell_gdspy = gdspy.Cell(self.name)
         for sub_cell in self.cells:
             angle = np.rad2deg(sub_cell['angle']) if sub_cell['angle'] is not None else None
             if sub_cell['columns'] == 1 and sub_cell['rows'] == 1 and not sub_cell['spacing']:
                 self.cell_gdspy.add(
                     gdspy.CellReference(sub_cell['cell'].get_gdspy_cell(executor), origin=sub_cell['origin'],
                                         rotation=angle, magnification=sub_cell['magnification'],
                                         x_reflection=sub_cell['x_reflection']))
             else:
                 self.cell_gdspy.add(
                     gdspy.CellArray(sub_cell['cell'].get_gdspy_cell(executor), origin=sub_cell['origin'],
                                     rotation=angle, magnification=sub_cell['magnification'],
                                     x_reflection=sub_cell['x_reflection'], columns=sub_cell['columns'],
                                     rows=sub_cell['rows'], spacing=sub_cell['spacing']))
         for layer, geometries in self.layer_dict.items():
             for geometry in geometries:
                 if executor:
                     executor.submit(convert_to_layout_objs, geometry, layer, library='gdspy') \
                         .add_done_callback(lambda future: self.cell_gdspy.add(future.result()))
                 else:
                     self.cell_gdspy.add(convert_to_layout_objs(geometry, layer, library='gdspy'))
     return self.cell_gdspy
Exemple #3
0
 def get_gdscad_cell(self, executor=None):
     if self.cell_gdscad is None:
         self.cell_gdscad = gdsCAD.core.Cell(self.name)
         for sub_cell in self.cells:
             angle = np.rad2deg(sub_cell['angle']) if sub_cell['angle'] is not None else None
             self.cell_gdscad.add(
                 gdsCAD.core.CellReference(sub_cell['cell'].get_gdscad_cell(executor), origin=sub_cell['origin'],
                                           rotation=angle))
         for layer, geometries in self.layer_dict.items():
             for geometry in geometries:
                 if executor:
                     executor.submit(convert_to_layout_objs, geometry, layer, library='gdscad') \
                         .add_done_callback(lambda future: self.cell_gdscad.add(future.result()))
                 else:
                     self.cell_gdscad.add(convert_to_layout_objs(geometry, layer, library='gdscad'))
     return self.cell_gdscad