Examples

III-V-on-Silicon DFB Laser

A heterogeneously integrated III-V/silicon distributed feedback laser with a quarter-wave-shifted grating and adiabatic tapers.

Compiling…
Laser from laylight/laser.lyl, compiled in your browserOpen in playground

Silicon does not emit light, so lasers on silicon chips bond a III-V gain material, such as an InP-based multiple-quantum-well stack, on top of a silicon waveguide. In the gain section the optical mode sits mostly in the III-V; at both ends the III-V mesa narrows to a tip while the silicon waveguide widens, which pushes the mode down into the silicon. A grating etched into the silicon under the gain section makes it a distributed feedback (DFB) laser, and a quarter-wave phase shift in the middle of the grating makes it lase on a single wavelength.

The example follows the DFB lasers of Keyvaninia et al.: a 3 µm mesa over a 680 µm gain section, narrowing to 0.9 µm over 35 µm and then to a 500 nm tip over 150 µm at each end. Under it, the silicon waveguide is 0.68 µm wide and widens to 2.16 µm along the tips, after the laser of Duprez et al. The grating trenches have a 490 nm period and a 25 % duty cycle; the two halves of the grating are a quarter period apart, the quarter-wave shift of a second-order grating. A wider n-InP layer carries the n contacts on either side of the mesa, a p contact runs along the top of the mesa, and metal covers each contact.

References

  • S. Keyvaninia et al., "Heterogeneously integrated III-V/silicon distributed feedback lasers," Optics Letters 38(24), 5434 (2013). doi:10.1364/OL.38.005434
  • H. Duprez et al., "1310 nm hybrid InP/InGaAsP on silicon distributed feedback laser with high side-mode suppression ratio," Optics Express 23(7), 8489–8497 (2015), for the silicon waveguide. doi:10.1364/OE.23.008489

Parameters

ParameterValueSource
Gain section680 µmKeyvaninia 2013 (read as the length of the grating section)
Grating490 nm period, 25 % etched, quarter-wave shiftKeyvaninia 2013, Fig. 1(b), Fig. 2
Mesa3 µm; 35 µm taper to 0.9 µm; 150 µm taper to a 500 nm tipKeyvaninia 2013, Sec. 2
Silicon waveguide0.68 µm, widening to 2.16 µm along the tipsDuprez 2015 (taper length matched to the III-V taper)
n-InP layer, contacts50 µm; 2 µm p contact, 10 µm n contactsassumed

How it is written

The mesa is a rectangle with two tapers chained on each end by their start and end anchors; the left ones are clones placed with rotate 180deg. The silicon tapers are placed on the start of the III-V tips, so they run alongside them whatever the dimensions. The grating is one loop that places a trench on each side of the center, offset by an eighth of a period, which leaves the quarter-period shift in the middle. The metal is one line: the three contacts grown by 1 µm, [p_contact, n_upper, n_lower] + 1um.

Implementations

ImplementationLines of codeTokensLayout
Laylight40329reference
gdsfactory48 (1.20×)501 (1.52×)same within 1 nm
gdstk37 (0.93×)441 (1.34×)same within 1 nm
KLayout41 (1.02×)409 (1.24×)same within 1 nm
laylight/laser.lyl
import "tech.lyl"

# A heterogeneously integrated III-V-on-silicon DFB laser, after Keyvaninia et
# al., Opt. Lett. 2013: a III-V mesa bonded over a Si waveguide with a
# second-order grating and a quarter-wave shift. At both ends the mesa tapers
# to a tip while the Si widens, so that the light moves down into the Si.
cell Laser(
    length = 680um,  # gain section with the grating
    period = 490nm,
    duty_cycle = 0.25,  # etched fraction of a period
    si_width = 680nm,  # Si waveguide under the gain section
    si_out_width = 2.16um,  # ... and at the tips
    mesa_width = 3um,
    neck_width = 900nm,  # after the fast taper
    tip_width = 500nm,
    fast_length = 35um,
    taper_length = 150um,  # adiabatic taper
    nmesa_width = 50um,
    contact_width = 2um,  # p contact on the mesa
    n_contact_width = 10um,
) {
    layer mesa {
        shape rect with length, mesa_width as gain at self.origin
        shape taper with fast_length, mesa_width, neck_width as right_fast
        place right_fast.start at gain.right_center
        shape taper with taper_length, neck_width, tip_width as right_tip
        place right_tip.start at right_fast.end
        clone right_fast as left_fast.start at gain.left_center rotate 180deg
        clone right_tip as left_tip.start at left_fast.end
    }

    layer si {
        shape rect with length + 2 * fast_length, si_width as core at self.origin
        shape taper with taper_length, si_width, si_out_width as right_out
        place right_out.start at right_tip.start
        clone right_out as left_out.start at left_tip.start
    }

    # Grating trenches; the two halves are a quarter wave apart, which is a
    # quarter period for a second-order grating.
    layer shallow {
        for i in 0..round(length / period / 2) {
            define x = period / 8 + (i + 0.5) * period
            shape rect with duty_cycle * period, si_width as left at (-x, 0)
            clone left as right at (x, 0)
        }
    }

    layer nmesa { shape rect with length, nmesa_width as n_layer at self.origin }

    # A p contact on the mesa and n contacts on the n layer on either side,
    # each under a metal strip 1 um wider.
    layer contact {
        shape rect with length, contact_width as p_contact at self.origin
        shape rect with length, n_contact_width as n_upper
        place n_upper at (0, (mesa_width + nmesa_width) / 4)
        clone n_upper as n_lower at (0, -(mesa_width + nmesa_width) / 4)
    }

    layer metal { shape [p_contact, n_upper, n_lower] + 1um as electrodes }
}
gdsfactory/laser.py
"""A heterogeneously integrated III-V-on-silicon DFB laser, as laylight/laser.lyl."""

import gdsfactory as gf

from tech import CONTACT, MESA, METAL, NMESA, SHALLOW, SI


@gf.cell
def laser(
    length=680,
    period=0.49,
    duty_cycle=0.25,
    si_width=0.68,
    si_out_width=2.16,
    mesa_width=3,
    neck_width=0.9,
    tip_width=0.5,
    fast_length=35,
    taper_length=150,
    nmesa_width=50,
    contact_width=2,
    n_contact_width=10,
):
    """A III-V mesa over a Si waveguide with a second-order grating and a quarter-wave
    shift; at both ends the mesa tapers to a tip while the Si widens."""
    c = gf.Component()
    mesa = gf.cross_section.cross_section(width=mesa_width, layer=MESA)
    gain = c << gf.components.straight(length, cross_section=mesa)
    gain.dmove((-length / 2, 0))
    for port in gain.ports:
        fast = c << gf.components.taper(fast_length, mesa_width, neck_width, layer=MESA)
        fast.connect("o1", port)
        tip = c << gf.components.taper(taper_length, neck_width, tip_width, layer=MESA)
        tip.connect("o1", fast.ports["o2"])
    si = gf.cross_section.cross_section(width=si_width, layer=SI)
    core = c << gf.components.straight(length + 2 * fast_length, cross_section=si)
    core.dmove((-length / 2 - fast_length, 0))
    for port in core.ports:
        out = c << gf.components.taper(taper_length, si_width, si_out_width, layer=SI)
        out.connect("o1", port)
    # Grating trenches; the two halves are a quarter wave apart, which is a quarter
    # period for a second-order grating.
    size = (duty_cycle * period, si_width)
    trench = gf.components.rectangle(size, layer=SHALLOW, centered=True)
    columns = round(length / period / 2)
    for s in [1, -1]:
        grating = c.add_ref(trench, columns=columns, column_pitch=s * period)
        grating.dmove((s * (period / 8 + period / 2), 0))
    c << gf.components.rectangle((length, nmesa_width), layer=NMESA, centered=True)
    # A p contact on the mesa and n contacts on the n layer on either side, each
    # under a metal strip 1 um wider.
    y = (mesa_width + nmesa_width) / 4
    for yc, w in [(0, contact_width), (y, n_contact_width), (-y, n_contact_width)]:
        contact = c << gf.components.rectangle(
            (length, w), layer=CONTACT, centered=True
        )
        contact.dmove((0, yc))
        metal = c << gf.components.rectangle(
            (length + 2, w + 2), layer=METAL, centered=True
        )
        metal.dmove((0, yc))
    return c


if __name__ == "__main__":
    import sys

    laser().write_gds(sys.argv[1])
gdstk/laser.py
"""A heterogeneously integrated III-V-on-silicon DFB laser, as laylight/laser.lyl."""

import gdstk

from tech import CONTACT, MESA, METAL, NMESA, SHALLOW, SI


def laser(
    length=680,
    period=0.49,
    duty_cycle=0.25,
    si_width=0.68,
    si_out_width=2.16,
    mesa_width=3,
    neck_width=0.9,
    tip_width=0.5,
    fast_length=35,
    taper_length=150,
    nmesa_width=50,
    contact_width=2,
    n_contact_width=10,
):
    """A III-V mesa over a Si waveguide with a second-order grating and a quarter-wave
    shift; at both ends the mesa tapers to a tip while the Si widens."""
    cell = gdstk.Cell("Laser")
    x0 = length / 2
    x1 = x0 + fast_length
    x2 = x1 + taper_length
    mesa = gdstk.FlexPath((-x2, 0), tip_width, **MESA)
    mesa.segment((-x1, 0), neck_width).segment((-x0, 0), mesa_width).segment((x0, 0))
    mesa.segment((x1, 0), neck_width).segment((x2, 0), tip_width)
    si = gdstk.FlexPath((-x2, 0), si_out_width, **SI)
    si.segment((-x1, 0), si_width).segment((x1, 0)).segment((x2, 0), si_out_width)
    cell.add(mesa, si)
    # Grating trenches; the two halves are a quarter wave apart, which is a quarter
    # period for a second-order grating.
    d = duty_cycle * period
    trench = gdstk.rectangle((-d / 2, -si_width / 2), (d / 2, si_width / 2), **SHALLOW)
    for i in range(round(length / period / 2)):
        x = period / 8 + (i + 0.5) * period
        cell.add(trench.copy().translate(-x, 0), trench.copy().translate(x, 0))
    cell.add(gdstk.rectangle((-x0, -nmesa_width / 2), (x0, nmesa_width / 2), **NMESA))
    # A p contact on the mesa and n contacts on the n layer on either side, each
    # under a metal strip 1 um wider.
    y = (mesa_width + nmesa_width) / 4
    for yc, w in [(0, contact_width), (y, n_contact_width), (-y, n_contact_width)]:
        contact = gdstk.rectangle((-x0, yc - w / 2), (x0, yc + w / 2), **CONTACT)
        cell.add(contact, *gdstk.offset(contact, 1, **METAL))
    return cell


if __name__ == "__main__":
    import sys

    lib = gdstk.Library()
    lib.add(laser())
    lib.write_gds(sys.argv[1])
klayout/laser.py
"""A heterogeneously integrated III-V-on-silicon DFB laser, as laylight/laser.lyl."""

import klayout.db as kdb

from tech import CONTACT, MESA, METAL, NMESA, SHALLOW, SI, layout
from waveguides import polygon


def symmetric(points):
    """The polygon symmetric about both axes through `points`, given from right to
    left in the upper right quadrant."""
    upper = points + [(-x, y) for x, y in reversed(points)]
    return polygon(upper + [(x, -y) for x, y in reversed(upper)])


def laser(
    length=680,
    period=0.49,
    duty_cycle=0.25,
    si_width=0.68,
    si_out_width=2.16,
    mesa_width=3,
    neck_width=0.9,
    tip_width=0.5,
    fast_length=35,
    taper_length=150,
    nmesa_width=50,
    contact_width=2,
    n_contact_width=10,
):
    """A III-V mesa over a Si waveguide with a second-order grating and a quarter-wave
    shift; at both ends the mesa tapers to a tip while the Si widens."""
    cell = layout.create_cell("Laser")

    def shapes(layer):
        return cell.shapes(layout.layer(layer))

    x0 = length / 2
    x1 = x0 + fast_length
    x2 = x1 + taper_length
    mesa = [(x2, tip_width / 2), (x1, neck_width / 2), (x0, mesa_width / 2)]
    shapes(MESA).insert(symmetric(mesa))
    shapes(SI).insert(symmetric([(x2, si_out_width / 2), (x1, si_width / 2)]))
    # Grating trenches; the two halves are a quarter wave apart, which is a quarter
    # period for a second-order grating.
    trench = kdb.DBox(duty_cycle * period, si_width)
    for i in range(round(length / period / 2)):
        x = period / 8 + (i + 0.5) * period
        shapes(SHALLOW).insert(trench.moved(-x, 0))
        shapes(SHALLOW).insert(trench.moved(x, 0))
    shapes(NMESA).insert(kdb.DBox(length, nmesa_width))
    # A p contact on the mesa and n contacts on the n layer on either side, each
    # under a metal strip 1 um wider.
    y = (mesa_width + nmesa_width) / 4
    for yc, w in [(0, contact_width), (y, n_contact_width), (-y, n_contact_width)]:
        contact = kdb.DBox(length, w).moved(0, yc)
        shapes(CONTACT).insert(contact)
        shapes(METAL).insert(contact.enlarged(1, 1))
    return cell


if __name__ == "__main__":
    import sys

    laser()
    layout.write(sys.argv[1])

On this page