def test_copy_deepcopy(): D = Device() A = pg.ellipse(radii=(10, 5), angle_resolution=2.5, layer=1) B = pg.ellipse(radii=(10, 5), angle_resolution=2.5, layer=1) a = D << A b1 = D << B b2 = D << B Dcopy = pg.copy(D) Ddeepcopy = pg.deepcopy(D) h = D.hash_geometry(precision=1e-4) assert (h == '0313cd7e58aa265b44dd1ea10265d1088a2f1c6d') h = Dcopy.hash_geometry(precision=1e-4) assert (h == '0313cd7e58aa265b44dd1ea10265d1088a2f1c6d') h = Ddeepcopy.hash_geometry(precision=1e-4) assert (h == '0313cd7e58aa265b44dd1ea10265d1088a2f1c6d') D << pg.ellipse(radii=(12, 5), angle_resolution=2.5, layer=2) h = D.hash_geometry(precision=1e-4) assert (h == '856cedcbbb53312ff839b9fe016996357e658d33') h = Dcopy.hash_geometry(precision=1e-4) assert (h == '0313cd7e58aa265b44dd1ea10265d1088a2f1c6d') h = Ddeepcopy.hash_geometry(precision=1e-4) assert (h == '0313cd7e58aa265b44dd1ea10265d1088a2f1c6d') A.add_ref(pg.ellipse(radii=(12, 5), angle_resolution=2.5, layer=2)) B.add_polygon([[3, 4, 5], [6.7, 8.9, 10.15]], layer=0) h = D.hash_geometry(precision=1e-4) assert (h == 'c007b674e8053c11c877860f0552fff18676b68e') h = Dcopy.hash_geometry(precision=1e-4) assert (h == '2590bd786348ab684616eecdfdbcc9735b156e18') h = Ddeepcopy.hash_geometry(precision=1e-4) assert (h == '0313cd7e58aa265b44dd1ea10265d1088a2f1c6d')
def draw(self): supercell = cls.draw(self) cell = pg.deepcopy(supercell) style = self.style if style == 'open': pt._remove_alias(cell, 'IDT') if style == 'short': for subcell in cell.get_dependencies(recursive=True): if "IDT" in subcell.name: subcell.remove_polygons( lambda x, y, z: y == self.idt.layer) trace_cell = pc.PolyRouting() trace_cell.source = subcell.ports['top'] trace_cell.destination = subcell.ports['bottom'] trace_cell.layer = (self.idt.layer, ) subcell.add(trace_cell.draw()) return cell
def draw(self): cell = pg.deepcopy(cls.draw(self)) _add_default_ground_vias(self, cell) return cell
def draw(self): oldprobe=probe.draw(self) cell=pg.deepcopy(oldprobe) groundpad=pg.compass( layer=self.ground_layer, size=(self.ground_size,self.ground_size)) r=st.get_corners(groundpad) for alias in cell.aliases: if 'GroundLX' in alias: dest=cell[alias].ports['N'].endpoints[1] for portname in cell.ports: if alias in portname: cell.remove(cell.ports[portname]) cell.remove(cell[alias]) groundref=cell.add_ref(groundpad,alias=alias) groundref.move(origin=r.ur.coord, destination=dest) ppt.copy_ports(groundref,cell,prefix="GroundLX") if 'GroundRX' in alias: dest=cell[alias].ports['N'].endpoints[0] for portname in cell.ports: if alias in portname: cell.remove(cell.ports[portname]) cell.remove(cell[alias]) groundref=cell.add_ref(groundpad,alias=alias) groundref.move( origin=r.ul.coord, destination=dest) for portname in cell[alias].ports: cell.remove(cell[alias].ports[portname]) ppt.copy_ports(groundref,cell,prefix="GroundRX") return cell
def draw(self): supercell=cls.draw(self) cell=pg.deepcopy(supercell) style=self.style ports=supercell.ports for subcell in cell.get_dependencies(recursive=True): if 'IDT' in subcell.aliases: idt_parent=subcell idt_cell=subcell['IDT'] for alias in cell.aliases.keys(): if 'IDT' in alias: idt_parent=cell idt_cell=cell['IDT'] if style=='open': idt_parent.remove(idt_cell) if style=='short': top_port=idt_cell.ports['top'] bottom_port=idt_cell.ports['bottom'] short=pg.taper(length=top_port.y-bottom_port.y,\ width1=top_port.width,\ width2=bottom_port.width,layer=self.idt.layer) s_ref=cell<<short s_ref.connect(short.ports[1],\ destination=top_port) s_ref.rotate(center=top_port.center,\ angle=180) cell.absorb(s_ref) return cell
# However, note that if we now modify the underlying Devices (which # were referenced in D, and whose references were copied to D_copied), both # the original D and D_copied are affected: E1.add_polygon([[10, 20, 35], [1, 60, 40]], layer=3) qp(D_copied) # If instead we use pg.deepcopy(), all of the underlying references are copied # and used in the new D_deepcopied device. So if we change one of the old # references, the new D_deepcopied doesn't get affected D = Device() E1 = pg.ellipse(layer=1) E2 = pg.rectangle(layer=2) D.add_ref(E1) D.add_ref(E2).movex(15) D_deepcopied = pg.deepcopy(D) qp(D_deepcopied) # As before, if we add geometry to D now, D_deepcopied is unaffected D.add_ref(pg.circle()) D.rotate(45) qp(D_deepcopied) # However, now if we mess with the underlying Devices of D, D_deepcopied # is not affected like it was before. E1.add_polygon([[10, 20, 35], [1, 60, 40]], layer=3) qp(D_deepcopied) #============================================================================== # Extracting layers #==============================================================================
# example-copy import phidl.geometry as pg from phidl import quickplot as qp X = pg.ellipse() D = pg.copy(X) qp(D) # quickplot the geometry create_image(D, 'copy') # example-deepcopy import phidl.geometry as pg from phidl import quickplot as qp X = pg.ellipse() D = pg.deepcopy(X) qp(D) # quickplot the geometry create_image(D, 'deepcopy') # example-copy_layer import phidl.geometry as pg from phidl import quickplot as qp X = Device() X << pg.ellipse(layer = 0) X << pg.ellipse(layer = 1) D = pg.copy_layer(X, layer = 1, new_layer = 2) qp(D) # quickplot the geometry create_image(D, 'copy_layer') # example-import_gds
def draw(self): device = self.device df_original = device.get_params() master_name = self.name master_cell = Device(master_name) cells = list() top_label_matrix = self.labels_top bottom_label_matrix = self.labels_bottom y_param = self.y_param x_param = self.x_param df = {} dlist = [] for index in range(len(y_param)): for name, value in zip(y_param.names, y_param.values): df[name] = value[index] device._set_params(df) # print("drawing array {} of {}".format(index+1,len(y_param)),end='\r') if top_label_matrix is not None: if isinstance(top_label_matrix[index], list): if len(top_label_matrix[index]) == len(self.x_param): self.labels_top = top_label_matrix[index] else: self.labels_top = None else: self.labels_top = None if bottom_label_matrix is not None: if isinstance(bottom_label_matrix[index], list): if len(bottom_label_matrix[index]) == len(self.x_param): self.labels_bottom = bottom_label_matrix[index] else: self.labels_bottom = None else: self.labels_bottom = None self.name = master_name + "Arr" + str(index + 1) new_cell = PArray.draw(self) dlist.extend(new_cell.references) print("\033[K", end='') master_cell << new_cell cells.append(new_cell) device._set_params(df_original) self.labels_top = top_label_matrix self.labels_bottom = bottom_label_matrix self.name = master_name if not self._pack: g = Group(cells) g.distribute(direction='y', spacing=self.y_spacing) g.align(alignment='x') return master_cell else: dlist_new = [] for d in dlist: dlist_new.append(pg.deepcopy(d.parent)) return pg.packer(dlist_new, aspect_ratio=(2, 1), spacing=max(self.x_spacing, self.y_spacing))