Layout#

All UBC ubcpdk.cells are conveniently combined into the ubcpdk.components module.

import gdsfactory as gf

from ubcpdk import PDK, cells

PDK.activate()

Fixed Component cells#

Most ubcpdk components are imported from GDS files as fixed cells.

c = cells.ebeam_crossing4()
c.plot()
../_images/99aa3a6e5659c6a7b6af172b77b9f54555e859ce611c26b756d08293373ee6cd.png
c = cells.ebeam_swg_edgecoupler()
c.plot()
../_images/80aab03b26870f950a1a11b93d387e1951ea6bbda22dc97323eaef4c96543ddf.png
c = cells.ebeam_bdc_te1550()
c.plot()
../_images/213e0910c181f55d1396e15aad4f007d29960119dbf8d901ec98c5dd45f9eac1.png
c = cells.ebeam_adiabatic_te1550()
c.plot()
../_images/fa6da483c84c9a8636d5b5aca46eb54d32c19da8112a0e6023440d3e3d5d9ba6.png
c = cells.ebeam_y_adiabatic()
c.plot()
../_images/56c73ec0c607e0df640fa35c67c804d3b6e1cf25a34ecace46d84a17db972e59.png
c = cells.ebeam_y_1550()
c.plot()
../_images/3d64e07cd1481dea2da8eacc61bdf3032d695ace29364fcd2c6dcb53addcedc3.png

Parametric Component PCells#

You can also define cells adapted from gdsfactory generic pdk.

c = cells.straight(length=2)
c.plot()
../_images/866808f720a06416d85df88cf5df8df78de9629581301812c729bb4f8d814b61.png
c = cells.bend_euler(radius=5)
c.plot()
../_images/0a60a981687535ce06b30c5043b59fac2e66ccfed2acf70c7dc57f18dba8adbc.png
c = cells.spiral()
c.plot()
../_images/485d37ad5cd3259a95996026e429a7f0e43d63d538fd683ac46bed2dbae10275.png
c = cells.ring_single_heater()
c.plot()
../_images/9fa8f905f87596e7057fb6183de8a0bbe11e07cecf38e4d3160d3eeabb181189.png

Components with grating couplers#

To test your devices you can add grating couplers. Both for single fibers and for fiber arrays.

splitter = cells.ebeam_y_1550()
mzi = gf.components.mzi(splitter=splitter)
mzi.plot()
../_images/c19534eee12b49e0718d2dddfe785cb007279e7cffc7fa06560d32c81655dcf9.png
component_fiber_array = cells.add_fiber_array(component=mzi, fanout_length=5)
component_fiber_array.plot()
../_images/aed9e35b40a72665898bacdaee933a6b64cc816176863e91540af78116f36287.png
c = cells.ring_single_heater()
c = cells.add_fiber_array_pads_rf(c)
c.plot()
../_images/560624edfbc45421b62db3fe54e6740f314c993f64674fa6cffac2bdf2c5056d.png
c = cells.mzi_heater()
c = cells.add_fiber_array_pads_rf(c)
c.plot()
../_images/98a15c96a38f3ebabf3dfcf931063b1f4d273b48ce8c5b5fea5ec58e3461814a.png

3D rendering#

scene = c.to_3d()
scene.show()

Die assembly#

from functools import partial

import gdsfactory as gf

from ubcpdk.tech import LAYER

size = (440, 470)
add_gc = cells.add_fiber_array


@gf.cell
def EBeam_JoaquinMatres_1() -> gf.Component:
    """Add DBR cavities."""
    e = [add_gc(cells.straight())]
    e += [add_gc(cells.mzi(delta_length=dl)) for dl in [9.32, 93.19]]
    e += [
        add_gc(cells.ring_single(radius=12, gap=gap, length_x=coupling_length))
        for gap in [0.2]
        for coupling_length in [2.5, 4.5, 6.5]
    ]

    c = gf.Component()
    _ = c << gf.pack(e, max_size=size, spacing=2)[0]
    _ = c << gf.components.rectangle(size=size, layer=LAYER.FLOORPLAN)
    return c


c = EBeam_JoaquinMatres_1()
c.show()  # show in klayout
c.plot()  # plot in notebook
../_images/3fa1bd01083d00f9318a80bec36bae4092bedf44281f7e2bebb1026d0531f52c.png
def EBeam_JoaquinMatres_2() -> gf.Component:
    """spirals for extracting straight waveguide loss"""

    e = [
        cells.add_fiber_array(component=cells.spiral(n_loops=8, length=length))
        for length in [0, 100, 200]
    ]

    c = gf.Component()
    _ = c << gf.pack(e, max_size=size, spacing=2)[0]
    _ = c << gf.components.rectangle(size=size, layer=LAYER.FLOORPLAN)
    return c


c = EBeam_JoaquinMatres_2()
c.show()  # show in klayout
c.plot()  # plot in notebook
../_images/f4cd74608920652cc5f7f793dcc9945f6da42b8a9eb24c1744b3e54eb178f634.png
def EBeam_JoaquinMatres_3() -> gf.Component:
    """Contains mirror cavities and structures inside a resonator."""
    e = []
    e += [add_gc(cells.ebeam_crossing4())]
    e += [add_gc(cells.ebeam_adiabatic_te1550())]
    e += [add_gc(cells.ebeam_bdc_te1550())]
    e += [add_gc(cells.ebeam_y_1550())]
    e += [add_gc(cells.straight(), component_name=f"straight_{i}") for i in range(2)]
    c = gf.Component()
    _ = c << gf.pack(e, max_size=size, spacing=2)[0]
    _ = c << gf.components.rectangle(size=size, layer=LAYER.FLOORPLAN)
    return c


c = EBeam_JoaquinMatres_3()
c.show()  # show in klayout
c.plot()  # plot in notebook
../_images/7d45e293f6c2d1ca1801e5ff1e4a237f0c3c2af1e6b7a50ed707dac70cf2c50b.png
def EBeam_JoaquinMatres_4() -> gf.Component:
    """MZI interferometers."""
    mzi = partial(gf.components.mzi, splitter=cells.ebeam_y_1550)
    mzis = [mzi(delta_length=delta_length) for delta_length in [10, 40]]
    mzis_gc = [cells.add_fiber_array(mzi, fanout_length=5) for mzi in mzis]

    mzis = [cells.mzi_heater(delta_length=delta_length) for delta_length in [40]]
    mzis_heater_gc = [
        cells.add_fiber_array_pads_rf(mzi, orientation=90) for mzi in mzis
    ]

    e = mzis_gc + mzis_heater_gc
    c = gf.Component()
    _ = c << gf.pack(e, max_size=size, spacing=2)[0]
    _ = c << gf.components.rectangle(size=size, layer=LAYER.FLOORPLAN)
    return c


c = EBeam_JoaquinMatres_4()
c.show()  # show in klayout
c.plot()  # plot in notebook
../_images/153d18a5328dd78c733989c071ba35437b13eddb3d6bac641daeaf8272efe2f6.png
def EBeam_JoaquinMatres_5() -> gf.Component:
    """Ring resonators."""

    rings = []
    for length_x in [4, 6]:
        ring = cells.ring_single_heater(length_x=length_x)
        ring_gc = cells.add_fiber_array_pads_rf(ring, pad_yspacing=10)
        rings.append(ring_gc)

    c = gf.Component()
    _ = c << gf.pack(rings, max_size=size, spacing=2)[0]
    _ = c << gf.components.rectangle(size=size, layer=LAYER.FLOORPLAN)
    return c


c = EBeam_JoaquinMatres_5()
c.show()  # show in klayout
c.plot()  # plot in notebook
../_images/881cefbbb33b4351f9c2222bb4130e48eb7625ff6f342f13b86bd6215f895db3.png