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)]
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
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