Skip to content

Download notebook (.ipynb)

Straight Waveguide

straight_dbu_factory(kcl) returns a cached cell function. Its canonical input is a cross section (by name, instance, or spec dict); the length is in DBU (database units). Convert µm values with kcl.to_dbu().

import kfactory as kf
from kfactory.factories.straight import straight_dbu_factory


class LAYER(kf.LayerInfos):
    WG: kf.kdb.LayerInfo = kf.kdb.LayerInfo(1, 0)
    WGCLAD: kf.kdb.LayerInfo = kf.kdb.LayerInfo(2, 0)


pdk = kf.KCLayout("FACTORIES_STRAIGHT_DEMO", infos=LAYER)
L = LAYER()

Build a few waveguides

Each call with the same arguments returns the same cell object — that's the @kcl.cell cache at work.

straight = straight_dbu_factory(pdk)

# Register a symmetric cross section (width in DBU) on the PDK, then build by name.
wg = pdk.get_icross_section(
    kf.CrossSectionSpecDict(
        layer=L.WG,
        width=pdk.to_dbu(0.5),  # 500 DBU = 0.5 µm
        unit="dbu",
        name="WG",
    )
)

wg_short = straight(cross_section="WG", length=pdk.to_dbu(10.0))  # 10 µm
wg_long = straight(cross_section="WG", length=pdk.to_dbu(20.0))

print("short name:", wg_short.name)
print("long  name:", wg_long.name)
print(
    "same object (same args)?",
    wg_short is straight(cross_section=wg, length=pdk.to_dbu(10.0)),
)
wg_short
short name: straight_CSWG_L10000
long  name: straight_CSWG_L20000
same object (same args)? True


png

Cladding / exclude via the cross section

Extra layers (slab, exclude, cladding) are sections of the cross section — (layer, width) or (layer, min, max) offsets around the core, in DBU.

wg_clad_xs = pdk.get_icross_section(
    kf.CrossSectionSpecDict(
        layer=L.WG,
        width=pdk.to_dbu(0.5),
        sections=[(L.WGCLAD, pdk.to_dbu(3.0))],
        unit="dbu",
        name="WG_CLAD",
    )
)

wg_clad = straight(cross_section="WG_CLAD", length=pdk.to_dbu(15.0))
wg_clad


png

See Also

Topic Where
Cross-sections (alternative spec) Cross-Sections