예제 #1
0
def spiralcircuit(wgw, nl, i_s, s, il, tl, gwgw, gsl, gp, gdc, w_ebeam=4):
    # wgw [int] -> waveguide width
    # nl -> Number of loops in the spiral
    # i_s -> inner size of the spiral coordinate2
    # s -> spacing between the individual loops
    # il -> incoupling length
    # tl -> taper length
    # gwgw = 10  # width of the waveguide for the grating
    # gsl = 78  # grating socket length
    # gp = 2.3  # grating period length
    # gdc = [0-1] -> grating duty cycle
    w_core = wgw + w_ebeam
    w_clad = wgw + 3 * w_ebeam
    gwg = gratingwaveguide(gwgw)
    g = grating(gwg, gsl, gp, gdc)
    sp = spiral(wgw, nl, i_s, s, il)
    wgt = WireWaveguideTemplate()
    wgt.Layout(core_width=w_core, cladding_width=w_clad)
    t = taper(gwg, wgt, tl)

    circuit = PlaceAndAutoRoute(child_cells={
        "grating1": g,
        "taper1": t,
        "spiral": sp,
        "taper2": t,
        "grating2": g
    })
    print i_s[0]
    circuit_layout = circuit.Layout(
        child_transformations={
            "grating1":
            i3.Translation((gsl / 2, 0)),
            "taper1":
            i3.Translation((gsl, 0)),
            "spiral":
            i3.Translation((gsl + tl, 0)),
            "taper2":
            i3.Rotation(rotation_center=(0.0, 0.0),
                        rotation=180,
                        absolute_rotation=False) +
            # i3.Translation((
            #     gsl + 2 * tl + i_s[0] + (4 * nl + 1) * s + 2 * il, 0)),
            i3.Translation((gsl + 2 * tl + i_s[0] + 4 *
                            (nl - 1) * s + 300 + 2 * il, 0)),
            "grating2":
            i3.Rotation(rotation_center=(0.0, 0.0),
                        rotation=180,
                        absolute_rotation=False) +
            i3.Translation((gsl * 3 / 2 + 2 * tl + i_s[0] + 4 *
                            (nl - 1) * s + 300 + 2 * il, 0))
        })

    return circuit
예제 #2
0
def waveguidecircuit(wg_length, w_core, w_clad, taper_length, grating_wg_width,
                     grating_socket_length, grating_period, grating_dc):
    # wg_length [int] -> waveguide length
    # wg_width [int] -> waveguide width
    # taper_length [int] -> taper length
    # grating_wg_width [int] -> width of the waveguide for the grating
    # grating_socket_length [int] -> grating socket length
    # grating_period [int] -> grating period
    # grating_dc [0-1] -> grating duty cycle

    wgt = WireWaveguideTemplate()
    wgt.Layout(core_width=w_core, cladding_width=w_clad)
    wg = wgt()
    wg.Layout(shape=[(0, 0), (wg_length, 0)])
    gwg = gratingwaveguide(grating_wg_width)
    g = grating(gwg, grating_socket_length, grating_period, grating_dc)
    t = taper(gwg, wgt, taper_length)

    circuit = PlaceAndAutoRoute(child_cells={
        "grating1": g,
        "taper1": t,
        "wire": wg,
        "taper2": t,
        "grating2": g
    })

    circuit_layout = circuit.Layout(
        child_transformations={
            "grating1":
            i3.Translation((grating_socket_length / 2, 0)),
            "taper1":
            i3.Translation((grating_socket_length, 0)),
            "wire":
            i3.Translation((grating_socket_length + taper_length, 0)),
            "taper2":
            i3.Rotation(rotation_center=(0.0, 0.0),
                        rotation=180,
                        absolute_rotation=False) +
            i3.Translation((grating_socket_length + 2 * taper_length +
                            wg_length, 0)),
            "grating2":
            i3.Rotation(rotation_center=(0.0, 0.0),
                        rotation=180,
                        absolute_rotation=False) +
            i3.Translation((grating_socket_length * 3 / 2 + 2 * taper_length +
                            wg_length, 0))
        })

    return circuit
예제 #3
0
def FBMSwaveguidecircuit(wg_length, wg_width, taper_length, grating_wg_width,
                         grating_socket_length, grating_period, grating_dc):
    # wg_length [int] -> waveguide length
    # wg_width [int] -> waveguide width
    # taper_length [int] -> taper length
    # grating_wg_width [int] -> width of the waveguide for the grating
    # grating_socket_length [int] -> grating socket length
    # grating_period [int] -> grating period
    # grating_dc [0-1] -> grating duty cycle

    gwg = gratingwaveguide(grating_wg_width)
    g = grating(gwg, grating_socket_length, grating_period, grating_dc)
    (wgt, wg) = FBMSwaveguide(wg_width, wg_length)
    t = taper(gwg, wgt, taper_length)

    circuit = PlaceAndAutoRoute(child_cells={
        "grating1": g,
        "taper1": t,
        "wire": wg,
        "taper2": t,
        "grating2": g
    })

    circuit_layout = circuit.Layout(
        child_transformations={
            "grating1":
            i3.Translation((g.Layout.view.socket_length / 2, 0)),
            "taper1":
            i3.Translation((g.Layout.view.socket_length, 0)),
            "wire":
            i3.Translation((g.Layout.view.socket_length +
                            t.Layout.view.end_position[0], 0)),
            "taper2":
            i3.Rotation(rotation_center=(0.0, 0.0),
                        rotation=180,
                        absolute_rotation=False) +
            i3.Translation((g.Layout.view.socket_length +
                            2 * t.Layout.view.end_position[0] +
                            wg.Layout.view.shape[1][0], 0)),
            "grating2":
            i3.Rotation(rotation_center=(0.0, 0.0),
                        rotation=180,
                        absolute_rotation=False) +
            i3.Translation((g.Layout.view.socket_length * 3 / 2 +
                            2 * t.Layout.view.end_position[0] +
                            wg.Layout.view.shape[1][0], 0))
        })

    return circuit
예제 #4
0
def spiralcircuit(wgw, nl, i_s, s, il, tl, gwgw, gsl, gp, gdc, w_ebeam=1.5):
    w_core = wgw + w_ebeam
    w_clad = wgw + 3 * w_ebeam
    gwg = gratingwaveguide(gwgw)
    g = grating(gwg, gsl, gp, gdc)
    sp = spiral(wgw, nl, i_s, s, il)
    wgt = WireWaveguideTemplate()
    wgt.Layout(core_width=w_core, cladding_width=w_clad)
    t = taper(gwg, wgt, tl)

    circuit = PlaceAndAutoRoute(child_cells={
        "grating1": g,
        "taper1": t,
        "spiral": sp,
        "taper2": t,
        "grating2": g
    })

    circuit_layout = circuit.Layout(
        child_transformations={
            "grating1":
            i3.Translation((gsl / 2, 0)),
            "taper1":
            i3.Translation((gsl, 0)),
            "spiral":
            i3.Translation((gsl + tl, 0)),
            "taper2":
            i3.Rotation(rotation_center=(0.0, 0.0),
                        rotation=180,
                        absolute_rotation=False) +
            i3.Translation((gsl + 2 * tl + i_s[0] +
                            (4 * nl + 1) * s + 2 * il, 0)),
            "grating2":
            i3.Rotation(rotation_center=(0.0, 0.0),
                        rotation=180,
                        absolute_rotation=False) +
            i3.Translation((gsl * 3 / 2 + 2 * tl + i_s[0] +
                            (4 * nl + 1) * s + 2 * il, 0))
        })

    return circuit
예제 #5
0
def ringcircuit3(radius, gap, wg_ring_width, wg_coupler_width, angle, lx, ly,
                 tl, gwgw, gsl, gp, gdc):
    gwg = gratingwaveguide(gwgw)
    g = grating(gwg, gsl, gp, gdc)
    r = ring3(radius, gap, wg_ring_width, wg_coupler_width, angle)
    wgt = WireWaveguideTemplate()
    wgt.Layout(core_width=wg_coupler_width,
               cladding_width=wg_coupler_width + 6)
    t = taper(gwg, wgt, tl)

    circuit = PlaceAndAutoRoute(child_cells={
        "grating1": g,
        "taper1": t,
        "ring": r,
        "taper2": t,
        "grating2": g
    })

    circuit_layout = circuit.Layout(
        child_transformations={
            "grating1":
            i3.Translation((gsl / 2.0, ly)),
            "taper1":
            i3.Translation((gsl, ly)),
            "ring":
            i3.Translation((gsl + tl + lx / 2.0, radius + gap +
                            wg_ring_width / 2.0 + wg_coupler_width / 2.0)),
            "taper2":
            i3.Rotation(rotation_center=(0.0, 0.0),
                        rotation=180,
                        absolute_rotation=False) +
            i3.Translation((gsl + 2 * tl + lx, ly)),
            "grating2":
            i3.Rotation(rotation_center=(0.0, 0.0),
                        rotation=180,
                        absolute_rotation=False) +
            i3.Translation((gsl * 3 / 2.0 + 2 * tl + lx, ly))
        })

    return circuit
예제 #6
0
# Define Templates

wg_t1 = WireWaveguideTemplate()
wg_t1.Layout(
    core_width=15.0,
    cladding_width=15.0 + 16.0,
)

# Define components

WG1 = i3.Waveguide(trace_template=wg_t1)

layout_WG1 = WG1.Layout(shape=[(0.0, 0.0), (50.0, 0.0)])

pr = PlaceAndAutoRoute(trace_template=wg_t1,
                       child_cells={
                           "WGup": WG1,
                           "WGdown": WG1
                       },
                       links=[
                           ("WGup:in", "WGdown:out"),
                       ])

layout = pr.Layout(child_transformations={
    "WGup": (400, 0),
    "WGdown": (-4000, 0)
}, )

#layout.visualize(annotate=True)

layout.write_gdsii("testmmi2.gds")
예제 #7
0
    def _default_cell_name(self):
        return 'PCELL_1'




mmi_slots = mmi_slots_cell()


from picazzo3.routing.place_route import PlaceAndAutoRoute


pr = PlaceAndAutoRoute(child_cells={"mmi1": mmi_slots,
                                    # "mmi2": mmi_slots,

                                    },
                       links=[])

layout = pr.Layout(child_transformations={"mmi1": i3.Rotation(rotation=90),
                                          # "score": (4745., 400.),
                                          # "sbundle1": (-200., 499 + 10.),
                                          # "sbundle2": (-200., 598 + 20),
                                          # "sbundle3": (-200., 697. + 30),
                                          # "spirals150": (304.97, 698 + 99. + 43),
                                          # "spirals200": (304.97, 824 + 99. + 56),
                                          # "rbundle1": (-200., 950 + 99. + 66),
                                          # "rbundle2": (-200., 1036 + 99. + 76),
                                          # "rbundle3": (-200., 1036 + 99 + 86. + 86),
                                          # "spiral06":(304.97,1120+99+86),
                                          # "spiral07":(304.97,1290+99+86)
예제 #8
0
dc_11 = Lspiral(width=11, name="ring3", offset=3)
dc_9 = Lspiral(width=9, name="ring4", offset=4)
dc_7 = Lspiral(width=7, name="ring5", offset=5)
dc_5 = Lspiral(width=5, name="ring6", offset=6)
dc_46 = Lspiral(width=4.6, name="ring7", offset=7)
dc_42 = Lspiral(width=4.2, name="ring8", offset=8)
dc_38 = Lspiral(width=3.8, name="ring9", offset=9)
dc_34 = Lspiral(width=3.4, name="ring10", offset=10)
dc_30 = Lspiral(width=3.0, name="ring11", offset=11)
dc_26 = Lspiral(width=2.6, name="ring12", offset=12)

pr = PlaceAndAutoRoute(
    child_cells={
        "dc0": dc_20,
        "dc1": dc_17,
        "dc2": dc_14,
        "dc3": dc_11,
        "dc4": dc_9,
        "dc5": dc_7,
        "dc6": dc_5,
        "dc7": dc_46,
        "dc8": dc_42,
        "dc9": dc_38,
        "dc10": dc_34,
        "dc11": dc_30,
        "dc12": dc_26,
    })
pr_layout = pr.Layout()
# pr_layout.visualize()
pr_layout.write_gdsii("lspiral.gds")
예제 #9
0
mmi2_layout = mmi2.Layout(length=398)
mmi3 = v8(name="P3")
mmi3_layout = mmi3.Layout(length=406)

mmmi1 = v6(name="PP1")
mmmi1_layout = mmmi1.Layout(length2=92)
mmmi2 = v6(name="PP2")
mmmi2_layout = mmmi2.Layout(length2=97)
mmmi3 = v6(name="PP3")
mmmi3_layout = mmmi3.Layout(length2=102)

pr = PlaceAndAutoRoute(
    child_cells={
        "1": mmi1,
        "2": mmi2,
        "3": mmi3,
        "cell_1": mmmi1,
        "cell_2": mmmi2,
        "cell_3": mmmi3
    })

pr_layout = pr.Layout(
    child_transformations={
        "1": (0, 0),
        "2":
        i3.HMirror(0.0) + i3.Translation((6000, 0)),
        "3": (6000, 0),
        "cell_1":
        i3.HMirror(0.0) + i3.Translation((3300, 0)) +
        i3.Translation((9000, 0.0)),
        "cell_2":
예제 #10
0
wg_rigth = i3.Waveguide(name="my_wire_t4", trace_template=WG_T2FBMS)
layout = wg_rigth.Layout(
    shape=[(-taper_length + field_Ebeamx / 2 + field_Ebeamx - overlap_wg +
            wg_length - socket_lentgh_def - wg_length / 2, field_Ebeamy),
           (-taper_length + field_Ebeamx / 2 + field_Ebeamx + wg_length -
            socket_lentgh_def, field_Ebeamy)])

from picazzo3.routing.place_route import PlaceAndAutoRoute

my_circuit = PlaceAndAutoRoute(
    trace_template=WG_T1,
    child_cells={
        "grating1": FGC1,
        "taper_G_c1": my_taperG,
        "taper_G_c2": my_taperG,
        "grating2": FGC1,
        "my_wire_t3": wg_left,
        "my_wire_t4": wg_rigth,
    },
)

my_circuit_layout1 = my_circuit.Layout(
    child_transformations={
        "grating1":
        i3.Translation((-socket_lentgh_def / 2 + field_Ebeamx / 2 +
                        socket_lentgh_def, field_Ebeamy)),
        "taper_G_c1":
        i3.Translation((field_Ebeamx / 2 + socket_lentgh_def, field_Ebeamy)),
        "taper_G_c2":
        i3.Rotation(rotation_center=(0.0, 0.0),
예제 #11
0
# mmmi2 = v9(name="PP2", length2=97)
#
# print mmmi1.length2
# print v9.length2
# mmmi2_layout = mmmi2.get_default_view(i3.LayoutView)

# mmmi1_layout.write_gdsii("MMI2112_V4_2.gds")

# mmmi3 = v9(name="PP3", length2=102)
#
# mmmi3_layout = mmmi3.Layout()
# #
#
prr = PlaceAndAutoRoute(child_cells={
    "cell_1": mmmi1,
    # "cell_2": mmmi2,
    # "cell_3": mmmi3
})

prr_layout = prr.Layout(
    child_transformations={
        "cell_1": i3.HMirror(0.0)
        # "cell_2": (3300, 0),
        # "cell_3": (6600, 0)
        # "cell_1": i3.HMirror(0.0)+i3.Translation((3300, 0)),
        # "cell_2": i3.Translation((3300, 0)),
        # "cell_3": i3.HMirror(0.0) + i3.Translation((9900, 0))
    })
#
# # prr_layout.visualize()
prr_layout.write_gdsii("2_2_MMI2112_V4.gds")
예제 #12
0
    manhattan=False,
    spacing=spacing_param[0])

print my_spiral_layout.trace_length()
#my_spiral_layout.visualize()

Spiral_width = incoupling_length_param[0] + 2 * (
    n_o_loop_param[0] + 1) * spacing_param[0] + inner_size_param[0]

print Spiral_width

from picazzo3.routing.place_route import PlaceAndAutoRoute

my_circuit = PlaceAndAutoRoute(
    trace_template=WG_IT19,
    child_cells={
        "spiral_c1": my_spiral,
    },
)

field_Ebeamx = 500
field_Ebeamy = 25 + 25 * 50

taper_length = 200

my_circuit_layout2 = my_circuit.Layout(
    bend_radius=50,
    child_transformations={
        "spiral_c1":
        (field_Ebeamx / 2 + taper_length + socket_lentgh_def + wg_length / 2 -
         Spiral_width / 2 - incoupling_length_param[0] / 2, field_Ebeamy),
    })
예제 #13
0
spr4_layout = spr4.Layout()
spr5 = my_dc(gap_inc_vec=[300, 200], sm_width=3.6)
spr5_layout = spr5.Layout()
spr6 = my_dc(gap_inc_vec=[300, 200], sm_width=3.8)
spr6_layout = spr6.Layout()
spr7 = my_dc(gap_inc_vec=[300, 200], sm_width=4.0)
spr7_layout = spr7.Layout()
spr8 = my_dc(gap_inc_vec=[300, 200], sm_width=4.2)
spr8_layout = spr8.Layout()

pr = PlaceAndAutoRoute(
    child_cells={
        "dc1": spr1,
        "dc2": spr2,
        "dc3": spr3,
        "dc4": spr4,
        "dc5": spr5,
        "dc6": spr6,
        "dc7": spr7,
        "dc8": spr8
    })
pr_layout = pr.Layout(
    child_transformations={
        "dc1": (0, 0),
        "dc2": i3.VMirror(-2000) + i3.Translation((0, 4000)),
        "dc3": (0, 8500),
        "dc4": i3.VMirror(-2000) + i3.Translation((0, 12500)),
        "dc5": (0, 17000),
        "dc6": i3.VMirror(-2000) + i3.Translation((0, 21000)),
        "dc7": (0, 25500),
        "dc8": i3.VMirror(-2000) + i3.Translation((0, 29500))
예제 #14
0
                height=20.0)

            # elems += i3.PolygonText(layer=i3.TECH.PPLAYER.WG.TEXT,
            #                         text='Name={}_R={}_delay={}'.format(name, self.R, self.delay_length),
            #
            #                         coordinate=(0.0, -counter * 5 * self.R - 2 * self.R + 50.0  # -100
            #                                     ),
            #                         alignment=(i3.TEXT_ALIGN_LEFT, i3.TEXT_ALIGN_LEFT),
            #                         font=2,
            #                         height=20.0)

            return elems


# dc_10 = my_dc()
# dc_10_layout = dc_10.Layout()
# dc_10_layout.visualize(annotate=True)
# dc_10_layout.write_gdsii("DC_V3.gds")

dc_10 = my_dc(width=10)
dc_15 = my_dc(width=15)
dc_20 = my_dc(width=20)
pr = PlaceAndAutoRoute(child_cells={"dc1": dc_10, "dc2": dc_15, "dc3": dc_20})
pr_layout = pr.Layout(child_transformations={
    "dc1": (0, 0),
    "dc2": (0, 8300),
    "dc3": (0, 16600)
})
# pr_layout.visualize()
pr_layout.write_gdsii("3_DC_V3.gds")
예제 #15
0
def ringcircuit2(radius, gap, gap1, wg_ring_width, wg_coupler_width,
                 wg_coupler_width2, tl, gwgw, gsl, gp, gdc, gp2, gdc2):
    gwg = gratingwaveguide(gwgw)
    g = grating(gwg, gsl, gp, gdc)
    g2 = grating(gwg, gsl, gp2, gdc2)
    r = ring2(radius, gap, gap1, wg_ring_width, wg_coupler_width,
              wg_coupler_width2)
    wgt = WireWaveguideTemplate()
    wgt.Layout(core_width=wg_coupler_width,
               cladding_width=wg_coupler_width + 6)
    wgt2 = WireWaveguideTemplate()
    wgt2.Layout(core_width=wg_coupler_width2,
                cladding_width=wg_coupler_width2 + 6)
    t = taper(gwg, wgt, tl)
    t2 = taper(gwg, wgt2, tl)

    circuit = PlaceAndAutoRoute(
        child_cells={
            "grating1": g,
            "taper1": t,
            "ring": r,
            "taper2": t,
            "grating2": g,
            "grating3": g2,
            "taper3": t2,
            "taper4": t2,
            "grating4": g2
        })

    circuit_layout = circuit.Layout(
        child_transformations={
            "grating1":
            i3.Translation((gsl / 2.0, 0)),
            "taper1":
            i3.Translation((gsl, 0)),
            "ring":
            i3.Translation((gsl + tl + 20, radius + gap + wg_ring_width / 2.0 +
                            wg_coupler_width / 2.0)),
            "taper2":
            i3.Rotation(rotation_center=(0.0, 0.0),
                        rotation=180,
                        absolute_rotation=False) +
            i3.Translation((gsl + 2 * tl + 40, 0)),
            "grating2":
            i3.Rotation(rotation_center=(0.0, 0.0),
                        rotation=180,
                        absolute_rotation=False) +
            i3.Translation((gsl * 3 / 2.0 + 2 * tl + 40, 0)),
            "grating3":
            i3.Translation((gsl / 2.0, 2 * radius + gap + gap1 +
                            wg_ring_width + wg_coupler_width)),
            "taper3":
            i3.Translation((gsl, 2 * radius + gap + gap1 + wg_ring_width +
                            wg_coupler_width)),
            "taper4":
            i3.Rotation(rotation_center=(0.0, 0.0),
                        rotation=180,
                        absolute_rotation=False) +
            i3.Translation((gsl + 2 * tl + 40, 2 * radius + gap + gap1 +
                            wg_ring_width + wg_coupler_width)),
            "grating4":
            i3.Rotation(rotation_center=(0.0, 0.0),
                        rotation=180,
                        absolute_rotation=False) +
            i3.Translation((gsl * 3 / 2.0 + 2 * tl + 40, 2 * radius + gap +
                            gap1 + wg_ring_width + wg_coupler_width))
        })

    return circuit
예제 #16
0
                "WGuptaper2": i3.HMirror() + i3.Translation((3100, 4000)),
                "WGdowntaper2": i3.HMirror() + i3.Translation((3100, -4000)),
                "WGup2": (3050, 4000),
                "WGdown2": (3050, -4000)
            }
            return child_transformations

        def _default_bend_radius(self):
            bend_radius = 300
            return bend_radius


mmi1 = ring()
mmi2 = ring()
mmi1_layout = mmi1.Layout(length=300)
mmi2_layout = mmi2.Layout(length=400)

pr = PlaceAndAutoRoute(child_cells={
    "1": mmi1,
    "2": mmi2,
})
layout = pr.Layout(child_transformations={
    "1": (0, 0),
    "2": (4100, 0),
})
layout.write_gdsii("testmmiV8.gds")

#layout.visualize(annotate=True)

# # my_ring_layout.write_gdsii("my_ring.gds")
# layout.write_gdsii("testmmiV7.gds")
예제 #17
0
spr4_layout = spr4.Layout()
spr5 = my_dc(gap_inc_vec=[300, 250, 200, 150], sm_width=3.6)
spr5_layout = spr5.Layout()
spr6 = my_dc(gap_inc_vec=[300, 250, 200, 150], sm_width=3.8)
spr6_layout = spr6.Layout()
spr7 = my_dc(gap_inc_vec=[300, 250, 200, 150], sm_width=4.0)
spr7_layout = spr7.Layout()
spr8 = my_dc(gap_inc_vec=[300, 250, 200, 150], sm_width=4.2)
spr8_layout = spr8.Layout()

pr = PlaceAndAutoRoute(
    child_cells={
        "dc1": spr1,
        "dc2": spr2,
        "dc3": spr3,
        "dc4": spr4,
        "dc5": spr5,
        "dc6": spr6,
        "dc7": spr7,
        "dc8": spr8
    })
# pr_layout = pr.Layout(child_transformations={"dc1": (0, 0),
#                                              "dc2": i3.VMirror(-2000) + i3.Translation((0, 700)),
#                                              "dc3": (0, 5200),
#                                              "dc4": i3.VMirror(-2000) + i3.Translation((0, 5900)),
#                                              "dc5": (0, 10400),
#                                              "dc6": i3.VMirror(-2000) + i3.Translation((0, 11100)),
#                                              "dc7": (0, 15600),
#                                              "dc8": i3.VMirror(-2000) + i3.Translation((0, 16300))
#                                              })
예제 #18
0
        grating_coupler_layout.ports["out"],
        i3.Vector(position=(cnt * d - 10, d), angle=90.0))
    transformations["term_out{}".format(cnt)] = i3.Rotation(rotation=90.0,rotation_center=wwa_lay.ports["in"]) + \
        i3.vector_match_transform(wwa_lay.ports["in"],
        r_layouts[cnt-1].ports["in2"].transform_copy(transformations["ring{}".format(cnt)])) + \
        i3.Translation(translation=(10.0,10.0))

transformations['gc_ref'] = i3.vector_match_transform(
    grating_coupler_layout.ports["out"],
    i3.Vector(position=(9 * d, -d / 2), angle=0.0))
transformations['gc_pass'] = i3.vector_match_transform(
    grating_coupler_layout.ports["out"],
    i3.Vector(position=(9 * d, d / 2), angle=0.0))

# Create the PCell
my_circuit = PlaceAndAutoRoute(child_cells=cells, links=links)

# Create Layout
layout = my_circuit.Layout(child_transformations=transformations)
layout.visualize(annotate=True)
layout.write_gdsii("full_circuit_8.gds")

# If the you pick resonance frequencies that lead to a off-grid ports it is safest to flatten your entire design.
top_cell_layout_flat = layout.layout.flat_copy()
top_layout_flat = i3.LayoutCell().Layout(elements=top_cell_layout_flat)
top_layout_flat.write_gdsii("full_circuit_flat_8.gds")

# Simulate
cm = my_circuit.CircuitModel()
wavelengths = np.linspace(1.52, 1.58, 4001)
S = cm.get_smatrix(wavelengths=wavelengths)
예제 #19
0
                        )

layout_mmi22 = mmi22.Layout(transition_length=200.0, length=398.0, trace_spacing=11.0)

# layout_mmi1_21.visualize(annotate="true")

pr = PlaceAndAutoRoute( trace_template=wg_sm,
                        child_cells={
                                    "MMI1b": mmi22,
                                    "WGup": WG1,
                                    "WGdown": WG1,
                                    "WGup2": WG1,
                                    "WGdown2": WG1,
                                     "WGuptaper":WG2,
                                     "WGdowntaper":WG2,
                                     "WGuptaper2":WG3,
                                     "WGdowntaper2":WG3},
                       links=[
                              ("MMI1b:out2", "WGuptaper2:in"),
                              ("MMI1b:out1", "WGdowntaper2:in"),
                            # ("MMI1b:out","MMI1a:in"),
                              ("WGuptaper:out", "MMI1b:in2"),
                              ("WGdowntaper:out", "MMI1b:in1")
                       ]
                       )

layout = pr.Layout(child_transformations={"MMI1b": (1200, 0),
                                          "WGup": (0, 4000),
                                          "WGuptaper":(0,4000),
                                          "WGdown": (0, -4000),
                                          "WGdowntaper":(0,-4000),
예제 #20
0

wg_width = 0.5
lengths = [5000, 10000, 20000, 40000]
true_lengths = []
child_cells = dict()
child_cells["straight_ref_top"] = StraightWgLossEbeamFBMSMerged(name="Straight_ref_top", wg_width=wg_width)
child_cells["straight_ref_bottom"] = StraightWgLossEbeamFBMSMerged(name="Straight_ref_bottom", wg_width=wg_width)
for num,length in enumerate(lengths):
    a = SpiralWgLossEbeamFBMSMerged(name="Spiral_length_"+str(length), spiral_length=length, wg_width=wg_width)
    a_lo = a.Layout()
    child_cells["length"+str(length)] = a
    # true_lengths.append(a_lo.get_true_length())
    # print length, true_lengths[num]

child_transformations = dict()
child_transformations["length40000"] = (0,0)
# middle_x_plane = (a_lo.ports["in"].position.x+a_lo.ports["out"].position.x)/2.0
si = a_lo.size_info()
# middle_x_plane = (a_lo.west.position.x+a_lo.east.position.x)/2.0
middle_x_plane = (si.west+si.east)*0.5
child_transformations["length5000"] = i3.CMirror(mirror_center=(middle_x_plane,0)) + i3.Translation((0,600))
child_transformations["length10000"] = (0,700)
child_transformations["length20000"] = i3.CMirror(mirror_center=(middle_x_plane,0)) + i3.Translation((0,600+700))
child_transformations["straight_ref_top"] = (0,600+700+100)
child_transformations["straight_ref_bottom"] = (0,-100)

SpiralWg = PlaceAndAutoRoute(name="SpiralWgEbeam"+str(wg_width),child_cells=child_cells)
lo = SpiralWg.Layout(child_transformations=child_transformations)
gds_name = os.path.join(os.curdir, "spiral_wg_sweep_width"+str(wg_width)+".gds")
lo.write_gdsii(gds_name)
예제 #21
0
                                    trace_template=wg_sm2)
layout21 = mmi1_21_taper.Layout(transition_length=200)
#layout21.visualize()
# layout.write_gdsii("testmmiV4.gds")

pr = PlaceAndAutoRoute(
    trace_template=wg_sm,
    child_cells={
        "MMI1a": mmi1_12_taper,
        "MMI1b": mmi1_21_taper,
        "WGup": WG1,
        "WGdown": WG1,
        "WGup2": WG1,
        "WGdown2": WG1,
        "WGuptaper": WG2,
        "WGdowntaper": WG2,
        "WGuptaper2": WG3,
        "WGdowntaper2": WG3
    },
    links=[
        ("MMI1a:out2", "WGuptaper2:in"),
        ("MMI1a:out1", "WGdowntaper2:in"),
        # ("MMI1b:out","MMI1a:in"),
        ("WGuptaper:out", "MMI1b:in2"),
        ("WGdowntaper:out", "MMI1b:in1")
    ])

layout = pr.Layout(child_transformations={
    "MMI1a": (1787, 0),
    "MMI1b": (1200, 0),
    "WGup": (0, 4000),
예제 #22
0
                                      box_width=15.5)
my_grating_cm = my_grating.CircuitModel(center_wavelength=1.55,
                                        bandwidth_3dB=0.06,
                                        peak_transmission=0.60**0.5,
                                        reflection=0.05**0.5)
my_grating_layout.visualize(annotate="true")

# 5. Create the place and auto-route.
from picazzo3.routing.place_route import PlaceAndAutoRoute

my_circuit = PlaceAndAutoRoute(child_cells={
    "in_grating": my_grating,
    "pass_grating": my_grating,
    "add_grating": my_grating,
    "drop_grating": my_grating,
    "ring": my_ring
},
                               links=[("in_grating:out", "ring:in1"),
                                      ("pass_grating:out", "ring:out1"),
                                      ("add_grating:out", "ring:in2"),
                                      ("drop_grating:out", "ring:out2")])

distance_x = 100.0
distance_y = 30.0
my_circuit_layout = my_circuit.Layout(
    child_transformations={
        "ring": (0, 0),
        "in_grating":
        i3.Rotation(rotation=0) + i3.Translation((-distance_x, -distance_y)),
        "pass_grating":
        i3.Rotation(rotation=180) + i3.Translation((distance_x, -distance_y)),
예제 #23
0
dc_10 = my_dc(gap_inc_vec=[0.6, 0.8, 1.0, 1.2], length=40, name="ring1")
dc_10_layout = dc_10.Layout()
dc_15 = my_dc(gap_inc_vec=[0.6, 0.8, 1.0, 1.2], length=60, name="ring2")
dc_15_layout = dc_15.Layout()
dc_20 = my_dc(gap_inc_vec=[0.6, 0.8, 1.0, 1.2], length=90, name="ring3")
dc_20_layout = dc_20.Layout()
dc_25 = my_dc(gap_inc_vec=[0.6, 0.8, 1.0, 1.2], length=120, name="ring4")
dc_25_layout = dc_25.Layout()
# dc_10_layout.visualize(annotate=True)
# dc_10_layout.write_gdsii("DC_V4.gds")

# dc_10 = my_dc(width=10)
# dc_15 = my_dc(width=15)
# dc_20 = my_dc(width=20)
pr = PlaceAndAutoRoute(child_cells={
    "dc1": dc_10,
    "dc2": dc_15,
    "dc3": dc_20,
    "dc4": dc_25
})
pr_layout = pr.Layout(
    child_transformations={
        "dc1": (0, 0),
        "dc2": i3.HMirror(1500) + i3.Translation((3000, 0)),
        "dc3": (6000, 0),
        "dc4": i3.HMirror(1500) + i3.Translation((9000, 0))
    })
# pr_layout.visualize()
pr_layout.write_gdsii("ring_double.gds")
예제 #24
0
layout_mmi22 = mmi22.Layout(transition_length=200.0, length=398.0, trace_spacing=11.0)

# layout_mmi1_21.visualize(annotate="true")

pr = PlaceAndAutoRoute( trace_template=wg_sm,
                        child_cells={
                                    "MMI1a": mmi22,
                                    "MMI1b": mmi22,
                                    "WGup": WG1,"WGup3": WG1,
                                    "WGdown": WG1, "WGdown3": WG1,
                                    "WGup2": WG1,
                                    "WGdown2": WG1,
                                     "WGuptaper":WG2,
                                     "WGdowntaper":WG2,
                                     "WGuptaper2":WG3,
                                     "WGdowntaper2":WG3},
                       links=[
                              ("MMI1b:out2", "WGuptaper2:in"),
                              ("MMI1b:out1", "WGdowntaper2:in"),
                             ("MMI1a:in1","WGdown2:out"),("MMI1a:in2","WGup2:out"),
                           ("MMI1a:out1","WGdown3:in"),("MMI1a:out2","WGup3:in"),
                              ("WGuptaper:out", "MMI1b:in2"),
                              ("WGdowntaper:out", "MMI1b:in1")
                       ]
                       )

layout = pr.Layout(child_transformations={"MMI1b": (1200, 0),
                                            "MMI1a": (1200+3600, 0),
                                          "WGup": (0, 4000),
                                          "WGuptaper":(0,4000),
예제 #25
0
# mmi2.set(width=20)
# mmi2_layout = mmi2.Layout()
# mmi3 = v8(name="P3", widtha=20)
# mmi2.set(width=20)

# print mmi1.width
# mmi1_layout.write_gdsii("MMI22_V2_1.gds")
# mmi2_layout.write_gdsii("MMI22_V2_2.gds")
# mmi3_layout.write_gdsii("MMI22_V2_3.gds")

pr = PlaceAndAutoRoute(
    child_cells={
        "1": mmi1,
        "2": mmi2,
        "3": mmi3,
        # "4": mmi4,
        # "5": mmi5,
        # "6": mmi6,
        # "7": mmi7,
        # "8": mmi8,
        # "9": mmi9
    })

pr_layout = pr.Layout(
    child_transformations={
        "1": (0, 0),
        "2": i3.HMirror(0.0) + i3.Translation((6000, 0)),
        "3": (6000, 0),
        # "4": (0, 8300),
        # "5": i3.HMirror(0.0) + i3.Translation((6000, 8300)),
        # "6": (6000, 8300),
        # "7": (0, 16600),
예제 #26
0
# print mmi1.width
# mmi1_layout.write_gdsii("MMI22_V2_1.gds")
# mmi2_layout.write_gdsii("MMI22_V2_2.gds")
# mmi3_layout.write_gdsii("MMI22_V2_3.gds")

pr = PlaceAndAutoRoute(
    child_cells={
        "1": mmi1,
        "2": mmi2,
        "3": mmi3,
        "4": mmi4,
        "5": mmi5,
        "6": mmi6,
        "7": mmi7,
        "8": mmi8,
        "9": mmi9,
        "10": mmi10,
        "11": mmi11,
        "12": mmi12,
        "13": mmi13,
        "14": mmi14,
        "15": mmi15
    }
)

pr_layout = pr.Layout(child_transformations={"10": (0, 0),
                                             "1": i3.HMirror(0.0) + i3.Translation((6000, 0)),
                                             "2": (6000, 0),

                                             "12": (0, 10700),
예제 #27
0
#                 bend_angle=30.0,
#                 rounding_algorithm=ra)

# layout.visualize(annotate=True)
# layout.write_gdsii("DC_V1.gds")

pr = PlaceAndAutoRoute(
    trace_template=wg_sm,
    child_cells={
        "MMI1b": C,
        "WGup": WG1,
        "WGdown": WG1,
        "WGup2": WG1,
        "WGdown2": WG1,
        "WGuptaper": WG2,
        "WGdowntaper": WG2,
        "WGuptaper2": WG3,
        "WGdowntaper2": WG3
    },
    links=[
        ("MMI1b:out2", "WGuptaper2:in"),
        ("MMI1b:out1", "WGdowntaper2:in"),
        # ("MMI1b:out","MMI1a:in"),
        ("WGuptaper:out", "MMI1b:in2"),
        ("WGdowntaper:out", "MMI1b:in1")
    ])

layout = pr.Layout(child_transformations={
    "MMI1b": (1500, 0),
    "WGup": (0, 4000),
    "WGuptaper": (0, 4000),
    "WGdown": (0, -4000),
예제 #28
0
# dc_10_layout.write_gdsii("DC_V4.gds")
#

# Interface(pocket= False, tilt=False).Layout.view.write_gdsii("interface1.gds")
dc20 = Interface(name="haha", pocket= False, tilt=False)
dc20_layout = dc20.Layout()
# dc20.visualize()

print("Done writing Release.gds!")

dc_15 = my_dc(gap_inc_vec=[390, 398, 406],  name="ring2")
dc_15_layout = dc_15.Layout()


pr = PlaceAndAutoRoute(
    child_cells={
        "dc1": dc_10,
        "dc2": dc_15,
        "dc3": dc20,
        # "dc3": dc_20,
        # "dc4": dc_25
    }
)
pr_layout = pr.Layout(child_transformations={"dc1": (0, 0),
                                             "dc2": i3.HMirror(2500) - i3.Translation((5000, 0)),
                                             "dc3": (-15000, 0),

                                             })
pr_layout.visualize()
pr_layout.write_gdsii("execute_test2.gds")