sipann#

SiPANN models compatible with SAX circuits.

This package contains wrappers for models defined in the SiPANN (Silicon Photonics with Artificial Neural Networks) project, another project by CamachoLab at BYU. It leverages machine learning to simulate photonic devices, giving greater speed and similar accuracy to a full FDTD simulation.

gap_func_symmetric(wl: Union[float, jax.Array, numpy.ndarray, numpy.bool_, numpy.number, bool, int, complex] = 1.55, width: float = 500.0, thickness: float = 220.0, gap: Callable[[float], float] = 100.0, dgap: Callable[[float], float] = 0.0, zmin: float = 0.0, zmax: float = 10000.0, sw_angle: float = 90.0) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']][source]

Symmetric directional coupler, meaning both waveguides are the same shape.

A gap function must describe the shape of the two waveguides, where the distance between the waveguides is the return value of the gap function at every horizontal point from left to right. The derivative of the gap function is also required.

Ports are numbered as:

|       2---\      /---4       |
|            ------            |
|            ------            |
|       1---/      \---3       |
Parameters
  • width (float) – Width of waveguides in nanometers (valid from 400 to 600).

  • thickness (float) – Thickness of waveguides in nanometers (valid from 180 to 240).

  • gap (callable) – Gap function along the waveguide, values it returns must be in nanometers (and must always be greater than 100).

  • dgap (callable) – Derivative of the gap function.

  • zmin (float) – Real number at which to begin integration of gap function.

  • zmax (float) – Real number at which to end integration of gap function.

  • sw_angle (float, optional) – Sidewall angle of waveguide from horizontal in degrees (valid from 80 to 90, defaults to 90).

gap_func_antisymmetric(wl: Union[float, jax.Array, numpy.ndarray, numpy.bool_, numpy.number, bool, int, complex] = 1.55, width: float = 500.0, thickness: float = 220.0, gap: Callable[[float], float] = 100.0, zmin: float = 0.0, zmax: float = 100.0, arc1: float = 10000.0, arc2: float = 10000.0, arc3: float = 10000.0, arc4: float = 10000.0, sw_angle: Union[float, numpy.ndarray] = 90) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']][source]

Antisymmetric directional coupler, meaning both waveguides are differently shaped.

A gap function describing the vertical distance between the two waveguides at any horizontal point, and arc lengths from each port to the coupling point, describe the shape of the device.

Ports are numbered as:

|       2---\      /---4       |
|            ------            |
|            ------            |
|       1---/      \---3       |
Parameters
  • width (float) – Width of waveguides in nanometers (valid from 400 to 600).

  • thickness (float) – Thickness of waveguides in nanometers (valid from 180 to 240).

  • gap (callable) – Gap function along the waveguide, values it returns must be in nanometers (and must always be greater than 100).

  • zmin (float) – Real number at which to begin integration of gap function.

  • zmax (float) – Real number at which to end integration of gap function.

  • arc1 (float) – Arc length from port 1 to minimum coupling point in nanometers.

  • arc2 (float) – Arc length from port 2 to minimum coupling point in nanometers.

  • arc3 (float) – Arc length from port 3 to minimum coupling point in nanometers.

  • arc4 (float) – Arc length from port 4 to minimum coupling point in nanometers.

  • sw_angle (float, optional) – Sidewall angle of waveguide from horizontal in degrees (valid from 80 to 90, defaults to 90).

half_ring(wl: Union[float, jax.Array, numpy.ndarray, numpy.bool_, numpy.number, bool, int, complex] = 1.55, width: float = 500.0, thickness: float = 220.0, radius: float = 10.0, gap: float = 100.0, sw_angle: float = 90.0) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']][source]

Half of a ring resonator.

Uses a radius and a gap to describe the shape.

Half ring port numbering.
Parameters
  • wl (float or ArrayLike) – The wavelengths to evaluate at in microns.

  • width (float) – Width of waveguides in nanometers (valid from 400 to 600).

  • thickness (float) – Thickness of waveguides in nanometers (valid from 180 to 240).

  • radius (float) – Distance from center of ring to middle of waveguide, in microns.

  • gap (float) – Minimum distance from ring waveguide edge to straight waveguide edge, in nanometers (must be greater than 100).

  • sw_angle (float, optional) – Sidewall angle of waveguide from horizontal in degrees (valid from 80 to 90, defaults to 90).

Examples

>>> s = half_ring(wl, 500, 220, 5000, 100)
straight_coupler(wl: Union[float, jax.Array, numpy.ndarray, numpy.bool_, numpy.number, bool, int, complex] = 1.55, width: float = 500.0, thickness: float = 220.0, gap: float = 100.0, length: float = 1000.0, sw_angle: float = 90.0) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']][source]

Straight directional coupler, both waveguides run parallel.

Described by a gap and a length.

Straight coupler port numbering.
Parameters
  • width (float) – Width of waveguides in nanometers (valid from 400 to 600).

  • thickness (float) – Thickness of waveguides in nanometers (valid from 180 to 240).

  • gap (float) – Distance between the two waveguide edges, in nanometers (must be greater than 100).

  • length (float) – Length of both waveguides in nanometers.

  • sw_angle (float, optional) – Sidewall angle of waveguide from horizontal in degrees (Valid from 80 to 90, defaults to 90).

Examples

>>> s = straight_coupler(wl, 500, 220, 100, 1000)
standard_coupler(wl: Union[float, jax.Array, numpy.ndarray, numpy.bool_, numpy.number, bool, int, complex] = 1.55, width: float = 500.0, thickness: float = 220.0, gap: float = 100.0, length: float = 1000.0, horizontal: float = 10000.0, vertical: float = 10000.0, sw_angle: float = 90.0) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']][source]

Standard-shaped directional coupler.

Described by a gap, length, horizontal and vertical distance.

Standard coupler port numbering.
Parameters
  • width (float) – Width of waveguides in nanometers (valid from 400 to 600).

  • thickness (float) – Thickness of waveguides in nanometers (Valid from 180 to 240).

  • gap (float) – Distance between the two waveguide edges, in nanometers (must be greater than 100).

  • length (float) – Length of the straight portion of both waveguides, in nanometers.

  • horizontal (float) – Horizontal distance between end of coupler and straight segment, in nanometers.

  • vertical (float) – Vertical distance between end of coupler and straight segment, in nanometers.

  • sw_angle (float, optional) – Sidewall angle of waveguide from horizontal in degrees (valid from 80 to 90, defaults to 90).

Examples

>>> s = standard_coupler(wl, 500, 220, 100, 5000, 5e3, 2e3)
double_half_ring(wl: Union[float, jax.Array, numpy.ndarray, numpy.bool_, numpy.number, bool, int, complex] = 1.55, width: float = 500.0, thickness: float = 220.0, radius: float = 10000.0, gap: float = 100.0, sw_angle: float = 90.0) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']][source]

Two equally sized half-rings coupling along their edges.

Described by a radius and a gap between the two rings.

Ports are numbered as:

|         2 |     | 4          |
|            \   /             |
|             ---              |
|             ---              |
|            /   \             |
|         1 |     | 3          |
Parameters
  • width (float) – Width of the waveguide in nanometers (valid from 400 to 600).

  • thickness (float) – Thickness of waveguide in nanometers (valid for 180 to 240).

  • radius (float) – Distance from center of ring to middle of waveguide, in nanometers.

  • gap (float) – Minimum distance from the edges of the waveguides of the two rings, in nanometers (must be greater than 100).

  • sw_angle (float, optional) – Sidewall angle of waveguide from horizontal in degrees (valid from 80 to 90, defaults to 90).

Notes

Writing to GDS is not supported for this component.

angled_half_ring(wl: Union[float, jax.Array, numpy.ndarray, numpy.bool_, numpy.number, bool, int, complex] = 1.55, width: float = 500.0, thickness: float = 220.0, radius: float = 10000.0, gap: float = 100.0, sw_angle: float = 90.0) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']][source]

A halfring resonator, except what was the straight waveguide is now curved.

Described by a radius, gap, and angle (theta) that the “straight” waveguide is curved by.

Ports are numbered as:

|      2  \        / 4       |
|          \      /          |
|      1--- \    / ---3      |
|          \ \  / /          |
|           \ -- /           |
|            ----            |
Parameters
  • width (float) – Width of the waveguide in nanometers (valid from 400 to 600).

  • thickness (float) – Thickness of waveguide in nanometers (Valid for 180 to 240).

  • radius (float) – Distance from center of ring to middle of waveguide, in nanometers.

  • gap (float) – Minimum distance from ring waveguide edge to “straight” waveguide edge, in nanometers (must be greater than 100).

  • theta (float) – Angle of the curve of the “straight” waveguide, in radians.

  • sw_angle (float, optional) – Sidewall angle of waveguide from horizontal in degrees (Valid from 80 to 90, defaults to 90).

Notes

Writing to GDS is not supported for this component.

waveguide(wl: Union[float, jax.Array, numpy.ndarray, numpy.bool_, numpy.number, bool, int, complex] = 1.55, width: float = 500.0, thickness: float = 220.0, length: float = 10000.0, sw_angle: float = 90.0) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']][source]

Lossless model for a straight waveguide. Main use case is for playing nice with other models in SCEE.

Waveguide port numbering
Parameters
  • width (float) – Width of the waveguide in nanometers (valid from 400 to 600).

  • thickness (float) – Thickness of waveguide in nanometers (valid for 180 to 240).

  • length (float) – Length of waveguide in nanometers.

  • sw_angle (float, optional) – Sidewall angle of waveguide from horizontal in degrees (valid from 80 to 90, defaults to 90).

racetrack(wl: Union[float, jax.Array, numpy.ndarray, numpy.bool_, numpy.number, bool, int, complex] = 1.55, width: float = 500.0, thickness: float = 220.0, radius: float = 10000.0, gap: float = 100.0, length: float = 10000.0, sw_angle: float = 90.0) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']][source]

Racetrack waveguide arc, used to connect to a racetrack directional coupler.

Racetrack port numbering
Parameters
  • width (float) – Width of the waveguide in nanometers (valid from 400 to 600).

  • thickness (float) – Thickness of waveguide in nanometers (valid for 180 to 240).

  • radius (float) – Distance from center of ring to middle of waveguide, in nanometers.

  • gap (float) – Minimum distance from ring waveguide edge to “straight” waveguide edge, in nanometers (must be greater than 100).

  • length (float) – Length of straight portion of ring waveguide, in nanometers.

  • sw_angle (float, optional) – Sidewall angle of waveguide from horizontal in degrees (valid from 80 to 90, defaults to 90).

Examples

>>> dev = Racetrack(500, 220, 5000, 200, 5000)

Notes

You can produce a GDS file of the model you instantiate using SiPANN (see more on SiPANN’s docs).

premade_coupler(wl: Union[float, jax.Array, numpy.ndarray, numpy.bool_, numpy.number, bool, int, complex] = 1.55, split: int = 50) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']][source]

Loads premade couplers based on the given split value.

Various splitting ratio couplers have been made and saved. This function reloads them. Note that each of their lengths are different and are also returned for the users info. These have all been designed with waveguide geometry 500nm x 220nm.

Ports are numbered as:

|       2---\      /---4       |
|            ------            |
|            ------            |
|       1---/      \---3       |
Parameters

split (int) – Percent of light coming out cross port. Valid numbers are 10, 20, 30, 40, 50, 100. 100 is a full crossover.