MMITapered

class picazzo3.filters.mmi.cell.MMITapered

Rectangular multimode interferometer, generated from a waveguide template with tapers.

Parameters:
output_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>

List of the output trace templates.

input_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>

List of the input trace templates.

mmi_trace_template: PCell and _WaveguideTemplate

Trace template used for the MMI section

trace_template: ( PCell and _WaveguideTemplate ), *None allowed*

Template for all ports, defaults to TECH.PCELLS.WG.DEFAULT.When set to None, the waveguide templates of the ports will be used.

transition_database: AutoTransitionDatabase

AutoTransitionDatabase in which the correct transition between the two trace templates can be looked up.

transitions: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>

List of transitions that is used on this MMI. By default Autotracetransition is used on all the transitions

port_labels: ( List with type restriction, allowed types: <class ‘str’> ), *None allowed*

Labels of the ports to be processed. Set to None to process all ports.

external_port_names: str

Dictionary for remapping of the port names of the contents to the external ports

name: String that contains only ISO/IEC 8859-1 (extended ASCII py3) or pure ASCII (py2) characters

The unique name of the pcell

Other Parameters:
mmi_trace: PCell, locked

Trace of the MMI section

n_outputs: int and number > 0, locked

Number of output channels.

n_inputs: int and number > 0, locked

Number of input channels.

trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

list of templates to apply to all ports

contents: PCell, locked

Contains the base MMI without the tapers

Views

class Layout
Parameters:
output_y_positions: list<Real, number>

Positions in the y direction at the output where ports are be added

input_y_positions: list<Real, number>

Positions in the y direction at the input where ports are be added

transition_length: ( float and Real, number and number >= 0 ), *None allowed*

Length of the transition. Set to None to take the standard transition length.

zero_length_if_identical: ( bool, bool_ or int )

uses a zero-length transition if the trace templates are identical

flatten_transitions: ( bool, bool_ or int )

if true, flattens the transitions one level

straight_extension: ( Coord2 and number >= 0 ), *None allowed*

Tuple: straight extensions of the transitions. Set to None to take the standard straight extensions

length: float and number > 0

Length of the MMI

contents_transformation: GenericNoDistortTransform
flatten_contents: ( bool, bool_ or int )

if True, it will insert the contents as elements in the layout, rather than as an Instance

view_name: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3.

The name of the view

Other Parameters:
transition_lengths: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mmi.cell import MMITapered
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate
import ipkiss3.all as i3

mmi_trace_template = WireWaveguideTemplate()
mmi_trace_template.Layout(core_width=6.0, cladding_width=10.0)

mmi_access_template = WireWaveguideTemplate()
mmi_access_template.Layout(core_width=1.0, cladding_width=5.0)

MMI = MMITapered(
    mmi_trace_template=mmi_trace_template,
    input_trace_templates=[mmi_access_template],
    output_trace_templates=[mmi_access_template],
    trace_template=i3.TECH.PCELLS.WG.DEFAULT,
)
layout = MMI.Layout(transition_length=5.0, length=10.0, input_y_positions=[0.0], output_y_positions=[0.0])
layout.visualize(annotate=True)
../../../../../_images/picazzo3-filters-mmi-cell-MMITapered-1.png

Tapered MMI with matched claddings:

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mmi.cell import MMITapered
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate
import ipkiss3.all as i3
import numpy as np

# This example illustrates a tapered MMI where the access waveguides are calculated in
# such a way that the cladding of the mmi matches naturally transitions to the cladding
# of the access waveguides.

mmi_cladding_width = 15.0  # Cladding width of the MMI section.
mmi_access_core_width = 1.0  # Core width of the access waveguides.
input_y_positions = [0.0]  # Input position of the access waveguides
output_y_positions = [-1.5, 0, 1.5]  # Output positions of the access waveguides

# We create the trace template for the MMI section
mmi_trace_template = WireWaveguideTemplate()
mmi_trace_template.Layout(core_width=10.0, cladding_width=mmi_cladding_width)

# We create the template for the access waveguide at the input side.
mmi_access_template = WireWaveguideTemplate()
mmi_access_template.Layout(core_width=mmi_access_core_width, cladding_width=mmi_cladding_width)
output_trace_templates = []

# We create the templates for the access waveguides at the output side. We calculate the
# cladding width of the access waveguides so that the tapers would transition to the
# cladding of the MMI.

for cnt, pos in enumerate(output_y_positions):
    template = WireWaveguideTemplate()
    height_cladding = mmi_cladding_width
    width_to_top = height_cladding / 2 - pos
    width_to_bottom = pos + height_cladding / 2
    # Just as wide as to reach the nearest cladding of the mmi.
    access_cladding_width = np.min([width_to_top, width_to_bottom]) * 2
    template.Layout(core_width=mmi_access_core_width, cladding_width=access_cladding_width)
    output_trace_templates.append(template)

# We create the tapered MMI
MMI_with_matched_claddings = MMITapered(
    mmi_trace_template=mmi_trace_template,
    input_trace_templates=[mmi_access_template],
    output_trace_templates=output_trace_templates,
    trace_template=i3.TECH.PCELLS.WG.DEFAULT,
)

layout = MMI_with_matched_claddings.Layout(
    transition_length=5.0,
    length=10.0,
    input_y_positions=input_y_positions,
    output_y_positions=output_y_positions,
)
layout.visualize(annotate=True)
../../../../../_images/picazzo3-filters-mmi-cell-MMITapered-2.png