Exemple #1
0
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')
Exemple #2
0
        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
Exemple #3
0
        def draw(self):

            cell = pg.deepcopy(cls.draw(self))

            _add_default_ground_vias(self, cell)

            return cell
Exemple #4
0
        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
Exemple #5
0
        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
#==============================================================================
Exemple #7
0
# 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
Exemple #8
0
    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))