PDK Components

Components are individual building blocks that make photonic integrated circuits. Components could be as simple as a straight waveguide or as complex as an optical phase array with thousands of active and passive sub-components. In PhotonForge, all devices are represented by a Component object, and are described by 2D layouts that can be easily exported to GDSII or OASIS files.

Technologies in PhotonForge represent a foundry PDK, and they can include a library of components, either represented by a fixed geometry layout or as a parametric component function (or even as a black-box, that does not disclose the physical layout of the component, but offers a model for simulation). Accessing the components of a PDK library can vary from one library to another, but the general idea is exemplified in this How-To.

We will use the SiEPIC OpenEBL PDK through the siepic_forge module, which includes both a parametric technology functions and fixed library components that we want to use.

[1]:
import photonforge as pf
import siepic_forge as siepic

# Set the default technology for this project from the PDK library
pf.config.default_technology = siepic.ebeam()

Available Components

The siepic_forge module lists all available component names in the component_names module attribute:

[2]:
siepic.component_names
[2]:
{'ANT_MMI_1x2_te1550_3dB_BB',
 'GC_SiN_TE_1550_8degOxide_BB',
 'GC_TE_1310_8degOxide_BB',
 'GC_TE_1550_8degOxide_BB',
 'GC_TM_1310_8degOxide_BB',
 'GC_TM_1550_8degOxide_BB',
 'ebeam_BondPad',
 'ebeam_DC_2-1_te895',
 'ebeam_DC_te895',
 'ebeam_MMI_2x2_5050_te1310',
 'ebeam_YBranch_895',
 'ebeam_YBranch_te1310',
 'ebeam_adiabatic_te1550',
 'ebeam_adiabatic_tm1550',
 'ebeam_bdc_te1550',
 'ebeam_crossing4',
 'ebeam_gc_te1550',
 'ebeam_gc_te895',
 'ebeam_gc_tm1550',
 'ebeam_splitter_swg_assist_te1310',
 'ebeam_splitter_swg_assist_te1550',
 'ebeam_terminator_SiN_1550',
 'ebeam_terminator_SiN_te895',
 'ebeam_terminator_te1310',
 'ebeam_terminator_te1550',
 'ebeam_terminator_tm1550',
 'ebeam_y_1550',
 'ebeam_y_adiabatic',
 'ebeam_y_adiabatic_500pin',
 'taper_SiN_750_3000',
 'taper_si_simm_1310',
 'taper_si_simm_1550'}

Here we see that this PDK contains various components like grating couplers, splitters, couplers, and so on at both O and C band.

We can easily load one of those components for use in our project with the component function:

[3]:
y_branch = siepic.component("ebeam_y_1550")
y_branch
[3]:
../_images/guides_PDK_Components_6_0.svg

The component already includes ports for connection and models, which we can inspect:

[4]:
y_branch.models
[4]:
{'Tidy3D': Tidy3DModel(run_time=None, medium=None, symmetry=(0, 0, 0), boundary_spec=None, monitors=(), structures=(), grid_spec=None, shutoff=1e-05, subpixel=True, courant=0.99, port_symmetries=[('P1', 'P2', {'P0': 'P0', 'P2': 'P1', 'P1': 'P2'})], bounds=((None, None, None), (None, None, None)), verbose=True)}

If we check the help from the component function, we’ll see that we can also provide extra keyword arguments for the component model we’re creating:

[5]:
siepic.component?

Let’s load another component and pass a model keyword argument to it:

[6]:
crossing = siepic.component("ebeam_crossing4", tidy3d_model_kwargs={"verbose": False})
crossing
[6]:
../_images/guides_PDK_Components_12_0.svg

Component Simulation

Because they already include ports and models, simulating a library component is usually very straightforward. Here we use the plot_s_matrix helper function to quickly compute and plot the scattering parameters for the cross.

[7]:
import numpy as np

s_matrix = crossing.s_matrix(pf.C_0 / np.linspace(1.4, 1.6, 21))
_ = pf.plot_s_matrix(s_matrix, input_ports=["P0"])
Starting...
Progress: 100%
../_images/guides_PDK_Components_14_1.png

These components form the basic building blocks which can be used to create complex photonic integrated circuits.