Picazzo Reference (single-page)

This a alternative to the picazzo reference. Instead of offering the reference as seperate pages, this reference combines all information in 1 webpage. This results in a very big page, but the advantage is that it’s easily searchable/navigatable.

Logical Blocks

Coupler1x2

class picazzo3.logical.coupler.cell.Coupler1x2

A logical 1x2 reciprocal waveguide coupler.

Transmissions and reflections and backcoupling can be set using the properties to arbitrary values without any enforcement of passivity.

Properties dealing with transmission: straight_coupling1, straight_coupling2 Properties dealing with reflection: reflection_in1, reflection_out1, reflection_out2 Properties dealing with back coupling: back_coupling

The default behaviour of the coupler model assumes symmetry that allows the permutations (out_1 with out_2) in the first place. If your component uses this symmetry, properties only have to be specified for in and out_1, the ones relating to out_2 will be assuming this symmetry.

In the second place the coupler model assumes symmetry that allows the permutation of output ports with input ports.

Parameters:
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:
n_outputs: int and number > 0, locked

Number of output channels.

n_inputs: int and number > 0, locked

Number of input channels.

Coupler2x1

class picazzo3.logical.coupler.cell.Coupler2x1

A logical 2x1 reciprocal waveguide coupler.

Transmissions and reflections and backcoupling can be set using the properties to arbitrary values without any enforcement of passivity.

Properties dealing with transmission: straight_coupling1, straight_coupling2 Properties dealing with reflection: reflection_out1, reflection_in1, reflection_in2 Properties dealing with back coupling: back_coupling

The default behaviour of the coupler model assumes symmetry that allows the permutations (in1 with in2) in the first place. If your component uses this symmetry, properties only have to be specified for in1 and out, the ones relating to in2 will be assuming this symmetry.

In the second place the coupler model assumes symmetry that allows the permutation of output ports with input ports.

Parameters:
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:
n_outputs: int and number > 0, locked

Number of output channels.

n_inputs: int and number > 0, locked

Number of input channels.

Coupler2x2

class picazzo3.logical.coupler.cell.Coupler2x2

A logical 2x2 reciprocal waveguide coupler.

Transmissions and reflections and backcoupling can be set using the properties to arbitrary values without any enforcement of passivity.

Properties dealing with transmission: cross_coupling1, cross_coupling2, straight_coupling1, straight_coupling2 Properties dealing with reflection: reflection_in1, reflection_in2, reflection_out1, reflection_out2 Properties dealing with back coupling: back_coupling_in, back_coupling_out

The default behaviour of the coupler model assumes symmetry that allows the permutations (in_1 with in_2) and (out_1 with out_2) in the first place. If your component uses this symmetry, properties only have to be specified for in_1 and out_1, the ones relating to in_2 and out_2 will be assuming this symmetry.

In the second place the coupler model assumes symmetry that allows the permutation of output ports with input ports.

Parameters:
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:
n_outputs: int and number > 0, locked

Number of output channels.

n_inputs: int and number > 0, locked

Number of input channels.

Reflector

class picazzo3.logical.reflector.cell.Reflector

Logical reflector: reflects a part of the light and passes on the rest

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

The unique name of the pcell

WaveguideReflector

class picazzo3.logical.reflector.cell.WaveguideReflector

Zero-length waveguide reflector: calculates reflection based on the waveguide templates

Parameters:
wg_template_out: PCell and _WaveguideTemplate

Waveguide template at the output

wg_template_in: PCell and _WaveguideTemplate

Waveguide template at the input

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

The unique name of the pcell

Termination

class picazzo3.logical.termination.cell.Termination

Logical component: a termination Has one input, no outputs. A reflectivity can be specified but defaults to 0.0 Use this to terminate terminals of PCells to avoid reflections and unconnected terms

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

The unique name of the pcell

PerfectTermination

class picazzo3.logical.termination.cell.PerfectTermination

Logical component: a perfect termination Has one input, no outputs and does not reflect any signal. Use this to terminate terminals of PCells to avoid reflections and unconnected terms

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

The unique name of the pcell

Grating Couplers

FiberCouplerCurvedGrating

class picazzo3.fibcoup.curved.cell.FiberCouplerCurvedGrating

Class for the definition of periodic curved fiber grating couplers with a focal point that fit in a box.

Parameters:
inclination: float

out-of-plane angle of the grating coupler

grating: PCell

grating of this fiber coupler

wide_trace_template: PCell and _WaveguideTemplate

end waveguide for the socket waveguide (broad side)

start_trace_template: PCell and _WaveguideTemplate

start waveguide for the socket waveguide (narrow side)

socket: PCell and WgSocket

socket of the fiber coupler

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

The unique name of the pcell

Views

class Layout

This class generates a fiber grating coupler composed of a curved fiber grating with a LinearTransitionSocket. The origin of the coordinate system of the component is placed where the center of the fiber facet is assumed to have maximal coupling efficiency. This also the location of the vertical port vertical_in.

The grating lines generated by this class have the following properties.

1. All the grating lines have a shared focus point that is the east focus point of all the ellipses. The focus point has to be on the x-axis. The location of the focus is set by focal_distance_x and will be located east of the origin.

2. The first grating line will be drawn a distance min_x from the focus point. So if min_x = 10, this means that the distance between the focus point and the first grating line will exactly be 10. By default, min_x is set to:

3. All the grating lines are periodic in the x-direction with period_x. This means that the distance between the intersections of grating lines with the x-axis is equal to period_x.

4. All the grating lines are periodic in the y direction with period_y. This means that the distance between the intersections grating lines with the y-axis is equal to period_y.

  1. The radius of the first ellipse in the y-direction is set be start_radius_y.

  2. The radius of the first ellipse in the x-direction is automatically calculated and therefore locked.

7. All the grating lines fit in a box with width set by box_width that is symmetrically set along the x-axis. For example if box_width is set to 10.0 all the grating lines will go from y=-5.0 to y=5.0.

8. The width of all the grating lines is set by fill_factor. A fill factor of 1 makes that the line width is a wide as the period. A fill factor of 0 makes sets the line_width to 0.

The socket is a LinearTransitionSocket transitioning from the start_trace_template to wide_trace_template. start_trace_template is the template seen at the focal point while wide_trace_template is the one seen at the location of the vertical port ``vertical_in`. The length of the transition socket_length is therefore locked and automatically set to the focal_distance_x.

To extend the taper beyond the focal point you can use the property socket_extension which will automatically prolong the taper with the length socket_extension The default value of extension is chosen such that entire grating fits in the socket.

Parameters:
fill_factor: float and fraction

Fill factor used to calculate the trench widths. 0 means no trench a all and 1 means that the trench covers the entire period

purpose:
process: ProcessLayer

default process used for the grating

grating_transformation: GenericNoDistortTransform
spread_angle: float

Angle in degrees of the far field radiation field of the socket.By default this is set to be equal to the angle of the taper that is set by its length and the width of the core of input and output waveguides.

period_x: float and number > 0

Period in the x direction.

min_x: float and number > 0

Minimum distance from the first line to the focus. By default it is set to the focal distance.

focal_distance_x: float

Distance between the vertical port of the grating and the focal point. By default this is TECH.IO.FIBCOUP.CURVED.GRATING.FOCAL_DISTANCE.

start_radius_y: float and number > 0

Starting radius in the y direction. By default this is set to start_period_x

period_y: float and number > 0

Period in the y direction. By default equal to period_x

box_width: float and number > 0

Width of the box used that contains the grating.

n_o_lines: int and number > 0

Number of lines in the grating. By default this number is chosen so that the curves fit in the box width.

socket_straight_extension: Coord2 and number >= 0

tuple: straight extension at start and end of socket

socket_extension: float and Real, number and number >= 0

extension of the wide side of the socket, asymmetric with respect to the specified center. By default this is calculated such that the entire grating fits in the socket with a margin of TECH.IO.FIBCOUP.CURVED.DEFAULT_SOCKET_MARGIN_FROM_GRATING

socket_transformation: GenericNoDistortTransform
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:
ellipse_radii_y: locked
ellipse_radii_x: locked
centers: locked
focal_point: Coord2, locked

Coordinate of the east focus point shared by all ellipses. The y coordinate of the focuspoint has to be zero

start_radius_x: locked
line_widths: locked

Line width of the grating coupler

end_angles: locked
start_angles: locked
socket_length: locked

Examples

Basic use:

# Example demonstrating the basic use of the FiberGratingCoupler.
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3

from picazzo3.fibcoup.curved import FiberCouplerCurvedGrating
from picazzo3.traces.wire_wg import WireWaveguideTemplate

# Creating the wire templates for the socket.
start_wg_tmpl = WireWaveguideTemplate()
start_wg_tmpl.Layout(core_width=0.5, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.5)
end_wg_tmpl = WireWaveguideTemplate()
end_wg_tmpl.Layout(core_width=17.0, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 17.0)

fc_cell = FiberCouplerCurvedGrating(start_trace_template=start_wg_tmpl, wide_trace_template=end_wg_tmpl)

fc_layout = fc_cell.Layout(
    period_x=0.8, focal_distance_x=20.0  # We with a period of 0.8
)  # We use a focal distance of 20.0

fc_layout.visualize(annotate=True)
../../_images/full-1.png

Changing the n_o_lines and where to place the first line:

# Example demonstrating how to change the length of the grating coupler using n_o_lines
# and how to set the location of the first grating line using min_x
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3

from picazzo3.fibcoup.curved import FiberCouplerCurvedGrating
from picazzo3.traces.wire_wg import WireWaveguideTemplate

# Creating the wire templates for the socket.
start_wg_tmpl = WireWaveguideTemplate()
start_wg_tmpl.Layout(core_width=0.5, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.5)
end_wg_tmpl = WireWaveguideTemplate()
end_wg_tmpl.Layout(core_width=17.0, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 17.0)

fc_cell = FiberCouplerCurvedGrating(start_trace_template=start_wg_tmpl, wide_trace_template=end_wg_tmpl)

fc_layout = fc_cell.Layout(
    period_x=0.8,  # We with a period of 0.8
    focal_distance_x=20.0,  # We use a focal distance of 20.0
    n_o_lines=30,  # We set the number of lines to 30
    min_x=10.0,  # We set the first line at 10.
)

fc_layout.visualize(annotate=True)
../../_images/full-2.png

Changing the box_width:

# Example demonstrating how to change the box_width.
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3

from picazzo3.fibcoup.curved import FiberCouplerCurvedGrating
from picazzo3.traces.wire_wg import WireWaveguideTemplate

# Creating the wire templates for the socket.
start_wg_tmpl = WireWaveguideTemplate()
start_wg_tmpl.Layout(core_width=0.5, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.5)
end_wg_tmpl = WireWaveguideTemplate()
end_wg_tmpl.Layout(core_width=17.0, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 17.0)

fc_cell = FiberCouplerCurvedGrating(start_trace_template=start_wg_tmpl, wide_trace_template=end_wg_tmpl)

fc_layout = fc_cell.Layout(
    period_x=0.8,  # We with a period of 0.8
    focal_distance_x=20.0,  # We use a focal distance of 20.0.
    n_o_lines=30,  # We set the number of lines to 30.
    min_x=10.0,  # We set the first line at 10.
    box_width=40.0,  # All the lines will be contained between -20 and 20
)

fc_layout.visualize(annotate=True)
../../_images/full-3.png

Changing the fill_factor to set the line width:

# Example demonstrating how to change the fill_factor.
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3

from picazzo3.fibcoup.curved import FiberCouplerCurvedGrating
from picazzo3.traces.wire_wg import WireWaveguideTemplate

# Creating the wire templates for the socket.
start_wg_tmpl = WireWaveguideTemplate()
start_wg_tmpl.Layout(core_width=0.5, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.5)
end_wg_tmpl = WireWaveguideTemplate()
end_wg_tmpl.Layout(core_width=17.0, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 17.0)

fc_cell = FiberCouplerCurvedGrating(start_trace_template=start_wg_tmpl, wide_trace_template=end_wg_tmpl)

fc_layout = fc_cell.Layout(
    period_x=0.8,  # We with a period of 0.8
    focal_distance_x=20.0,  # We use a focal distance of 20.0.
    n_o_lines=30,  # We set the number of lines to 30.
    min_x=10.0,  # We set the first line at 10.
    fill_factor=0.2,  # Here we set the fill factor to 0.2 meaning that lines will be 0.2 * period_x thick
)

fc_layout.visualize(annotate=True)
../../_images/full-4.png

Changing the start radii in the y direction:

# Example that illustrates the degrees of freedom at your disposal concerning the
# periodicity and radii of the gratings in the y direction. You have more freedom in
# y direction since the focus is in the x-axis.

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3

from picazzo3.fibcoup.curved import FiberCouplerCurvedGrating
from picazzo3.traces.wire_wg import WireWaveguideTemplate

# Creating the wire templates for the socket.
start_wg_tmpl = WireWaveguideTemplate()
start_wg_tmpl.Layout(core_width=0.5, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.5)
end_wg_tmpl = WireWaveguideTemplate()
end_wg_tmpl.Layout(core_width=17.0, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 17.0)

fc_cell = FiberCouplerCurvedGrating(start_trace_template=start_wg_tmpl, wide_trace_template=end_wg_tmpl)

fc_layout = fc_cell.Layout(
    focal_distance_x=20.0,  # We use a focal distance of 20.0.
    n_o_lines=30,  # We use 30 lines.
    period_x=0.8,  # We with a period of 0.8
    period_y=0.5,  # period has to be smaller than the period in the x direction
    start_radius_y=3.0,  # Start_radius_y has to be smaller than min_x
    fill_factor=0.2,  # Fill factor of 0.2
    min_x=10.0,  # First line at 10.0
)

fc_layout.visualize(annotate=True)
../../_images/full-5.png

Changing the socket extensions:

# Example demonstrating how to change the socket_extension.
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3

from picazzo3.fibcoup.curved import FiberCouplerCurvedGrating
from picazzo3.traces.wire_wg import WireWaveguideTemplate

# Creating the wire templates for the socket.
start_wg_tmpl = WireWaveguideTemplate()
start_wg_tmpl.Layout(core_width=0.5, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.5)
end_wg_tmpl = WireWaveguideTemplate()
end_wg_tmpl.Layout(core_width=17.0, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 17.0)

fc_cell = FiberCouplerCurvedGrating(start_trace_template=start_wg_tmpl, wide_trace_template=end_wg_tmpl)

fc_layout = fc_cell.Layout(
    period_x=0.8,  # We with a period of 0.8
    focal_distance_x=20.0,  # We use a focal distance of 20.0.
    n_o_lines=30,  # We set the number of lines to 30.
    min_x=10.0,  # We set the first line at 10.
    box_width=40.0,  # All the lines will be contained between -20 and 20
    socket_extension=30.0,  # A socket extension will of 30.0 will be added
)

fc_layout.visualize(annotate=True)
../../_images/full-6.png

Changing the straight socket extensions:

# Example demonstrating how to change the socket_straight_extensions.
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3

from picazzo3.fibcoup.curved import FiberCouplerCurvedGrating
from picazzo3.traces.wire_wg import WireWaveguideTemplate

# Creating the wire templates for the socket.
start_wg_tmpl = WireWaveguideTemplate()
start_wg_tmpl.Layout(core_width=0.5, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.5)
end_wg_tmpl = WireWaveguideTemplate()
end_wg_tmpl.Layout(core_width=17.0, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 17.0)

fc_cell = FiberCouplerCurvedGrating(start_trace_template=start_wg_tmpl, wide_trace_template=end_wg_tmpl)

fc_layout = fc_cell.Layout(
    period_x=0.8,  # We with a period of 0.8
    focal_distance_x=20.0,  # We use a focal distance of 20.0.
    n_o_lines=30,  # We set the number of lines to 30.
    min_x=10.0,  # We set the first line at 10.
    box_width=40.0,
    # A straight extension of 10.0 will be added at the
    # narrow side and 5.0 at the wide part of the socket.
    socket_straight_extension=(10.0, 5.0),
)

fc_layout.visualize(annotate=True)
../../_images/full-7.png

FiberCouplerCurvedGratingGeneric

class picazzo3.fibcoup.curved.cell.FiberCouplerCurvedGratingGeneric

Class allowing the creating of generic fiber curved grating coupler. This class allows you to define each grating line individually as long as the grating lines themselves are ellipses.

Parameters:
inclination: float

out-of-plane angle of the grating coupler

grating: PCell

grating of this fiber coupler

wide_trace_template: PCell and _WaveguideTemplate

end waveguide for the socket waveguide (broad side)

start_trace_template: PCell and _WaveguideTemplate

start waveguide for the socket waveguide (narrow side)

socket: PCell and WgSocket

socket of the fiber coupler

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

The unique name of the pcell

Views

class Layout

When using this class you have to specify centers, ellipse_radii_x, ellipse_radii_y, start_angles, end_angles, line_widths as a list of numbers. A fiber grating coupler composed of ellipses using those parameters will be constructed on a LinearTransitionSocket.

It is advised (but not strictly required) to place the intended location of the fiber in the origin of your component. To make sure that this the case you can use socket_transformation and grating_transformation to independently transform both the socket and the grating.

You can also add extensions to your socket by using the property socket_straight_extension.

Parameters:
ellipse_radii_y: list

List of y radii of the ellipses. By default identical to ellipse_radii_y

ellipse_radii_x: list

List of x radii of the ellipses. By default a list of radii matching the number of center and a period of TECH.IO.FIBCOUP.CURVED.GRATING.PERIOD

centers: list and List with type restriction, allowed types: <class ‘ipkiss.geometry.coord.Coord2’>

List of centers for the ellipses. By default [i3.Coord2(0, 0)] * TECH.IO.FIBCOUP.CURVED.GRATING.N_O_LINES

purpose:
process: ProcessLayer

default process used for the grating

grating_transformation: GenericNoDistortTransform
spread_angle: float

Angle in degrees of the far field radiation field of the socket.By default this is set to be equal to the angle of the taper that is set by its length and the width of the core of input and output waveguides.

line_widths: list

List of the linewidth of the trench of each ellipse. By default TECH.IO.FIBCOUP.CURVED.GRATING.PERIOD / 2.0 for all lines

end_angles: list

List of the end angle for each ellipse. By default 360 - start_angles

start_angles: list

List of the start angle in degrees for each ellipse. By default 180 - TECH.FIBCOUP.DEFAULT_ANGLE_SPAN / 2.0 for all lines

socket_straight_extension: Coord2 and number >= 0

tuple: straight extension at start and end of socket

socket_extension: float and Real, number and number >= 0

extension of the wide side of the socket, asymmetric with respect to the specified center

socket_length: float and number > 0

length of the straight waveguide socket

socket_transformation: GenericNoDistortTransform
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:
n_o_lines: int and number > 0, locked

Number of trenches.

Examples

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3

from picazzo3.fibcoup.curved import FiberCouplerCurvedGratingGeneric
from picazzo3.traces.wire_wg import WireWaveguideTemplate

# Creating the wire templates for the socket.
start_wg_tmpl = WireWaveguideTemplate()
start_wg_tmpl.Layout(core_width=0.5, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.5)
end_wg_tmpl = WireWaveguideTemplate()
end_wg_tmpl.Layout(core_width=17.0, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 17.0)

fc_cell = FiberCouplerCurvedGratingGeneric(
    start_trace_template=start_wg_tmpl, wide_trace_template=end_wg_tmpl
)

fc_layout = fc_cell.Layout(
    centers=[i3.Coord2(0, 0) for _ in range(30)],
    ellipse_radii_x=[i + 1 for i in range(30)],
    ellipse_radii_y=[i + 0.9 for i in range(30)],
    start_angles=[180.0 - 15 for _ in range(30)],
    end_angles=[180.0 + 15 for _ in range(30)],
    line_widths=[0.2 for _ in range(30)],
    socket_length=30,
    socket_transformation=i3.Translation(translation=(-10.0, 0.0)),
    grating_transformation=i3.Translation(translation=(20, 0)),
    socket_straight_extension=(10.0, 5.0),
)

fc_layout.visualize(annotate=True)
../../_images/full-8.png

UniformLineGrating

class picazzo3.fibcoup.uniform.cell.UniformLineGrating

Uniform 1D fiber coupler grating consisting of identical grating lines, on a straight waveguide socket

Parameters:
inclination: float

out-of-plane angle of the grating coupler

grating: PCell

grating of this fiber coupler

trace_template: PCell and _TraceTemplate

trace template for the socket waveguide

socket: PCell and WgSocket

socket of the fiber coupler

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

The unique name of the pcell

Views

class Layout
Parameters:
n_o_periods: int and number > 0

number of periods of the grating

origin: Coord2

local origin of the grating (first trench)

period: float and number > 0

period of the grating

purpose: PatternPurpose

drawing purpose for the grating lines

process: ProcessLayer

process layer for the grating

line_length: float and number > 0

length of the grating trenches (perpendicular to the socket waveguide)

line_width: float and number > 0

width of the grating trenches, drawn in the given layer

grating_transformation: GenericNoDistortTransform
socket_length: float and number > 0

length of the straight waveguide socket

socket_transformation: GenericNoDistortTransform
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

Examples

# Creation of a uniform grating coupler with a taper.
import si_fab.all as pdk  # noqa: F401
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.fibcoup.uniform import UniformLineGrating

# Creating the trace template for the grating area
wg_coupler = WireWaveguideTemplate()
wg_coupler.Layout(core_width=15.0, cladding_width=18.0)

FGC = UniformLineGrating(trace_template=wg_coupler)
FGC.Layout(period=0.8, line_width=0.4, line_length=18.0, n_o_periods=24)

# Adding taper to the fibergrating coupler.

# trace template for the connecting waveguide.
wg_t = WireWaveguideTemplate()
wg_t.Layout(core_width=0.5, cladding_width=4.0)

from picazzo3.container.transition_ports import AutoTransitionPorts

Tapered_FCG = AutoTransitionPorts(contents=FGC, port_labels=["out"], trace_template=wg_t)
Tapered_FCG.Layout().visualize(annotate=True)
../../_images/full-9.png

FiberCouplerGrating

class picazzo3.fibcoup.base.FiberCouplerGrating

Base class for fiber couplers which combine a grating on top of a socket.

The socket is the piece of waveguide, taper or slab on which the grating rests. The grating couples light between the plane (the socket) and the out-of-plane direction, to a fiber, lens or free space.

This cell should be used such that the inclination and angle of the port match the direction of peak transmission at the center wavelength specified in the circuitmodel, when light is incident from the vertical (through vertical_in) and couples to the out port

             *  "vertical_in"
              *
               *
inclination   / *
            _/  _*  _   _
     "in" _| |_| |_| |_| |_  ---> "out"
Parameters:
grating: PCell

grating of this fiber coupler

inclination: float

out-of-plane angle of the grating coupler

socket: PCell and WgSocket

socket of the fiber coupler

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

The unique name of the pcell

Views

class Layout
Parameters:
grating_transformation: GenericNoDistortTransform
socket_length: float and number > 0

length of the straight waveguide socket

socket_transformation: GenericNoDistortTransform
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

Filters

Ringresonators

RingRect

class picazzo3.filters.ring.cell.RingRect

A Ring resonator consisting of a rounded rectangular trace.

You should specify the trace template for the ring and a shape

By default, this ring has no couplers. you can supply the couplers manually as a list of child cells through the property ‘couplers’, or you can subclass this PCell to define the couplers internally.

Parameters:
ring_trace_template: PCell and _WaveguideTemplate

Trace template for the ring waveguide

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

list of Ring PCells

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

list of coupler PCells

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:
ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.

Views

class Layout
Parameters:
straights: Coord2 and number >= 0
shape_position: Coord2

Translation of the shape.

coupler_transformations:

list of coupler transformations

area_layer_on: ( bool, bool_ or int )

When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.

coupler_parameters:

Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
shape: locked
shapes: locked

Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead

Examples

"""This example demonstrates a simple rounded rectangular ring consisting
of a user-defined waveguide template. The straights parameter
defines the straight section along the X and Y axis.
"""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.filters.ring import RingRect
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

wg_t = WireWaveguideTemplate(name="wg_template_3")
wg_t.Layout(core_width=0.7, core_process=i3.TECH.PROCESS.FC)

ring = RingRect(name="my_rectring", ring_trace_template=wg_t)
layout = ring.Layout(straights=(i3.TECH.WG.SHORT_STRAIGHT, i3.TECH.WG.SHORT_STRAIGHT + 3.0))

layout.visualize(annotate=True)
../../_images/full-10.png
"""
We create a custom ring with a custom trace template and a custom coupler.
You can use any trace template for the ring and any PCell for the coupler.
"""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.traces.slot_wg.trace import SlotWaveguideTemplate
from picazzo3.filters.ring import RingRect
from picazzo3.traces.wire_wg import WireWaveguideTemplate

length_ring = 50.0
bend_radius = 10.0
height_ring = 10.0

# We make the coupler
wire_wg_t = WireWaveguideTemplate()
coupler = i3.Waveguide(trace_template=wire_wg_t)
coupler.Layout(shape=[(-(length_ring + 3 * bend_radius) / 2, 0), ((3 * bend_radius + length_ring) / 2, 0)])

# Create the waveguide template for the ring
wg_t = SlotWaveguideTemplate()
wg_t.Layout(core_width=0.5, slot_width=0.12, cladding_width=2 * 3.0 + 0.5)

# We make the ring
ring = RingRect(ring_trace_template=wg_t, couplers=[coupler])
layout = ring.Layout(
    straights=(length_ring, height_ring),
    bend_radius=bend_radius,
    coupler_transformations=[i3.Translation((0, -height_ring - bend_radius + 4.3))],
)  # Control spacing here.

layout.visualize(annotate=True)
../../_images/full-11.png

RingRect180DropFilter

class picazzo3.filters.ring.cell.RingRect180DropFilter

Rectangular ring filter with two straight access waveguide. This component is often called a channel drop filter. The access waveguides are placed north and south of the Ring

The ring shape is a rounded rectangle of which the bend radius can be specified, as well as the horizontal and vertical straight sections. it is also possible to specify the rounding algorithm of the bends.

The waveguide template of the ring and the couplers can be chosen independently.

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

list of trace_templates for the ring couplers. By default the same template as the ring is taken

ring_trace_template: PCell and _WaveguideTemplate

Trace template for the ring waveguide

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

list of Ring PCells

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

list of coupler PCells

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:
ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.

Examples

"""This example illustrates the basic ring resonator model without creating a layout.

It also illustrates the effect of resonance peak splitting due to back-reflection in the coupler.
"""
import si_fab.all as pdk  # noqa: F401
import pylab as plt
import numpy as np

from picazzo3.filters.ring import RingRect180DropFilter

# To get an FSR of 10 nm at 1.55 um, we use the following formula
n_g = 2.86  # default value used in picazzo3, see TECH.PCELLS.WG.DEFAULT
L_fsr_10nm = 1.55**2 / (n_g * 0.01)

# 1. Define the ring
my_ring = RingRect180DropFilter(name="my_example_ring")

# coupler parameters
cp = {
    "cross_coupling1": 1j * 0.0784**0.5,
    "straight_coupling1": 0.9216**0.5,
    "reflection_in1": 1j * 0.030,
}

my_ring_cm = my_ring.CircuitModel(
    ring_length=L_fsr_10nm,  # we can manually specify the ring length
    coupler_parameters=[cp, cp],  # 2 couplers
)

# 2. Simulate
wavelengths = np.linspace(1.54, 1.56, 2000)
R = my_ring_cm.get_smatrix(wavelengths=wavelengths)

# 3. Plot the results
plt.plot(wavelengths, np.abs(R["in1", "out1"]) ** 2, "b", label="pass")
plt.plot(wavelengths, np.abs(R["in1", "out2"]) ** 2, "g", label="drop")
plt.plot(wavelengths, np.abs(R["in1", "in2"]) ** 2, "r", label="add")
plt.legend()
plt.show()
../../_images/full-12.png
"""This example illustrates a simulation of a single ring resonator model based on the
layout that is first generated."""
import si_fab.all as pdk  # noqa: F401
import pylab as plt
import numpy as np

from picazzo3.filters.ring import RingRect180DropFilter

# 1. Define the ring
my_ring = RingRect180DropFilter(name="my_example_ring2")
my_ring.Layout(straights=(6.0, 0.0))

# set model in couplers and ring waveguides TODO: change the models
cp = {"delta_n_eff": 0.02}  # coupler parameters
for coupler in my_ring.couplers:
    coupler.set_default_view(coupler.SimpleCircuitModel)  # based on delta_n_eff
for ring_wg in my_ring.ring_segments:
    ring_wg.set_default_view(ring_wg.CircuitModel)  # based on the actual waveguide length

# ring model
my_ring_cm = my_ring.CircuitModel(coupler_parameters=[cp, cp])  # 2 couplers

# 2. Simulate
wavelengths = np.linspace(1.55, 1.58, 400)
R = my_ring_cm.get_smatrix(wavelengths=wavelengths)

# 3. Plot the results
plt.plot(wavelengths, np.abs(R["in1", "out1"]) ** 2, "b", label="pass")
plt.plot(wavelengths, np.abs(R["in1", "out2"]) ** 2, "g", label="drop")
plt.show()
../../_images/full-13.png

Views

class Layout
Parameters:
coupler_extensions: list<Coord2 and number >= 0>

additional length of the couplers. By default, the couplers will be extended to the size of the ring.

coupler_lengths: list<number >= 0>

straight lengths of the coupling section. By default, same lengths as the ring will be used

coupler_offsets: list<Real, number>

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>

list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)

straights: Coord2 and number >= 0
shape_position: Coord2

Translation of the shape.

coupler_transformations:

list of coupler transformations

area_layer_on: ( bool, bool_ or int )

When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.

coupler_parameters:

Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
shape: locked
shapes: locked

Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead

Examples

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

wg1_t = WireWaveguideTemplate(name="wg_template_6")
wg1_t.Layout(core_width=0.5)

wg2_t = WireWaveguideTemplate(name="wg_template_7")
wg2_t.Layout(core_width=0.4)

wg3_t = WireWaveguideTemplate(name="wg_template_8")
wg3_t.Layout(core_width=0.6)

ring = RingRect180DropFilter(
    name="my_ringrectdropring", ring_trace_template=wg1_t, coupler_trace_templates=[wg2_t, wg3_t]
)  # In a list!!!
layout = ring.Layout(
    coupler_spacings=[0.65, 0.70],  # This results in a 200nm and 250nm gap
    straights=(i3.TECH.WG.SHORT_STRAIGHT, i3.TECH.WG.SHORT_STRAIGHT + 3.0),
)

layout.visualize(annotate=True)
../../_images/full-14.png

RingRoundedShape

class picazzo3.filters.ring.cell.RingRoundedShape

A ring resonator based on a rounded shape, without couplers.

The Layout takes a shape, and a trace template. The trace template is turned into a RoundedTraceTemplate with the user supplied bend_radius and rounding_algorithm.

By default, this ring has no couplers. you can supply the couplers manually as a list of child cells through the property ‘couplers’, or you can subclass this PCell to define the couplers internally.

Parameters:
ring_trace_template: PCell and _WaveguideTemplate

Trace template for the ring waveguide

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

list of Ring PCells

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

list of coupler PCells

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:
ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.

Views

class Layout
Parameters:
shape_position: Coord2

Translation of the shape.

shape: Shape

Shape of the ring

coupler_transformations:

list of coupler transformations

area_layer_on: ( bool, bool_ or int )

When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.

coupler_parameters:

Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
shapes: locked

Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead

Examples

"""This example demonstrates a generic ring consisting of a user-defined control shape
which is drawn by rounding using the provided trace template with a given bend radius
"""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.filters.ring import RingRoundedShape
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

wg_t = WireWaveguideTemplate(name="wg_template_2")
wg_t.Layout(core_width=0.45)

shape = i3.ShapeCross(box_size=26.0, thickness=13.0)

ring = RingRoundedShape(name="my_roundedring", ring_trace_template=wg_t)
layout = ring.Layout(shape=shape, bend_radius=3.0)

layout.visualize(annotate=True)
../../_images/full-15.png

RingRectNotchFilter

class picazzo3.filters.ring.cell.RingRectNotchFilter

Rectangular Ring resonator with one straight bus waveguide, which is placed on the South side of the ring. This type of filter is often called a ‘notch filter’ or ‘all-pass’ filter.

The ring shape is a rounded rectangle of which the bend radius can be specified, as well as the horizontal and vertical straight sections. it is also possible to specify the rounding algorithm of the bends.

The waveguide template of the ring and the couplers can be chosen independently.

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

list of trace_templates for the ring couplers. By default the same template as the ring is taken

ring_trace_template: PCell and _WaveguideTemplate

Trace template for the ring waveguide

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

list of Ring PCells

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

list of coupler PCells

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:
ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.

Views

class Layout
Parameters:
coupler_extensions: list<Coord2 and number >= 0>

additional length of the couplers. By default, the couplers will be extended to the size of the ring.

coupler_lengths: list<number >= 0>

straight lengths of the coupling section. By default, same lengths as the ring will be used

coupler_offsets: list<Real, number>

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>

list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)

straights: Coord2 and number >= 0
shape_position: Coord2

Translation of the shape.

coupler_transformations:

list of coupler transformations

area_layer_on: ( bool, bool_ or int )

When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.

coupler_parameters:

Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
shape: locked
shapes: locked

Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRectNotchFilter
from ipkiss3 import all as i3
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

wg1_t = WireWaveguideTemplate(name="wg_template_4")
wg1_t.Layout(core_width=0.5)

wg2_t = WireWaveguideTemplate(name="wg_template_5")
wg2_t.Layout(core_width=0.4)

ring = RingRectNotchFilter(
    name="my_rectnotchring", ring_trace_template=wg1_t, coupler_trace_templates=[wg2_t]
)  # In a list!!!
layout = ring.Layout(
    coupler_spacings=[0.65],  # This results in a 200nm gap
    area_layer_on=True,
    straights=(i3.TECH.WG.SHORT_STRAIGHT, i3.TECH.WG.SHORT_STRAIGHT + 3.0),
)

layout.visualize(annotate=True)
../../_images/full-16.png

RingRect180DropFilter

class picazzo3.filters.ring.cell.RingRect180DropFilter

Rectangular ring filter with two straight access waveguide. This component is often called a channel drop filter. The access waveguides are placed north and south of the Ring

The ring shape is a rounded rectangle of which the bend radius can be specified, as well as the horizontal and vertical straight sections. it is also possible to specify the rounding algorithm of the bends.

The waveguide template of the ring and the couplers can be chosen independently.

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

list of trace_templates for the ring couplers. By default the same template as the ring is taken

ring_trace_template: PCell and _WaveguideTemplate

Trace template for the ring waveguide

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

list of Ring PCells

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

list of coupler PCells

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:
ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.

Examples

"""This example illustrates the basic ring resonator model without creating a layout.

It also illustrates the effect of resonance peak splitting due to back-reflection in the coupler.
"""
import si_fab.all as pdk  # noqa: F401
import pylab as plt
import numpy as np

from picazzo3.filters.ring import RingRect180DropFilter

# To get an FSR of 10 nm at 1.55 um, we use the following formula
n_g = 2.86  # default value used in picazzo3, see TECH.PCELLS.WG.DEFAULT
L_fsr_10nm = 1.55**2 / (n_g * 0.01)

# 1. Define the ring
my_ring = RingRect180DropFilter(name="my_example_ring")

# coupler parameters
cp = {
    "cross_coupling1": 1j * 0.0784**0.5,
    "straight_coupling1": 0.9216**0.5,
    "reflection_in1": 1j * 0.030,
}

my_ring_cm = my_ring.CircuitModel(
    ring_length=L_fsr_10nm,  # we can manually specify the ring length
    coupler_parameters=[cp, cp],  # 2 couplers
)

# 2. Simulate
wavelengths = np.linspace(1.54, 1.56, 2000)
R = my_ring_cm.get_smatrix(wavelengths=wavelengths)

# 3. Plot the results
plt.plot(wavelengths, np.abs(R["in1", "out1"]) ** 2, "b", label="pass")
plt.plot(wavelengths, np.abs(R["in1", "out2"]) ** 2, "g", label="drop")
plt.plot(wavelengths, np.abs(R["in1", "in2"]) ** 2, "r", label="add")
plt.legend()
plt.show()
../../_images/full-17.png
"""This example illustrates a simulation of a single ring resonator model based on the
layout that is first generated."""
import si_fab.all as pdk  # noqa: F401
import pylab as plt
import numpy as np

from picazzo3.filters.ring import RingRect180DropFilter

# 1. Define the ring
my_ring = RingRect180DropFilter(name="my_example_ring2")
my_ring.Layout(straights=(6.0, 0.0))

# set model in couplers and ring waveguides TODO: change the models
cp = {"delta_n_eff": 0.02}  # coupler parameters
for coupler in my_ring.couplers:
    coupler.set_default_view(coupler.SimpleCircuitModel)  # based on delta_n_eff
for ring_wg in my_ring.ring_segments:
    ring_wg.set_default_view(ring_wg.CircuitModel)  # based on the actual waveguide length

# ring model
my_ring_cm = my_ring.CircuitModel(coupler_parameters=[cp, cp])  # 2 couplers

# 2. Simulate
wavelengths = np.linspace(1.55, 1.58, 400)
R = my_ring_cm.get_smatrix(wavelengths=wavelengths)

# 3. Plot the results
plt.plot(wavelengths, np.abs(R["in1", "out1"]) ** 2, "b", label="pass")
plt.plot(wavelengths, np.abs(R["in1", "out2"]) ** 2, "g", label="drop")
plt.show()
../../_images/full-18.png

Views

class Layout
Parameters:
coupler_extensions: list<Coord2 and number >= 0>

additional length of the couplers. By default, the couplers will be extended to the size of the ring.

coupler_lengths: list<number >= 0>

straight lengths of the coupling section. By default, same lengths as the ring will be used

coupler_offsets: list<Real, number>

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>

list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)

straights: Coord2 and number >= 0
shape_position: Coord2

Translation of the shape.

coupler_transformations:

list of coupler transformations

area_layer_on: ( bool, bool_ or int )

When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.

coupler_parameters:

Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
shape: locked
shapes: locked

Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead

Examples

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

wg1_t = WireWaveguideTemplate(name="wg_template_6")
wg1_t.Layout(core_width=0.5)

wg2_t = WireWaveguideTemplate(name="wg_template_7")
wg2_t.Layout(core_width=0.4)

wg3_t = WireWaveguideTemplate(name="wg_template_8")
wg3_t.Layout(core_width=0.6)

ring = RingRect180DropFilter(
    name="my_ringrectdropring", ring_trace_template=wg1_t, coupler_trace_templates=[wg2_t, wg3_t]
)  # In a list!!!
layout = ring.Layout(
    coupler_spacings=[0.65, 0.70],  # This results in a 200nm and 250nm gap
    straights=(i3.TECH.WG.SHORT_STRAIGHT, i3.TECH.WG.SHORT_STRAIGHT + 3.0),
)

layout.visualize(annotate=True)
../../_images/full-19.png

RingRect90DropFilter

class picazzo3.filters.ring.cell.RingRect90DropFilter

Rectangular ring filter with two straight access waveguide. This component is often called a channel drop filter. The access waveguides are placed south and east of the Ring, at 90 degree angles.

The ring shape is a rounded rectangle of which the bend radius can be specified, as well as the horizontal and vertical straight sections. it is also possible to specify the rounding algorithm of the bends.

The waveguide template of the ring and the couplers can be chosen independently.

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

list of trace_templates for the ring couplers. By default the same template as the ring is taken

ring_trace_template: PCell and _WaveguideTemplate

Trace template for the ring waveguide

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

list of Ring PCells

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

list of coupler PCells

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:
ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.

Views

class Layout
Parameters:
coupler_extensions: list<Coord2 and number >= 0>

additional length of the couplers. By default, the couplers will be extended to the size of the ring.

coupler_lengths: list<number >= 0>

straight lengths of the coupling section. By default, same lengths as the ring will be used

coupler_offsets: list<Real, number>

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>

list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)

straights: Coord2 and number >= 0
shape_position: Coord2

Translation of the shape.

coupler_transformations:

list of coupler transformations

area_layer_on: ( bool, bool_ or int )

When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.

coupler_parameters:

Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
shape: locked
shapes: locked

Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead

Examples

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.filters.ring import RingRect90DropFilter
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

wg1_t = WireWaveguideTemplate(name="wg_template_9")
wg1_t.Layout(core_width=0.5)

wg2_t = WireWaveguideTemplate(name="wg_template_10")
wg2_t.Layout(core_width=0.4)

wg3_t = WireWaveguideTemplate(name="wg_template_11")
wg3_t.Layout(core_width=0.6)

ring = RingRect90DropFilter(
    name="my_rect90dropring", ring_trace_template=wg1_t, coupler_trace_templates=[wg2_t, wg3_t]
)  # In a list!!!
layout = ring.Layout(
    coupler_spacings=[0.65, 0.70],  # This results in a 200nm and 250nm gap
    straights=(i3.TECH.WG.SHORT_STRAIGHT, i3.TECH.WG.SHORT_STRAIGHT + 3.0),
)

layout.visualize(annotate=True)
../../_images/full-20.png

RingRectWrappedNotchFilter

class picazzo3.filters.ring.cell.RingRectWrappedNotchFilter

Rectangular Ring resonator with one bus waveguide, which is placed on the South side of the ring. This type of filter is often called a ‘notch filter’ or ‘all-pass’ filter. The shape of the bus waveguide follows conformally the outline of the ring.

The ring shape is a rounded rectangle of which the bend radius can be specified, as well as the horizontal and vertical straight sections. it is also possible to specify the rounding algorithm of the bends.

The waveguide template of the ring and the couplers can be chosen independently.

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

list of trace_templates for the ring couplers. By default the same template as the ring is taken

ring_trace_template: PCell and _WaveguideTemplate

Trace template for the ring waveguide

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

list of Ring PCells

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

list of coupler PCells

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:
ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.

Views

class Layout
Parameters:
coupler_sbend_straights: list<number >= 0>
coupler_angles: list<[-90,90]>
coupler_rounding_algorithms:

rounding algorithm of the couplers. if None, same radius as the ring will be used

coupler_radii: list<number >= 0>

radii of the couplers. if None, same radius as the ring will be used

coupler_lengths: list<number >= 0>

straight lengths of the couplers. if None, same lengths as the ring will be used

coupler_offsets: list<Real, number>

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>

list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)

straights: Coord2 and number >= 0
shape_position: Coord2

Translation of the shape.

coupler_transformations:

list of coupler transformations

area_layer_on: ( bool, bool_ or int )

When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.

coupler_parameters:

Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
shape: locked
shapes: locked

Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRectWrappedNotchFilter
import ipkiss3.all as i3

ring = RingRectWrappedNotchFilter(name="my_rectwrappednotchring")
layout = ring.Layout(
    bend_radius=10.0,
    straights=(i3.TECH.WG.SHORT_STRAIGHT, i3.TECH.WG.SHORT_STRAIGHT + 3.0),
    coupler_angles=[45.0, 45.0],
)

layout.visualize(annotate=True)
../../_images/full-21.png

RingRectWrapped180DropFilter

class picazzo3.filters.ring.cell.RingRectWrapped180DropFilter

Rectangular ring filter with two access waveguides. This component is often called a channel drop filter. The access waveguides are placed north and south of the Ring. The shape of the bus waveguide follows conformally the outline of the ring.

The ring shape is a rounded rectangle of which the bend radius can be specified, as well as the horizontal and vertical straight sections. it is also possible to specify the rounding algorithm of the bends.

The waveguide template of the ring and the couplers can be chosen independently.

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

list of trace_templates for the ring couplers. By default the same template as the ring is taken

ring_trace_template: PCell and _WaveguideTemplate

Trace template for the ring waveguide

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

list of Ring PCells

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

list of coupler PCells

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:
ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.

Views

class Layout
Parameters:
coupler_sbend_straights: list<number >= 0>
coupler_angles: list<[-90,90]>
coupler_rounding_algorithms:

rounding algorithm of the couplers. if None, same radius as the ring will be used

coupler_radii: list<number >= 0>

radii of the couplers. if None, same radius as the ring will be used

coupler_lengths: list<number >= 0>

straight lengths of the couplers. if None, same lengths as the ring will be used

coupler_offsets: list<Real, number>

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>

list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)

straights: Coord2 and number >= 0
shape_position: Coord2

Translation of the shape.

coupler_transformations:

list of coupler transformations

area_layer_on: ( bool, bool_ or int )

When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.

coupler_parameters:

Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
shape: locked
shapes: locked

Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRectWrapped180DropFilter
import ipkiss3.all as i3

ring = RingRectWrapped180DropFilter(name="my_rectwrapped180dropring")
layout = ring.Layout(
    straights=(i3.TECH.WG.SHORT_STRAIGHT, i3.TECH.WG.SHORT_STRAIGHT + 3.0),
    coupler_angles=[30.0, 10.0],
    coupler_spacings=[1.0, 0.8],
    manhattan=True,
)

layout.visualize(annotate=True)
../../_images/full-22.png

RingRectSymmNotchFilter

class picazzo3.filters.ring.cell.RingRectSymmNotchFilter

Rectangular Ring resonator with one bus waveguide, which is placed on the South side of the ring. This type of filter is often called a ‘notch filter’ or ‘all-pass’ filter. The shape of the bus waveguide mirrors the shape of the ring, which makes the coupling section symmetric.

The ring shape is a rounded rectangle of which the bend radius can be specified, as well as the horizontal and vertical straight sections. it is also possible to specify the rounding algorithm of the bends.

The waveguide template of the ring and the couplers can be chosen independently.

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

list of trace_templates for the ring couplers. By default the same template as the ring is taken

ring_trace_template: PCell and _WaveguideTemplate

Trace template for the ring waveguide

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

list of Ring PCells

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

list of coupler PCells

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:
ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.

Views

class Layout
Parameters:
coupler_straights: list<number >= 0>

lengths of the straigth sections at the start and end of the couplers

coupler_angles: list<[0,90]>
coupler_rounding_algorithms:

rounding algorithm of the couplers. if None, same radius as the ring will be used

coupler_radii: list<number >= 0>

radii of the couplers. if None, same radius as the ring will be used

coupler_lengths: list<number >= 0>

straight lengths of the couplers. if None, same lengths as the ring will be used

coupler_offsets: list<Real, number>

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>

list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)

straights: Coord2 and number >= 0
shape_position: Coord2

Translation of the shape.

coupler_transformations:

list of coupler transformations

area_layer_on: ( bool, bool_ or int )

When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.

coupler_parameters:

Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
shape: locked
shapes: locked

Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead

Examples

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.filters.ring import RingRectSymmNotchFilter

ring = RingRectSymmNotchFilter(name="my_rectsymmnotchring")
layout = ring.Layout(
    coupler_lengths=[1.0],
    coupler_radii=[3.0],
    straights=(i3.TECH.WG.SHORT_STRAIGHT, i3.TECH.WG.SHORT_STRAIGHT + 3.0),
    area_layer_on=False,
    manhattan=True,
)

layout.visualize(annotate=True)
../../_images/full-23.png

RingRectSymm180DropFilter

class picazzo3.filters.ring.cell.RingRectSymm180DropFilter

Rectangular ring filter with two access waveguide. This component is often called a channel drop filter. The access waveguides are placed north and south of the Ring. The shape of the bus waveguides mirrors the shape of the ring, which makes the coupling section symmetric.

The ring shape is a rounded rectangle of which the bend radius can be specified, as well as the horizontal and vertical straight sections. it is also possible to specify the rounding algorithm of the bends.

The waveguide template of the ring and the couplers can be chosen independently.

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

list of trace_templates for the ring couplers. By default the same template as the ring is taken

ring_trace_template: PCell and _WaveguideTemplate

Trace template for the ring waveguide

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

list of Ring PCells

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

list of coupler PCells

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:
ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.

Views

class Layout
Parameters:
coupler_straights: list<number >= 0>

lengths of the straigth sections at the start and end of the couplers

coupler_angles: list<[0,90]>
coupler_rounding_algorithms:

rounding algorithm of the couplers. if None, same radius as the ring will be used

coupler_radii: list<number >= 0>

radii of the couplers. if None, same radius as the ring will be used

coupler_lengths: list<number >= 0>

straight lengths of the couplers. if None, same lengths as the ring will be used

coupler_offsets: list<Real, number>

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>

list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)

straights: Coord2 and number >= 0
shape_position: Coord2

Translation of the shape.

coupler_transformations:

list of coupler transformations

area_layer_on: ( bool, bool_ or int )

When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.

coupler_parameters:

Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
shape: locked
shapes: locked

Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead

Examples

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.filters.ring import RingRectSymm180DropFilter

ring = RingRectSymm180DropFilter(name="my_rectsymm180dropring")
layout = ring.Layout(
    bend_radius=8.0,
    coupler_lengths=[1.0, 4.0],
    coupler_radii=[3.0, 5.0],
    coupler_angles=[90.0, 30.0],
    straights=(i3.TECH.WG.SHORT_STRAIGHT, i3.TECH.WG.SHORT_STRAIGHT + 3.0),
)

layout.visualize(annotate=True)
../../_images/full-24.png

RingRectSymm90DropFilter

class picazzo3.filters.ring.cell.RingRectSymm90DropFilter

Rectangular ring filter with two access waveguide. This component is often called a channel drop filter. The access waveguides are placed south and east of the Ring, at 90 degree angles. The shape of the bus waveguides mirrors the shape of the ring, which makes the coupling section symmetric.

The ring shape is a rounded rectangle of which the bend radius can be specified, as well as the horizontal and vertical straight sections. it is also possible to specify the rounding algorithm of the bends.

The waveguide template of the ring and the couplers can be chosen independently.

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

list of trace_templates for the ring couplers. By default the same template as the ring is taken

ring_trace_template: PCell and _WaveguideTemplate

Trace template for the ring waveguide

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

list of Ring PCells

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

list of coupler PCells

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:
ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.

Views

class Layout
Parameters:
coupler_straights: list<number >= 0>

lengths of the straigth sections at the start and end of the couplers

coupler_angles: list<[0,90]>
coupler_rounding_algorithms:

rounding algorithm of the couplers. if None, same radius as the ring will be used

coupler_radii: list<number >= 0>

radii of the couplers. if None, same radius as the ring will be used

coupler_lengths: list<number >= 0>

straight lengths of the couplers. if None, same lengths as the ring will be used

coupler_offsets: list<Real, number>

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>

list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)

straights: Coord2 and number >= 0
shape_position: Coord2

Translation of the shape.

coupler_transformations:

list of coupler transformations

area_layer_on: ( bool, bool_ or int )

When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.

coupler_parameters:

Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
shape: locked
shapes: locked

Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead

Examples

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.filters.ring import RingRectSymm90DropFilter

ring = RingRectSymm90DropFilter(name="my_rectsymm90dropring")
layout = ring.Layout(
    bend_radius=8.0,
    coupler_lengths=[1.0, 4.0],
    coupler_radii=[3.0, 5.0],
    coupler_angles=[90.0, 30.0],
    manhattan=True,
    straights=(i3.TECH.WG.SHORT_STRAIGHT, i3.TECH.WG.SHORT_STRAIGHT + 3.0),
)

layout.visualize(annotate=True)
../../_images/full-25.png

RingRectSBendNotchFilter

class picazzo3.filters.ring.cell.RingRectSBendNotchFilter

Rectangular Ring resonator with one bus waveguide, which is placed on the South side of the ring. The shape of the bus waveguide bends away from the ring, and then again horizontally, with an S-bend.

The ring shape is a rounded rectangle of which the bend radius can be specified, as well as the horizontal and vertical straight sections. it is also possible to specify the rounding algorithm of the bends.

The waveguide template of the ring and the couplers can be chosen independently.

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

list of trace_templates for the ring couplers. By default the same template as the ring is taken

ring_trace_template: PCell and _WaveguideTemplate

Trace template for the ring waveguide

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

list of Ring PCells

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

list of coupler PCells

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:
ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.

Views

class Layout
Parameters:
coupler_sbend_straights: list<number >= 0>
coupler_angles: list<[0,90]>
coupler_rounding_algorithms:

rounding algorithm of the couplers. if None, same radius as the ring will be used

coupler_radii: list<number >= 0>

radii of the couplers. if None, same radius as the ring will be used

coupler_lengths: list<number >= 0>

straight lengths of the couplers. if None, same lengths as the ring will be used

coupler_offsets: list<Real, number>

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>

list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)

straights: Coord2 and number >= 0
shape_position: Coord2

Translation of the shape.

coupler_transformations:

list of coupler transformations

area_layer_on: ( bool, bool_ or int )

When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.

coupler_parameters:

Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
shape: locked
shapes: locked

Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRectSBendNotchFilter
import ipkiss3.all as i3

ring = RingRectSBendNotchFilter(name="my_ring12")
layout = ring.Layout(
    straights=(i3.TECH.WG.SHORT_STRAIGHT, i3.TECH.WG.SHORT_STRAIGHT + 3.0),
    coupler_sbend_straights=[6.0],
    manhattan=True,
    area_layer_on=False,
)

layout.visualize(annotate=True)
../../_images/full-26.png

RingRectSBend180DropFilter

class picazzo3.filters.ring.cell.RingRectSBend180DropFilter

Rectangular ring filter with two access waveguides. This component is often called a channel drop filter. The access waveguides are placed north and south of the Ring. The shapes of the bus waveguides bends away from the ring, and then again horizontally, with an S-bend.

The ring shape is a rounded rectangle of which the bend radius can be specified, as well as the horizontal and vertical straight sections. it is also possible to specify the rounding algorithm of the bends.

The waveguide template of the ring and the couplers can be chosen independently.

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

list of trace_templates for the ring couplers. By default the same template as the ring is taken

ring_trace_template: PCell and _WaveguideTemplate

Trace template for the ring waveguide

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

list of Ring PCells

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

list of coupler PCells

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:
ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.

Views

class Layout
Parameters:
coupler_sbend_straights: list<number >= 0>
coupler_angles: list<[0,90]>
coupler_rounding_algorithms:

rounding algorithm of the couplers. if None, same radius as the ring will be used

coupler_radii: list<number >= 0>

radii of the couplers. if None, same radius as the ring will be used

coupler_lengths: list<number >= 0>

straight lengths of the couplers. if None, same lengths as the ring will be used

coupler_offsets: list<Real, number>

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>

list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)

straights: Coord2 and number >= 0
shape_position: Coord2

Translation of the shape.

coupler_transformations:

list of coupler transformations

area_layer_on: ( bool, bool_ or int )

When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.

coupler_parameters:

Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
shape: locked
shapes: locked

Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRectSBend180DropFilter
import ipkiss3.all as i3

ring = RingRectSBend180DropFilter(name="my_rectsbend180dropring")
layout = ring.Layout(
    straights=(i3.TECH.WG.SHORT_STRAIGHT, i3.TECH.WG.SHORT_STRAIGHT + 3.0),
    coupler_angles=[30.0, 10.0],
    coupler_spacings=[1.0, 0.8],
    coupler_lengths=[6.0, 2.0],
    coupler_radii=[3.0, 7.0],
    manhattan=True,
    area_layer_on=False,
)

layout.visualize(annotate=True)
../../_images/full-27.png

Multi-mode Interferometers

MMITapered

class picazzo3.filters.mmi.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/full-28.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/full-29.png

MMIIdenticalTapered

class picazzo3.filters.mmi.MMIIdenticalTapered

Rectangular multimode interferometer, generated from a trace template with identical input and output trace_templates and with tapers.

Parameters:
output_trace_template: PCell

Output trace template.

input_trace_template: PCell

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate

Trace template used for the MMI section

n_outputs: int and number > 0

Number of output channels.

n_inputs: int and number > 0

Number of input channels

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

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

List of the output trace templates.

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

List of the input trace templates.

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 MMIIdenticalTapered
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 = MMIIdenticalTapered(
    mmi_trace_template=mmi_trace_template,
    input_trace_template=mmi_access_template,
    output_trace_template=mmi_access_template,
    trace_template=i3.TECH.PCELLS.WG.DEFAULT,
    n_inputs=3,
    n_outputs=2,
)
layout = MMI.Layout(
    transition_length=5.0, length=10.0, input_y_positions=[-2.0, 0.0, 2.0], output_y_positions=[-1.0, 1.0]
)
layout.visualize(annotate=True)
../../_images/full-30.png

MMISymmetricTapered

class picazzo3.filters.mmi.MMISymmetricTapered

MMI with symmetrically distributed access templates and with tapers. This is usually useful when the MMI is used a splitter or combiner.

Parameters:
output_trace_template: PCell

Output trace template.

input_trace_template: PCell

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate

Trace template used for the MMI section

n_outputs: int and number > 0

Number of output channels.

n_inputs: int and number > 0

Number of input channels

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

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

List of the output trace templates.

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

List of the input trace templates.

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:
trace_spacing: float and Real, number and number >= 0

Offset between the traces at the input and the output

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:
output_y_positions: list<Real, number>, locked

Positions in the y direction at the output where access waveguides are be added

input_y_positions: list<Real, number>, locked

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

transition_lengths: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mmi.cell import MMISymmetricTapered
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 = MMISymmetricTapered(
    mmi_trace_template=mmi_trace_template,
    input_trace_template=mmi_access_template,
    output_trace_template=mmi_access_template,
    trace_template=i3.TECH.PCELLS.WG.DEFAULT,
    n_inputs=3,
    n_outputs=2,
)
layout = MMI.Layout(transition_length=5.0, length=10.0, trace_spacing=2.0)
layout.visualize(annotate=True)
../../_images/full-31.png

MMI1x2Tapered

class picazzo3.filters.mmi.MMI1x2Tapered

MMI with one access waveguide and two output waveguides and with tapers that symmetrically distributed. This is usually useful when the MMI is used as a splitter.

Parameters:
output_trace_template: PCell

Output trace template.

input_trace_template: PCell

Input trace template.

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

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

List of the output trace templates.

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

List of the input trace templates.

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:
trace_spacing: float and Real, number and number >= 0

Offset between the traces at the input and the output

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:
output_y_positions: list<Real, number>, locked

Positions in the y direction at the output where access waveguides are be added

input_y_positions: list<Real, number>, locked

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

transition_lengths: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mmi.cell import MMI1x2Tapered
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 = MMI1x2Tapered(
    mmi_trace_template=mmi_trace_template,
    input_trace_template=mmi_access_template,
    output_trace_template=mmi_access_template,
    trace_template=i3.TECH.PCELLS.WG.DEFAULT,
)
layout = MMI.Layout(transition_length=5.0, length=10.0, trace_spacing=2.0)
layout.visualize(annotate=True)
../../_images/full-32.png

MMI2x1Tapered

class picazzo3.filters.mmi.MMI2x1Tapered

MMI with two access waveguides and one output waveguides and with tapers that symmetrically distributed. This is usually useful when the MMI is used as a combiner.

Parameters:
output_trace_template: PCell

Output trace template.

input_trace_template: PCell

Input trace template.

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

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

List of the output trace templates.

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

List of the input trace templates.

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:
trace_spacing: float and Real, number and number >= 0

Offset between the traces at the input and the output

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:
output_y_positions: list<Real, number>, locked

Positions in the y direction at the output where access waveguides are be added

input_y_positions: list<Real, number>, locked

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

transition_lengths: locked

Examples

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

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 = MMI2x1Tapered(
    mmi_trace_template=mmi_trace_template,
    input_trace_template=mmi_access_template,
    output_trace_template=mmi_access_template,
    trace_template=i3.TECH.PCELLS.WG.DEFAULT,
)

layout = MMI.Layout(transition_length=5.0, length=10.0, trace_spacing=2.0)
layout.visualize(annotate=True)
../../_images/full-33.png

MMI2x2Tapered

class picazzo3.filters.mmi.MMI2x2Tapered

MMI with one access waveguide and two output waveguides and with tapers that symmetrically distributed. This is usually useful when the MMI is used as a 2x2 splitter or a crossing.

Parameters:
output_trace_template: PCell

Output trace template.

input_trace_template: PCell

Input trace template.

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

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

List of the output trace templates.

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

List of the input trace templates.

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:
trace_spacing: float and Real, number and number >= 0

Offset between the traces at the input and the output

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:
output_y_positions: list<Real, number>, locked

Positions in the y direction at the output where access waveguides are be added

input_y_positions: list<Real, number>, locked

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

transition_lengths: locked

Examples

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

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 = MMI2x2Tapered(
    mmi_trace_template=mmi_trace_template,
    input_trace_template=mmi_access_template,
    output_trace_template=mmi_access_template,
    trace_template=i3.TECH.PCELLS.WG.DEFAULT,
)
layout = MMI.Layout(transition_length=5.0, length=10.0, trace_spacing=2.0)
layout.visualize(annotate=True)
../../_images/full-34.png

RibMMIIdenticalTapered

class picazzo3.filters.mmi_rib.RibMMIIdenticalTapered
Rectangular multimode interferometer, using a Ribwaveguide for the MMI with identical input and

output trace_templates and with tapers.

This MMI is basically built upon the regular tapered MMI using a RibWaveguide for the MMI section, but adds modifications intended to avoid sharp corners DRC errors with the tapers.

Parameters:
output_trace_template: PCell

Output trace template.

input_trace_template: PCell

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate

Trace template used for the MMI section

n_outputs: int and number > 0

Number of output channels.

n_inputs: int and number > 0

Number of input channels

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

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

List of the output trace templates.

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

List of the input trace templates.

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:
rib_cover_purpose: PatternPurpose

Drawing purpose for covering the mmi and rib-only part of the tapers

extra_line_thickness: float and Real, number and number >= 0

Extra width added to minimum_space to calculate the width of the line correction (usually you do not have to modify this)

minimum_space: float and number > 0

Minimum space between the tapers needed for the line corrections to be added (usually you do not have to modify this)

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_rib.cell import RibMMIIdenticalTapered
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

mmi_trace_template = RibWaveguideTemplate()
mmi_trace_template.Layout(core_width=10.0, cladding_width=25.0)

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

mmi_access_template = RibWaveguideTemplate()
mmi_access_template.Layout(core_width=2.0, cladding_width=15.0)

MMI = RibMMIIdenticalTapered(
    mmi_trace_template=mmi_trace_template,
    input_trace_template=mmi_access_template,
    output_trace_template=mmi_access_template,
    trace_template=mmi_wav_template,
    n_inputs=3,
    n_outputs=2,
)

layout = MMI.Layout(length=10.0, input_y_positions=[-3.0, 0.0, 3.0], output_y_positions=[-1.0, 1.0])
layout.visualize(annotate=True)
../../_images/full-35.png

RibMMISymmetricTapered

class picazzo3.filters.mmi_rib.RibMMISymmetricTapered

Rib MMI with symmetrically distributed access templates and with tapers.

Parameters:
output_trace_template: PCell

Output trace template.

input_trace_template: PCell

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate

Trace template used for the MMI section

n_outputs: int and number > 0

Number of output channels.

n_inputs: int and number > 0

Number of input channels

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

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

List of the output trace templates.

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

List of the input trace templates.

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:
trace_spacing: float and Real, number and number >= 0

Offset between the traces at the input and the output

rib_cover_purpose: PatternPurpose

Drawing purpose for covering the mmi and rib-only part of the tapers

extra_line_thickness: float and Real, number and number >= 0

Extra width added to minimum_space to calculate the width of the line correction (usually you do not have to modify this)

minimum_space: float and number > 0

Minimum space between the tapers needed for the line corrections to be added (usually you do not have to modify this)

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:
output_y_positions: list<Real, number>, locked

Positions in the y direction at the output where access waveguides are be added

input_y_positions: list<Real, number>, locked

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

transition_lengths: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mmi_rib.cell import RibMMISymmetricTapered
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

mmi_trace_template = RibWaveguideTemplate()
mmi_trace_template.Layout(core_width=10.0, cladding_width=25.0)

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

mmi_access_template = RibWaveguideTemplate()
mmi_access_template.Layout(core_width=2.0, cladding_width=15.0)

MMI = RibMMISymmetricTapered(
    mmi_trace_template=mmi_trace_template,
    input_trace_template=mmi_access_template,
    output_trace_template=mmi_access_template,
    trace_template=mmi_wav_template,
    n_inputs=3,
    n_outputs=2,
)

layout = MMI.Layout(transition_length=5.0, length=10.0, trace_spacing=2.0)
layout.visualize(annotate=True)
../../_images/full-36.png

RibMMI1x2Tapered

class picazzo3.filters.mmi_rib.RibMMI1x2Tapered

Rib 1x2 MMI with symmetrically distributed access templates and with tapers.

Parameters:
output_trace_template: PCell

Output trace template.

input_trace_template: PCell

Input trace template.

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

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

List of the output trace templates.

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

List of the input trace templates.

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:
trace_spacing: float and Real, number and number >= 0

Offset between the traces at the input and the output

rib_cover_purpose: PatternPurpose

Drawing purpose for covering the mmi and rib-only part of the tapers

extra_line_thickness: float and Real, number and number >= 0

Extra width added to minimum_space to calculate the width of the line correction (usually you do not have to modify this)

minimum_space: float and number > 0

Minimum space between the tapers needed for the line corrections to be added (usually you do not have to modify this)

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:
output_y_positions: list<Real, number>, locked

Positions in the y direction at the output where access waveguides are be added

input_y_positions: list<Real, number>, locked

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

transition_lengths: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mmi_rib.cell import RibMMI1x2Tapered
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

mmi_trace_template = RibWaveguideTemplate()
mmi_trace_template.Layout(core_width=10.0, cladding_width=25.0)

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

mmi_access_template = RibWaveguideTemplate()
mmi_access_template.Layout(core_width=2.0, cladding_width=15.0)

MMI = RibMMI1x2Tapered(
    mmi_trace_template=mmi_trace_template,
    input_trace_template=mmi_access_template,
    output_trace_template=mmi_access_template,
    trace_template=mmi_wav_template,
)

layout = MMI.Layout(transition_length=5.0, length=10.0, trace_spacing=2.0)
layout.visualize(annotate=True)
../../_images/full-37.png

RibMMI2x1Tapered

class picazzo3.filters.mmi_rib.RibMMI2x1Tapered

Rib 2x1 MMI with symmetrically distributed access templates and with tapers.

Parameters:
output_trace_template: PCell

Output trace template.

input_trace_template: PCell

Input trace template.

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

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

List of the output trace templates.

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

List of the input trace templates.

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:
trace_spacing: float and Real, number and number >= 0

Offset between the traces at the input and the output

rib_cover_purpose: PatternPurpose

Drawing purpose for covering the mmi and rib-only part of the tapers

extra_line_thickness: float and Real, number and number >= 0

Extra width added to minimum_space to calculate the width of the line correction (usually you do not have to modify this)

minimum_space: float and number > 0

Minimum space between the tapers needed for the line corrections to be added (usually you do not have to modify this)

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:
output_y_positions: list<Real, number>, locked

Positions in the y direction at the output where access waveguides are be added

input_y_positions: list<Real, number>, locked

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

transition_lengths: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mmi_rib.cell import RibMMI2x1Tapered
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

mmi_trace_template = RibWaveguideTemplate()
mmi_trace_template.Layout(core_width=10.0, cladding_width=25.0)

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

mmi_access_template = RibWaveguideTemplate()
mmi_access_template.Layout(core_width=2.0, cladding_width=15.0)

MMI = RibMMI2x1Tapered(
    mmi_trace_template=mmi_trace_template,
    input_trace_template=mmi_access_template,
    output_trace_template=mmi_access_template,
    trace_template=mmi_wav_template,
)

layout = MMI.Layout(transition_length=5.0, length=10.0, trace_spacing=2.0)
layout.visualize(annotate=True)
../../_images/full-38.png

RibMMI2x2Tapered

class picazzo3.filters.mmi_rib.RibMMI2x2Tapered

Rib 2x2 MMI with symmetrically distributed access templates and with tapers.

Parameters:
output_trace_template: PCell

Output trace template.

input_trace_template: PCell

Input trace template.

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

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

List of the output trace templates.

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

List of the input trace templates.

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:
trace_spacing: float and Real, number and number >= 0

Offset between the traces at the input and the output

rib_cover_purpose: PatternPurpose

Drawing purpose for covering the mmi and rib-only part of the tapers

extra_line_thickness: float and Real, number and number >= 0

Extra width added to minimum_space to calculate the width of the line correction (usually you do not have to modify this)

minimum_space: float and number > 0

Minimum space between the tapers needed for the line corrections to be added (usually you do not have to modify this)

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:
output_y_positions: list<Real, number>, locked

Positions in the y direction at the output where access waveguides are be added

input_y_positions: list<Real, number>, locked

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

transition_lengths: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mmi_rib.cell import RibMMI2x2Tapered
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

mmi_trace_template = RibWaveguideTemplate()
mmi_trace_template.Layout(core_width=10.0, cladding_width=25.0)

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

mmi_access_template = RibWaveguideTemplate()
mmi_access_template.Layout(core_width=2.0, cladding_width=15.0)

MMI = RibMMI2x2Tapered(
    mmi_trace_template=mmi_trace_template,
    input_trace_template=mmi_access_template,
    output_trace_template=mmi_access_template,
    trace_template=mmi_wav_template,
)

layout = MMI.Layout(transition_length=5.0, length=10.0, trace_spacing=2.0)
layout.visualize(annotate=True)
../../_images/full-39.png

MMI

class picazzo3.filters.mmi.MMI

Rectangular multimode interferometer, generated from a waveguide template

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

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.

Views

class Layout

Layoutview of the MMI. It is built from the MMI waveguide over a certain length and ports at the input_y_positions and output_y_positions.

Parameters:
length: float and number > 0

Length of the MMI

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

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

Examples

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

mmi_trace_template = WireWaveguideTemplate()
mmi_trace_template.Layout(core_width=6.0, cladding_width=10.0)
MMI = MMI(
    mmi_trace_template=mmi_trace_template,
    input_trace_templates=[i3.TECH.PCELLS.WG.DEFAULT],
    output_trace_templates=[i3.TECH.PCELLS.WG.DEFAULT],
)
layout = MMI.Layout(length=10.0, input_y_positions=[0.0], output_y_positions=[0.0])
layout.visualize(annotate=True)
../../_images/full-40.png

MMIIdentical

class picazzo3.filters.mmi.MMIIdentical

Rectangular multimode interferometer, generated from a trace template with identical input and output trace_templates.

Parameters:
output_trace_template: PCell

Output trace template.

input_trace_template: PCell

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate

Trace template used for the MMI section

n_outputs: int and number > 0

Number of output channels.

n_inputs: int and number > 0

Number of input channels

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

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

List of the output trace templates.

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

List of the input trace templates.

Views

class Layout
Parameters:
length: float and number > 0

Length of the MMI

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

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

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mmi.cell import MMIIdentical
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 = MMIIdentical(
    mmi_trace_template=mmi_trace_template,
    input_trace_template=i3.TECH.PCELLS.WG.DEFAULT,
    output_trace_template=i3.TECH.PCELLS.WG.DEFAULT,
    n_inputs=3,
    n_outputs=2,
)
layout = MMI.Layout(length=10.0, input_y_positions=[-2.0, 0.0, 2.0], output_y_positions=[-1.0, 1.0])
layout.visualize(annotate=True)
../../_images/full-41.png

MMISymmetric

class picazzo3.filters.mmi.MMISymmetric

MMI with symmetrically distributed access templates. This is usually useful when the MMI is used a splitter or combiner.

Parameters:
output_trace_template: PCell

Output trace template.

input_trace_template: PCell

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate

Trace template used for the MMI section

n_outputs: int and number > 0

Number of output channels.

n_inputs: int and number > 0

Number of input channels

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

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

List of the output trace templates.

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

List of the input trace templates.

Views

class Layout
Parameters:
trace_spacing: float and Real, number and number >= 0

Offset between the traces at the input and the output

length: float and number > 0

Length of the MMI

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:
output_y_positions: list<Real, number>, locked

Positions in the y direction at the output where access waveguides are be added

input_y_positions: list<Real, number>, locked

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

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mmi.cell import MMISymmetric
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 = MMISymmetric(
    mmi_trace_template=mmi_trace_template,
    input_trace_template=i3.TECH.PCELLS.WG.DEFAULT,
    output_trace_template=i3.TECH.PCELLS.WG.DEFAULT,
    n_inputs=3,
    n_outputs=2,
)
layout = MMI.Layout(length=10.0, trace_spacing=2.0)
layout.visualize(annotate=True)
../../_images/full-42.png

MMI1x2

class picazzo3.filters.mmi.MMI1x2

MMI with one access waveguide and two output waveguides that symmetrically distributed. This is usually useful when the MMI is used as a splitter.

Parameters:
output_trace_template: PCell

Output trace template.

input_trace_template: PCell

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate

Trace template used for the MMI section

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

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

List of the output trace templates.

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

List of the input trace templates.

n_outputs: int and number > 0, locked

Number of output channels.

n_inputs: int and number > 0, locked

Number of input channels.

Views

class Layout
Parameters:
trace_spacing: float and Real, number and number >= 0

Offset between the traces at the input and the output

length: float and number > 0

Length of the MMI

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:
output_y_positions: list<Real, number>, locked

Positions in the y direction at the output where access waveguides are be added

input_y_positions: list<Real, number>, locked

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

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mmi.cell import MMI1x2
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 = MMI1x2(
    mmi_trace_template=mmi_trace_template,
    input_trace_template=i3.TECH.PCELLS.WG.DEFAULT,
    output_trace_template=i3.TECH.PCELLS.WG.DEFAULT,
)
layout = MMI.Layout(length=10.0, trace_spacing=2.0)
layout.visualize(annotate=True)
../../_images/full-43.png

MMI2x1

class picazzo3.filters.mmi.MMI2x1

MMI with two access waveguides and one output waveguides that symmetrically distributed. This is usually useful when the MMI is used as a combiner.

Parameters:
output_trace_template: PCell

Output trace template.

input_trace_template: PCell

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate

Trace template used for the MMI section

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

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

List of the output trace templates.

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

List of the input trace templates.

n_outputs: int and number > 0, locked

Number of output channels.

n_inputs: int and number > 0, locked

Number of input channels.

Views

class Layout
Parameters:
trace_spacing: float and Real, number and number >= 0

Offset between the traces at the input and the output

length: float and number > 0

Length of the MMI

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:
output_y_positions: list<Real, number>, locked

Positions in the y direction at the output where access waveguides are be added

input_y_positions: list<Real, number>, locked

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

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mmi.cell import MMI2x1
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 = MMI2x1(
    mmi_trace_template=mmi_trace_template,
    input_trace_template=i3.TECH.PCELLS.WG.DEFAULT,
    output_trace_template=i3.TECH.PCELLS.WG.DEFAULT,
)

layout = MMI.Layout(length=10.0, trace_spacing=2.0)
layout.visualize(annotate=True)
../../_images/full-44.png

MMI2x2

class picazzo3.filters.mmi.MMI2x2

MMI with one access waveguide and two output waveguides that symmetrically distributed. This is usually useful when the MMI is used as a 2x2 splitter or a crossing.

Parameters:
output_trace_template: PCell

Output trace template.

input_trace_template: PCell

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate

Trace template used for the MMI section

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

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

List of the output trace templates.

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

List of the input trace templates.

n_outputs: int and number > 0, locked

Number of output channels.

n_inputs: int and number > 0, locked

Number of input channels.

Views

class Layout
Parameters:
trace_spacing: float and Real, number and number >= 0

Offset between the traces at the input and the output

length: float and number > 0

Length of the MMI

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:
output_y_positions: list<Real, number>, locked

Positions in the y direction at the output where access waveguides are be added

input_y_positions: list<Real, number>, locked

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

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mmi.cell import MMI2x2
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 = MMI2x2(
    mmi_trace_template=mmi_trace_template,
    input_trace_template=i3.TECH.PCELLS.WG.DEFAULT,
    output_trace_template=i3.TECH.PCELLS.WG.DEFAULT,
)
layout = MMI.Layout(length=10.0, trace_spacing=2.0)
layout.visualize(annotate=True)
../../_images/full-45.png

Mach-Zehnder Interferometers (MZI)

MZI

class picazzo3.filters.mzi.cell.MZI

Generic MZI, taking a splitter, combiner and two _MziArm objects. You have to specify the transformations yourself.

Parameters:
arm2_port_names: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3. and length == 2

port names for the north arm ports connected to splitter and combiner. Default = (‘in’, ‘out’)

arm1_port_names: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3. and length == 2

port names for the south arm ports connected to splitter and combiner. Default = (‘in’, ‘out’)

combiner_port_names: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3. and length == 2

port names for the combiner ports to the arms. Default = (‘in1’, ‘in2’)

splitter_port_names: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3. and length == 2

port names for the splitter ports to the arms. Default = (‘out1’, ‘out2’)

combiner: PCell

The combiner of the MZI

splitter: PCell

The splitter of the MZI

arm2: PCell and MZIArm

The North arm of the MZI

arm1: PCell and MZIArm

The South arm of the MZI

external_port_names: str

Map of the free instance terms/ports to the names of external terms/ports.Format is a dict {‘inst:term’ : ‘new_term_name’}.If a term/port is not listed, the format instname_portname will be used

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:
links: locked
child_cells: locked

Views

class Layout
Parameters:
combiner_transformation: GenericNoDistortTransform
splitter_transformation: GenericNoDistortTransform
flyline_width: float and number > 0

line width of the flylines

flyline_layer: ( __Layer__ ), *None allowed*

layer to draw flylines of physically unconnected links

netlist_view: NetlistView

Netlist view in the same cell on which this Layout is based. Normally no need to manually override.

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:
child_transformations: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mzi import MZI, MZIWaveguideArm
from picazzo3.wg.splitters import WgY90Splitter
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate
from ipkiss3 import all as i3

wg1_t = WireWaveguideTemplate(name="my_wire_template_3")
wg1_t.Layout(core_width=0.5)

split = WgY90Splitter(name="my_splitter1")
split_layout = split.Layout()

comb_t = i3.HMirror() + i3.Translation((100.0, 0.0))

mziarm1 = MZIWaveguideArm(name="my_mzi_example_arm1")
mziarm1.Layout(
    extra_length=30.0,
    routing_direction=i3.DIRECTION.SOUTH,
    splitter_port=split_layout.ports["arm1"],
    combiner_port=split_layout.ports["arm1"].transform_copy(comb_t),
)

mziarm2 = MZIWaveguideArm(name="my_mzi_example_arm2")
mziarm2.Layout(
    splitter_port=split_layout.ports["arm2"],
    combiner_port=split_layout.ports["arm2"].transform_copy(comb_t),
)

mzi = MZI(
    name="my_mzi_example",
    splitter=split,
    combiner=split,
    arm1=mziarm1,
    arm2=mziarm2,
    splitter_port_names=["arm1", "arm2"],
    combiner_port_names=["arm1", "arm2"],
)
layout = mzi.Layout(combiner_transformation=comb_t)

layout.visualize(annotate=True)
../../_images/full-46.png

MZIWaveguides

class picazzo3.filters.mzi.cell.MZIWaveguides

A MZI with two simple waveguide arms. The splitter and combiner are safely spaced, but this can be manually optimized. The difference in length between the delay lines can be set in the layout.

Parameters:
auto_transition: ( bool, bool_ or int )

if True, splitter and combiner are transitioned to the correct waveguide template

trace_template: PCell and _WaveguideTemplate
arm2_port_names: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3. and length == 2

port names for the north arm ports connected to splitter and combiner. Default = (‘in’, ‘out’)

arm1_port_names: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3. and length == 2

port names for the south arm ports connected to splitter and combiner. Default = (‘in’, ‘out’)

combiner_port_names: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3. and length == 2

port names for the combiner ports to the arms. Default = (‘in1’, ‘in2’)

splitter_port_names: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3. and length == 2

port names for the splitter ports to the arms. Default = (‘out1’, ‘out2’)

combiner: PCell

The combiner of the MZI

splitter: PCell

The splitter of the MZI

external_port_names: str

Map of the free instance terms/ports to the names of external terms/ports.Format is a dict {‘inst:term’ : ‘new_term_name’}.If a term/port is not listed, the format instname_portname will be used

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:
arm2: PCell, locked
arm1: PCell, locked
links: locked
child_cells: locked

Views

class Layout
Parameters:
delay_length: float

if positive, the upper arms is longer, if negative, the lower arm

flatten_contents: ( bool, bool_ or int )

allows for enabling/disabling the flattening of the splitter and combiner, default is True

min_straight: float and Real, number and number >= 0

Minimum straight length between two bends

arm2_direction: List with value restriction, allowed values: [C2(0.000000, 1.000000), C2(0.000000, -1.000000)]

direction of routing (DIRECTION.NORTH or DIRECTION.SOUTH)

arm1_direction: List with value restriction, allowed values: [C2(0.000000, 1.000000), C2(0.000000, -1.000000)]

direction of routing (DIRECTION.NORTH or DIRECTION.SOUTH)

combiner_transformation: GenericNoDistortTransform
splitter_transformation: GenericNoDistortTransform
flyline_width: float and number > 0

line width of the flylines

flyline_layer: ( __Layer__ ), *None allowed*

layer to draw flylines of physically unconnected links

netlist_view: NetlistView

Netlist view in the same cell on which this Layout is based. Normally no need to manually override.

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
child_transformations: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mzi import MZIWaveguides
from picazzo3.wg.splitters import WgY90Splitter, WgY180Combiner

split = WgY90Splitter(name="my_splitter_5")
split.Layout()

comb = WgY180Combiner(name="my_combiner_5")
comb.Layout()

mzi = MZIWaveguides(
    name="my_mzi_waveguides_1",
    splitter=split,
    combiner=comb,
    splitter_port_names=["arm1", "arm2"],
    combiner_port_names=["arm1", "arm2"],
)
layout = mzi.Layout(delay_length=100.0)

layout.visualize(annotate=True)
../../_images/full-47.png
import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mzi import MZIWaveguides
from picazzo3.wg.dircoup import BendDirectionalCoupler
from ipkiss3 import all as i3

split = BendDirectionalCoupler(name="my_splitter_6")
split.Layout(bend_angle=30.0)

mzi = MZIWaveguides(name="my_mzi_waveguides_2", splitter=split, combiner=split)
layout = mzi.Layout(
    delay_length=-50.0,
    splitter_transformation=i3.Rotation(rotation=90.0),
    combiner_transformation=i3.Rotation(rotation=-90.0) + i3.Translation((25.0, 0.0)),
    arm1_direction=i3.DIRECTION.NORTH,
)

layout.visualize(annotate=True)
../../_images/full-48.png

MZIWithCells

class picazzo3.filters.mzi.cell.MZIWithCells

An MZI which contains another cell in one or both arms.

Parameters:
arm2_contents_port_names: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3. and length == 2

port names for the contents ports in arm2. Default = (‘in’, ‘out’)

arm1_contents_port_names: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3. and length == 2

port names for the contents ports in arm1. Default = (‘in’, ‘out’)

arm2_contents: ( PCell ), *None allowed*

Cell to place in the NORTH arm. Use None when only a waveguide is required.

arm1_contents: ( PCell ), *None allowed*

Cell to place in the SOUTH arm. Use None when only a waveguide is required.

auto_transition: ( bool, bool_ or int )

if True, splitter and combiner are transitioned to the correct waveguide template

trace_template: PCell and _WaveguideTemplate
arm2_port_names: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3. and length == 2

port names for the north arm ports connected to splitter and combiner. Default = (‘in’, ‘out’)

arm1_port_names: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3. and length == 2

port names for the south arm ports connected to splitter and combiner. Default = (‘in’, ‘out’)

combiner_port_names: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3. and length == 2

port names for the combiner ports to the arms. Default = (‘in1’, ‘in2’)

splitter_port_names: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3. and length == 2

port names for the splitter ports to the arms. Default = (‘out1’, ‘out2’)

combiner: PCell

The combiner of the MZI

splitter: PCell

The splitter of the MZI

arm2: PCell and MZIArm

The North arm of the MZI

arm1: PCell and MZIArm

The South arm of the MZI

external_port_names: str

Map of the free instance terms/ports to the names of external terms/ports.Format is a dict {‘inst:term’ : ‘new_term_name’}.If a term/port is not listed, the format instname_portname will be used

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:
links: locked
child_cells: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mzi import MZIWithCells
from picazzo3.wg.dircoup import BendDirectionalCoupler
from picazzo3.filters.ring import RingRectNotchFilter

split = BendDirectionalCoupler(name="my_splitter_7")
split.Layout(bend_angle=30.0)

ring = RingRectNotchFilter(name="my_ring_8")

mzi = MZIWithCells(
    name="my_mzi_cells_1",
    splitter=split,
    combiner=split,
    arm1_contents=ring,
    arm1_contents_port_names=["in", "out"],
)
layout = mzi.Layout(extra_length=-50.0)

layout.visualize(annotate=True)
../../_images/full-49.png

Views

class Layout
Parameters:
arm2_contents_length: ( float and Real, number and number >= 0 ), *None allowed*

Specify manually the physical length of the content in the North arm. If None, it will be calculated by the arms from the distance between the ports.

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

Specify manually the physical length of the content in the South arm. If None, it will be calculated by the arms from the distance between the ports.

arm2_contents_transformation: GenericNoDistortTransform
arm1_contents_transformation: GenericNoDistortTransform
extra_length: float

if positive, the lower (south) arm is longer, if negative, the upper (north) arm

flatten_contents: ( bool, bool_ or int )

allows for enabling/disabling the flattening of the splitter and combiner, default is True

min_straight: float and Real, number and number >= 0

Minimum straight length between two bends

arm2_direction: List with value restriction, allowed values: [C2(0.000000, 1.000000), C2(0.000000, -1.000000)]

direction of routing (DIRECTION.NORTH or DIRECTION.SOUTH)

arm1_direction: List with value restriction, allowed values: [C2(0.000000, 1.000000), C2(0.000000, -1.000000)]

direction of routing (DIRECTION.NORTH or DIRECTION.SOUTH)

combiner_transformation: GenericNoDistortTransform
splitter_transformation: GenericNoDistortTransform
flyline_width: float and number > 0

line width of the flylines

flyline_layer: ( __Layer__ ), *None allowed*

layer to draw flylines of physically unconnected links

netlist_view: NetlistView

Netlist view in the same cell on which this Layout is based. Normally no need to manually override.

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
child_transformations: locked

MZIWaveguideArm

class picazzo3.filters.mzi.cell.MZIWaveguideArm

A Mach-Zehnder arm with a given length: routing upward at right-angle

Parameters:
trace_template: PCell and _WaveguideTemplate
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:
contents: PCell and _Trace, locked

Views

class Layout
Parameters:
extra_length: float and Real, number and number >= 0

Extra length that will be added in the arm

min_straight: float and Real, number and number >= 0

Minimum straight length between bends

routing_direction: List with value restriction, allowed values: [C2(0.000000, 1.000000), C2(0.000000, -1.000000)]

direction of routing (DIRECTION.NORTH or DIRECTION.SOUTH)

combiner_port: OpticalPort

Port interface of the combiner to which the output of this arm is connected

splitter_port: OpticalPort

Port interface of the splitter to which the input of this arm is connected

output_port: TracePort
trace_template_for_ports: _TraceTemplate.Layout

Trace template to be used for the ports.

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

reverse_individual_bends: list<( bool, bool_ or int )>

When set to True, it will generate the individual bends backwards. This has only effect when the bend algorithm is not symmetric. Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes.

rounding_algorithms:

Rounding algorithm for every individual bend. Can be circular, spline, … Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes.

bend_radii: list<number > 0>

Bend radius for every individual bend.

reverse_bends: ( bool, bool_ or int )

When set to True, it will generate the bends backwards. This has only effect when the bend algorithm is not symmetric.

remove_straight_angles: ( bool, bool_ or int )

Removes the waypoints with straight angles. Set to False if the algorithm uses waypoint-specific information.

core_layer: __Layer__

layer used to define the core of the waveguide

input_port: TracePort
control_shape_layer: __Layer__

layer on which the control shape is drawn

draw_control_shape: ( bool, bool_ or int )

draws the control shape on top of the waveguide

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
shape: locked
center_line_shape: locked

Automatically calculated shape of the center line of the trace

Examples

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.filters.mzi import MZIWaveguideArm
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

wg1_t = WireWaveguideTemplate(name="my_template1")
wg1_t.Layout(core_width=0.5)

mziarm = MZIWaveguideArm(name="my_mziarm_1")
layout = mziarm.Layout(
    extra_length=30.0,
    splitter_port=i3.OpticalPort(position=(0.0, 0.0), angle_deg=30.0, trace_template=wg1_t),
    combiner_port=i3.OpticalPort(position=(40.0, 5.0), angle_deg=120.0, trace_template=wg1_t),
)

layout.visualize(annotate=True)
../../_images/full-50.png

MZIContainerArm

class picazzo3.filters.mzi.cell.MZIContainerArm

A Mach-Zehnder arm which contains another cell and connects it to the splitter and combiner port

Parameters:
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.

auto_transition: ( bool, bool_ or int )

if True, Automatic transitions will be added to the contents if the trace templates are not matched

port_labels: List with type restriction, allowed types: <class ‘str’> and length == 2

Names of the two ports to be processed

external_port_names: str

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

contents: PCell

the contents of the container: the child cell

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:
waveguides: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

list of templates to apply to all ports

Views

class Layout
Parameters:
contents_length: float and Real, number and number >= 0

The physical length of the optical path of the content. If not set manually, it will default to the distance between the content ports used.

horizontal_contents_offset: float

Horizontal offset (from the center of the MZI Arm) of the transformed content

extra_length: float and Real, number and number >= 0

Extra length that will be added in the arm

min_straight: float and Real, number and number >= 0

Minimum straight length between bends

combiner_port: OpticalPort

Port interface of the combiner to which the output of this arm is connected

splitter_port: OpticalPort

Port interface of the splitter to which the input of this arm is connected

routes:

routes along which the waveguides will be generated

routing_direction: List with value restriction, allowed values: [C2(0.000000, 1.000000), C2(0.000000, -1.000000)]

direction of routing (DIRECTION.NORTH or DIRECTION.SOUTH)

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mzi import MZIContainerArm
from picazzo3.filters.ring import RingRect180DropFilter
import ipkiss3.all as i3

ring = RingRect180DropFilter(name="my_ring_in_the_mzi_arm1")
ring.Layout(bend_radius=10.0)

mziarm = MZIContainerArm(name="my_mzi_container_arm", contents=ring, port_labels=["in1", "out1"])

layout = mziarm.Layout(
    extra_length=30.0,
    splitter_port=i3.OpticalPort(position=(0.0, 0.0), angle_deg=30.0),
    combiner_port=i3.OpticalPort(position=(60.0, 5.0), angle_deg=120.0),
    contents_transformation=i3.Rotation(rotation=30.0),
)
layout.visualize(annotate=True)
../../_images/full-51.png
import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mzi import MZIContainerArm
from picazzo3.filters.ring import RingRect180DropFilter
import ipkiss3.all as i3

ring = RingRect180DropFilter(name="my_ring_in_the_mzi_arm2")
ring.Layout(bend_radius=10.0)

mziarm = MZIContainerArm(name="my_mzi_container_arm2", contents=ring, port_labels=["out2", "out1"])

layout = mziarm.Layout(
    extra_length=30.0,
    splitter_port=i3.OpticalPort(position=(0.0, 0.0), angle_deg=30.0),
    combiner_port=i3.OpticalPort(position=(80.0, 5.0), angle_deg=120.0),
    contents_transformation=i3.Rotation(rotation=30.0),
    routing_direction=i3.DIRECTION.SOUTH,
)
layout.visualize(annotate=True)
../../_images/full-52.png
import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.mzi import MZIContainerArm
from picazzo3.filters.ring import RingRect180DropFilter
import ipkiss3.all as i3

ring = RingRect180DropFilter(name="my_ring_in_the_mzi_arm3")
ring.Layout(bend_radius=10.0)

mziarm = MZIContainerArm(name="my_mzi_container_arm3", contents=ring, port_labels=["in1", "out1"])

layout = mziarm.Layout(
    extra_length=0.0,
    splitter_port=i3.OpticalPort(position=(0.0, 0.0), angle_deg=30.0),
    combiner_port=i3.OpticalPort(position=(30.0, 5.0), angle_deg=120.0),
    contents_transformation=i3.Rotation(rotation=30.0),
)
layout.visualize(annotate=True)
../../_images/full-53.png

Photonic Crystals

Generic Photonic Crystals

DodecPhCLayout

class picazzo3.phc.generic.cell.DodecPhCLayout

Generic Layouting Cell for photonic crystals with 12-sided holes on a Triangular lattice. The Layout of the cell is made up of a map, which is a multiline string representing the unit cells on a regular triangular lattice. The letters in the ‘map’ correspond to the diameters of the holes in the dictionary ‘hole_sizes’. The pitches can be defined as cartesian pitches using the property ‘pitches’, or using the property ‘lattice_pitches’ which specifies the lattice vector along the horizontal and the oblique axis, or using the property ‘pitch’, which just sets a uniform pitch along all lattice vectors.

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

The unique name of the pcell

Views

class Layout
Parameters:
purpose: PatternPurpose

Purpose of the layer on which the holes should be drawn.

process_wg: ProcessLayer

Process of the layer on which the holes should be drawn.

hole_sizes: dict

dictionary of the hole sizes of the Photonic Crystal. The value should be of the form {‘x’: 0.25, ‘y’: 0.26}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. If the property ‘cells’ is set manually, hole_sizes’ will be ignored.

pitch: float and Real, number and number >= 0

Lattice constant for a uniform triangular lattice. This property will be ignored if ‘lattice_pitches’ or ‘pitches’ are set manually

lattice_pitches: Coord2 and number >= 0

Lattice constants along the horizontal and the oblique direction. Choose identical values for a regular grid. If ‘pitches’ is manually set, this property will be ignored. If this property is set, the property ‘pitch’ will be ignored.

ports_coordinates:

list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])

zero_line_y: float

line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .

purpose_hfw: PatternPurpose

drawing purpose for underetching

process_hfw: ProcessLayer

process for underetching

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

Map of the photonic crystal. This property accepts a multi-line string. Every character in the string represents a unit cell of the photonic crystal, which can be found in the property cells

cells:

dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. The default value of this property is automatically calculated from the dictionary ‘hole_sizes’. Only assign to this property if you want to override this value. If you do this, the property ‘hole_sizes’ will be ignored.

pitches:

Cartesian (X, Y) pitches of the lattice. If this is specified, the properties ‘lattice_pitches’ and ‘pitch’ will be ignored

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

Examples

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3

TECH = i3.TECH
from picazzo3.phc.generic import DodecPhCLayout

my_phc_map = [
    "A A A A A A A A A A A",
    " B   A A A A A A   B",
    "A B   A A   A A   B A",
    " A B   A     A   B A",
    "A A B     B     B A A",
    " A A B   B B   B A A",
    "A A A B B A B B A A A",
    " A A A B A A B A A A",
    "A A A A A A A A A A A",
]  # a W-shaped cavity
cell = DodecPhCLayout(name="my_dodec_phc_layout1")
layout = cell.Layout(
    pitch=0.45,
    hole_sizes={"A": 0.290, "B": 0.190},  # two sizes
    map="\n".join(my_phc_map),
    zero_line_y=5,  # count lines from the top
    ports_coordinates=[
        ((-0.5, 0), 180, TECH.PCELLS.WG.DEFAULT),
        ((10.5, 0), 0, TECH.PCELLS.WG.DEFAULT),
    ],  # coordinates expressed in lattice pitches
)

layout.visualize(annotate=True)
../../_images/full-54.png

HexPhCLayout

class picazzo3.phc.generic.cell.HexPhCLayout

Generic Layouting Cell for photonic crystals with hexagon holes on a Triangular lattice. The Layout of the cell is made up of a map, which is a multiline string representing the unit cells on a regular triangular lattice. The letters in the ‘map’ correspond to the diameters of the holes in the dictionary ‘hole_sizes’. The pitches can be defined as cartesian pitches using the property ‘pitches’, or using the property ‘lattice_pitches’ which specifies the lattice vector along the horizontal and the oblique axis, or using the property ‘pitch’, which just sets a uniform pitch along all lattice vectors.

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

The unique name of the pcell

Views

class Layout
Parameters:
purpose: PatternPurpose

Purpose of the layer on which the holes should be drawn.

process_wg: ProcessLayer

Process of the layer on which the holes should be drawn.

hole_sizes: dict

dictionary of the hole sizes of the Photonic Crystal. The value should be of the form {‘x’: 0.25, ‘y’: 0.26}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. If the property ‘cells’ is set manually, hole_sizes’ will be ignored.

pitch: float and Real, number and number >= 0

Lattice constant for a uniform triangular lattice. This property will be ignored if ‘lattice_pitches’ or ‘pitches’ are set manually

lattice_pitches: Coord2 and number >= 0

Lattice constants along the horizontal and the oblique direction. Choose identical values for a regular grid. If ‘pitches’ is manually set, this property will be ignored. If this property is set, the property ‘pitch’ will be ignored.

ports_coordinates:

list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])

zero_line_y: float

line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .

purpose_hfw: PatternPurpose

drawing purpose for underetching

process_hfw: ProcessLayer

process for underetching

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

Map of the photonic crystal. This property accepts a multi-line string. Every character in the string represents a unit cell of the photonic crystal, which can be found in the property cells

cells:

dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. The default value of this property is automatically calculated from the dictionary ‘hole_sizes’. Only assign to this property if you want to override this value. If you do this, the property ‘hole_sizes’ will be ignored.

pitches:

Cartesian (X, Y) pitches of the lattice. If this is specified, the properties ‘lattice_pitches’ and ‘pitch’ will be ignored

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

Examples

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3

TECH = i3.TECH
from picazzo3.phc.generic import HexPhCLayout

my_phc_map = [
    "A A A A A A A A A A A",
    " B   A A A A A A   B",
    "A B   A A   A A   B A",
    " A B   A     A   B A",
    "A A B     B     B A A",
    " A A B   B B   B A A",
    "A A A B B A B B A A A",
    " A A A B A A B A A A",
    "A A A A A A A A A A A",
]  # a W-shaped cavity
cell = HexPhCLayout(name="my_hex_phc_layout1")
layout = cell.Layout(
    pitch=0.45,
    hole_sizes={"A": 0.290, "B": 0.190},  # two sizes
    map="\n".join(my_phc_map),
    zero_line_y=5,  # count lines from the top
    ports_coordinates=[
        ((-0.5, 0), 180, TECH.PCELLS.WG.DEFAULT),
        ((10.5, 0), 0, TECH.PCELLS.WG.DEFAULT),
    ],  # coordinates expressed in lattice pitches
)

layout.visualize(annotate=True)
../../_images/full-55.png

OctPhCLayout

class picazzo3.phc.generic.cell.OctPhCLayout

Generic Layouting cell for Photonic Crystals with octagon holes on a Rectangular lattice. The Layout of the cell is made up of a map, which is a multiline string representing the unit cells on a regular rectangular lattice. The letters in the ‘map’ correspond to the diameters of the holes in the dictionary ‘hole_sizes’.

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

The unique name of the pcell

Views

class Layout
Parameters:
process_wg: ProcessLayer

Process of the layer on which the holes should be drawn.

hole_sizes: dict

dictionary of the hole sizes of the Photonic Crystal. The value should be of the form {‘x’: 0.25, ‘y’: 0.26}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. If the property ‘cells’ is set manually, hole_sizes’ will be ignored.

purpose: PatternPurpose

Purpose of the layer on which the holes should be drawn.

pitch: float and Real, number and number >= 0

Lattice constant for a uniform square lattice. This property will be ignored if the property ‘pitches’ is set manually

ports_coordinates:

list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])

zero_line_y: float

line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .

purpose_hfw: PatternPurpose

drawing purpose for underetching

process_hfw: ProcessLayer

process for underetching

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

Map of the photonic crystal. This property accepts a multi-line string. Every character in the string represents a unit cell of the photonic crystal, which can be found in the property cells

cells:

dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. The default value of this property is automatically calculated from the dictionary ‘hole_sizes’. Only assign to this property if you want to override this value. If you do this, the property ‘hole_sizes’ will be ignored.

pitches: Coord2 and number >= 0

X and Y pitch of the photonic crystal

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

Examples

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3

TECH = i3.TECH
from picazzo3.phc.generic import OctPhCLayout

my_phc_map = ["AAAAAAAA", "AAAAAAAA", "AA AA AA", "BBBAABBB", "AAAAAAAA"]
cell = OctPhCLayout(name="my_oct_phc_layout1")
layout = cell.Layout(
    pitch=0.45,
    hole_sizes={"A": 0.290, "B": 0.190},  # two sizes
    map="\n".join(my_phc_map),
    zero_line_y=5,  # count lines from the top
    ports_coordinates=[
        ((-0.5, 0), 180, TECH.PCELLS.WG.DEFAULT),
        ((10.5, 0), 0, TECH.PCELLS.WG.DEFAULT),
    ],  # coordinates expressed in lattice pitches
)

layout.visualize(annotate=True)
../../_images/full-56.png

SquarePhCLayout

class picazzo3.phc.generic.cell.SquarePhCLayout

Generic Layouting cell for Photonic Crystals with square holes on a Rectangular lattice. The Layout of the cell is made up of a map, which is a multiline string representing the unit cells on a regular rectangular lattice. The letters in the ‘map’ correspond to the diameters of the holes in the dictionary ‘hole_sizes’.

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

The unique name of the pcell

Views

class Layout
Parameters:
process_wg: ProcessLayer

Process of the layer on which the holes should be drawn.

hole_sizes: dict

dictionary of the hole sizes of the Photonic Crystal. The value should be of the form {‘x’: 0.25, ‘y’: 0.26}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. If the property ‘cells’ is set manually, hole_sizes’ will be ignored.

purpose: PatternPurpose

Purpose of the layer on which the holes should be drawn.

pitch: float and Real, number and number >= 0

Lattice constant for a uniform square lattice. This property will be ignored if the property ‘pitches’ is set manually

ports_coordinates:

list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])

zero_line_y: float

line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .

purpose_hfw: PatternPurpose

drawing purpose for underetching

process_hfw: ProcessLayer

process for underetching

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

Map of the photonic crystal. This property accepts a multi-line string. Every character in the string represents a unit cell of the photonic crystal, which can be found in the property cells

cells:

dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. The default value of this property is automatically calculated from the dictionary ‘hole_sizes’. Only assign to this property if you want to override this value. If you do this, the property ‘hole_sizes’ will be ignored.

pitches: Coord2 and number >= 0

X and Y pitch of the photonic crystal

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

Examples

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3

TECH = i3.TECH
from picazzo3.phc.generic import SquarePhCLayout

my_phc_map = ["AAAAAAAA", "AAAAAAAA", "AA AA AA", "BBBAABBB", "AAAAAAAA"]
cell = SquarePhCLayout(name="my_square_phc_layout1")
layout = cell.Layout(
    pitch=0.45,
    hole_sizes={"A": 0.290, "B": 0.190},  # two sizes
    map="\n".join(my_phc_map),
    zero_line_y=5,  # count lines from the top
    ports_coordinates=[
        ((-0.5, 0), 180, TECH.PCELLS.WG.DEFAULT),
        ((10.5, 0), 0, TECH.PCELLS.WG.DEFAULT),
    ],  # coordinates expressed in lattice pitches
)

layout.visualize(annotate=True)
../../_images/full-57.png

TriangularPhCLayout

class picazzo3.phc.generic.cell.TriangularPhCLayout

Generic Photonic Crystal Layouting Cell on a Triangular lattice. The Layout of the cell is made up of a map, which is a multiline string representing the unit cells on a regular triangular lattice. The letters in the ‘map’ correspond to unit cells in the dictionary ‘cells’. The pitches can be defined as cartesian pitches using the property ‘pitches’, or using the property ‘lattice_pitches’ which specifies the lattice vector along the horizontal and the oblique axis, or using the property ‘pitch’, which just sets a uniform pitch along all lattice vectors.

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

The unique name of the pcell

Views

class Layout
Parameters:
pitch: float and Real, number and number >= 0

Lattice constant for a uniform triangular lattice. This property will be ignored if ‘lattice_pitches’ or ‘pitches’ are set manually

lattice_pitches: Coord2 and number >= 0

Lattice constants along the horizontal and the oblique direction. Choose identical values for a regular grid. If ‘pitches’ is manually set, this property will be ignored. If this property is set, the property ‘pitch’ will be ignored.

ports_coordinates:

list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])

zero_line_y: float

line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .

purpose_hfw: PatternPurpose

drawing purpose for underetching

process_hfw: ProcessLayer

process for underetching

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

Map of the photonic crystal. This property accepts a multi-line string. Every character in the string represents a unit cell of the photonic crystal, which can be found in the property cells

cells: dict

dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map

pitches:

Cartesian (X, Y) pitches of the lattice. If this is specified, the properties ‘lattice_pitches’ and ‘pitch’ will be ignored

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

RectangularPhCLayout

class picazzo3.phc.generic.cell.RectangularPhCLayout

Generic Photonic Crystal Layouting Cell on a Rectangular lattice. The Layout of the cell is made up of a map, which is a multiline string representing the unit cells on a regular rectangular lattice. The letters in the ‘map’ correspond to unit cells in the dictionary ‘cells’.

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

The unique name of the pcell

Views

class Layout
Parameters:
pitch: float and Real, number and number >= 0

Lattice constant for a uniform square lattice. This property will be ignored if the property ‘pitches’ is set manually

ports_coordinates:

list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])

zero_line_y: float

line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .

purpose_hfw: PatternPurpose

drawing purpose for underetching

process_hfw: ProcessLayer

process for underetching

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

Map of the photonic crystal. This property accepts a multi-line string. Every character in the string represents a unit cell of the photonic crystal, which can be found in the property cells

cells: dict

dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map

pitches: Coord2 and number >= 0

X and Y pitch of the photonic crystal

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

Photonic Crystal HeteroWaveguide Layouts

W1HeteroCavity

class picazzo3.phc.hetero.cell.W1HeteroCavity

Photonic Crystal Waveguide HeteroCavity consisting of a W1 waveguide with adjusted pitch in the cavity. The unit cells for the waveguide and the cavity can be chosen seperately, as well as the different lattice pitches.

Parameters:
n_o_cladding_layers: int and number > 0
cavity: PCell

The cavity child cell (autogenerated)

mirror: PCell

The mirror child cell (autogenerated)

cavity_defect_unit_cell: PCell

The Photonic Crystal unit cell of the cavity lattice. By default it is empty.

mirror_defect_unit_cell: PCell

The Photonic Crystal unit cell of the mirror waveguide. By default it is empty.

cavity_unit_cell: PCell

The Photonic Crystal unit cell of the cavity lattice

mirror_unit_cell: PCell

The Photonic Crystal unit cell of the mirror lattice

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

The unique name of the pcell

Views

class Layout
Parameters:
mirror_pos2:
cavity_pos: Coord2
mirror_pos: Coord2
purpose_hfw: PatternPurpose
process_hfw: ProcessLayer
vertical_cavity_pitch: float and number > 0

off-axis pitch of the cavity lattice: default = matched to mirror)

vertical_mirror_pitch: float and number > 0

off-axis pitch of the mirror lattice: default = same as mirror_pitch)

cavity_pitch: float and number > 0
mirror_pitch: float and number > 0
n_o_cavity_periods: int and number > 0
n_o_mirror_periods: int and number > 0
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

Examples

"""We combine three photonic crystal lattices into a heterocavity"""
import si_fab.all as pdk  # noqa: F401
from picazzo3.phc.generic import DodecHole

mirror_unit_cell = DodecHole(name="Hb1")
mirror_unit_cell.Layout(radius=0.13)
cavity_unit_cell = DodecHole(name="Hb2")
cavity_unit_cell.Layout(radius=0.14)

from picazzo3.phc.hetero import W1HeteroCavity

cell = W1HeteroCavity(
    name="my_heterophc_cavity",
    mirror_unit_cell=mirror_unit_cell,
    cavity_unit_cell=cavity_unit_cell,
    n_o_cladding_layers=6,
)
layout = cell.Layout(mirror_pitch=0.43, cavity_pitch=0.46, n_o_mirror_periods=10, n_o_cavity_periods=6)

layout.visualize(annotate=True)
../../_images/full-58.png

W1HeteroCavity1Mirror

class picazzo3.phc.hetero.cell.W1HeteroCavity1Mirror

this partial component class forms a Cavity with a single mirror. It requires a second mirror to form a complete cavity

Parameters:
n_o_cladding_layers: int and number > 0
cavity: PCell

The cavity child cell (autogenerated)

mirror: PCell

The mirror child cell (autogenerated)

cavity_defect_unit_cell: PCell

The Photonic Crystal unit cell of the cavity lattice. By default it is empty.

mirror_defect_unit_cell: PCell

The Photonic Crystal unit cell of the mirror waveguide. By default it is empty.

cavity_unit_cell: PCell

The Photonic Crystal unit cell of the cavity lattice

mirror_unit_cell: PCell

The Photonic Crystal unit cell of the mirror lattice

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

The unique name of the pcell

Views

class Layout
Parameters:
cavity_pos: Coord2
mirror_pos: Coord2
purpose_hfw: PatternPurpose
process_hfw: ProcessLayer
vertical_cavity_pitch: float and number > 0

off-axis pitch of the cavity lattice: default = matched to mirror)

vertical_mirror_pitch: float and number > 0

off-axis pitch of the mirror lattice: default = same as mirror_pitch)

cavity_pitch: float and number > 0
mirror_pitch: float and number > 0
n_o_cavity_periods: int and number > 0
n_o_mirror_periods: int and number > 0
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

W1HeteroCavityMulti

class picazzo3.phc.hetero.cell.W1HeteroCavityMulti

Photonic Crystal W1 Waveguide with multiple HeteroCavities with adjusted pitch in the cavity. The unit cells for the waveguide and the cavity can be chosen separately, as well as the different lattice pitches.

Parameters:
n_o_cladding_layers: int and number > 0
cavity: PCell

The cavity child cell (autogenerated)

mirror: PCell

The mirror child cell (autogenerated)

cavity_defect_unit_cell: PCell

The Photonic Crystal unit cell of the cavity lattice. By default it is empty.

mirror_defect_unit_cell: PCell

The Photonic Crystal unit cell of the mirror waveguide. By default it is empty.

cavity_unit_cell: PCell

The Photonic Crystal unit cell of the cavity lattice

mirror_unit_cell: PCell

The Photonic Crystal unit cell of the mirror lattice

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

The unique name of the pcell

Views

class Layout
Parameters:
cavity_period: float and number > 0

repetition period of the cavity. By default it is calculated automatically.

n_o_cavities: int and number > 0

number of cavities in series

mirror_pos2:
cavity_pos: Coord2
mirror_pos: Coord2
purpose_hfw: PatternPurpose
process_hfw: ProcessLayer
vertical_cavity_pitch: float and number > 0

off-axis pitch of the cavity lattice: default = matched to mirror)

vertical_mirror_pitch: float and number > 0

off-axis pitch of the mirror lattice: default = same as mirror_pitch)

cavity_pitch: float and number > 0
mirror_pitch: float and number > 0
n_o_cavity_periods: int and number > 0
n_o_mirror_periods: int and number > 0
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

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.phc.generic import DodecHole

mirror_unit_cell = DodecHole(name="Hc1")
mirror_unit_cell.Layout(radius=0.13)
cavity_unit_cell = DodecHole(name="Hc2")
cavity_unit_cell.Layout(radius=0.14)

# If we combine two hetero-interfaces, we get a Cavity.
from picazzo3.phc.hetero import W1HeteroCavityMulti

cell = W1HeteroCavityMulti(
    name="my_multihetero_cavity", mirror_unit_cell=mirror_unit_cell, cavity_unit_cell=cavity_unit_cell
)
layout = cell.Layout(
    n_o_cladding_layers=6,
    mirror_pitch=0.43,
    cavity_pitch=0.46,
    n_o_mirror_periods=10,
    n_o_cavity_periods=6,
    n_o_cavities=3,
)

layout.visualize(annotate=True)
../../_images/full-59.png

Photonic Crystal W1 Waveguides and Cavities

GenericW1Waveguide

class picazzo3.phc.w1.cell.GenericW1Waveguide

A generic W1 Photonic Crystal waveguide. The unit cells can be specified as PCells, going outward as from the center line.

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

List of unit cells: center row to outside rows (symmetric)

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

The unique name of the pcell

Views

class Layout
Parameters:
n_o_periods: int and number > 0

number of lattice periods in the propagation direction of the W1 waveguide

start_even: ( bool, bool_ or int )

If true, start the crystal on an even row, if false, on an odd row.

port_offset: float

Horizontal offset of the port width respect to the first and last column of the W1 waveguide.

port_width: ( float and number > 0 ), *None allowed*

width of the waveguide ports of the photonic crystal waveguide. If none, a width of sqrt(3)*pitch is taken.

port_row: ( int and number >= 0 ), *None allowed*

Row of the photonic crystal waveguide where the input/output ports are located. If none, it will be the center.

pitch: float and Real, number and number >= 0

Lattice constant for a uniform triangular lattice. This property will be ignored if ‘lattice_pitches’ or ‘pitches’ are set manually

lattice_pitches: Coord2 and number >= 0

Lattice constants along the horizontal and the oblique direction. Choose identical values for a regular grid. If ‘pitches’ is manually set, this property will be ignored. If this property is set, the property ‘pitch’ will be ignored.

ports_coordinates:

list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])

zero_line_y: float

line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .

purpose_hfw: PatternPurpose

drawing purpose for underetching

process_hfw: ProcessLayer

process for underetching

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

Map of the photonic crystal. This property accepts a multi-line string. Every character in the string represents a unit cell of the photonic crystal, which can be found in the property cells

cells: dict

dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map

pitches:

Cartesian (X, Y) pitches of the lattice. If this is specified, the properties ‘lattice_pitches’ and ‘pitch’ will be ignored

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

Examples

"""We will generate a W1 with a lattice pitch which is slightly
different along the horizontal and oblique direction
"""

import si_fab.all as pdk  # noqa: F401
from picazzo3.phc.generic import DodecHole
from picazzo3.phc.w1 import GenericW1Waveguide

radii = [0.11, 0.11, 0.12, 0.12]  # inner holes are smaller than outer holes
centers = [(0.10, 0), (0, 0), (0, 0), (0, 0)]  # the inner rows are slightly displaced
unit_cells = [DodecHole().Layout(center=c, radius=r, angle=0) for (r, c) in zip(radii, centers)]

print(unit_cells)
# add them together, with an empty cell in the center
unit_cells = unit_cells[::-1] + [None] + unit_cells

cell = GenericW1Waveguide(name="my_generic_phc_waveguide1", unit_cells=unit_cells)
layout = cell.Layout(
    unit_cells=unit_cells,
    lattice_pitches=(0.43, 0.45),
    n_o_periods=22,
)

layout.visualize(annotate=True)
../../_images/full-60.png

W1Waveguide

class picazzo3.phc.w1.cell.W1Waveguide

A Uniform Photonic Crystal W1 waveguide consisting of 12-sided holes. You can specify the diameter of the lattice and the diameter of the defect holes in the core of the waveguide.

It is also possible to override the parameters of DodecPhCLayout, which allows you to customize the PCell in more detail.

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

The unique name of the pcell

Views

class Layout
Parameters:
n_o_periods: int and number > 0

Number of lattice periods in the propagation direction.

n_o_cladding_layers: int and number > 0

Number of cladding layers north and south.

defect_diameter: float and Real, number and number >= 0

Diameter of the defect holes. If zero, no holes are drawn.

diameter: float and number > 0

diameter of the photonic crystal lattice holes

purpose: PatternPurpose

Purpose of the layer on which the holes should be drawn.

process_wg: ProcessLayer

Process of the layer on which the holes should be drawn.

hole_sizes: dict

dictionary of the hole sizes of the Photonic Crystal. The value should be of the form {‘x’: 0.25, ‘y’: 0.26}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. If the property ‘cells’ is set manually, hole_sizes’ will be ignored.

pitch: float and Real, number and number >= 0

Lattice constant for a uniform triangular lattice. This property will be ignored if ‘lattice_pitches’ or ‘pitches’ are set manually

lattice_pitches: Coord2 and number >= 0

Lattice constants along the horizontal and the oblique direction. Choose identical values for a regular grid. If ‘pitches’ is manually set, this property will be ignored. If this property is set, the property ‘pitch’ will be ignored.

ports_coordinates:

list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])

zero_line_y: float

line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .

purpose_hfw: PatternPurpose

drawing purpose for underetching

process_hfw: ProcessLayer

process for underetching

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

Map of the photonic crystal. This property accepts a multi-line string. Every character in the string represents a unit cell of the photonic crystal, which can be found in the property cells

cells:

dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. The default value of this property is automatically calculated from the dictionary ‘hole_sizes’. Only assign to this property if you want to override this value. If you do this, the property ‘hole_sizes’ will be ignored.

pitches:

Cartesian (X, Y) pitches of the lattice. If this is specified, the properties ‘lattice_pitches’ and ‘pitch’ will be ignored

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

Examples

"""A W1 waveguide with a missing row of holes"""
import si_fab.all as pdk  # noqa: F401
from picazzo3.phc.w1 import W1Waveguide

cell = W1Waveguide(name="my_w1")
layout = cell.Layout(
    pitch=0.43,  # lattice period of the triangular lattice
    diameter=0.28,  # hole diameter of the lattice
    n_o_cladding_layers=5,  # number of rows on each side of the defect
    n_o_periods=20,  # length of the lattice
)

layout.visualize(annotate=True)
../../_images/full-61.png
"""A W1 waveguide with a center row of holes of different size"""
import si_fab.all as pdk  # noqa: F401
from picazzo3.phc.w1 import W1Waveguide

cell = W1Waveguide(name="my_w1_with_defect")
layout = cell.Layout(
    pitch=0.43,  # lattice period of the triangular lattice
    diameter=0.28,  # hole diameter of the lattice
    defect_diameter=0.16,  # defect hole diameter
    n_o_cladding_layers=6,  # number of rows on each side of the defect
    n_o_periods=21,  # length of the lattice
)

layout.visualize(annotate=True)
../../_images/full-62.png

W1WaveguideWithInlineCavity

class picazzo3.phc.w1.cell.W1WaveguideWithInlineCavity

A Uniform Photonic Crystal W1 waveguide with an inline cavity, consisting of 12-sided holes. You can specify the diameter of the lattice and the diameter of the defect holes in the core of the waveguide. The property ‘cavity_hole_diameters’ specifies the holes of the cavity from east to west.

It is also possible to override the parameters of DodecPhCLayout, which allows you to customize the PCell in more detail.

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

The unique name of the pcell

Views

class Layout
Parameters:
cavity_hole_diameters: list<number >= 0>

list of hole diameters in the cavity, including mirrors

n_o_periods: int and number > 0

Number of lattice periods in the propagation direction.

n_o_cladding_layers: int and number > 0

Number of cladding layers north and south.

defect_diameter: float and Real, number and number >= 0

Diameter of the defect holes. If zero, no holes are drawn.

diameter: float and number > 0

diameter of the photonic crystal lattice holes

purpose: PatternPurpose

Purpose of the layer on which the holes should be drawn.

process_wg: ProcessLayer

Process of the layer on which the holes should be drawn.

hole_sizes: dict

dictionary of the hole sizes of the Photonic Crystal. The value should be of the form {‘x’: 0.25, ‘y’: 0.26}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. If the property ‘cells’ is set manually, hole_sizes’ will be ignored.

pitch: float and Real, number and number >= 0

Lattice constant for a uniform triangular lattice. This property will be ignored if ‘lattice_pitches’ or ‘pitches’ are set manually

lattice_pitches: Coord2 and number >= 0

Lattice constants along the horizontal and the oblique direction. Choose identical values for a regular grid. If ‘pitches’ is manually set, this property will be ignored. If this property is set, the property ‘pitch’ will be ignored.

ports_coordinates:

list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])

zero_line_y: float

line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .

purpose_hfw: PatternPurpose

drawing purpose for underetching

process_hfw: ProcessLayer

process for underetching

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

Map of the photonic crystal. This property accepts a multi-line string. Every character in the string represents a unit cell of the photonic crystal, which can be found in the property cells

cells:

dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. The default value of this property is automatically calculated from the dictionary ‘hole_sizes’. Only assign to this property if you want to override this value. If you do this, the property ‘hole_sizes’ will be ignored.

pitches:

Cartesian (X, Y) pitches of the lattice. If this is specified, the properties ‘lattice_pitches’ and ‘pitch’ will be ignored

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

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.phc.w1 import W1WaveguideWithInlineCavity

cell = W1WaveguideWithInlineCavity(name="my_w1_with_cavity")
layout = cell.Layout(
    pitch=0.43,  # lattice period of the triangular lattice
    diameter=0.28,  # hole diameter of the lattice
    n_o_cladding_layers=5,  # number of rows on each side of the defect
    n_o_periods=20,  # length of the lattice
    cavity_hole_diameters=[0.14, 0.16, 0.18, 0.21, 0.0, 0.21, 0.18, 0.16, 0.14],
)

layout.visualize(annotate=True)
../../_images/full-63.png

W1WaveguideWithAllpass

class picazzo3.phc.w1.cell.W1WaveguideWithAllpass

A Uniform Photonic Crystal W1 waveguide with a lateral cavity (e.g. L3), consisting of 12-sided holes. You can specify the diameter of the lattice and the diameter of the defect holes in the core of the waveguide. The property ‘cavity_hole_diameters’ specifies the holes of the cavity from east to west.

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

The unique name of the pcell

Views

class Layout
Parameters:
cavity_offset: int and number > 0

side row on which the cavity should be located

cavity_length: int and number > 0

number of holes the cavity should be long

n_o_periods: int and number > 0

Number of lattice periods in the propagation direction.

n_o_cladding_layers: int and number > 0

Number of cladding layers north and south.

defect_diameter: float and Real, number and number >= 0

Diameter of the defect holes. If zero, no holes are drawn.

diameter: float and number > 0

diameter of the photonic crystal lattice holes

purpose: PatternPurpose

Purpose of the layer on which the holes should be drawn.

process_wg: ProcessLayer

Process of the layer on which the holes should be drawn.

hole_sizes: dict

dictionary of the hole sizes of the Photonic Crystal. The value should be of the form {‘x’: 0.25, ‘y’: 0.26}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. If the property ‘cells’ is set manually, hole_sizes’ will be ignored.

pitch: float and Real, number and number >= 0

Lattice constant for a uniform triangular lattice. This property will be ignored if ‘lattice_pitches’ or ‘pitches’ are set manually

lattice_pitches: Coord2 and number >= 0

Lattice constants along the horizontal and the oblique direction. Choose identical values for a regular grid. If ‘pitches’ is manually set, this property will be ignored. If this property is set, the property ‘pitch’ will be ignored.

ports_coordinates:

list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])

zero_line_y: float

line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .

purpose_hfw: PatternPurpose

drawing purpose for underetching

process_hfw: ProcessLayer

process for underetching

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

Map of the photonic crystal. This property accepts a multi-line string. Every character in the string represents a unit cell of the photonic crystal, which can be found in the property cells

cells:

dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. The default value of this property is automatically calculated from the dictionary ‘hole_sizes’. Only assign to this property if you want to override this value. If you do this, the property ‘hole_sizes’ will be ignored.

pitches:

Cartesian (X, Y) pitches of the lattice. If this is specified, the properties ‘lattice_pitches’ and ‘pitch’ will be ignored

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

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.phc.w1 import W1WaveguideWithAllpass

cell = W1WaveguideWithAllpass(name="my_w1_with_L_cavity")
layout = cell.Layout(
    pitch=0.43,  # lattice period of the triangular lattice
    diameter=0.28,  # hole diameter of the lattice
    n_o_cladding_layers=5,  # number of rows on each side of the defect
    n_o_periods=20,  # length of the lattice
    cavity_length=2,  # number of holes in the cavity
    cavity_offset=4,  # line from the center of the cavity
)

layout.visualize(annotate=True)
../../_images/full-64.png

Traces

Rib Waveguides

RibWaveguideTemplate

class picazzo3.traces.rib_wg.RibWaveguideTemplate

This waveguide is a (shallow etched) rib waveguide, with no specific bound in the slab.

                 core_width
               <----------->
               cladding_width
<------------------------------------------>
                ___________
_______________|           |________________

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

The unique name of the pcell

Views

class Layout
Parameters:
cladding_width: float and number > 0

total width of the waveguide with cladding

cladding_purpose: PatternPurpose

drawing purpose layer for the cladding

cladding_process: ProcessLayer

process for the waveguide cladding, defaults to the core process

core_purpose: PatternPurpose

drawing purpose for the waveguide core

core_process: ProcessLayer

process of the rib

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

core_width: float and number > 0

width of the rib

core_layer: __Layer__

layer used to define the core of the waveguide

pin_shape: Shape

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout

Trace template to be used for the ports. Default = this template

width: float and Real, number and number >= 0
control_shape_layer: __Layer__

layer on which the control shape is drawn

draw_control_shape: ( bool, bool_ or int )

draws the control shape on top of the waveguide

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

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

Examples

"""This example shows how you use the template to directly create a rib waveguide PCell
and its layout."""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.traces.rib_wg.trace import RibWaveguideTemplate

wg_t = RibWaveguideTemplate(name="my_rib_wg_template1")
wg_t.Layout(core_width=0.47, cladding_width=2 * 3.0 + 0.47, core_process=i3.TECH.PROCESS.RWG)

wg = wg_t(name="my_rib_waveguide1")
layout = wg.Layout(shape=[(0.0, 0.0), (10.0, 0.0)])

layout.visualize(annotate=True)
../../_images/full-65.png

RibWireWaveguideTemplate

class picazzo3.traces.rib_wg.RibWireWaveguideTemplate

This waveguide is a (shallow etched) rib waveguide, loaded on top of a (finite) strip wire.

                 core_width
               <----------->
                 strip_width
          <--------------------->
               cladding_width
<------------------------------------------>
                ___________
           ____|           |____
          |                     |
__________|_____________________|___________
Parameters:
name: String that contains only ISO/IEC 8859-1 (extended ASCII py3) or pure ASCII (py2) characters

The unique name of the pcell

Views

class Layout
Parameters:
strip_cladding_purpose: PatternPurpose

drawing purpose for the strip wire cladding

strip_purpose: PatternPurpose

drawing purpose for the strip wire

strip_process: ProcessLayer

process for the strip wire

strip_width: float and number > 0

width of the deep-etched strip wire

cladding_width: float and number > 0

total width of the waveguide with cladding

cladding_purpose: PatternPurpose

drawing purpose layer for the cladding

cladding_process: ProcessLayer

process for the waveguide cladding, defaults to the core process

core_purpose: PatternPurpose

drawing purpose for the waveguide core

core_process: ProcessLayer

process for the shallow-etched core

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

core_width: float and number > 0

width of the shallow-etched core

core_layer: __Layer__

layer used to define the core of the waveguide

pin_shape: Shape

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout

Trace template to be used for the ports. Default = this template

width: float and Real, number and number >= 0
control_shape_layer: __Layer__

layer on which the control shape is drawn

draw_control_shape: ( bool, bool_ or int )

draws the control shape on top of the waveguide

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

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

Examples

"""This example shows how you use the template to directly create a rib-wire waveguide PCell
and its layout."""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.traces.rib_wg.trace import RibWireWaveguideTemplate

wg_t = RibWireWaveguideTemplate(name="my_ribwire_wg_template1")
wg_t.Layout(
    core_width=0.4,
    strip_width=1.2,
    cladding_width=2 * 4.0 + 1.2,
    core_process=i3.TECH.PROCESS.RWG,
    strip_process=i3.TECH.PROCESS.WG,
)

wg = wg_t(name="my_ribwire_waveguide1")
layout = wg.Layout(shape=[(0.0, 0.0), (10.0, 0.0)])

layout.visualize(annotate=True)
../../_images/full-66.png

Slot Waveguides

SlotWaveguideTemplate

class picazzo3.traces.slot_wg.SlotWaveguideTemplate

This waveguide is a strip-like waveguide with a slot in the middle.

                ____   ____
               |    | |    |
               |    | |    |
_______________|____|_|____|_________________

The core width is defined as the total width covering both slots. (i.e., slot_width should be < core_width).

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

The unique name of the pcell

Views

class Layout
Parameters:
slot_purpose: PatternPurpose

drawing purpose for the slot

slot_process: ProcessLayer

process for the slot

slot_width: float and number > 0

width of the slot

cladding_width: float and number > 0

total width of the waveguide with cladding

cladding_purpose: PatternPurpose

drawing purpose layer for the cladding

cladding_process: ProcessLayer

process for the waveguide cladding, defaults to the core process

core_purpose: PatternPurpose

drawing purpose for the waveguide ribs

core_process: ProcessLayer

process for the waveguide ribs

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

core_width: float and number > 0

width of the waveguide core

core_layer: __Layer__

layer used to define the core of the waveguide

pin_shape: Shape

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout

Trace template to be used for the ports. Default = this template

width: float and Real, number and number >= 0
control_shape_layer: __Layer__

layer on which the control shape is drawn

draw_control_shape: ( bool, bool_ or int )

draws the control shape on top of the waveguide

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

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

Examples

"""This example shows how you use the template to directly create a slot waveguide PCell
and its layout."""
import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.traces.slot_wg.trace import SlotWaveguideTemplate

wg_t = SlotWaveguideTemplate(name="my_slot_wg_template1")
wg_t.Layout(
    core_width=0.5, slot_width=0.12, cladding_width=2 * 3.0 + 0.5, slot_purpose=i3.TECH.PURPOSE.DRWSUB
)

wg = wg_t(name="my_slot_waveguide1")
layout = wg.Layout(shape=[(0.0, 0.0), (10.0, 0.0)])

layout.visualize(annotate=True)
../../_images/full-67.png

DoubleSlotWaveguideTemplate

class picazzo3.traces.slot_wg.DoubleSlotWaveguideTemplate

This waveguide is a strip-like waveguide with two slots in the middle

                ___   __   ___
               |   | |  | |   |
               |   | |  | |   |
_______________|___|_|  |_|___|_________________
Parameters:
name: String that contains only ISO/IEC 8859-1 (extended ASCII py3) or pure ASCII (py2) characters

The unique name of the pcell

Views

class Layout
Parameters:
center_core_width: float and number > 0
slot_purpose: PatternPurpose

drawing purpose for the slot

slot_process: ProcessLayer

process for the slot

slot_width: float and number > 0

width of the slot

cladding_width: float and number > 0

total width of the waveguide with cladding

cladding_purpose: PatternPurpose

drawing purpose layer for the cladding

cladding_process: ProcessLayer

process for the waveguide cladding, defaults to the core process

core_purpose: PatternPurpose

drawing purpose for the waveguide ribs

core_process: ProcessLayer

process for the waveguide ribs

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

core_width: float and number > 0
core_layer: __Layer__

layer used to define the core of the waveguide

pin_shape: Shape

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout

Trace template to be used for the ports. Default = this template

width: float and Real, number and number >= 0
control_shape_layer: __Layer__

layer on which the control shape is drawn

draw_control_shape: ( bool, bool_ or int )

draws the control shape on top of the waveguide

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

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

Examples

"""This example shows how you use the template to directly create a slot waveguide PCell
and its layout."""
import si_fab.all as pdk  # noqa: F401
from picazzo3.traces.slot_wg.trace import DoubleSlotWaveguideTemplate

wg_t = DoubleSlotWaveguideTemplate(name="my_doubleslot_wg_template1")
wg_t.Layout(core_width=0.6, slot_width=0.12, center_core_width=0.12, cladding_width=2 * 3.0 + 0.6)

wg = wg_t(name="my_doubleslot_waveguide1")
layout = wg.Layout(shape=[(0.0, 0.0), (10.0, 0.0)])

layout.visualize(annotate=True)
../../_images/full-68.png

Socket Waveguides

SocketWaveguideTemplate

class picazzo3.traces.socket_wg.SocketWaveguideTemplate

Socket-style waveguide template: deep etched rib waveguide

                ___________
               |           |
_______________|           |________________
____________________________________________
Parameters:
name: String that contains only ISO/IEC 8859-1 (extended ASCII py3) or pure ASCII (py2) characters

The unique name of the pcell

Views

class Layout
Parameters:
cladding_width: float and number > 0

total width of the waveguide with cladding

cladding_purpose: PatternPurpose

drawing purpose layer for the cladding

cladding_process: ProcessLayer

process for the waveguide cladding, defaults to the core process

core_purpose: PatternPurpose

drawing purpose for the waveguide core

core_process: ProcessLayer

process for the rib

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

core_width: float and number > 0

width of the rib

core_layer: __Layer__

layer used to define the core of the waveguide

pin_shape: Shape

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout

Trace template to be used for the ports. Default = this template

width: float and Real, number and number >= 0
control_shape_layer: __Layer__

layer on which the control shape is drawn

draw_control_shape: ( bool, bool_ or int )

draws the control shape on top of the waveguide

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

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

Examples

"""This example shows how you use the template to directly create a socket waveguide PCell
and its layout."""
import si_fab.all as pdk  # noqa: F401
from picazzo3.traces.socket_wg.trace import SocketWaveguideTemplate

wg_t = SocketWaveguideTemplate(name="my_socket_wg_template1")
wg_t.Layout(core_width=0.5, cladding_width=2 * 3.0 + 0.5)

wg = wg_t(name="my_socket_waveguide1")
layout = wg.Layout(shape=[(0.0, 0.0), (10.0, 0.0)])

layout.visualize(annotate=True)
../../_images/full-69.png

SlottedSocketWaveguideTemplate

class picazzo3.traces.socket_wg.SlottedSocketWaveguideTemplate

Socket waveguide with a deep etched slot

                ____   ____
               |    | |    |
_______________|    | |    |________________
____________________|_|_____________________
Parameters:
name: String that contains only ISO/IEC 8859-1 (extended ASCII py3) or pure ASCII (py2) characters

The unique name of the pcell

Views

class Layout
Parameters:
slot_purpose: PatternPurpose

drawing purpose for the slot

slot_process: ProcessLayer

process for the slot

slot_width: float and number > 0

width of the slot

cladding_width: float and number > 0

total width of the waveguide with cladding

cladding_purpose: PatternPurpose

drawing purpose layer for the cladding

cladding_process: ProcessLayer

process for the waveguide cladding, defaults to the core process

core_purpose: PatternPurpose

drawing purpose for the waveguide ribs

core_process: ProcessLayer

process for the rib

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

core_width: float and number > 0

width of the waveguide core

core_layer: __Layer__

layer used to define the core of the waveguide

pin_shape: Shape

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout

Trace template to be used for the ports. Default = this template

width: float and Real, number and number >= 0
control_shape_layer: __Layer__

layer on which the control shape is drawn

draw_control_shape: ( bool, bool_ or int )

draws the control shape on top of the waveguide

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

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

Examples

"""This example shows how you use the template to directly create a slotted socket waveguide PCell
and its layout."""
import si_fab.all as pdk  # noqa: F401
from picazzo3.traces.socket_wg.trace import SlottedSocketWaveguideTemplate

wg_t = SlottedSocketWaveguideTemplate(name="my_slottedsocket_wg_template1")
wg_t.Layout(core_width=0.5, slot_width=0.15, cladding_width=2 * 3.0 + 0.5)

wg = wg_t(name="my_slottedsocket_waveguide1")
layout = wg.Layout(shape=[(0.0, 0.0), (10.0, 0.0)])

layout.visualize(annotate=True)
../../_images/full-70.png

Thinned Waveguides

ThinnedWaveguideTemplate

class picazzo3.traces.thin_wg.ThinnedWaveguideTemplate

Thinned waveguide.

Takes an existing waveguide template (given by trace_template) and overlay with a thinning layer.

Parameters:
trace_template: PCell and _TraceTemplate

Refers to the other trace template from which information is taken to build this trace template.

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

The unique name of the pcell

Views

class Layout
Parameters:
thin_width: float and Real, number and number >= 0

width of the thinning layer

thin_purpose: PatternPurpose

drawing purpose for the thinning region

thin_process: ProcessLayer

thinning process

cladding_process: ProcessLayer

process for the waveguide cladding, defaults to the core process

core_purpose: PatternPurpose

drawing purpose for the waveguide core

core_process: ProcessLayer

process for the waveguide core

cladding_width: float and number > 0

total width of the waveguide with cladding

cladding_purpose: PatternPurpose

drawing purpose layer for the cladding

core_width: float and number > 0

width of the waveguide core

core_layer: __Layer__

layer used to define the core of the waveguide

flatten_contents: ( bool, bool_ or int )

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

pin_shape: Shape

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout

Trace template to be used for the ports. Default = this template

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

keep_original_trace_template: ( bool, bool_ or int )
width: float and Real, number and number >= 0
control_shape_layer: __Layer__

layer on which the control shape is drawn

draw_control_shape: ( bool, bool_ or int )

draws the control shape on top of the waveguide

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

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

Examples

"""This example shows how you use the template to directly create a thinned waveguide PCell
and its layout.
"""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate
from picazzo3.traces.thin_wg.trace import ThinnedWaveguideTemplate

wg_t = WireWaveguideTemplate(name="my_wire_wg_template1")
wg_t.Layout(core_width=0.47, cladding_width=2 * 3.0 + 0.47, core_process=i3.TECH.PROCESS.WG)

thinwg_t = ThinnedWaveguideTemplate(trace_template=wg_t, name="my_thin_wg_template1")
thinwg_t.Layout(thin_process=i3.TECH.PROCESS.FC, thin_width=1.2)

wg = thinwg_t(name="my_thin_waveguide1")
layout = wg.Layout(shape=[(0.0, 0.0), (10.0, 0.0)])

layout.visualize(annotate=True)
../../_images/full-71.png

ThinnedWaveguideTemplate

class picazzo3.traces.thin_wg.ThinnedWaveguideTemplate

Thinned waveguide.

Takes an existing waveguide template (given by trace_template) and overlay with a thinning layer.

Parameters:
trace_template: PCell and _TraceTemplate

Refers to the other trace template from which information is taken to build this trace template.

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

The unique name of the pcell

Views

class Layout
Parameters:
thin_width: float and Real, number and number >= 0

width of the thinning layer

thin_purpose: PatternPurpose

drawing purpose for the thinning region

thin_process: ProcessLayer

thinning process

cladding_process: ProcessLayer

process for the waveguide cladding, defaults to the core process

core_purpose: PatternPurpose

drawing purpose for the waveguide core

core_process: ProcessLayer

process for the waveguide core

cladding_width: float and number > 0

total width of the waveguide with cladding

cladding_purpose: PatternPurpose

drawing purpose layer for the cladding

core_width: float and number > 0

width of the waveguide core

core_layer: __Layer__

layer used to define the core of the waveguide

flatten_contents: ( bool, bool_ or int )

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

pin_shape: Shape

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout

Trace template to be used for the ports. Default = this template

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

keep_original_trace_template: ( bool, bool_ or int )
width: float and Real, number and number >= 0
control_shape_layer: __Layer__

layer on which the control shape is drawn

draw_control_shape: ( bool, bool_ or int )

draws the control shape on top of the waveguide

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

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

Examples

"""This example shows how you use the template to directly create a thinned waveguide PCell
and its layout.
"""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate
from picazzo3.traces.thin_wg.trace import ThinnedWaveguideTemplate

wg_t = WireWaveguideTemplate(name="my_wire_wg_template1")
wg_t.Layout(core_width=0.47, cladding_width=2 * 3.0 + 0.47, core_process=i3.TECH.PROCESS.WG)

thinwg_t = ThinnedWaveguideTemplate(trace_template=wg_t, name="my_thin_wg_template1")
thinwg_t.Layout(thin_process=i3.TECH.PROCESS.FC, thin_width=1.2)

wg = thinwg_t(name="my_thin_waveguide1")
layout = wg.Layout(shape=[(0.0, 0.0), (10.0, 0.0)])

layout.visualize(annotate=True)
../../_images/full-72.png

Wire Waveguides

WireWaveguideTemplate

class picazzo3.traces.wire_wg.WireWaveguideTemplate

Wire-like waveguide definition, with a core and a cladding. The waveguide is defined as a ‘cladding area’ (i.e. a cladding zone where the trench will be etched or other material will be), and a ‘core area’, which draws the shape of the waveguide core inside the ‘cladding area’.

The waveguide can be drawn on different processes, by default it is the WG process.

          core_width
          <-------->
        cladding_width
<------------------------------>
           ________
          |        |
__________|        |____________
Parameters:
name: String that contains only ISO/IEC 8859-1 (extended ASCII py3) or pure ASCII (py2) characters

The unique name of the pcell

Views

class Layout
Parameters:
cladding_width: float and number > 0

total width of the waveguide with cladding

cladding_purpose: PatternPurpose

drawing purpose layer for the cladding

cladding_process: ProcessLayer

process for the waveguide cladding, defaults to the core process

core_purpose: PatternPurpose

drawing purpose for the waveguide core

core_process: ProcessLayer

process for the waveguide core

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

core_width: float and number > 0

width of the waveguide core

core_layer: __Layer__

layer used to define the core of the waveguide

pin_shape: Shape

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout

Trace template to be used for the ports. Default = this template

width: float and Real, number and number >= 0
control_shape_layer: __Layer__

layer on which the control shape is drawn

draw_control_shape: ( bool, bool_ or int )

draws the control shape on top of the waveguide

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

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

Examples

"""This example shows how you use the template to directly create a waveguide PCell
and its layout."""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

wg_t = WireWaveguideTemplate(name="my_wire_wg_template1")
wg_t.Layout(core_width=0.47, cladding_width=2 * 3.0 + 0.47, core_process=i3.TECH.PROCESS.WG)

wg = wg_t(name="my_wire_waveguide1")
layout = wg.Layout(shape=[(0.0, 0.0), (10.0, 0.0), (15.0, 15.0)])

layout.visualize(annotate=True)
../../_images/full-73.png
"""This example shows how you use the template as a parameter for a generic
Waveguide PCell."""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

wg_t = WireWaveguideTemplate(name="my_wire_wg_template2")
wg_t.Layout(core_width=0.47, cladding_width=2 * 3.0 + 0.47, core_process=i3.TECH.PROCESS.WG)

wg = i3.Waveguide(name="my_wire_waveguide2", trace_template=wg_t)
layout = wg.Layout(shape=[(0.0, 0.0), (10.0, 0.0), (15.0, 15.0)])

layout.visualize(annotate=True)
../../_images/full-74.png
"""This example shows how you use the template as a parameter for a rounded
Waveguide PCell."""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

wg_t = WireWaveguideTemplate(name="my_wg_template3")
wg_t.Layout(core_width=0.47, cladding_width=2 * 3.0 + 0.47, core_process=i3.TECH.PROCESS.WG)

wg = i3.RoundedWaveguide(name="my_rounded_wire_waveguide1", trace_template=wg_t)
layout = wg.Layout(shape=[(0.0, 0.0), (10.0, 0.0), (15.0, 15.0)], bend_radius=7.0, manhattan=True)

layout.visualize(annotate=True)
../../_images/full-75.png

Transitions

Rib Transitions

WireRibWaveguideTransitionLinear

class picazzo3.traces.rib_wg.WireRibWaveguideTransitionLinear

Transition from/to wire (deep etched) to/from rib (shallow etched) waveguides.

You can provide either a wire for the start, and rib for the end, or vice versa. The wire_only_length is the part of the transition in which the rib part is gradually built up. After this length, we abruptly change to the rib waveguide. If the rib part is sufficiently wide in the first part, there should be no reflections at the interface.

Parameters:
modified_start_wg_template: PCell and _TraceTemplate

Modified start waveguide template (using the end_trace_template, but with the dimensions of the start_trace_template)

wire_only_wg_template: PCell and _TraceTemplate
end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, RibWaveguideTemplate
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, RibWaveguideTemplate
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:
reverse_templates: ( bool, bool_ or int ), locked

When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.

Views

class Layout
Parameters:
wire_only_cladding_width: float and number > 0

width of the cladding at the end of the wire_only_length

wire_end_width: float and Real, number and number >= 0

width of the wire core at its end point.

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

Length of transition where shallow part is built up.

straight_extension: Coord2 and number >= 0

tuple: straight extension at start and end of transition

end_position: Coord2

end position of the transition

start_position: Coord2

start position of the transition

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:
length: float and Real, number and number >= 0, locked

length of the transition

Examples

"""This example shows how you transition from a wire to a rib waveguide."""
import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3

from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.traces.rib_wg import WireRibWaveguideTransitionLinear

wg_start = WireWaveguideTemplate()
wg_start.Layout(core_width=0.45, cladding_width=0.45 + 2 * i3.TECH.WG.TRENCH_WIDTH)
wg_end = RibWaveguideTemplate()
wg_end.Layout(core_width=0.9, cladding_width=0.9 + 2 * 3.0)

wg_deeponly = WireWaveguideTemplate()
wg_deeponly.Layout(core_width=3.0, cladding_width=3.0 + 2 * i3.TECH.WG.TRENCH_WIDTH)

t = WireRibWaveguideTransitionLinear(
    start_trace_template=wg_start, end_trace_template=wg_end, wire_only_wg_template=wg_deeponly
)

t_lay = t.Layout(
    start_position=(10.0, 0.0),
    end_position=(30.0, 0.0),
    wire_only_length=5.0,
    straight_extension=(0.3, 0.4),
)
t_lay.visualize(annotate=True)
../../_images/full-76.png

WireRibWaveguideTransitionFromPortLinear

class picazzo3.traces.rib_wg.WireRibWaveguideTransitionFromPortLinear

Transition from/to wire (deep etched) to/from rib (shallow etched) waveguides.

You can provide a start_port and end_trace_template.

Parameters:
wire_only_wg_template: PCell and _TraceTemplate
modified_start_wg_template: PCell and _TraceTemplate

Modified start waveguide template (using the end_trace_template, but with the dimensions of the start_trace_template)

start_port: _PortInterface

the port on which to extract trace template, position and angle

end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, RibWaveguideTemplate
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, RibWaveguideTemplate
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:
reverse_templates: ( bool, bool_ or int ), locked

When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.

Views

class Layout
Parameters:
wire_only_length: ( float and Real, number and number >= 0 ), *None allowed*

Length of transition where shallow part is built up.

wire_only_cladding_width: float and number > 0

width of the cladding at the end of the wire_only_length

wire_end_width: float and Real, number and number >= 0

width of the wire core at its end point.

straight_extension: Coord2 and number >= 0

tuple: straight extension at start and end of transition

length: float and Real, number and number >= 0

length of the transition

end_position: Coord2

end position of the transition

start_position: Coord2

start position of the transition

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

Examples

"""This example shows how to append a transition onto a component.
The component has a port, which is associated with a
WireWaveguideTemplate, and we want to taper to a RibWaveguideTemplate.
"""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.traces.rib_wg import WireRibWaveguideTransitionFromPortLinear

wg_start = WireWaveguideTemplate()
wg_start.Layout(core_width=0.45, cladding_width=0.45 + 2 * i3.TECH.WG.TRENCH_WIDTH)

wg_end = RibWaveguideTemplate()
wg_end.Layout(core_width=0.9, cladding_width=0.9 + 2 * i3.TECH.WG.TRENCH_WIDTH)

wg_wireonly = WireWaveguideTemplate()
wg_wireonly.Layout(core_width=3.0, cladding_width=3.0 + 2 * i3.TECH.WG.TRENCH_WIDTH)

class P(i3.PCell):
    out_trace_template = i3.TraceTemplateProperty()

    class Layout(i3.LayoutView):
        def _generate_ports(self, ports):
            return i3.OpticalPort(name="out", position=(3.0, 3.0), angle=10.0, trace_template=wg_start)

p = P(out_trace_template=wg_start)
p.Layout()

t = WireRibWaveguideTransitionFromPortLinear(
    start_port=(p, "out"), end_trace_template=wg_end, wire_only_wg_template=wg_wireonly
)

t_lay = t.Layout(length=15.0, straight_extension=(0.0, 0.2), wire_only_length=5.0)

t_lay.visualize(annotate=True)
../../_images/full-77.png

Slot Transitions

SlottedWireWaveguideTransitionLinear

class picazzo3.traces.slot_wg.SlottedWireWaveguideTransitionLinear

Transition from/to a slotted waveguide to/from a wire waveguide.

You can provide either a slotted waveguide for the start, and a wire waveguide for the end, or vica versa.

Parameters:
end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SlotWaveguideTemplate
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SlotWaveguideTemplate
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:
reverse_templates: ( bool, bool_ or int ), locked

When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.

Views

class Layout
Parameters:
tip_width: float and number > 0
slot_extension_length: float and number > 0
straight_extension: Coord2 and number >= 0

tuple: straight extension at start and end of transition

end_position: Coord2

end position of the transition

start_position: Coord2

start position of the transition

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:
length: float and Real, number and number >= 0, locked

length of the transition

Examples

"""This example shows how you transition from a wire to a slotted waveguide."""
import si_fab.all as pdk  # noqa: F401
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.traces.slot_wg import SlotWaveguideTemplate, SlottedWireWaveguideTransitionLinear
from ipkiss3 import all as i3

wg_start_wire = WireWaveguideTemplate()
wg_start_wire.Layout(core_width=0.6, cladding_width=0.6 + 2 * i3.TECH.WG.TRENCH_WIDTH)

wg_start = SlotWaveguideTemplate()
wg_start.Layout(slot_width=0.15, cladding_width=1.0)

wg_end = WireWaveguideTemplate()
wg_end.Layout(core_width=0.6, cladding_width=0.6 + 2 * i3.TECH.WG.TRENCH_WIDTH)

t = SlottedWireWaveguideTransitionLinear(
    name="my_transition", start_trace_template=wg_start, end_trace_template=wg_end
)

t_lay = t.Layout(start_position=(3.0, 3.0), end_position=(23.0, 3.0), straight_extension=(0.3, 0.4))

t_lay.visualize(annotate=True)
../../_images/full-78.png

SlottedWireWaveguideTransitionFromPortLinear

class picazzo3.traces.slot_wg.SlottedWireWaveguideTransitionFromPortLinear

Linear transition from/to a slotted waveguide to/from a wire waveguide.

You can provide either a slotted waveguide for the start, and a wire waveguide for the end, or vica versa.

Parameters:
start_port: _PortInterface

the port on which to extract trace template, position and angle

end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SlotWaveguideTemplate
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SlotWaveguideTemplate
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:
reverse_templates: ( bool, bool_ or int ), locked

When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.

Views

class Layout
Parameters:
slot_extension_length: float and number > 0
tip_width: float and number > 0
straight_extension: Coord2 and number >= 0

tuple: straight extension at start and end of transition

length: float and Real, number and number >= 0

length of the transition

end_position: Coord2

end position of the transition

start_position: Coord2

start position of the transition

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

Examples

"""This example shows how to append a transition onto a component.
The component has a port, which is associated with a
WireWaveguideTemplate, and we want to taper to a SlotWaveguideTemplate.
"""
import si_fab.all as pdk  # noqa: F401
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.traces.slot_wg import SlotWaveguideTemplate, SlottedWireWaveguideTransitionFromPortLinear
from ipkiss3 import all as i3

wg_start = WireWaveguideTemplate()
wg_start.Layout(core_width=0.6, cladding_width=0.6 + 2 * i3.TECH.WG.TRENCH_WIDTH)

wg_end = SlotWaveguideTemplate()
wg_end.Layout(slot_width=0.15, cladding_width=1.0)

class P(i3.PCell):
    out_trace_template = i3.TraceTemplateProperty()

    class Layout(i3.LayoutView):
        def _generate_ports(self, ports):
            return i3.OpticalPort(name="out", position=(3.0, 3.0), angle=10.0, trace_template=wg_start)

p = P(out_trace_template=wg_start)
p.Layout()

t = SlottedWireWaveguideTransitionFromPortLinear(start_port=(p, "out"), end_trace_template=wg_end)

t_lay = t.Layout(length=15.0, straight_extension=(0.0, 0.2))

t_lay.visualize(annotate=True)
../../_images/full-79.png

Socket Transitions

WireSocketWaveguideTransitionLinear

class picazzo3.traces.socket_wg.WireSocketWaveguideTransitionLinear

Transition from/to wire (deep etched) to/from socket (deep etched rib) waveguides.

You can provide either a wire for the start, and socket for the end, or vice versa.

The wire_only_length is the part of the transition in which the socket part is gradually built up. After this length, we abruptly change to the socket waveguide. If the socket part is sufficiently wide in the first part, there should be no reflections at the interface.

Parameters:
modified_start_wg_template: PCell and _TraceTemplate

Modified start waveguide template (using the end_trace_template, but with the dimensions of the start_trace_template)

wire_only_wg_template: PCell and _TraceTemplate
end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SocketWaveguideTemplate
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SocketWaveguideTemplate
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:
reverse_templates: ( bool, bool_ or int ), locked

When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.

Views

class Layout
Parameters:
wire_only_cladding_width: float and number > 0

width of the cladding at the end of the wire_only_length

wire_end_width: float and Real, number and number >= 0

width of the wire core at its end point.

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

Length of transition where shallow part is built up.

straight_extension: Coord2 and number >= 0

tuple: straight extension at start and end of transition

end_position: Coord2

end position of the transition

start_position: Coord2

start position of the transition

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:
length: float and Real, number and number >= 0, locked

length of the transition

Examples

"""This example shows how you use the template as a parameter for a rounded
Waveguide PCell."""
import si_fab.all as pdk  # noqa: F401
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.traces.socket_wg import SocketWaveguideTemplate, WireSocketWaveguideTransitionLinear

wt1 = WireWaveguideTemplate()
wt1.Layout(core_width=0.45, cladding_width=1.6)
wt2 = SocketWaveguideTemplate()
wt2.Layout(core_width=0.85, cladding_width=2.0)

t = WireSocketWaveguideTransitionLinear(start_trace_template=wt1, end_trace_template=wt2)

t_lay = t.Layout(start_position=(0.0, 0.0), end_position=(5.0, 0.0))
t_lay.visualize(annotate=True)
../../_images/full-80.png

WireSocketWaveguideTransitionFromPortLinear

class picazzo3.traces.socket_wg.WireSocketWaveguideTransitionFromPortLinear

Linear Transition between Wire and Socket Waveguides.

Parameters:
wire_only_wg_template: PCell and _TraceTemplate
modified_start_wg_template: PCell and _TraceTemplate

Modified start waveguide template (using the end_trace_template, but with the dimensions of the start_trace_template)

start_port: _PortInterface

the port on which to extract trace template, position and angle

end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SocketWaveguideTemplate
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SocketWaveguideTemplate
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:
reverse_templates: ( bool, bool_ or int ), locked

When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.

Views

class Layout
Parameters:
wire_only_length: ( float and Real, number and number >= 0 ), *None allowed*

Length of transition where shallow part is built up.

wire_only_cladding_width: float and number > 0

width of the cladding at the end of the wire_only_length

wire_end_width: float and Real, number and number >= 0

width of the wire core at its end point.

straight_extension: Coord2 and number >= 0

tuple: straight extension at start and end of transition

length: float and Real, number and number >= 0

length of the transition

end_position: Coord2

end position of the transition

start_position: Coord2

start position of the transition

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

Examples

"""This example shows how to append a transition onto a component.

We define a PCell with a port on the Layout level (position + angle). Then we use
WireWaveguideTransitionFromPortLinear to connect this port to a transition that creates
a transition to a wire waveguide.
"""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.traces.socket_wg import SocketWaveguideTemplate, WireSocketWaveguideTransitionFromPortLinear

wg_start = WireWaveguideTemplate()
wg_start.Layout(core_width=0.45, cladding_width=1.6)
wg_end = SocketWaveguideTemplate()
wg_end.Layout(core_width=0.85, cladding_width=2.0)

p = i3.OpticalPort(name="out", position=(5.0, 0.0), angle=20.0, trace_template=wg_start)

t = WireSocketWaveguideTransitionFromPortLinear(start_port=p, end_trace_template=wg_end)

t_lay = t.Layout(length=15.0, straight_extension=(0.5, 1.0))

t_lay.visualize(annotate=True)
../../_images/full-81.png

Thinned Transitions

ThinnedWireWireWaveguideTransitionLinear

class picazzo3.traces.thin_wg.ThinnedWireWireWaveguideTransitionLinear

Transition from/to thinned wire to/from wire waveguides.

You can provide either a thinned wire for the start, and wire for the end, or vica versa.

Parameters:
end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, ThinnedWaveguideTemplate
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, ThinnedWaveguideTemplate
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:
reverse_templates: ( bool, bool_ or int ), locked

When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.

Views

class Layout
Parameters:
tip_width: float and number > 0
straight_extension: Coord2 and number >= 0

tuple: straight extension at start and end of transition

end_position: Coord2

end position of the transition

start_position: Coord2

start position of the transition

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:
length: float and Real, number and number >= 0, locked

length of the transition

Examples

"""This example shows how you transition from a thinned wire to a wire waveguide."""
import si_fab.all as pdk  # noqa: F401
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.traces.thin_wg import ThinnedWaveguideTemplate, ThinnedWireWireWaveguideTransitionLinear
import ipkiss3.all as i3

wg_start_wire = WireWaveguideTemplate()
wg_start_wire.Layout(core_width=0.6, cladding_width=0.6 + 2 * i3.TECH.WG.TRENCH_WIDTH)

wg_start = ThinnedWaveguideTemplate(trace_template=wg_start_wire)
wg_start.Layout(thin_width=1.0)

wg_end = WireWaveguideTemplate()
wg_end.Layout(core_width=0.6, cladding_width=0.6 + 2 * i3.TECH.WG.TRENCH_WIDTH)

t = ThinnedWireWireWaveguideTransitionLinear(
    name="test_ThinnedWireWireWaveguideTransitionLinear",
    start_trace_template=wg_start,
    end_trace_template=wg_end,
)

t_lay = t.Layout(start_position=(3.0, 3.0), end_position=(23.0, 3.0), straight_extension=(0.3, 0.4))

t_lay.visualize(annotate=True)
../../_images/full-82.png

ThinnedWireWireWaveguideTransitionFromPortLinear

class picazzo3.traces.thin_wg.ThinnedWireWireWaveguideTransitionFromPortLinear

Linear Transition from/to thinned wire to/from wire waveguides.

You can provide either a thinned wire for the start, and wire for the end, or vica versa.

Parameters:
start_port: _PortInterface

the port on which to extract trace template, position and angle

end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, ThinnedWaveguideTemplate
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, ThinnedWaveguideTemplate
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:
reverse_templates: ( bool, bool_ or int ), locked

When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.

Views

class Layout
Parameters:
tip_width: float and number > 0
straight_extension: Coord2 and number >= 0

tuple: straight extension at start and end of transition

length: float and Real, number and number >= 0

length of the transition

end_position: Coord2

end position of the transition

start_position: Coord2

start position of the transition

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

Examples

"""This example shows how to append a transition onto a component.
The component has a port, which is associated with a
ThinnedWaveguideTemplate, and we want to taper to a WireWaveguideTemplate.
"""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.traces.thin_wg import (
    ThinnedWaveguideTemplate,
    ThinnedWireWireWaveguideTransitionFromPortLinear,
)

wg_start_wire = WireWaveguideTemplate()
wg_start_wire.Layout(core_width=0.6, cladding_width=0.6 + 2 * i3.TECH.WG.TRENCH_WIDTH)

wg_start = ThinnedWaveguideTemplate(trace_template=wg_start_wire)
wg_start.Layout(thin_width=1.0)

wg_end = WireWaveguideTemplate()
wg_end.Layout(core_width=0.6, cladding_width=0.6 + 2 * i3.TECH.WG.TRENCH_WIDTH)

class P(i3.PCell):
    out_trace_template = i3.TraceTemplateProperty()

    class Layout(i3.LayoutView):
        def _generate_ports(self, ports):
            return i3.OpticalPort(name="out", position=(3.0, 3.0), angle=10.0, trace_template=wg_start)

p = P(out_trace_template=wg_start)
p.Layout()

t = ThinnedWireWireWaveguideTransitionFromPortLinear(start_port=(p, "out"), end_trace_template=wg_end)

t_lay = t.Layout(length=15.0, straight_extension=(0.0, 0.2))

t_lay.visualize(annotate=True)
../../_images/full-83.png

Wire Transitions

WireWaveguideTransitionLinear

class picazzo3.traces.wire_wg.WireWaveguideTransitionLinear

A transition between two WireWaveguideTemplates.

Parameters:
end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate
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:
reverse_templates: ( bool, bool_ or int ), locked

When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.

Views

class Layout
Parameters:
straight_extension: Coord2 and number >= 0

tuple: straight extension at start and end of transition

end_position: Coord2

end position of the transition

start_position: Coord2

start position of the transition

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:
length: float and Real, number and number >= 0, locked

length of the transition

Examples

"""This example shows how you use the template as a parameter for a rounded
Waveguide PCell."""
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.traces.wire_wg import WireWaveguideTransitionLinear

wt1 = WireWaveguideTemplate()
wt1.Layout(core_width=0.45, cladding_width=1.6)
wt2 = WireWaveguideTemplate()
wt2.Layout(core_width=0.85, cladding_width=2.0)

t = WireWaveguideTransitionLinear(start_trace_template=wt1, end_trace_template=wt2)

t_lay = t.Layout(start_position=(0.0, 0.0), end_position=(5.0, 0.0))
t_lay.visualize(annotate=True)
../../_images/full-84.png

WireWaveguideTransitionFromPortLinear

class picazzo3.traces.wire_wg.WireWaveguideTransitionFromPortLinear

A linear transition between two WireWaveguideTemplates.

Parameters:
start_port: _PortInterface

the port on which to extract trace template, position and angle

end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate
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:
reverse_templates: ( bool, bool_ or int ), locked

When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.

Views

class Layout
Parameters:
straight_extension: Coord2 and number >= 0

tuple: straight extension at start and end of transition

length: float and Real, number and number >= 0

length of the transition

end_position: Coord2

end position of the transition

start_position: Coord2

start position of the transition

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

Examples

"""This example shows how to append a transition onto a component.

We define a PCell with a port on the Layout level (position + angle). Then we use
WireWaveguideTransitionFromPortLinear to connect this port to a transition that creates
a transition to a wire waveguide.
"""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.traces.wire_wg import WireWaveguideTemplate, WireWaveguideTransitionFromPortLinear

wg_start = WireWaveguideTemplate()
wg_start.Layout(core_width=0.45, cladding_width=0.45 + 2 * i3.TECH.WG.TRENCH_WIDTH)

wg_end = WireWaveguideTemplate()
wg_end.Layout(core_width=2.0, cladding_width=2.0 + 2 * i3.TECH.WG.TRENCH_WIDTH)

p = i3.OpticalPort(name="out", position=(5.0, 0.0), angle=20.0, trace_template=wg_start)

t = WireWaveguideTransitionFromPortLinear(start_port=p, end_trace_template=wg_end)

t_lay = t.Layout(length=15.0, straight_extension=(0.5, 1.0))

t_lay.visualize(annotate=True)
../../_images/full-85.png

Waveguides

Bends

WgBend

class picazzo3.wg.bend.cell.WgBend

Fixed Waveguide bend of an arbitrary angle. This is a rounded waveguide, so it takes a rounding algorithm and a bend radius as a parameter, as well as a trace_template.

Parameters:
trace_template: PCell and _WaveguideTemplate
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:
contents: PCell and _Trace, locked

Views

class Layout
Parameters:
angle: float

angular coverage of the bend

start_angle: float

start_angle of the bend. Negative is clockwise, positive is counterclockwise

output_port: TracePort
trace_template_for_ports: _TraceTemplate.Layout

Trace template to be used for the ports.

shape: Shape

Shape from which the Trace is calculated

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

reverse_individual_bends: list<( bool, bool_ or int )>

When set to True, it will generate the individual bends backwards. This has only effect when the bend algorithm is not symmetric. Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes.

rounding_algorithms:

Rounding algorithm for every individual bend. Can be circular, spline, … Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes.

bend_radii: list<number > 0>

Bend radius for every individual bend.

reverse_bends: ( bool, bool_ or int )

When set to True, it will generate the bends backwards. This has only effect when the bend algorithm is not symmetric.

remove_straight_angles: ( bool, bool_ or int )

Removes the waypoints with straight angles. Set to False if the algorithm uses waypoint-specific information.

core_layer: __Layer__

layer used to define the core of the waveguide

input_port: TracePort
control_shape_layer: __Layer__

layer on which the control shape is drawn

draw_control_shape: ( bool, bool_ or int )

draws the control shape on top of the waveguide

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
center_line_shape: locked

Automatically calculated shape of the center line of the trace

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.bend import WgBend
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate
import ipkiss3.all as i3

wg_t = WireWaveguideTemplate()
wg_t.Layout(core_width=0.550, cladding_width=i3.TECH.WG.CLADDING_WIDTH, core_process=i3.TECH.PROCESS.WG)
C = WgBend(trace_template=wg_t)
layout = C.Layout(bend_radius=20.0, start_angle=45.0, angle=-120)
layout.visualize(annotate=True)
../../_images/full-86.png

WgBend90

class picazzo3.wg.bend.cell.WgBend90

Fixed Waveguide bend of 90 degrees. This is a rounded waveguide, so it takes a rounding algorithm and a bend radius as a parameter, as well as a trace_template.

Parameters:
trace_template: PCell and _WaveguideTemplate
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:
contents: PCell and _Trace, locked

Views

class Layout
Parameters:
clockwise: ( bool, bool_ or int )

clockwise or counterclockwise propagation. By default it is calculated from ‘quadrant’

quadrant: int and List with value restriction, allowed values: (-4, -3, -2, -1, 1, 2, 3, 4)

quadrant on the circle. (-4=>4)positive numbers is counterclockwise, negative numbers is clockwise

start_angle: float

start_angle of the bend. By default it is calculated from ‘quadrant’

output_port: TracePort
trace_template_for_ports: _TraceTemplate.Layout

Trace template to be used for the ports.

shape: Shape

Shape from which the Trace is calculated

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

reverse_individual_bends: list<( bool, bool_ or int )>

When set to True, it will generate the individual bends backwards. This has only effect when the bend algorithm is not symmetric. Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes.

rounding_algorithms:

Rounding algorithm for every individual bend. Can be circular, spline, … Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes.

bend_radii: list<number > 0>

Bend radius for every individual bend.

reverse_bends: ( bool, bool_ or int )

When set to True, it will generate the bends backwards. This has only effect when the bend algorithm is not symmetric.

remove_straight_angles: ( bool, bool_ or int )

Removes the waypoints with straight angles. Set to False if the algorithm uses waypoint-specific information.

core_layer: __Layer__

layer used to define the core of the waveguide

input_port: TracePort
control_shape_layer: __Layer__

layer on which the control shape is drawn

draw_control_shape: ( bool, bool_ or int )

draws the control shape on top of the waveguide

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
angle: locked

angle of the bend (locked at 90 degrees)

center_line_shape: locked

Automatically calculated shape of the center line of the trace

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.bend import WgBend90
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate
import ipkiss3.all as i3

wg_t = WireWaveguideTemplate()
wg_t.Layout(core_width=0.550, cladding_width=i3.TECH.WG.CLADDING_WIDTH, core_process=i3.TECH.PROCESS.WG)
C = WgBend90(trace_template=wg_t)
layout = C.Layout(quadrant=-3, bend_radius=20.0)
layout.visualize(annotate=True)
../../_images/full-87.png

Crossings

WgDirectCrossing

class picazzo3.wg.crossing.cell.WgDirectCrossing

A Direct waveguide crossing, consisting of two identical waveguides at right angles. This design is not particularly efficient for high-contrast waveguides, but is OK for low-contrast waveguides (e.g. silica.)

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

the waveguides through the crossing

trace_template: PCell and _WaveguideTemplate

Trace template used to define the crossing

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

The unique name of the pcell

Views

class Layout
Parameters:
straight_stub: float and number > 0

length of the straight sections of the crossing

length: float and number > 0
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

Examples

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.wg.crossing import WgDirectCrossing
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

wg_t = WireWaveguideTemplate(name="my_crossing_wg_template1")
wg_t.Layout(core_width=0.550, cladding_width=2 * 2.0 + 0.550, core_process=i3.TECH.PROCESS.WG)
C = WgDirectCrossing(name="my_direct_crossing", trace_template=wg_t)
layout = C.Layout()

layout.visualize(annotate=True)
../../_images/full-88.png

WgParabolicCrossing

class picazzo3.wg.crossing.cell.WgParabolicCrossing

Highly efficient crossing for high-contrast silicon photonics. The crossing consists of double-etched parabolic transitions at right angles, collimating the optical field over a short distance to a parallel beam at the center of the crossing. This allows for a minimum of crosstalk. The details of this crossing are described in detail in [W. Bogaerts et al., Optics Letters, 32(19), p.2801-2803 (2007)]

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

the waveguides through the crossing

trace_template: PCell and _WaveguideTemplate

Trace template used to define the crossing

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

The unique name of the pcell

Views

class Layout
Parameters:
core_width: float and number > 0

width of the shallow waveguide etch at the ports. defaults to same value as deep waveguide

width_step: float and number > 0

discretisation in width for the parabolic shapes

core_cladding_purpose: PatternPurpose

pattern purpose for the shallow etched core cladding

cladding_purpose: PatternPurpose

pattern purpose for the full etched strip cladding

core_purpose: PatternPurpose

pattern purpose for the shallow etched core

strip_purpose: PatternPurpose

pattern purpose for the full etched strip

core_cladding_process: ProcessLayer

process for the shallow etched core cladding

cladding_process: ProcessLayer

process for the full etched strip cladding

core_process: ProcessLayer

process for the shallow etched core

strip_process: ProcessLayer

process for the full etched strip

core_cladding_width: float and number > 0

width of the cladding of the shallow etched core

core_width_center: float and number > 0

shallowetched core width at the center

strip_width_center: float and number > 0

full etched strip width at the center

straight_stub: float and number > 0

length of the straight sections of the crossing

length: float and number > 0

length of the parabolic section (from start to crossing center to the end)

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

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.crossing import WgParabolicCrossing

C = WgParabolicCrossing(name="my_parabolic_crossing")
layout = C.Layout(
    length=5.7, strip_width_center=2.6, core_width_center=0.8, core_cladding_width=2 * 0.5 + 0.8
)

layout.visualize(annotate=True)
../../_images/full-89.png

Gratings

WaveguideUniformGrating

class picazzo3.wg.grating.cell.WaveguideUniformGrating

Waveguide with inline, uniform grating. The grating consists of a Child cell with the period, which is repeated to create the grating.

Parameters:
n_o_periods: int and number > 0

The number of periods

period_cell: PCell and _WaveguideGratingPeriod

The unit cell of the grating

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

The unique name of the pcell

Views

class Layout
Parameters:
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

Examples

"""How to create a uniform grating with a custom unit cell."""
import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.grating import WaveguideUniformGrating, WaveguideSectionsGratingPeriod
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.traces.slot_wg import SlotWaveguideTemplate

# 2 templates to make a single period
t1 = WireWaveguideTemplate(name="wire_t")
t1.Layout(core_width=0.6, cladding_width=3.0)

t2 = SlotWaveguideTemplate(name="slot_t")
t2.Layout(core_width=0.6, slot_width=0.15, cladding_width=3.0)

period = WaveguideSectionsGratingPeriod(name="period", wg_templates=[t1, t2, t1])
period.Layout(section_lengths=[0.11, 0.5, 0.11])

grating = WaveguideUniformGrating(name="my_uniform_grating", period_cell=period, n_o_periods=12)
layout = grating.Layout()

layout.visualize(annotate=True)
../../_images/full-90.png

WaveguideNonUniformGrating

class picazzo3.wg.grating.cell.WaveguideNonUniformGrating

Waveguide with inline, non-uniform grating. The grating periods are described as individual cells, and they are concatenated into a grating.

Parameters:
period_cells: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’> and List with type restriction, allowed types: <class ‘picazzo3.wg.grating.cell._WaveguideGratingPeriod’>
name: String that contains only ISO/IEC 8859-1 (extended ASCII py3) or pure ASCII (py2) characters

The unique name of the pcell

Views

class Layout
Parameters:
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

Examples

"""How to create a fully customized non-uniform grating using
3 different unit cells constructed from two waveguide templates.
"""

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.grating import WaveguideNonUniformGrating, WaveguideSectionsGratingPeriod
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.traces.slot_wg import SlotWaveguideTemplate

# 2 templates to make a single period unit cell
t1 = WireWaveguideTemplate(name="wire_t")
t1.Layout(core_width=0.6, cladding_width=3.0)

t2 = SlotWaveguideTemplate(name="slot_t")
t2.Layout(core_width=0.6, slot_width=0.15, cladding_width=3.0)

# 3 different grating period unit cells
period1 = WaveguideSectionsGratingPeriod(name="period1", wg_templates=[t1, t2, t1])
period1.Layout(section_lengths=[0.2, 0.3, 0.2])

period2 = WaveguideSectionsGratingPeriod(name="period2", wg_templates=[t1, t2, t1])
period2.Layout(section_lengths=[0.13, 0.4, 0.13])

period3 = WaveguideSectionsGratingPeriod(name="period3", wg_templates=[t1, t2, t1])
period3.Layout(section_lengths=[0.11, 0.5, 0.11])

# a nonuniform grating with different starting and ending cells (apodized)
grating = WaveguideNonUniformGrating(
    name="my_nonuniform_grating",
    period_cells=[
        period1,
        period2,
        period3,
        period3,
        period3,
        period3,
        period3,
        period3,
        period3,
        period3,
        period3,
        period3,
        period3,
        period3,
        period2,
        period1,
    ],
)
layout = grating.Layout()

layout.visualize(annotate=True)
../../_images/full-91.png

ModifiedWaveguideGratingPeriod

class picazzo3.wg.grating.cell.ModifiedWaveguideGratingPeriod

Period for a waveguide with modified parameters. The base definition is taken from the wg_template which is used for the ports. The modify_waveguide_parameters property then creates the blocks with modified widths, by adapting the properties of the individual waveguide template.

Parameters:
modified_waveguide_parameters: list

Dict of the parameters of the waveguide template that should be modified for the different sections of the Grating Period.

n_o_sections: int and number > 0

Number of sections in the grating period

wg_template: PCell and _WaveguideTemplate

Waveguide template of start and end of the period (and 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:
wg_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

Views

class Layout
Parameters:
section_lengths: list<number >= 0>

List of lengths for the waveguide templates

length: float and Real, number and number >= 0

Length of the grating period.

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

Examples

"""In this example we build a grating from a modified slot waveguide.
Starting from the basic slot waveguide template, we define grating period sections
with different slot width and core width.
"""
import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.grating import WaveguideUniformGrating, ModifiedWaveguideGratingPeriod
from picazzo3.traces.slot_wg import SlotWaveguideTemplate

t = SlotWaveguideTemplate(name="slot_t")
t.Layout(core_width=0.6, slot_width=0.15, cladding_width=3.0)

period = ModifiedWaveguideGratingPeriod(name="period", wg_template=t, n_o_sections=5)

# we modify the core width and the slot width
period.Layout(
    section_lengths=[0.1, 0.1, 0.3, 0.1, 0.1],
    modified_waveguide_parameters={
        "slot_width": [0.15, 0.18, 0.20, 0.18, 0.15],
        "core_width": [0.6, 0.59, 0.58, 0.59, 0.6],
    },
)

grating = WaveguideUniformGrating(name="my_grating_modifiedwg", period_cell=period, n_o_periods=12)
layout = grating.Layout()

layout.visualize(annotate=True)
../../_images/full-92.png

WaveguideSideGratingPeriod

class picazzo3.wg.grating.cell.WaveguideSideGratingPeriod

Period for a waveguide with side gratings. The base definition is taken from the wg_template which is used for the ports. The widths property then creates the blocks with modified widths, based on the original. (another parameter can be adapted by changing the property width_parameter_name)

Parameters:
n_o_sections: int and number > 0

Number of sections in the grating period

wg_template: PCell and _WaveguideTemplate

Waveguide template of start and end of the period (and 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:
modified_waveguide_parameters: locked
wg_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

Views

class Layout
Parameters:
relative_widths: ( bool, bool_ or int )

If True, the values of the width are relative to the original value.

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

Name of the property of the waveguide template that is to be adjusted by the values in ‘widths’.

widths: list<Real, number>

The modified widths of the waveguide core. If ‘relative_widths’ is True, the values are relative to the original core width. It is also possible to adjust another parameter than ‘core_width’ by overriding the ‘width_parameter_name’.

section_lengths: list<number >= 0>

List of lengths for the waveguide templates

length: float and Real, number and number >= 0

Length of the grating period.

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

Examples

"""We make a grating based on a wire waveguide and modify the width of the core
to create side gratings:
"""
import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.grating import WaveguideUniformGrating, WaveguideSideGratingPeriod

period = WaveguideSideGratingPeriod(n_o_sections=3)

# we modify the width with +/- 50nm
# relative to the original core width
period.Layout(section_lengths=[0.1, 0.13, 0.1], widths=[-0.05, +0.05, -0.05], relative_widths=True)

grating = WaveguideUniformGrating(name="my_side_grating", period_cell=period, n_o_periods=12)
layout = grating.Layout()

layout.visualize(annotate=True)
../../_images/full-93.png

Directional Couplers

StraightDirectionalCoupler

class picazzo3.wg.dircoup.cell.StraightDirectionalCoupler

A directional coupler consisting of 2 parallel (horizontal) straight waveguides.

Parameters:
wg2b: PCell

North-east waveguide

wg2a: PCell

North-west waveguide

wg1b: PCell

South-east waveguide

wg1a: PCell

South-west waveguide

trace_template2: PCell and _WaveguideTemplate

waveguide template used by the north arm of the directional coupler. If not set, it defaults to the template of the south arm

trace_template1: PCell and _WaveguideTemplate

waveguide template used by the south arm of the directional coupler

coupler_length: float and Real, number and number >= 0

length of the directional coupler

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:
n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

Views

class Layout
Parameters:
straight_extensions: Coord2 and number >= 0

additional lengths of the couplers at start and end

wg2b_shape: Shape

Shape for the north-east part of the waveguide

wg2a_shape: Shape

Shape for the north-west part of the waveguide

wg1b_shape: Shape

Shape for the south-east part of the waveguide

wg1a_shape: Shape

Shape for the south-west part of the waveguide

coupler_spacing: float

Spacing between the two waveguide centerlines.

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

Examples

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.wg.dircoup import StraightDirectionalCoupler
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

wg_t = WireWaveguideTemplate(name="my_wg_template1")
wg_t.Layout(core_width=0.550, cladding_width=i3.TECH.WG.CLADDING_WIDTH, core_process=i3.TECH.PROCESS.WG)

C = StraightDirectionalCoupler(name="my_dircoup1", trace_template1=wg_t, coupler_length=6.0)
layout = C.Layout(coupler_spacing=0.7)

layout.visualize(annotate=True)
../../_images/full-94.png

BendDirectionalCoupler

class picazzo3.wg.dircoup.cell.BendDirectionalCoupler

A directional coupler consisting of 2 parallel (horizontal) waveguides with bends at the start and end.

Parameters:
wg2b: PCell

North-east waveguide

wg2a: PCell

North-west waveguide

wg1b: PCell

South-east waveguide

wg1a: PCell

South-west waveguide

trace_template2: PCell and _WaveguideTemplate

waveguide template used by the north arm of the directional coupler. If not set, it defaults to the template of the south arm

trace_template1: PCell and _WaveguideTemplate

waveguide template used by the south arm of the directional coupler

coupler_length: float and Real, number and number >= 0

length of the directional coupler

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:
n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

Views

class Layout
Parameters:
bend_angles2: tuple2

Input and output angle of the bends of arm 2. Defaults to bend_angle. If set, bend_angle will be ignored.

bend_angles1: tuple2

Input and output angle of the bends of arm 1. Defaults to bend_angle. If set, bend_angle will be ignored.

straight_after_bend: float and Real, number and number >= 0

length of the straight waveguide after the bend

bend_angle: float

angle at which the directional coupler is bent

reverse_individual_bends2b: List with type restriction, allowed types: <class ‘bool’>

List of booleans to indicate whether the individual bends in arm2 should be reversed

reverse_individual_bends1b: List with type restriction, allowed types: <class ‘bool’>

List of booleans to indicate whether the individual bends in arm1 should be reversed

reverse_individual_bends2a: List with type restriction, allowed types: <class ‘bool’>

List of booleans to indicate whether the individual bends in arm2 should be reversed

reverse_individual_bends1a: List with type restriction, allowed types: <class ‘bool’>

List of booleans to indicate whether the individual bends in arm1 should be reversed

reverse_bends: ( bool, bool_ or int )

If True, all bends will be reversed. This has only an effect on asymmetric bends, such as splines

wg2b_shape: Shape

Shape for the north-east part of the waveguide

wg2a_shape: Shape

Shape for the north-west part of the waveguide

wg1b_shape: Shape

Shape for the south-east part of the waveguide

wg1a_shape: Shape

Shape for the south-west part of the waveguide

coupler_spacing: float

Spacing between the two waveguide centerlines.

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.dircoup import BendDirectionalCoupler
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate
import ipkiss3.all as i3

wg_t = WireWaveguideTemplate(name="my_wg_template2")
wg_t.Layout(core_width=0.500, cladding_width=i3.TECH.WG.CLADDING_WIDTH, core_process=i3.TECH.PROCESS.WG)
C = BendDirectionalCoupler(name="my_dircoup_2", trace_template1=wg_t, coupler_length=6.0)
layout = C.Layout(
    coupler_spacing=0.7, bend_radius=10.0, manhattan=True, straight_after_bend=6.0, bend_angle=60.0
)
layout.visualize(annotate=True)
../../_images/full-95.png

SBendDirectionalCoupler

class picazzo3.wg.dircoup.cell.SBendDirectionalCoupler

A directional coupler consisting of 2 parallel (horizontal) waveguides with S-shaped bends at the start and end.

Parameters:
wg2b: PCell

North-east waveguide

wg2a: PCell

North-west waveguide

wg1b: PCell

South-east waveguide

wg1a: PCell

South-west waveguide

trace_template2: PCell and _WaveguideTemplate

waveguide template used by the north arm of the directional coupler. If not set, it defaults to the template of the south arm

trace_template1: PCell and _WaveguideTemplate

waveguide template used by the south arm of the directional coupler

coupler_length: float and Real, number and number >= 0

length of the directional coupler

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:
n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

Views

class Layout
Parameters:
sbend_straight: float and Real, number and number >= 0

length of the straight section in the S-bend

bend_angles2: tuple2

Input and output angle of the bends of arm 2. Defaults to bend_angle. If set, bend_angle will be ignored.

bend_angles1: tuple2

Input and output angle of the bends of arm 1. Defaults to bend_angle. If set, bend_angle will be ignored.

straight_after_bend: float and Real, number and number >= 0

length of the straight waveguide after the bend

bend_angle: float

angle at which the directional coupler is bent

reverse_individual_bends2b: List with type restriction, allowed types: <class ‘bool’>

List of booleans to indicate whether the individual bends in arm2 should be reversed

reverse_individual_bends1b: List with type restriction, allowed types: <class ‘bool’>

List of booleans to indicate whether the individual bends in arm1 should be reversed

reverse_individual_bends2a: List with type restriction, allowed types: <class ‘bool’>

List of booleans to indicate whether the individual bends in arm2 should be reversed

reverse_individual_bends1a: List with type restriction, allowed types: <class ‘bool’>

List of booleans to indicate whether the individual bends in arm1 should be reversed

reverse_bends: ( bool, bool_ or int )

If True, all bends will be reversed. This has only an effect on asymmetric bends, such as splines

wg2b_shape: Shape

Shape for the north-east part of the waveguide

wg2a_shape: Shape

Shape for the north-west part of the waveguide

wg1b_shape: Shape

Shape for the south-east part of the waveguide

wg1a_shape: Shape

Shape for the south-west part of the waveguide

coupler_spacing: float

Spacing between the two waveguide centerlines.

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.dircoup import SBendDirectionalCoupler
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate
import ipkiss3.all as i3

wg_t = WireWaveguideTemplate()
wg_t.Layout(core_width=0.500, cladding_width=i3.TECH.WG.CLADDING_WIDTH, core_process=i3.TECH.PROCESS.WG)

C = SBendDirectionalCoupler(name="my_sbenddircoup3", trace_template1=wg_t, coupler_length=6.0)
layout = C.Layout(coupler_spacing=0.7, straight_after_bend=6.0, bend_angle=30.0)
layout.visualize(annotate=True)
../../_images/full-96.png
"""A more complicated example using asymmetric spline bends and different
waveguide definition in the two arms.
"""
import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.dircoup import SBendDirectionalCoupler
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate
from ipkiss3.all import SplineRoundingAlgorithm
import ipkiss3.all as i3

wg_t = WireWaveguideTemplate(name="my_wg_template4")
wg_t.Layout(core_width=0.500, cladding_width=i3.TECH.WG.CLADDING_WIDTH, core_process=i3.TECH.PROCESS.WG)

wg_t2 = WireWaveguideTemplate(name="my_wg_template5")
wg_t2.Layout(
    core_width=0.600, cladding_width=i3.TECH.WG.CLADDING_WIDTH, core_process=i3.TECH.PROCESS.WG
)

ra = SplineRoundingAlgorithm(adiabatic_angles=(30.0, 0))  # asymmetric

C = SBendDirectionalCoupler(
    name="my_sbenddircoup_4", trace_template1=wg_t, trace_template2=wg_t2, coupler_length=6.0
)

layout = C.Layout(
    coupler_spacing=0.7,
    bend_radius=5.0,
    manhattan=True,
    straight_after_bend=6.0,
    sbend_straight=1.0,
    bend_angle=30.0,
    rounding_algorithm=ra,
)
layout.visualize(annotate=True)
../../_images/full-97.png

Splitters

WgYSplitter

class picazzo3.wg.splitters.cell.WgYSplitter

Y-splitter PCell with branches that fan out specifiable angle.

Parameters:
trace_template: PCell and _WaveguideTemplate

Waveguide template of the Y splitter

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

The unique name of the pcell

Views

class Layout
Parameters:
split_stub_width: float and number > 0

Width of the stub where the waveguide split

center_waveguide_length: float and Real, number and number >= 0

Length of the center waveguide

taper_length: float and Real, number and number >= 0

Length of the tapered section

angle_out: float

Angle at which the waveguide exit the splitter.

cladding_width: float and number > 0

Width of the cladding. The default is taken from the trace template.

core_width: float and number > 0

Width of the core. The default is taken from the trace template.

bend_radius: float and number > 0
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

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.splitters import WgYSplitter

C = WgYSplitter(name="my_splitter90")
layout = C.Layout(bend_radius=4.5, angle_out=60.0)

layout.visualize(annotate=True)
../../_images/full-98.png

WgYCombiner

class picazzo3.wg.splitters.cell.WgYCombiner

Y-Combiner PCell with branches that fan out specifiable angle.

Parameters:
trace_template: PCell and _WaveguideTemplate

Waveguide template of the Y splitter

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

The unique name of the pcell

Views

class Layout
Parameters:
split_stub_width: float and number > 0

Width of the stub where the waveguide split

center_waveguide_length: float and Real, number and number >= 0

Length of the center waveguide

taper_length: float and Real, number and number >= 0

Length of the tapered section

angle_out: float

Angle at which the waveguide exit the splitter.

cladding_width: float and number > 0

Width of the cladding. The default is taken from the trace template.

core_width: float and number > 0

Width of the core. The default is taken from the trace template.

bend_radius: float and number > 0
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

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.splitters import WgYCombiner

C = WgYCombiner(name="my_combiner60")
layout = C.Layout(bend_radius=4.5, core_width=0.6, angle_out=60.0)
layout.visualize(annotate=True)
../../_images/full-99.png

WgY90Splitter

class picazzo3.wg.splitters.cell.WgY90Splitter

Y-splitter PCell with branches that fan out at right angles to the input waveguide.

Parameters:
trace_template: PCell and _WaveguideTemplate

Waveguide template of the Y splitter

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

The unique name of the pcell

Views

class Layout
Parameters:
split_stub_width: float and number > 0

Width of the stub where the waveguide split

center_waveguide_length: float and Real, number and number >= 0

Length of the center waveguide

taper_length: float and Real, number and number >= 0

Length of the tapered section

cladding_width: float and number > 0

Width of the cladding. The default is taken from the trace template.

core_width: float and number > 0

Width of the core. The default is taken from the trace template.

bend_radius: float and number > 0
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:
angle_out: float, locked

Angle at which the waveguide exit the splitter.

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.splitters import WgY90Splitter

C = WgY90Splitter(name="my_splitter90")
layout = C.Layout(bend_radius=4.5)

layout.visualize(annotate=True)
../../_images/full-100.png

WgY90Combiner

class picazzo3.wg.splitters.cell.WgY90Combiner

Y-shaped combiner with branches that come in at right angles to the output waveguide.

Parameters:
trace_template: PCell and _WaveguideTemplate

Waveguide template of the Y splitter

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

The unique name of the pcell

Views

class Layout
Parameters:
split_stub_width: float and number > 0

Width of the stub where the waveguide split

center_waveguide_length: float and Real, number and number >= 0

Length of the center waveguide

taper_length: float and Real, number and number >= 0

Length of the tapered section

cladding_width: float and number > 0

Width of the cladding. The default is taken from the trace template.

core_width: float and number > 0

Width of the core. The default is taken from the trace template.

bend_radius: float and number > 0
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:
angle_out: float, locked

Angle at which the waveguide exit the splitter.

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.splitters import WgY90Combiner

C = WgY90Combiner(name="my_combiner90")
layout = C.Layout(bend_radius=4.5, core_width=0.6)

layout.visualize(annotate=True)
../../_images/full-101.png

WgY180Splitter

class picazzo3.wg.splitters.cell.WgY180Splitter

Y-splitter PCell with branches that fan out at right angles to the input waveguide and then come back to the horizontal direction.

Parameters:
trace_template: PCell and _WaveguideTemplate

Waveguide template of the Y splitter

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

The unique name of the pcell

Views

class Layout
Parameters:
bend_radius: float and number > 0
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

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.splitters import WgY180Splitter

C = WgY180Splitter(name="my_splitter180")
layout = C.Layout(bend_radius=4.5)

layout.visualize(annotate=True)
../../_images/full-102.png

WgY180Combiner

class picazzo3.wg.splitters.cell.WgY180Combiner

Y-shaped combiner with branches that come in horizontally and combine with the output waveguide at right angles.

Parameters:
trace_template: PCell and _WaveguideTemplate

Waveguide template of the Y splitter

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

The unique name of the pcell

Views

class Layout
Parameters:
bend_radius: float and number > 0
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

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.splitters import WgY180Combiner

C = WgY180Combiner(name="my_combiner180")
layout = C.Layout(bend_radius=4.5)

layout.visualize(annotate=True)
../../_images/full-103.png

Waveguide Bundles

WaveguideBundle

class picazzo3.wg.bundle.cell.WaveguideBundle

Bundle of waveguides, routed together

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

the traces in this bundle

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

The unique name of the pcell

Views

class Layout
Parameters:
area_layer_on: ( bool, bool_ or int )

When True, the entire bundle area will be covered by all the cover layers.

trace_transformations: list and List with type restriction, allowed types: <class ‘ipkiss.geometry.transform.Transform’>

transformations to be applied to each of the traces

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

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

Examples

import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.wg.bundle import WaveguideBundle
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

wg_t = WireWaveguideTemplate()
wg_t.Layout(core_width=0.550, cladding_width=i3.TECH.WG.CLADDING_WIDTH, core_process=i3.TECH.PROCESS.WG)
trace = wg_t()
trace.Layout(shape=[(0.0, 0.0), (20.0, 5.0)])
trace_tfs = [i3.Translation(translation=(0.0, 10.0 * i)) for i in range(5)]
C = WaveguideBundle(traces=[trace] * 5)
lay = C.Layout(trace_transformations=trace_tfs)
lay.visualize(annotate=True)
../../_images/full-104.png

#pcell: picazzo3.wg.bundle.cell.TemplatedWaveguideBundle#

Spirals

SingleSpiral

class picazzo3.wg.spirals.cell.SingleSpiral

Single spiral class going from the inside to the outside. The trace template provided in the property trace_template is used to build a chain of waveguides.

Parameters:
n_o_loops: int and number > 0

Number of loops in the spiral

trace_template: PCell and _TraceTemplate

Trace template used in the chain.

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:
n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

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

Views

class Layout
Parameters:
shapes: list

List of shapes used to build the traces

flatten: ( bool, bool_ or int )

If true the instances are flattened

inner_size: Coord2 and number >= 0

Inner size of the the spiral, defaults to 3 * spacing + 2 * bend_radius, in each direction

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

spacing: float and Real, number and number >= 0

spacing between the individual loops.

spiral_center: Coord2

location of the center of the spiral.

Other Parameters:
auto_transform: locked

Examples

# Example of single spiral using a trace template.
import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.spirals import SingleSpiral
from ipkiss3 import all as i3

cell = SingleSpiral(n_o_loops=5, trace_template=i3.TECH.PCELLS.WG.DEFAULT)
layout = cell.Layout(inner_size=(20, 15), spacing=5.0, spiral_center=(2, 1))

layout.visualize(annotate=True)
../../_images/full-105.png

SingleSpiralRounded

class picazzo3.wg.spirals.cell.SingleSpiralRounded

Rounded single spiral class going from the inside to the outside. The trace template provided in the property trace_template is used to build a chain of waveguides. All the rounding properties can be set at the layout level.

Parameters:
n_o_loops: int and number > 0

Number of loops in the spiral

trace_template: PCell and _TraceTemplate

Trace template used in the chain.

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:
n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

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

Views

class Layout
Parameters:
shapes: list

List of shapes used to build the traces

flatten: ( bool, bool_ or int )

If true the instances are flattened

spacing: float and Real, number and number >= 0

spacing between the individual loops.

spiral_center: Coord2

location of the center of the spiral.

inner_size: Coord2 and number >= 0

Inner size of the the spiral, defaults to 3 * spacing + 2 * bend_radius, in each direction

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
auto_transform: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.spirals import SingleSpiralRounded
from ipkiss3 import all as i3

cell = SingleSpiralRounded(n_o_loops=5, trace_template=i3.TECH.PCELLS.WG.DEFAULT)
layout = cell.Layout(
    inner_size=(30.0, 30.0), bend_radius=3.0, manhattan=True, spacing=5.0, spiral_center=(2, 1)
)

layout.visualize(annotate=True)
../../_images/full-106.png

DoubleSpiral

class picazzo3.wg.spirals.cell.DoubleSpiral

Double spiral class with both access waveguides on the outside of the spiral. The trace template provided in the property trace_template is used to build a chain of waveguides.

Parameters:
n_o_loops: int and number > 0

Number of loops in the spiral

trace_template: PCell and _TraceTemplate

Trace template used in the chain.

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:
n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

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

Views

class Layout
Parameters:
shapes: list

List of shapes used to build the traces

flatten: ( bool, bool_ or int )

If true the instances are flattened

inner_size: Coord2 and number >= 0

Inner size of the the spiral, defaults to 3 * spacing + 2 * bend_radius, in each direction

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

stub_direction: List with value restriction, allowed values: [‘H’, ‘V’]
spacing: float and Real, number and number >= 0

spacing between the individual loops.

spiral_center: Coord2

location of the center of the spiral.

Other Parameters:
auto_transform: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.spirals import DoubleSpiral
from ipkiss3 import all as i3

cell = DoubleSpiral(n_o_loops=2, trace_template=i3.TECH.PCELLS.WG.DEFAULT)
layout = cell.Layout(
    inner_size=(15.0, 15.0), spacing=1.0, stub_direction="H", spiral_center=(0, 0)  # either H or V
)

layout.visualize(annotate=True)
../../_images/full-107.png

DoubleSpiralRounded

class picazzo3.wg.spirals.cell.DoubleSpiralRounded

Rounded double spiral class with both access waveguides on the outside of the spiral. The trace template provided in the property trace_template is used to build a chain of waveguides. All the rounding properties can be set at the layout level.

Parameters:
n_o_loops: int and number > 0

Number of loops in the spiral

trace_template: PCell and _TraceTemplate

Trace template used in the chain.

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:
n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

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

Views

class Layout
Parameters:
shapes: list

List of shapes used to build the traces

flatten: ( bool, bool_ or int )

If true the instances are flattened

spacing: float and Real, number and number >= 0

spacing between the individual loops.

spiral_center: Coord2

location of the center of the spiral.

stub_direction: List with value restriction, allowed values: [‘H’, ‘V’]
inner_size: Coord2 and number >= 0

Inner size of the the spiral, defaults to 3 * spacing + 2 * bend_radius, in each direction

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
auto_transform: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.spirals import DoubleSpiralRounded
from ipkiss3 import all as i3

cell = DoubleSpiralRounded(n_o_loops=2, trace_template=i3.TECH.PCELLS.WG.DEFAULT)
layout = cell.Layout(
    inner_size=(15.0, 15.0),
    bend_radius=3.0,
    manhattan=True,
    spacing=1.0,
    stub_direction="H",  # either H or V
    spiral_center=(0, 0),
)

layout.visualize(annotate=True)
../../_images/full-108.png

DoubleSpiralWithInCoupling

class picazzo3.wg.spirals.cell.DoubleSpiralWithInCoupling

Double spiral class with both access waveguides on the outside of the spiral. In coupling waveguides are added to the spiral, one at the east side and one at the west side. The trace template provided in the property trace_template is used to build a chain of waveguides.

Parameters:
n_o_loops: int and number > 0

Number of loops in the spiral

trace_template: PCell and _TraceTemplate

Trace template used in the chain.

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:
n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

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

Views

class Layout
Parameters:
incoupling_length: float and Real, number and number >= 0

length of the incoupling section.

shapes: list

List of shapes used to build the traces

flatten: ( bool, bool_ or int )

If true the instances are flattened

inner_size: Coord2 and number >= 0

Inner size of the the spiral, defaults to 3 * spacing + 2 * bend_radius, in each direction

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

stub_direction: List with value restriction, allowed values: [‘H’, ‘V’]
spacing: float and Real, number and number >= 0

spacing between the individual loops.

Other Parameters:
auto_transform: locked
spiral_center: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.spirals import DoubleSpiralWithInCoupling
from ipkiss3 import all as i3

cell = DoubleSpiralWithInCoupling(n_o_loops=3, trace_template=i3.TECH.PCELLS.WG.DEFAULT)
layout = cell.Layout(inner_size=(30.0, 30.0), incoupling_length=10.0, spacing=5)

layout.visualize(annotate=True)
../../_images/full-109.png

DoubleSpiralWithInCouplingRounded

class picazzo3.wg.spirals.cell.DoubleSpiralWithInCouplingRounded

Rounded double spiral class with both access waveguides on the outside of the spiral. In coupling waveguides are added to the spiral, one at the east side and one at the west side. The trace template provided in the property trace_template is used to build a chain of waveguides. All the rounding properties can be set at the layout level.

Parameters:
n_o_loops: int and number > 0

Number of loops in the spiral

trace_template: PCell and _TraceTemplate

Trace template used in the chain.

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:
n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

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

Views

class Layout
Parameters:
incoupling_length: float and Real, number and number >= 0

length of the incoupling section.

shapes: list

List of shapes used to build the traces

flatten: ( bool, bool_ or int )

If true the instances are flattened

spacing: float and Real, number and number >= 0

spacing between the individual loops.

stub_direction: List with value restriction, allowed values: [‘H’, ‘V’]
inner_size: Coord2 and number >= 0

Inner size of the the spiral, defaults to 3 * spacing + 2 * bend_radius, in each direction

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
auto_transform: locked
spiral_center: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.spirals import DoubleSpiralWithInCouplingRounded
from ipkiss3 import all as i3

cell = DoubleSpiralWithInCouplingRounded(n_o_loops=3, trace_template=i3.TECH.PCELLS.WG.DEFAULT)
layout = cell.Layout(
    inner_size=(30.0, 30.0), incoupling_length=10.0, bend_radius=3.0, manhattan=False, spacing=5.0
)

layout.visualize(annotate=True)
../../_images/full-110.png

FixedLengthSpiral

class picazzo3.wg.spirals.cell.FixedLengthSpiral

Spiral with incoupling sections that calculates its length. The total length is set by the property total_length and the inner size of the spiral will be adapted so that the total length of the spiral (including the incoupling sections) would be equal to total_length. The way this inner size is calculated can set using properties in the Layout view.

Parameters:
total_length: float and number > 0

Total design length of the spiral.

n_o_loops: int and number > 0

Number of loops in the spiral

trace_template: PCell and _TraceTemplate

Trace template used in the chain.

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:
n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

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

Views

class Layout

The inner size of the spiral is calculated by assuming a minimal inner_size and growing it in either the direction set by growth_direction. An error is raised when that is impossible to do with the set number of loops.

Parameters:
growth_direction: List with value restriction, allowed values: [‘H’, ‘V’]
incoupling_length: float and Real, number and number >= 0

length of the incoupling section.

shapes: list

List of shapes used to build the traces

flatten: ( bool, bool_ or int )

If true the instances are flattened

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

stub_direction: List with value restriction, allowed values: [‘H’, ‘V’]
spacing: float and Real, number and number >= 0

spacing between the individual loops.

Other Parameters:
auto_transform: locked
inner_size: locked
spiral_center: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.spirals import FixedLengthSpiral
from ipkiss3 import all as i3

cell = FixedLengthSpiral(total_length=4000, n_o_loops=6, trace_template=i3.TECH.PCELLS.WG.DEFAULT)

layout = cell.Layout(
    incoupling_length=10.0,
    spacing=4,
    stub_direction="H",  # either H or V
    growth_direction="V",  # either H or V
)

# Checking if the trace length is indeed correct
print(layout.trace_length())

layout.visualize(annotate=True)
../../_images/full-111.png

FixedLengthSpiralRounded

class picazzo3.wg.spirals.cell.FixedLengthSpiralRounded

Rounded spiral with incoupling sections that calculates its length. The total length is set by the property total_length and the inner size of the spiral will be adapted so that the total length of the spiral (including the incoupling sections) would be equal to total_length. The way this inner size is calculated can set using properties in the Layout view.

Parameters:
total_length: float and number > 0

Total design length of the spiral.

n_o_loops: int and number > 0

Number of loops in the spiral

trace_template: PCell and _TraceTemplate

Trace template used in the chain.

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:
n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

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

Views

class Layout

The inner size of the spiral is calculated by assuming a minimal inner_size and growing it in either the direction set by growth_direction. An error is raised when that is impossible to do with the set number of loops.

Parameters:
growth_direction: List with value restriction, allowed values: [‘H’, ‘V’]
incoupling_length: float and Real, number and number >= 0

length of the incoupling section.

shapes: list

List of shapes used to build the traces

flatten: ( bool, bool_ or int )

If true the instances are flattened

spacing: float and Real, number and number >= 0

spacing between the individual loops.

stub_direction: List with value restriction, allowed values: [‘H’, ‘V’]
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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
auto_transform: locked
spiral_center: locked
inner_size: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.wg.spirals import FixedLengthSpiralRounded
from ipkiss3 import all as i3

cell = FixedLengthSpiralRounded(total_length=4000, n_o_loops=6, trace_template=i3.TECH.PCELLS.WG.DEFAULT)

layout = cell.Layout(
    incoupling_length=10.0,
    bend_radius=10.0,
    spacing=4,
    stub_direction="H",  # either H or V
    growth_direction="V",  # either H or V
)

# Checking if the trace length is indeed correct
print(layout.trace_length())

layout.visualize(annotate=True)
../../_images/full-112.png

Placement and Routing

ConnectComponents

class ipkiss3.pcell.container.connect_components.ConnectComponents

Parametric Cell for logically connecting multiple components.

The user supplies a dictionary of the instances of child cells that need to be placed through the property child_cells. This dictionary maps the instance names to the PCell objects. The same PCell object can be used for multiple instances.

child_cells={ "ring1"  : my_ring1,
              "ring2"  : my_ring2,
              "spl"    : my_splitter,
              "com"    : my_splitter # the same cell is used both for splitting and combining
              }

The connectivity between the instances of the child cells is set by a list of tuples containing pairs of instance terms/port names. This list links is of the form instname:portname

links=[ ("spl:arm1",   "arm1:in1"),
        ("arm1:out1", "com:arm1"),
        ("spl:arm2",   "arm2:in1"),
        ("arm2:out1", "com:arm2")
        ]

All the terms of the instances are connected to outside terms. You can override the default external term names using the external_port_names property. There you can specify the individual names of the external terms. If no name is specified, the default pattern of ‘instname_termname’ will be used.

external_port_names={ "spl:in1"  : "input",
                      "com:out1" : "output"
                      }
Parameters:
links: list and List with type restriction, allowed types: [<class ‘collections.abc.Sequence’>]

list of tuples connecting the instances. Format is [(‘inst1:term1’,’inst2:term2’), …]

external_port_names: str

Map of the free instance terms/ports to the names of external terms/ports.Format is a dict {‘inst:term’ : ‘new_term_name’}.If a term/port is not listed, the format instname_portname will be used

child_cells:

dict to create the instances of the child cells.Format is {‘inst_name1’: PCell}

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

The unique name of the pcell

Examples

"""Here we connect 2 splitters and two rings into a RLMZI
We use the splitter twice but use two different rings.
"""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3  # noqa: F401
import numpy as np
import pylab as plt

from picazzo3.filters.ring import RingRectNotchFilter
from picazzo3.wg.splitters import WgY90Splitter

ring1 = RingRectNotchFilter()
cp = {"cross_coupling1": 0.4j, "straight_coupling1": (1 - 0.4**2) ** 0.5}
ring1.CircuitModel(coupler_parameters=[cp], ring_length=50.0)

ring2 = RingRectNotchFilter()
ring2.CircuitModel(coupler_parameters=[cp], ring_length=55.0)

splitter = WgY90Splitter()

pc = i3.ConnectComponents(
    child_cells={"spl": splitter, "com": splitter, "arm1": ring1, "arm2": ring2},
    links=[
        ("spl:arm1", "arm1:in"),
        ("arm1:out", "com:arm1"),
        ("spl:arm2", "arm2:in"),
        ("arm2:out", "com:arm2"),
    ],
)

cm = pc.CircuitModel()

# Caphe simulation
wavelengths = np.linspace(1.50, 1.6, 2001)
R = cm.get_smatrix(wavelengths=wavelengths)

plt.plot(wavelengths, np.abs(R["spl_center", "com_center"]) ** 2, "b", label="power")
plt.title("Waveguide transmission (Power)")
plt.xlabel(r"Wavelength ($\mu m$)")
plt.ylabel("Power transmission")
plt.legend()
plt.show()
../../_images/full-113.png

Views

class Layout
Parameters:
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

PlaceAndConnect

class picazzo3.routing.place_route.cell.PlaceAndConnect

Parametric Cell for manual placement and Logical connection of components.

The user supplies a dictionary of the instances of child cells that need to be placed through the property child_cells. This dictionary maps the instance names to the PCell objects. The same PCell object can be used for multiple instances.

child_cells={ "ring1"  : my_ring1,
              "ring2"  : my_ring2,
              "spl"    : my_splitter,
              "com"    : my_splitter # the same cell is used both for splitting and combining
              }

The connectivity between the instances of the child cells is set by a list of tuples containing pairs of instance terms/port names. This list links is of the form instname:portname

links=[ ("spl:arm1",   "arm1:in1"),
        ("arm1:out1", "com:arm1"),
        ("spl:arm2",   "arm2:in1"),
        ("arm2:out1", "com:arm2")
        ]

All the unused terms of the instances are connected to outside terms. You can override the default external term names using the external_port_names property. There you can specify the individual names of the external terms. If no name is specified, the default pattern of ‘instname_termname’ will be used.

external_port_names={ "spl:in1"  : "input",
                      "com:out1" : "output"
                      }

The PCell will place the waveguides and connect them logically in the netlist, but it is up to the user to verify whether the physical location of the connected ports matches.

In the layout, the placement is specified manually using the child_transformations property, which defines a transformation for each instance. If no transformation is supplied for an instance, no transformation will be applied. It is also possible to supply a coordinate (Coord2) or tuple, which will be interpreted as a position for placement.

child_transformations={"arm1": (50, -50),
                       "arm2": (50,50),
                       "com": i3.HMirror(0.0)+i3.Translation((100,0))}

Child cells that are logically connected but where the ports are not physically connected (e.g. by wrong placement), will be connected with visual flylines.

You can subclass this PCell in order to implement your own additional functionality, or define subcircuits that define their own child cells and child transformations. Warning: do not refer to self.child_cells from within an overridden _default_child_transformations - rather refer to the child cell directly (like self.my_child_cell).

Parameters:
links: list and List with type restriction, allowed types: [<class ‘collections.abc.Sequence’>]

list of tuples connecting the instances. Format is [(‘inst1:term1’,’inst2:term2’), …]

external_port_names: str

Map of the free instance terms/ports to the names of external terms/ports.Format is a dict {‘inst:term’ : ‘new_term_name’}.If a term/port is not listed, the format instname_portname will be used

child_cells:

dict to create the instances of the child cells. Format is {‘inst_name1’: PCell}

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

The unique name of the pcell

Views

class Layout
Parameters:
flyline_width: float and number > 0

line width of the flylines

flyline_layer: ( __Layer__ ), *None allowed*

layer to draw flylines of physically unconnected links

child_transformations:

dictionary with the transformation of each child instance.

netlist_view: NetlistView

Netlist view in the same cell on which this Layout is based. Normally no need to manually override.

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

Examples

"""Here we connect together 2 splitters and two rings to form a Ring-loaded
Mach-Zehnder. We use the splitter twice (as splitter and combiner) but use
two different rings. We calculate the transformations of the rings in such
a way that they attach correctly to the splitter and combiner
"""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3  # noqa: F401

from picazzo3.filters.ring import RingRect180DropFilter, RingRectNotchFilter
from picazzo3.wg.splitters import WgY180Splitter

from picazzo3.routing.place_route import PlaceAndConnect

from ipkiss.geometry.vector import vector_match_transform

# both rings have the same size
ring1 = RingRectNotchFilter()
ring1_layout = ring1.Layout()
ring2 = RingRect180DropFilter()
ring2_layout = ring2.Layout()
splitter = WgY180Splitter()
splitter_layout = splitter.Layout()

pr = PlaceAndConnect(
    child_cells={
        "spl": splitter,
        "com": splitter,
        "arm1": ring1,
        "arm2": ring2,
    },
    links=[
        ("spl:arm1", "arm1:in"),
        ("arm1:out", "com:arm1"),
        ("spl:arm2", "arm2:in1"),
        ("arm2:out1", "com:arm2"),
    ],
)

# manually calculate the transformations needed to attach the ports together
t_ring1 = vector_match_transform(ring1_layout.ports["in"], splitter_layout.ports["arm1"])
t_ring2 = vector_match_transform(ring2_layout.ports["in1"], splitter_layout.ports["arm2"])
t_com = (
    vector_match_transform(splitter_layout.ports["arm1"], ring1_layout.ports["out"], mirrored=True)
    + t_ring1
)

layout = pr.Layout(child_transformations={"arm1": t_ring1, "arm2": t_ring2, "com": t_com})
layout.visualize(annotate=True)
../../_images/full-114.png

Apertures

OpenAperture

class picazzo3.apertures.basic.cell.OpenAperture

Abstract base class for apertures into a slab area

Parameters:
aperture_trace_template: PCell and _TraceTemplate

template of the aperture cross-section

trace_template: PCell and _TraceTemplate

template of the start waveguide

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

The unique name of the pcell

Views

class Layout
Parameters:
transition_length: float and number > 0

transition length

center: Coord2

center coordinate

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

WireWgAperture

class picazzo3.apertures.basic.cell.WireWgAperture

Wire waveguide aperture into a slab area

Parameters:
aperture_trace_template: PCell and _TraceTemplate

template of the aperture cross-section

trace_template: PCell and _TraceTemplate

template of the start waveguide

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

The unique name of the pcell

Views

class Layout
Parameters:
aperture_trench_width: float and Real, number and number >= 0

Width of the cladding/trench extending from the core at the aperture side. Defaults to that of aperture_trace_template

trench_width: float and Real, number and number >= 0

Width of the cladding/trench extending from the core at the input side. Defaults to that of trace_template

transition_length: float and number > 0

transition length

center: Coord2

center coordinate

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

Examples

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.apertures.basic import WireWgAperture
from picazzo3.traces.wire_wg import WireWaveguideTemplate

wt = WireWaveguideTemplate()
wt.Layout(core_width=0.9, cladding_width=2 * i3.TECH.WG.WIRE_WIDTH + 0.9)
wwa = WireWgAperture(aperture_trace_template=wt)
wwa_lay = wwa.Layout()
wwa_lay.visualize(annotate=True)
../../_images/full-115.png

Containers and adapters

AutoTransitionPorts

AutoTransitionPorts

class picazzo3.container.transition_ports.AutoTransitionPorts

Pcell containing another PCell with transitions on all (labeled) ports, using AutoTraceTransitionFromPort. The target trace template is defined in trace_template.

Parameters:
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’>

Transitions (of type WaveguideTransitionFromPort) attached the the ports given in port_labels. Should be in the same order as port_labels.

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

contents: PCell

the contents of the container: the child cell

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:
trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

list of templates to apply to all ports

Examples

Tapering ports to a wider width:

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.traces.wire_wg import WireWaveguideTemplate

my_ring = RingRect180DropFilter()
my_ring.Layout()
from picazzo3.container.transition_ports import AutoTransitionPorts

wire_t = WireWaveguideTemplate()
wire_t.Layout(core_width=0.7, cladding_width=0.7 + 2 * 2.0)
my_ring_tapered_auto = AutoTransitionPorts(
    contents=my_ring, port_labels=["W0", "W1", "E0"], trace_template=wire_t
)
my_ring_tapered_auto_layout = my_ring_tapered_auto.Layout()
my_ring_tapered_auto_layout.visualize(annotate=True)
../../_images/full-116.png

Using _transition_parameters:

import si_fab.all as pdk  # noqa: F401
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.container.transition_ports import AutoTransitionPorts
import ipkiss3.all as i3

class MyCell(i3.PCell):
    class Layout(i3.LayoutView):
        def _generate_elements(self, elems):
            elems += i3.Circle(layer=i3.TECH.PPLAYER.SI)
            return elems

        def _generate_ports(self, ports):
            ports += i3.OpticalPort(name="in", position=(5.0, 0.0), trace_template=RibWaveguideTemplate())
            ports += i3.OpticalPort(
                name="out", position=(-5.0, 0.0), angle=180, trace_template=RibWaveguideTemplate()
            )
            return ports

trace_template = WireWaveguideTemplate()
auto_transition_ports = AutoTransitionPorts(
    contents=MyCell(),
    trace_template=trace_template,
)
auto_transition_ports_lv = auto_transition_ports.Layout(_transition_parameters={"length": 5.0})
auto_transition_ports_lv.visualize(annotate=True)
../../_images/full-117.png

Views

class Layout
Parameters:
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

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

FanoutPorts

FanoutPorts

class picazzo3.container.fanout_ports.FanoutPorts

Fanout Container. Routes all ports listed in port_labels into a given direction, with a given spacing. This is typically used to redirect a set of ports on a component to a regularly spaced array of ports. The user can use this to convert from one input/output waveguide pitch to another, or from irregular input/output waveguide positioning to a regular pitch.

If port_labels is not specified, all ports will be routed.

By default, the default waveguide template specified in the technology, TECH.PCELLS.WG.DEFAULT, will be used. This can be overridden by setting trace_template=None, in which case the trace templates of the ports of the contents will be used.

Parameters:
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.

auto_transition: ( bool, bool_ or int )

If True, automatically transition all ports of contents to the given trace template. If False, no transitions are applied, which might lead to a discontinuity in the waveguide. Also, if trace_template is None, no transitions are applied.

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

contents: PCell

the contents of the container: the child cell

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:
bundle: ( PCell ), locked, *None allowed*

bundle of waveguides added to the contents, generated based on the supplied waveguides list

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

list of templates to apply to all ports

Views

class Layout
Parameters:
target_coordinate: ( float ), *None allowed*

The coordinate where the endpoints of the waveguides are aligned. An x-coordinate when routing toEAST or WEST, a y-coordinate when routing to NORTH or SOUTH. When the waveguides extend beyond thetarget coordinate, the value is ignored.

max_s_bend_angle: float and ]0.0,90.0]
spacing: float

spacing between adjacent output waveguides

align_outputs: ( bool, bool_ or int )

If True, all outputs will be aligned to the outermost waveguide end, even if it extends beyond its target coordinate.

reference_coordinate: ( float ), *None allowed*

The coordinate where the first waveguide will be aligned. An x-coordinate if routed towards NORTH or SOUTH,a y-coordinate when routed towards EAST or WEST. If not specified, the x or y coordinate of the first port is taken.

output_direction: List with value restriction, allowed values: [C2(1.000000, 0.000000), C2(-1.000000, 0.000000), C2(0.000000, 1.000000), C2(0.000000, -1.000000)]

direction of the output waveguides. Should be EAST, WEST, NORTH or SOUTH

area_layer_on: ( bool, bool_ or int )

When True, the waveguide area will be covered by i3.Rectangles on all cover layers.

routes:

routes along which the waveguides will be generated

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
target_coordinates: locked
max_s_bend_angles: locked
spacings_from_reference: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.container.fanout_ports import FanoutPorts
from ipkiss3 import all as i3

my_ring = RingRect180DropFilter()
my_ring.Layout()

my_ring_fanout = FanoutPorts(contents=my_ring, port_labels=["E0", "E1"])

lay = my_ring_fanout.Layout(
    contents_transformation=i3.Rotation(rotation=10.0),
    flatten_contents=False,
    area_layer_on=False,  # if True, adds area layer on the bundle
    output_direction=i3.EAST,
    spacing=20.0,  # spacing between outputs
    reference_coordinate=-12.5,  # y-coordinate (or x for NORTH and SOUTH) of first waveguide
    target_coordinate=20.0,  # x-coordinate (or y for NORTH and SOUTH) of output port
    max_s_bend_angle=45.0,  # maximum angle of S-bend
    bend_radius=4.5,  # bend radius of waveguides
)
lay.visualize(annotate=True)
../../_images/full-118.png
import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.container.fanout_ports import FanoutPorts
from ipkiss3 import all as i3

wg_t1 = WireWaveguideTemplate()
wg_t1.Layout(core_width=0.55)
wg_t2 = WireWaveguideTemplate()
wg_t2.Layout(core_width=0.35)

my_ring = RingRect180DropFilter(name="ring_for_fanout", coupler_trace_templates=[wg_t1, wg_t2])
my_ring.Layout()

my_ring_fanout = FanoutPorts(
    contents=my_ring,
    port_labels=["E0", "E1"],
    trace_template=wg_t1,
    auto_transition=True,  # this adds transitions when the waveguide templates don't match.
)

layout = my_ring_fanout.Layout(
    contents_transformation=i3.Rotation(rotation=10.0),
    flatten_contents=False,
    area_layer_on=False,  # draws a cover layer between the waveguides
    output_direction=i3.DIRECTION.EAST,
    spacing=20.0,  # spacing between outputs
    max_s_bend_angle=60.0,  # maximum angle of S-bend
    bend_radius=10.0,  # bend radius of waveguides
)
layout.visualize(annotate=True)
../../_images/full-119.png

IoFibcoup

IoFibcoupGeneric

class picazzo3.container.iofibcoup.IoFibcoupGeneric

generic adapter for grating fiber couplers.

The component East and West ports are treated separately, and routed towards the East and West, respectively. For this routing, they go through several steps.

Here, we discuss the use for the East ports, but a similar set of parameters is available for the West ports. A lot of the properties are “plural”. This means that they can accept a list of parameters (e.g. east_trace_templates). This allows you to specify the template (or other parameter) for each individual port. The lists do not need to have the exact same length as the number of ports. If the number of elements is different from the number of ports in your component, the IoFibcoupGeneric will just cycle through the list. That way, if all the ports use the same value, you only need to supply a list of one element.

  1. First of all, the ports of the component are transitioned to a common trace template east_trace_templates. By default, it uses the standard waveguide definition defined in TECH.PCELLS.WG.DEFAULT. However, if an element of the list is None , it will use the trace template of the actual port. The same holds for east_transition_lengths. This can be manually specified by the user, but if a value in the list is set to None, the default length of that transition will be used.

  2. Then, the ports are fanned out to the fixed y_spacing of the fiber couplers. The length of that Fanout can be specified through east_fanout_length. Bend radius and rounding algorithm is shared between all ports in the parameter bend_radius and rounding_algorithm. If west_bundle_traces is True, the cover layers will be drawn over the Fanout. This can help reduce DRC errors.

  3. Then, the waveguides are transitioned to another waveguide template, specified in east_connect_trace_templates. By default, this is the same template as east_trace_templates, but it is possible to override it to use a lower loss multi-mode waveguide. The connection for which this waveguide is used is a simple straight connection, but depending on the chip layout it can have a long length. The transition lengths can be manually specified using the east_connect_transition_lengths.

  4. At the output, the waveguides are transitioned to the waveguide template of the individual input and output fiber couplers. The transition lengths from the connection waveguide to the grating coupler can be specified using east_fiber_coupler_transition_lengths.

  5. Finally, the circuit is terminated with the individual fiber couplers, specified in east_fiber_couplers

The same procedure and parameters are used for the west ports

Parameters:
west_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’> and ( _WaveguideTemplate or None ) and [1,inf]

The trace templates that will be used for the Fanout of the West ports. and the traces of the Fanout. If an entry of the list is ‘None’, the trace template of the individual port will be used. Defaults to [TECH.PCELLS.WG.DEFAULT]. The number of entries in the list should not be identical to the number of West port. If the component has fewer West ports, only the first entries in the list will be used. If the component has more West ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

east_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’> and ( _WaveguideTemplate or None ) and [1,inf]

The trace templates that will be used for the Fanout of the East ports. and the traces of the Fanout. If an entry of the list is ‘None’, the trace template of the individual port will be used. Defaults to [TECH.PCELLS.WG.DEFAULT]. The number of entries in the list should not be identical to the number of East port. If the component has fewer East ports, only the first entries in the list will be used. If the component has more East ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

west_connect_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’> and ( _WaveguideTemplate or None ) and [1,inf]

The trace templates that will be used for connecting the Fanout of the West ports. to the Grating couplers. If an entry of the list is ‘None’, the trace template of the individual port will be used. Defaults to the same as west_trace_templates. The number of entries in the list should not be identical to the number of West port. If the component has fewer West ports, only the first entries in the list will be used. If the component has more West ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

east_connect_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’> and ( _WaveguideTemplate or None ) and [1,inf]

The trace templates that will be used for connecting the Fanout of the East ports. to the Grating couplers. If an entry of the list is ‘None’, the trace template of the individual port will be used. Defaults to the same as east_trace_templates. The number of entries in the list should not be identical to the number of East port. If the component has fewer East ports, only the first entries in the list will be used. If the component has more East ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

west_fiber_coupler_external_port_name_maps: str

list of dicts to map the names of the West fiber coupler ports that will be exposed as external ports. The format is [dict1, dict2, …] with for each termination a dict of the form {‘port_name_on_termination’: ‘unique_external_port_name’, …}. the ‘unique_external_port_name’ string can contain the identifier {port}, which will be replaced by the corresponding port name on the component.The number of entries in the list should not be identical to the number of West port. If the component has fewer West ports, only the first entries in the list will be used. If the component has more West ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports. For example, the default is [{‘vertical_in’ : ‘{port}’}], which will map the port ‘vertical_in’ of the fiber coupler to the name of port on the component.

west_fiber_coupler_port_labels: List with type restriction, allowed types: <class ‘str’>

Port labels of the West fiber couplers connected to the ports of the contents. For fiber couplers with more than one port, the port labels should be concatenated with a ‘,’. For example, when using 2D grating couplers, the ports could be [‘in1,in2’, ‘in’]. This will use ports ‘in1’ and ‘in2’ of the first grating coupler, and ‘in’ of the second.By default, all the East ports of the fiber coupler are used. If an entry in the list is ‘None’, also the East ports of that fiber coupler are used. The number of entries in the list should not be identical to the number of West port. If the component has fewer West ports, only the first entries in the list will be used. If the component has more West ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

west_fiber_couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’> and [1,inf]

List of the fiber couplers to be attached on the West ports. Defaults to [TECH.IO.FIBCOUP.DEFAULT.PCELLS.DEFAULT_GRATING] The number of entries in the list should not be identical to the number of West port. If the component has fewer West ports, only the first entries in the list will be used. If the component has more West ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

east_fiber_coupler_external_port_name_maps: str

list of dicts to map the names of the East fiber coupler ports that will be exposed as external ports. The format is [dict1, dict2, …] with for each termination a dict of the form {‘port_name_on_termination’: ‘unique_external_port_name’, …}. the ‘unique_external_port_name’ string can contain the identifier {port}, which will be replaced by the corresponding port name on the component.The number of entries in the list should not be identical to the number of East port. If the component has fewer East ports, only the first entries in the list will be used. If the component has more East ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports. For example, the default is [{‘vertical_in’ : ‘{port}’}], which will map the port ‘vertical_in’ of the fiber coupler to the name of port on the component.

east_fiber_coupler_port_labels: List with type restriction, allowed types: <class ‘str’>

Port labels of the East fiber couplers connected to the ports of the contents. For fiber couplers with more than one port, the port labels should be concatenated with a ‘,’. For example, when using 2D grating couplers, the ports could be [‘in1,in2’, ‘in’]. This will use ports ‘in1’ and ‘in2’ of the first grating coupler, and ‘in’ of the second.By default, all the West ports of all the fiber couplers are used. If an entry in the list is ‘None’, also the west ports of that fiber coupler are used. The number of entries in the list should not be identical to the number of East port. If the component has fewer East ports, only the first entries in the list will be used. If the component has more East ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

east_fiber_couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’> and [1,inf]

List of the fiber couplers to be attached on the East ports. Defaults to [TECH.IO.FIBCOUP.DEFAULT.PCELLS.DEFAULT_GRATING] The number of entries in the list should not be identical to the number of East port. If the component has fewer East ports, only the first entries in the list will be used. If the component has more East ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

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

Labels of the ports to directed to the West. Set to None to process all West ports.

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

Labels of the ports to directed to the East. Set to None to process all East ports.

external_port_names: str

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

contents: PCell

the contents of the container: the child cell

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:
port_labels: locked

Examples

"""This example illustrates how the IoFibcoupGeneric properties can customize the routing in an IoColumn."""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.filters.mmi import MMIIdentical
from picazzo3.traces.wire_wg import WireWaveguideTemplate

wg_t1 = WireWaveguideTemplate()
wg_t1.Layout(core_width=7.0, cladding_width=8.0)
my_mmi = MMIIdentical(mmi_trace_template=wg_t1, n_inputs=1, n_outputs=5)
my_mmi.Layout(length=10.0, input_y_positions=[-1.0], output_y_positions=[-2.0, -1.0, 0.0, 1.0, 2.0])

from picazzo3.container.iofibcoup import IoFibcoupGeneric

from ipkiss3.pcell.blocks.iocolumn import IoColumn

my_column = IoColumn(name="iocol", adapter=IoFibcoupGeneric, max_n_o_lines=100)
my_column.Layout(south_east=(1500.0, 0.0))

my_column.add(my_mmi)
my_column.add(my_mmi, relative_offset=(0.0, 50.0), transformation=i3.Rotation(rotation=180.0))

my_column.Layout()

Views

class Layout
Parameters:
west_fiber_coupler_transition_lengths: ( number >= 0 or None ) and [1,inf]

The lengths of the transitions between the West straight connection traces and the fiber coupler. If an entry of the list is ‘None’, the default length of the transition of that type will be used. Defaults to [None]. The number of entries in the list should not be identical to the number of West port. If the component has fewer West ports, only the first entries in the list will be used. If the component has more West ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

east_fiber_coupler_transition_lengths: ( number >= 0 or None ) and [1,inf]

The lengths of the transitions between the East straight connection traces and the fiber coupler. If an entry of the list is ‘None’, the default length of the transition of that type will be used. Defaults to [None]. The number of entries in the list should not be identical to the number of East port. If the component has fewer East ports, only the first entries in the list will be used. If the component has more East ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

west_connect_transition_lengths: ( number >= 0 or None ) and [1,inf]

The lengths of the transitions between the West fanout ports and the straight connection traces to the fiber coupler. If an entry of the list is ‘None’, the default length of the transition of that type will be used. Defaults to [None]. The number of entries in the list should not be identical to the number of West port. If the component has fewer West ports, only the first entries in the list will be used. If the component has more West ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

east_connect_transition_lengths: ( number >= 0 or None ) and [1,inf]

The lengths of the transitions between the East fanout ports and the straight connection traces to the fiber coupler. If an entry of the list is ‘None’, the default length of the transition of that type will be used. Defaults to [None]. The number of entries in the list should not be identical to the number of East port. If the component has fewer East ports, only the first entries in the list will be used. If the component has more East ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

west_transition_lengths: ( number >= 0 or None ) and [1,inf]

The lengths of the transitions between the West ports of the component and the traces of the Fanout. If an entry of the list is ‘None’, the default length of the transition of that type will be used. Defaults to [None]. The number of entries in the list should not be identical to the number of West port. If the component has fewer West ports, only the first entries in the list will be used. If the component has more West ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

east_transition_lengths: ( number >= 0 or None ) and [1,inf]

The lengths of the transitions between the East ports of the component and the traces of the Fanout. If an entry of the list is ‘None’, the default length of the transition of that type will be used. Defaults to [None]. The number of entries in the list should not be identical to the number of East port. If the component has fewer East ports, only the first entries in the list will be used. If the component has more East ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

west_max_s_bend_angles: ]0.0,90.0]

Maximum angle for the S-bend in the fanout of the West ports.

east_max_s_bend_angles: ]0.0,90.0]

Maximum angles for the S-bend in the fanout of the East ports.

west_bundle_traces: ( bool, bool_ or int )

Combine the Fanout waveguides on the West in a bundle (adding Cover layers)?

west_align_fanout: ( bool, bool_ or int )

if True, the outputs of the waveguides in the West Fanout will be aligned.

west_fanout_lengths: ( number > 0 or None )

Lengths of the waveguides in the Fanout section of the West ports. If an entry in the list is None the lengths will be chosen automatically.If the required length is larger than the specified length, additional space will be used.

east_align_fanout: ( bool, bool_ or int )

if True, the outputs of the waveguides in the East Fanout will be aligned.

east_bundle_traces: ( bool, bool_ or int )

Combine the Fanout waveguides on the east in a bundle (adding Cover layers)?

east_fanout_lengths: ( number > 0 or None )

Lengths of the waveguides in the Fanout section of the East ports. If an entry in the list is None the lengths will be chosen automatically.If the required length is larger than the specified length, additional space will be used.

west_fiber_coupler_transformations: List with type restriction, allowed types: <class ‘ipkiss.geometry.transforms.no_distort.NoDistortTransform’>

Transformations of the individual West fiber couplers, relative to the y_spacing grid of the adapter. By default, a no transformation is applied. The number of entries in the list should not be identical to the number of West port. If the component has fewer West ports, only the first entries in the list will be used. If the component has more West ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

east_fiber_coupler_transformations: List with type restriction, allowed types: <class ‘ipkiss.geometry.transforms.no_distort.NoDistortTransform’>

Transformations of the individual East fiber couplers, relative to the y_spacing grid of the adapter. By default, a Horizontal Mirroring is applied. The number of entries in the list should not be identical to the number of East port. If the component has fewer East ports, only the first entries in the list will be used. If the component has more East ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

relative_offset: Coord2

Offset of the component as it is positioned by absolute_offset

absolute_offset: Coord2

Offset of the component from the (0,0) of the adapter.By default this offset will be calculated such that the component ports areX-aligned around the center and that the first West port is Y-aligned to the south_west.This is after the contents_transformation has been applied.

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

outline_layer: __Layer__

Layer on which to draw the block outline

draw_block_outline: ( bool, bool_ or int )

Draw the outline of the block when set to True

south_east: Coord2

Position of the south east corner of the block

south_west: Coord2

Position of the south west corner of the block

y_spacing: float and number > 0

The spacing between blocks

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
south_offset: int, locked

The y-offset between south_west & south_east, measured in units of y_spacing

width: float and Real, number and number >= 0, locked

The width of the block, calculated using south_west & south_east

Examples

"""This example illustrates the default settings of IoFibcoupGeneric,
by adding a Ring resonator to the adapter"""
import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter

my_ring = RingRect180DropFilter()

from picazzo3.container.iofibcoup import IoFibcoupGeneric

iofb = IoFibcoupGeneric(contents=my_ring)
iofb_layout = iofb.Layout()
iofb_layout.visualize(annotate=True)
../../_images/full-121.png
"""This example takes an MMI and encapsulates it in an IoFibcoup adapter.
It customizes several parameters of the adapter for individual tailoring of each input and output.
For instance, it explicitly lists the east ports of the MMI, skipping port 'out4'.
It also uses 2 different grating couplers on the East side, and 3 different transformations.
The cycling of the parameters will cause the fiber couplers to be repeated every even and odd line
(because there are 2 fiber couplers specified), while the transformation will repeat every 3 lines.
As a result, the 4 outputs of the MMI all have a different combination of fiber coupler
and its transformation."""

import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.container.iofibcoup import IoFibcoupGeneric
from picazzo3.filters.mmi import MMIIdentical

# normal waveguide template: single mode
wg_t = WireWaveguideTemplate()
wg_t.Layout(core_width=0.46)

# connect_template: wider to reduce losses
wgc_t = WireWaveguideTemplate()
wgc_t.Layout(core_width=2.0)

# input and output traces of the MMI
wg_t1 = WireWaveguideTemplate()
wg_t1.Layout(core_width=7.0, cladding_width=8.0)
wg_t2 = WireWaveguideTemplate()
wg_t2.Layout(core_width=0.6)

my_mmi = MMIIdentical(
    mmi_trace_template=wg_t1,
    input_trace_template=wg_t2,
    output_trace_template=wg_t2,
    n_inputs=1,
    n_outputs=5,
)
my_mmi.Layout(length=10.0, input_y_positions=[-1.0], output_y_positions=[-2.0, -1.0, 0.0, 1.0, 2.0])

from picazzo3.fibcoup.uniform import UniformLineGrating

my_gc = UniformLineGrating(trace_template=wg_t1)
my_gc2 = i3.TECH.IO.FIBCOUP.STRAIGHT.PCELLS.DEFAULT_GRATING_TM

iofb = IoFibcoupGeneric(
    contents=my_mmi,  # the component
    east_trace_templates=[wg_t],  # trace template for East fanout
    west_trace_templates=[wg_t],  # trace_template for West fanout
    east_connect_trace_templates=[wgc_t],  # trace template for wide connections
    west_connect_trace_templates=[wgc_t],  # trace template for wide connections
    east_fiber_couplers=[my_gc, my_gc2],  # fiber couplers East
    west_fiber_couplers=[my_gc],  # fiber couplers West
    east_port_labels=["out1", "out2", "out3", "out5"],  # skipping "out3""
    east_fiber_coupler_external_port_name_maps=[{}, {}, {"vertical_in": "Whooopeeee", "out": "Yuk"}, {}]
    # the line above will map the port names of the fiber coupler on the third port (out3)
    # to Whoopee and Yuk.
)

iofb_layout = iofb.Layout(
    contents_transformation=i3.Rotation(rotation=30.0),  # rotate the contents
    east_connect_transition_lengths=[30.0],  # transition lengths
    east_fiber_coupler_transformations=[
        i3.HMirror(),
        i3.HMirror() + i3.Translation((-30.0, -5.0)),
        i3.HMirror() + i3.Translation((-20.0, 5.0)),
    ],
    east_fiber_coupler_transition_lengths=[
        50.0,
        100.0,
        25.0,
    ],  # transition lengths between connection WG and the fiber coupler
    south_west=(-0.0, 50.0),  # south west corner of the adapter
    south_east=(1200.0, 100.0),  # south east corner of the adapter
    relative_offset=(-100.0, 50.0),  # offset of component from the center.
)

iofb_layout.visualize(annotate=True)
../../_images/full-122.png
"""This example uses IoFibcoupGeneric to route all ports to fiber couplers on the same side."""
import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter

my_ring = RingRect180DropFilter()

from picazzo3.container.iofibcoup.cell import IoFibcoupGeneric

iofb = IoFibcoupGeneric(
    contents=my_ring, west_port_labels=["out1", "in1", "out2", "in2"], east_port_labels=[]
)
iofb_layout = iofb.Layout(south_east=(1200.0, 0.0), relative_offset=(0.0, 50.0), west_bundle_traces=False)

iofb_layout.visualize(annotate=True)
../../_images/full-123.png

IoFibcoupEastWest

class picazzo3.container.iofibcoup.IoFibcoupEastWest

Adapter for grating fiber couplers East and West.

The component East and West ports are treated separately, and routed towards the East and West, respectively. For this routing, they go through several steps. The settings for the East and West grating couplers can be tuned.

Here, we discuss the use for the East ports, but a similar set of parameters is available for the West ports.

  1. First of all, the ports of the component are transitioned to a common trace template east_trace_template. By default, it uses the standard waveguide definition defined in TECH.PCELLS.WG.DEFAULT. However, if set to None , the trace will use the trace template of the actual port. The same holds for east_transition_length. This can be manually specified by the user, but if a value in the list is set to None, the default length of that type of transition will be used.

  2. Then, the ports are fanned out to the fixed y_spacing of the fiber couplers. The length of that Fanout can be specified through east_fanout_length. Similarly, bend radius and rounding algorithm can be set through the parameter bend_radius and rounding_algorithm. If west_bundle_traces is True, the cover layers will be drawn over the Fanout. This can help reduce DRC errors.

  3. Then, the waveguides are transitioned to another waveguide template, specified in east_connect_trace_template. By default, this is the same template as east_trace_template, but it is possible to override it to use a lower loss multi-mode waveguide. The connection for which this waveguide is used is a simple straight connection, but depending on the chip layout it can have a long length. The transition length can be manually specified using the east_connect_transition_length.

  4. At the output, the waveguides are transitioned to the waveguide template of the individual input and output fiber couplers. The transition length from the connection waveguide to the grating coupler can be specified using east_fiber_coupler_transition_length.

  5. Finally, the circuit is terminated with fiber couplers, using the PCell specified in east_fiber_coupler

The same procedure and parameters are used for the west ports

Parameters:
west_trace_template: ( PCell and _WaveguideTemplate ), *None allowed*

The trace template that will be used for the Fanout of the West ports. If ‘None’, the trace template of the individual port will be used. Defaults to TECH.PCELLS.WG.DEFAULT.

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

The trace template that will be used for the Fanout of the East ports. If ‘None’, the trace template of the individual port will be used. Defaults to TECH.PCELLS.WG.DEFAULT.

east_fiber_coupler_external_port_name_map: str

Dicts to map the names of the East fiber coupler ports that will be exposed as external ports. The dict is of the form {‘port_name_on_termination’: ‘unique_external_port_name’, …}. the ‘unique_external_port_name’ string can contain the identifier {port}, which will be replaced by the corresponding port name on the component. For example, the default is {‘vertical_in’ : ‘{port}’}, which will map the port ‘vertical_in’ of the fiber coupler to the name of port on the component.

west_fiber_coupler: PCell

Fiber coupler to be attached to the West ports. Defaults to TECH.IO.FIBCOUP.DEFAULT.PCELLS.DEFAULT_GRATING

east_fiber_coupler: PCell

Fiber coupler to be attached to the East ports. Defaults to TECH.IO.FIBCOUP.DEFAULT.PCELLS.DEFAULT_GRATING

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

The trace template that will be used for connecting the Fanout of the West ports. to the Grating couplers. If ‘None’, the trace template of the individual port will be used. Defaults to the same as west_trace_template.

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

The trace template that will be used for connecting the Fanout of the East ports. to the Grating couplers. If ‘None’, the trace template of the individual port will be used. Defaults to the same as east_trace_template.

west_fiber_coupler_external_port_name_map: str

Dicts to map the names of the West fiber coupler ports that will be exposed as external ports. The dict is of the form {‘port_name_on_termination’: ‘unique_external_port_name’, …}. the ‘unique_external_port_name’ string can contain the identifier {port}, which will be replaced by the corresponding port name on the component. For example, the default is {‘vertical_in’ : ‘{port}’}, which will map the port ‘vertical_in’ of the fiber coupler to the name of port on the component.

west_fiber_coupler_port_labels: List with type restriction, allowed types: <class ‘str’>

Port labels of the West fiber couplers connected to the ports of the contents. For fiber couplers with more than one port, the port labels should be concatenated with a ‘,’. For example, when using 2D grating couplers, the ports could be [‘in1,in2’, ‘in’]. This will use ports ‘in1’ and ‘in2’ of the first grating coupler, and ‘in’ of the second.By default, all the East ports of the fiber coupler are used. If an entry in the list is ‘None’, also the East ports of that fiber coupler are used. The number of entries in the list should not be identical to the number of West port. If the component has fewer West ports, only the first entries in the list will be used. If the component has more West ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

east_fiber_coupler_port_labels: List with type restriction, allowed types: <class ‘str’>

Port labels of the East fiber couplers connected to the ports of the contents. For fiber couplers with more than one port, the port labels should be concatenated with a ‘,’. For example, when using 2D grating couplers, the ports could be [‘in1,in2’, ‘in’]. This will use ports ‘in1’ and ‘in2’ of the first grating coupler, and ‘in’ of the second.By default, all the West ports of all the fiber couplers are used. If an entry in the list is ‘None’, also the west ports of that fiber coupler are used. The number of entries in the list should not be identical to the number of East port. If the component has fewer East ports, only the first entries in the list will be used. If the component has more East ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

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

Labels of the ports to directed to the West. Set to None to process all West ports.

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

Labels of the ports to directed to the East. Set to None to process all East ports.

external_port_names: str

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

contents: PCell

the contents of the container: the child cell

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:
west_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
east_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
west_connect_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
east_connect_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
west_fiber_coupler_external_port_name_maps: locked
west_fiber_couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
east_fiber_coupler_external_port_name_maps: locked
east_fiber_couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
port_labels: locked

Examples

"""This example illustrates how the IoFibcoupEastWest properties can customize
the routing in an IoColumn."""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.filters.mmi import MMIIdentical
from picazzo3.traces.wire_wg import WireWaveguideTemplate

wg_t1 = WireWaveguideTemplate()
wg_t1.Layout(core_width=7.0, cladding_width=8.0)
my_mmi = MMIIdentical(mmi_trace_template=wg_t1, n_inputs=1, n_outputs=5)
my_mmi.Layout(length=10.0, input_y_positions=[-1.0], output_y_positions=[-2.0, -1.0, 0.0, 1.0, 2.0])

from picazzo3.container.iofibcoup import IoFibcoupEastWest

from ipkiss3.pcell.blocks.iocolumn import IoColumn

my_column = IoColumn(name="iocol", adapter=IoFibcoupEastWest, max_n_o_lines=100)
my_column.Layout(south_east=(1200.0, 0.0))

my_column.add(my_mmi)
my_column.add(my_mmi, relative_offset=(0.0, 50.0), transformation=i3.Rotation(rotation=180.0))

layout = my_column.Layout()
layout.visualize(annotate=True)
../../_images/full-124.png

Views

class Layout
Parameters:
west_connect_transition_length: ( float and Real, number and number >= 0 ), *None allowed*

The lengths of the transitions between the West fanout ports and the straight connection traces to the fiber coupler. If ‘None’, the default length for that type of transition is used.

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

The lengths of the transitions between the East fanout ports and the straight connection traces to the fiber coupler. If ‘None’, the default length for that type of transition is used.

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

The lengths of the transitions between the West ports of the component and the traces of the Fanout. If ‘None’, the default length for that type of transition is used.

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

The lengths of the transitions between the East ports of the component and the traces of the Fanout. If ‘None’, the default length for that type of transition is used.

west_fiber_coupler_transformation: GenericNoDistortTransform
east_fiber_coupler_transformation: GenericNoDistortTransform
west_max_s_bend_angle: float and number > 0 and ]0.0,90.0]

Maximum angle for the S-bend in the fanout of the West ports.

east_max_s_bend_angle: float and number > 0 and ]0.0,90.0]

Maximum angle for the S-bend in the fanout of the East ports.

west_fanout_length: ( float and number > 0 ), *None allowed*

Length of the Fanout section of the West ports. If None the length will be chosen automatically.If the required length is larger than the specified length, additional space will be used.

east_fanout_length: ( float and number > 0 ), *None allowed*

Length of the Fanout section of the East ports. If None the length will be chosen automatically.If the required length is larger than the specified length, additional space will be used.

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

The length of the transition between the West straight connection traces and the fiber coupler. If ‘None’, the default length for that type of transition is used.

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

The length of the transition between the East straight connection traces and the fiber coupler. If ‘None’, the default length for that type of transition is used.

west_max_s_bend_angles: ]0.0,90.0]

Maximum angle for the S-bend in the fanout of the West ports.

east_max_s_bend_angles: ]0.0,90.0]

Maximum angles for the S-bend in the fanout of the East ports.

west_bundle_traces: ( bool, bool_ or int )

Combine the Fanout waveguides on the West in a bundle (adding Cover layers)?

west_fanout_lengths: ( number > 0 or None )

Lengths of the waveguides in the Fanout section of the West ports. If an entry in the list is None the lengths will be chosen automatically.If the required length is larger than the specified length, additional space will be used.

east_bundle_traces: ( bool, bool_ or int )

Combine the Fanout waveguides on the east in a bundle (adding Cover layers)?

east_fanout_lengths: ( number > 0 or None )

Lengths of the waveguides in the Fanout section of the East ports. If an entry in the list is None the lengths will be chosen automatically.If the required length is larger than the specified length, additional space will be used.

relative_offset: Coord2

Offset of the component as it is positioned by absolute_offset

absolute_offset: Coord2

Offset of the component from the (0,0) of the adapter.By default this offset will be calculated such that the component ports areX-aligned around the center and that the first West port is Y-aligned to the south_west.This is after the contents_transformation has been applied.

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

outline_layer: __Layer__

Layer on which to draw the block outline

draw_block_outline: ( bool, bool_ or int )

Draw the outline of the block when set to True

south_east: Coord2

Position of the south east corner of the block

south_west: Coord2

Position of the south west corner of the block

y_spacing: float and number > 0

The spacing between blocks

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
west_fiber_coupler_transition_lengths: locked
east_fiber_coupler_transition_lengths: locked
west_connect_transition_lengths: locked
east_connect_transition_lengths: locked
west_transition_lengths: locked
east_transition_lengths: locked
west_align_fanout: locked
east_align_fanout: locked
west_fiber_coupler_transformations: locked
east_fiber_coupler_transformations: locked
south_offset: int, locked

The y-offset between south_west & south_east, measured in units of y_spacing

width: float and Real, number and number >= 0, locked

The width of the block, calculated using south_west & south_east

Examples

"""This example illustrates the default settings of IoFibcoupEastWest ,
by adding a Ring resonator to the adapter"""
import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter

my_ring = RingRect180DropFilter()

from picazzo3.container.iofibcoup import IoFibcoupEastWest

iofb = IoFibcoupEastWest(contents=my_ring)
iofb_layout = iofb.Layout()
iofb_layout.visualize(annotate=True)
../../_images/full-125.png
"""This example takes an MMI and encapsulates it in an IoFibcoupEastWest adapter.
It customizes several parameters of the adapter for individual tailoring of the East and West outputs."""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.filters.mmi import MMIIdentical
from picazzo3.traces.wire_wg import WireWaveguideTemplate

# normal waveguide template: single mode
wg_t = WireWaveguideTemplate()
wg_t.Layout(core_width=0.46)

# connect_template: wider to reduce losses
wgc_t = WireWaveguideTemplate()
wgc_t.Layout(core_width=2.0)

# MMI
wg_t1 = WireWaveguideTemplate()
wg_t1.Layout(core_width=7.0, cladding_width=8.0)
# input and output traces of the MMI
wg_t2 = WireWaveguideTemplate()
wg_t2.Layout(core_width=0.6)

my_mmi = MMIIdentical(
    mmi_trace_template=wg_t1,
    input_trace_template=wg_t2,
    output_trace_template=wg_t2,
    n_inputs=1,
    n_outputs=5,
)
my_mmi.Layout(length=10.0, input_y_positions=[-1.0], output_y_positions=[-2.0, -1.0, 0.0, 1.0, 2.0])

# fiber coupler
from picazzo3.fibcoup.uniform import UniformLineGrating

my_gc = UniformLineGrating(trace_template=wg_t1)

from picazzo3.container.iofibcoup import IoFibcoupEastWest

iofb = IoFibcoupEastWest(
    contents=my_mmi,  # the component
    east_trace_template=wg_t,  # trace template for East fanout
    west_trace_template=wg_t,  # trace_template for West fanout
    east_connect_trace_template=wgc_t,  # trace template for wide connections
    west_connect_trace_template=wgc_t,  # trace template for wide connections
    east_fiber_coupler=my_gc,  # fiber coupler East
    west_fiber_coupler=my_gc,
)  # fiber coupler West

iofb_layout = iofb.Layout(
    contents_transformation=i3.Rotation(rotation=-30.0),  # rotate the contents
    east_connect_transition_length=30.0,  # transition length
    # transition length between connection WG and the fiber coupler
    east_fiber_coupler_transition_length=50.0,
    south_west=(-0.0, 0.0),  # south west corner of the adapter
    south_east=(1200.0, 0.0),  # south east corner of the adapter
    relative_offset=(-100.0, 70.0),  # offset of component from the center.
)
iofb_layout.visualize(annotate=True)
../../_images/full-126.png

IoFibcoup

class picazzo3.container.iofibcoup.IoFibcoup

Adapter for grating fiber couplers.

The component East and West ports are routed towards the East and West, respectively. For this routing, they go through several steps.

  1. First of all, the ports of the component are transitioned to a common trace template trace_template. By default, it uses the standard waveguide definition defined in TECH.PCELLS.WG.DEFAULT. However, if set to None , the trace will use the trace template of the actual port. The same holds for transition_length. This can be manually specified by the user, but if a value in the list is set to None, the default length of that type of transition will be used.

  2. Then, the ports are fanned out to the fixed y_spacing of the fiber couplers. The length of that Fanout can be specified through fanout_length. Similarly, bend radius and rounding algorithm can be set through the parameter bend_radius and rounding_algorithm. If bundle_traces is True, the cover layers will be drawn over the Fanout. This can help reduce DRC errors.

  3. Then, the waveguides are transitioned to another waveguide template, specified in east_connect_trace_template. By default, this is the same template as trace_template, but it is possible to override it to use a lower loss multi-mode waveguide. The connection for which this waveguide is used is a simple straight connection, but depending on the chip layout it can have a long length. The transition length can be manually specified using the connect_transition_length.

  4. At the output, the waveguides are transitioned to the waveguide template of the individual input and output fiber couplers. The transition length from the connection waveguide to the grating coupler can be specified using fiber_coupler_transition_length.

  5. Finally, the circuit is terminated with fiber couplers, using the PCell specified in fiber_coupler

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

The trace template that will be used for the Fanout of the East and West ports. If ‘None’, the trace template of the individual port will be used. Defaults to TECH.PCELLS.WG.DEFAULT.

fiber_coupler_external_port_name_map: str

Dicts to map the names of the fiber coupler ports that will be exposed as external ports. The dict is of the form {‘port_name_on_termination’: ‘unique_external_port_name’, …}. the ‘unique_external_port_name’ string can contain the identifier {port}, which will be replaced by the corresponding port name on the component. For example, the default is {‘vertical_in’ : ‘{port}’}, which will map the port ‘vertical_in’ of the fiber coupler to the name of port on the component.

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

The trace template that will be used for connecting the Fanout of the East and West ports. to the Grating couplers. If ‘None’, the trace template of the individual port will be used. Defaults to the same as trace_template.

fiber_coupler: PCell

Fiber coupler to be attached to the East and West ports. Defaults to TECH.IO.FIBCOUP.DEFAULT.PCELLS.DEFAULT_GRATING

west_fiber_coupler_port_labels: List with type restriction, allowed types: <class ‘str’>

Port labels of the West fiber couplers connected to the ports of the contents. For fiber couplers with more than one port, the port labels should be concatenated with a ‘,’. For example, when using 2D grating couplers, the ports could be [‘in1,in2’, ‘in’]. This will use ports ‘in1’ and ‘in2’ of the first grating coupler, and ‘in’ of the second.By default, all the East ports of the fiber coupler are used. If an entry in the list is ‘None’, also the East ports of that fiber coupler are used. The number of entries in the list should not be identical to the number of West port. If the component has fewer West ports, only the first entries in the list will be used. If the component has more West ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

east_fiber_coupler_port_labels: List with type restriction, allowed types: <class ‘str’>

Port labels of the East fiber couplers connected to the ports of the contents. For fiber couplers with more than one port, the port labels should be concatenated with a ‘,’. For example, when using 2D grating couplers, the ports could be [‘in1,in2’, ‘in’]. This will use ports ‘in1’ and ‘in2’ of the first grating coupler, and ‘in’ of the second.By default, all the West ports of all the fiber couplers are used. If an entry in the list is ‘None’, also the west ports of that fiber coupler are used. The number of entries in the list should not be identical to the number of East port. If the component has fewer East ports, only the first entries in the list will be used. If the component has more East ports, the list is just recycled. Therefore, it is allowed to use a list of just one element for multiple ports.

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

Labels of the ports to directed to the West. Set to None to process all West ports.

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

Labels of the ports to directed to the East. Set to None to process all East ports.

external_port_names: str

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

contents: PCell

the contents of the container: the child cell

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:
west_trace_template: PCell and _WaveguideTemplate, locked
east_trace_template: PCell and _WaveguideTemplate, locked
west_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
east_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
west_fiber_coupler: PCell, locked
east_fiber_coupler: PCell, locked
west_fiber_coupler_external_port_name_map: locked
west_connect_trace_template: PCell and _WaveguideTemplate, locked
east_connect_trace_template: PCell and _WaveguideTemplate, locked
east_fiber_coupler_external_port_name_map: locked
west_connect_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
east_connect_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
west_fiber_coupler_external_port_name_maps: locked
west_fiber_couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
east_fiber_coupler_external_port_name_maps: locked
east_fiber_couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
port_labels: locked

Examples

"""This example illustrates how the IoFibcoup properties can customize
the routing in an IoColumn."""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.filters.mmi import MMIIdentical
from picazzo3.traces.wire_wg import WireWaveguideTemplate

wg_t1 = WireWaveguideTemplate()
wg_t1.Layout(core_width=7.0, cladding_width=8.0)
my_mmi = MMIIdentical(mmi_trace_template=wg_t1, n_inputs=1, n_outputs=5)
my_mmi.Layout(length=10.0, input_y_positions=[-1.0], output_y_positions=[-2.0, -1.0, 0.0, 1.0, 2.0])

from picazzo3.container.iofibcoup import IoFibcoup

from ipkiss3.pcell.blocks.iocolumn import IoColumn

my_column = IoColumn(name="iocol", adapter=IoFibcoup, max_n_o_lines=100)
layout = my_column.Layout(south_east=(1400.0, 0.0))

my_column.add(my_mmi)
my_column.add(my_mmi, relative_offset=(0.0, 50.0), transformation=i3.Rotation(rotation=180.0))

layout.visualize(annotate=True)
../../_images/full-127.png

Views

class Layout
Parameters:
fiber_coupler_transition_length: ( float and Real, number and number >= 0 ), *None allowed*

The length of the transition between the straight connection traces and the fiber coupler. If ‘None’, the default length for that type of transition is used.

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

The length of the transitions between the fanout ports and the straight connection traces to the fiber coupler. If ‘None’, the default length for that type of transition is used.

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

The lengths of the transitions between the East and West ports of the component and the traces of the Fanout. If ‘None’, the default length for that type of transition is used.

max_s_bend_angle: float and number > 0 and ]0.0,90.0]

Maximum angle for the S-bend in the fanout.

fanout_length: float and number > 0

Length of the Fanout section

bundle_traces: ( bool, bool_ or int )

Combine the Fanout waveguides on the east in a bundle (adding Cover layers)?

west_max_s_bend_angle: float and number > 0 and ]0.0,90.0]

Maximum angle for the S-bend in the fanout of the West ports.

east_max_s_bend_angle: float and number > 0 and ]0.0,90.0]

Maximum angle for the S-bend in the fanout of the East ports.

fiber_coupler_transformation: GenericNoDistortTransform
west_max_s_bend_angles: ]0.0,90.0]

Maximum angle for the S-bend in the fanout of the West ports.

east_max_s_bend_angles: ]0.0,90.0]

Maximum angles for the S-bend in the fanout of the East ports.

west_fanout_lengths: ( number > 0 or None )

Lengths of the waveguides in the Fanout section of the West ports. If an entry in the list is None the lengths will be chosen automatically.If the required length is larger than the specified length, additional space will be used.

east_fanout_lengths: ( number > 0 or None )

Lengths of the waveguides in the Fanout section of the East ports. If an entry in the list is None the lengths will be chosen automatically.If the required length is larger than the specified length, additional space will be used.

relative_offset: Coord2

Offset of the component as it is positioned by absolute_offset

absolute_offset: Coord2

Offset of the component from the (0,0) of the adapter.By default this offset will be calculated such that the component ports areX-aligned around the center and that the first West port is Y-aligned to the south_west.This is after the contents_transformation has been applied.

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

outline_layer: __Layer__

Layer on which to draw the block outline

draw_block_outline: ( bool, bool_ or int )

Draw the outline of the block when set to True

south_east: Coord2

Position of the south east corner of the block

south_west: Coord2

Position of the south west corner of the block

y_spacing: float and number > 0

The spacing between blocks

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
east_fiber_coupler_transition_length: locked
west_connect_transition_length: locked
east_connect_transition_length: locked
west_fiber_coupler_transition_lengths: locked
east_fiber_coupler_transition_lengths: locked
west_connect_transition_lengths: locked
east_connect_transition_lengths: locked
west_transition_length: locked
east_transition_length: locked
west_transition_lengths: locked
east_transition_lengths: locked
west_fanout_length: locked
east_fanout_length: locked
west_fiber_coupler_transition_length: locked
west_fiber_coupler_transformation: locked
east_fiber_coupler_transformation: locked
west_bundle_traces: locked
west_align_fanout: locked
east_align_fanout: locked
east_bundle_traces: locked
west_fiber_coupler_transformations: locked
east_fiber_coupler_transformations: locked
south_offset: int, locked

The y-offset between south_west & south_east, measured in units of y_spacing

width: float and Real, number and number >= 0, locked

The width of the block, calculated using south_west & south_east

Examples

"""This example illustrates the default settings of IoFibcoup,
by adding a Ring resonator to the adapter"""
import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter

my_ring = RingRect180DropFilter()

from picazzo3.container.iofibcoup import IoFibcoup

iofb = IoFibcoup(contents=my_ring)
iofb_layout = iofb.Layout()

iofb_layout.visualize(annotate=True)
../../_images/full-128.png
"""This example takes an MMI and encapsulates it in an IoFibcoupadapter.
It customizes several parameters of the adapter for individual tailoring of the East and West outputs."""
import si_fab.all as pdk  # noqa: F401
from ipkiss3 import all as i3
from picazzo3.filters.mmi import MMIIdentical
from picazzo3.traces.wire_wg import WireWaveguideTemplate

# normal waveguide template: single mode
wg_t = WireWaveguideTemplate()
wg_t.Layout(core_width=0.46)

# connect_template: wider to reduce losses
wgc_t = WireWaveguideTemplate()
wgc_t.Layout(core_width=2.0)

# MMI
wg_t1 = WireWaveguideTemplate()
wg_t1.Layout(core_width=7.0, cladding_width=8.0)
# input and output traces of the MMI
wg_t2 = WireWaveguideTemplate()
wg_t2.Layout(core_width=0.6)

my_mmi = MMIIdentical(
    mmi_trace_template=wg_t1,
    input_trace_template=wg_t2,
    output_trace_template=wg_t2,
    n_inputs=1,
    n_outputs=5,
)
my_mmi.Layout(length=10.0, input_y_positions=[-1.0], output_y_positions=[-2.0, -1.0, 0.0, 1.0, 2.0])

# fiber coupler
from picazzo3.fibcoup.uniform import UniformLineGrating

my_gc = UniformLineGrating(trace_template=wg_t1)

from picazzo3.container.iofibcoup import IoFibcoup

iofb = IoFibcoup(
    contents=my_mmi,  # the component
    trace_template=wg_t,  # trace template for fanout
    connect_trace_template=wgc_t,  # trace template for wide connections
    fiber_coupler=my_gc,  # fiber coupler
)

iofb_layout = iofb.Layout(
    contents_transformation=i3.Rotation(rotation=-10.0),  # rotate the contents
    connect_transition_length=30.0,  # transition length
    fiber_coupler_transition_length=50.0,  # transition length between connection WG and the fiber coupler
    south_west=(-0.0, 0.0),  # south west corner of the adapter
    south_east=(1200.0, 0.0),  # south east corner of the adapter
    relative_offset=(0.0, 70.0),  # offset of component from the center.
)
iofb_layout.visualize(annotate=True)
../../_images/full-129.png
"""This example shows how to use fiber couplers that don't have their waveguide port facing towards the east.

We use a fiber coupler with both an east-facing and a west-facing port here,
but this example can easily be applied to other couplers.
"""

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

# normal waveguide template: single mode
wg_t = WireWaveguideTemplate()
wg_t.Layout(core_width=0.46)

# MMI
wg_t1 = WireWaveguideTemplate()
wg_t1.Layout(core_width=7.0, cladding_width=8.0)
# input and output traces of the MMI
wg_t2 = WireWaveguideTemplate()
wg_t2.Layout(core_width=0.6)

my_mmi = MMI1x2(
    mmi_trace_template=wg_t1,
    input_trace_template=wg_t2,
    output_trace_template=wg_t2,
)
my_mmi.Layout(length=10.0, trace_spacing=2.0)

# fiber coupler
from picazzo3.fibcoup.uniform import UniformLineGrating

my_gc = UniformLineGrating(trace_template=wg_t1)

from picazzo3.container.iofibcoup import IoFibcoup

# we want to use the west-facing 'in' port of the fiber coupler

iofb = IoFibcoup(
    contents=my_mmi,  # the component
    trace_template=wg_t,  # trace template for fanout
    fiber_coupler=my_gc,  # fiber coupler
    west_fiber_coupler_port_labels=["in"],
    east_fiber_coupler_port_labels=["in"],
)

iofb_layout = iofb.Layout(
    south_west=(0.0, 0.0),  # south west corner of the adapter
    south_east=(500.0, 0.0),  # south east corner of the adapter
    # we need to mirror the fiber coupler so the 'in' port faces east
    fiber_coupler_transformation=i3.HMirror(),
)
iofb_layout.visualize(annotate=True)
../../_images/full-130.png

ContainerWithWaveguides

ContainerWithWaveguides

class picazzo3.container.container_waveguides.ContainerWithWaveguides

Abstract base class for containers which add waveguides to the contents, such as fanout or for routing ports in certain directions

Waveguides are provided as a list of child cells. They will be bundled if bundled=True.

Parameters:
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.

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

waveguides added to the contents

auto_transition: ( bool, bool_ or int )

If True, automatically transition all ports of contents to the given trace template. If False, no transitions are applied, which might lead to a discontinuity in the waveguide. Also, if trace_template is None, no transitions are applied.

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

contents: PCell

the contents of the container: the child cell

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:
trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

list of templates to apply to all ports

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.container.container_waveguides import ContainerWithWaveguides
from ipkiss3 import all as i3

my_ring = RingRect180DropFilter(name="my_ring1")
my_ring_layout = my_ring.Layout()

port_labels = ["E1", "W0"]

wgs = []
for pl in port_labels:
    p = my_ring_layout.ports[pl]
    shape = i3.Shape(points=[p.position])
    shape.add_polar(10.0, p.angle_deg)
    wg = i3.Waveguide()
    wg.Layout(shape=shape)
    wgs.append(wg)

my_container = ContainerWithWaveguides(
    name="my_waveguide_container1", contents=my_ring, waveguides=wgs, port_labels=port_labels
)
layout = my_container.Layout()
layout.visualize(annotate=True)
../../_images/full-131.png

Views

class Layout
Parameters:
routes:

routes along which the waveguides will be generated

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

ContainerWithWaveguideBundle

class picazzo3.container.container_waveguides.ContainerWithWaveguideBundle

Abstract base class for containers which add waveguides to the contents, such as fanout or for routing ports in certain directions

Waveguides are provided as a list of child cells. They will be bundled if bundled = True.

Parameters:
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.

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

waveguides added to the contents

auto_transition: ( bool, bool_ or int )

If True, automatically transition all ports of contents to the given trace template. If False, no transitions are applied, which might lead to a discontinuity in the waveguide. Also, if trace_template is None, no transitions are applied.

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

contents: PCell

the contents of the container: the child cell

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:
bundle: ( PCell ), locked, *None allowed*

bundle of waveguides added to the contents, generated based on the supplied waveguides list

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

list of templates to apply to all ports

Views

class Layout
Parameters:
area_layer_on: ( bool, bool_ or int )

When True, the waveguide area will be covered by i3.Rectangles on all cover layers.

routes:

routes along which the waveguides will be generated

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

ContainerWithRoundedWaveguides

class picazzo3.container.container_waveguides.ContainerWithRoundedWaveguides

Container with waveguides (picazzo3.container.container_waveguides.ContainerWithWaveguides) which generates its waveguides from a given waveguide_template and routes. You can specify a bend radius and rounding algorithm for the waveguides in the Layout view.

Parameters:
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.

auto_transition: ( bool, bool_ or int )

If True, automatically transition all ports of contents to the given trace template. If False, no transitions are applied, which might lead to a discontinuity in the waveguide. Also, if trace_template is None, no transitions are applied.

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

contents: PCell

the contents of the container: the child cell

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:
waveguides: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

list of templates to apply to all ports

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.container.container_waveguides import ContainerWithRoundedWaveguides
from ipkiss3 import all as i3

my_ring = RingRect180DropFilter(name="my_ring3")
my_ring_layout = my_ring.Layout()

port_labels = ["E1", "W0"]

shapes = []
for pl in port_labels:
    p = my_ring_layout.ports[pl]
    shape = i3.Shape(points=[p.position])
    shape.add_polar(15.0, p.angle_deg)
    shape.add_polar(15.0, p.angle_deg + 90.0)
    shapes.append(shape)

my_container = ContainerWithRoundedWaveguides(
    name="my_waveguide_container3", contents=my_ring, port_labels=port_labels
)
layout = my_container.Layout(routes=shapes, bend_radius=10.0)

layout.visualize(annotate=True)
../../_images/full-132.png

Views

class Layout
Parameters:
routes:

routes along which the waveguides will be generated

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

ContainerWithRoundedWaveguideBundle

class picazzo3.container.container_waveguides.ContainerWithRoundedWaveguideBundle

Container with waveguide bundle (picazzo3.container.container_waveguides.ContainerWithWaveguideBundle) which generates its waveguides from a given waveguide_template and routes and rounds the bends. You can specify a bend radius and rounding algorithm for the waveguides in the Layout view.

Parameters:
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.

auto_transition: ( bool, bool_ or int )

If True, automatically transition all ports of contents to the given trace template. If False, no transitions are applied, which might lead to a discontinuity in the waveguide. Also, if trace_template is None, no transitions are applied.

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

contents: PCell

the contents of the container: the child cell

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:
bundle: ( PCell ), locked, *None allowed*

bundle of waveguides added to the contents, generated based on the supplied waveguides list

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

list of templates to apply to all ports

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.container.container_waveguides import ContainerWithRoundedWaveguideBundle
from ipkiss3 import all as i3

my_ring = RingRect180DropFilter(name="my_ring_4")
my_ring_layout = my_ring.Layout()

port_labels = ["E0", "E1"]

shapes = []
for pl in port_labels:
    p = my_ring_layout.ports[pl]
    shape = i3.Shape(points=[p.position])
    shape.add_polar(15.0, p.angle_deg)
    shape.add_polar(15.0, p.angle_deg + 30.0)
    shapes.append(shape)

my_container = ContainerWithRoundedWaveguideBundle(
    name="my_waveguide_container_4", contents=my_ring, port_labels=port_labels
)
layout = my_container.Layout(routes=shapes, bend_radius=10.0, area_layer_on=True)
layout.visualize(annotate=True)
../../_images/full-133.png

Views

class Layout
Parameters:
area_layer_on: ( bool, bool_ or int )

When True, the waveguide area will be covered by i3.Rectangles on all cover layers.

routes:

routes along which the waveguides will be generated

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

ExtendPorts

ExtendPorts

class picazzo3.container.extend_ports.ExtendPorts

Extends all the ports listed in port_labels with a waveguide of a given length.

This length is specified in extension_length of the Layout View.

A common trace template for all ports is specified through trace_template. When this is set to None (the default), the trace templates of the ports of the contents will be used.

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

Template for all ports. If None, the trace templates of the ports will be used

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

waveguides added to the contents

auto_transition: ( bool, bool_ or int )

If True, automatically transition all ports of contents to the given trace template. If False, no transitions are applied, which might lead to a discontinuity in the waveguide. Also, if trace_template is None, no transitions are applied.

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

contents: PCell

the contents of the container: the child cell

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:
bundle: ( PCell ), locked, *None allowed*

bundle of waveguides added to the contents, generated based on the supplied waveguides list

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

list of templates to apply to all ports

Views

class Layout
Parameters:
extension_length: float and number > 0

Length by which the ports are extended

area_layer_on: ( bool, bool_ or int )

When True, the waveguide area will be covered by i3.Rectangles on all cover layers.

routes:

routes along which the waveguides will be generated

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:
extension_lengths: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.container.extend_ports import ExtendPorts

wg_t1 = WireWaveguideTemplate()
wg_t1.Layout(core_width=0.55)
wg_t2 = WireWaveguideTemplate()
wg_t2.Layout(core_width=0.35)

my_ring = RingRect180DropFilter(name="ring_for_fanout", coupler_trace_templates=[wg_t1, wg_t2])
my_ring.Layout()

port_labels = ["E1", "E0"]

my_container = ExtendPorts(contents=my_ring, port_labels=port_labels, auto_transition=True)
layout = my_container.Layout(extension_length=20.0, area_layer_on=False)
layout.visualize(annotate=True)
../../_images/full-134.png
import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.container.extend_ports import ExtendPorts

wg_t1 = WireWaveguideTemplate()
wg_t1.Layout(core_width=0.55)
wg_t2 = WireWaveguideTemplate()
wg_t2.Layout(core_width=0.35)

my_ring = RingRect180DropFilter(name="ring_for_fanout", coupler_trace_templates=[wg_t1, wg_t2])
my_ring.Layout()

port_labels = ["E1", "E0"]

my_container = ExtendPorts(
    contents=my_ring, port_labels=port_labels, trace_template=wg_t1, auto_transition=False  # Default
)
layout = my_container.Layout(extension_length=20.0, area_layer_on=True)
layout.visualize(annotate=True)
../../_images/full-135.png

Route Ports

RoutePortsEastWest

class picazzo3.container.route_ports.RoutePortsEastWest

Routes ports to the east or west side of a component

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

Labels of the ports to directed to the West. Set to None to process all West ports.

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

Labels of the ports to directed to the East. Set to None to process all East ports.

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.

auto_transition: ( bool, bool_ or int )

If True, automatically transition all ports of contents to the given trace template. If False, no transitions are applied, which might lead to a discontinuity in the waveguide. Also, if trace_template is None, no transitions are applied.

external_port_names: str

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

contents: PCell

the contents of the container: the child cell

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:
bundle: ( PCell ), locked, *None allowed*

bundle of waveguides added to the contents, generated based on the supplied waveguides list

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

list of templates to apply to all ports

port_labels: locked

Views

class Layout
Parameters:
target_coordinate_west: ( float ), *None allowed*

The coordinate where the west routes are aligned

target_coordinate_east: ( float ), *None allowed*

The coordinate where the east routes are aligned

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

Port Label of port that serves as y reference

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

Port Label of port that serves as y reference

spacing: float and number > 0

Distance between the endpoints of the routes

area_layer_on: ( bool, bool_ or int )

When True, the waveguide area will be covered by i3.Rectangles on all cover layers.

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
routes: locked

Examples

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.container.route_ports import RoutePortsEastWest

my_ring = RingRect180DropFilter()

my_ring_ew = RoutePortsEastWest(
    contents=my_ring,
    east_port_labels=["E0", "E1", "W1"],  # ports to be routed eastwards
    west_port_labels=["W0"],  # ports to be routed westward
)
layout = my_ring_ew.Layout()
layout.visualize(annotate=True)
../../_images/full-136.png
"""The area_layer_on can be used to disable the
drawing of the area between the layers.
"""
import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.container.route_ports import RoutePortsEastWest

my_ring = RingRect180DropFilter()

my_ring_ew = RoutePortsEastWest(
    contents=my_ring,
    east_port_labels=["E0", "E1", "W1"],  # ports to be routed eastwards
    west_port_labels=["W0"],  # ports to be routed westward
)
layout = my_ring_ew.Layout(area_layer_on=False)
layout.visualize(annotate=True)
../../_images/full-137.png
"""The target_coordinate_east, target_coordinate_west parameters
can be used to specify where the routes should align"""

import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.container.route_ports import RoutePortsEastWest

my_ring = RingRect180DropFilter()

my_ring_ew = RoutePortsEastWest(
    contents=my_ring,
    east_port_labels=["E0", "E1", "W1"],  # ports to be routed eastwards
    west_port_labels=["W0"],  # ports to be routed westward
)
layout = my_ring_ew.Layout(target_coordinate_east=-30.0, target_coordinate_west=30.0)
layout.visualize(annotate=True)
../../_images/full-138.png

RoutePortsAroundCorner

class picazzo3.container.route_ports.RoutePortsAroundCorner

Routes ports around a corner of the component in a given direction.

Parameters:
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.

auto_transition: ( bool, bool_ or int )

If True, automatically transition all ports of contents to the given trace template. If False, no transitions are applied, which might lead to a discontinuity in the waveguide. Also, if trace_template is None, no transitions are applied.

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

contents: PCell

the contents of the container: the child cell

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:
bundle: ( PCell ), locked, *None allowed*

bundle of waveguides added to the contents, generated based on the supplied waveguides list

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

list of templates to apply to all ports

Views

class Layout
Parameters:
first_step_spacing: float and number > 0

The spacing between the routes ( in the section after the first bend )

reference_coordinate_first_step: float

The minimum 1D coordinate of the first bend of the routes

first_step_direction: List with value restriction, allowed values: [C2(0.000000, 1.000000), C2(0.000000, -1.000000), C2(1.000000, 0.000000), C2(-1.000000, 0.000000)]

The direction to take when rounding the corner. By default it is 90 degrees off the output direction

target_coordinate: ( float ), *None allowed*

The coordinate where the endpoints of the waveguides are aligned. An x-coordinate when routing toEAST or WEST, a y-coordinate when routing to NORTH or SOUTH. When the waveguides extend beyond thetarget coordinate, the value is ignored.

max_s_bend_angle: float and ]0.0,90.0]
spacing: float

spacing between adjacent output waveguides

align_outputs: ( bool, bool_ or int )

If True, all outputs will be aligned to the outermost waveguide end, even if it extends beyond its target coordinate.

reference_coordinate: ( float ), *None allowed*

The coordinate where the first waveguide will be aligned. An x-coordinate if routed towards NORTH or SOUTH,a y-coordinate when routed towards EAST or WEST. If not specified, the x or y coordinate of the first port is taken.

output_direction: List with value restriction, allowed values: [C2(1.000000, 0.000000), C2(-1.000000, 0.000000), C2(0.000000, 1.000000), C2(0.000000, -1.000000)]

direction of the output waveguides. Should be EAST, WEST, NORTH or SOUTH

area_layer_on: ( bool, bool_ or int )

When True, the waveguide area will be covered by i3.Rectangles on all cover layers.

routes:

routes along which the waveguides will be generated

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

manhattan: ( bool, bool_ or int )

Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.

angle_step: float and number > 0

Angle step for rounding.

rounding_algorithm:

Rounding algorithm used to generate the bends. Can be circular, spline, ….

bend_radius: float and number > 0

Bend radius for the auto-generated bends.

Other Parameters:
target_coordinates: locked
max_s_bend_angles: locked
spacings_from_reference: locked

Examples

import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.container.route_ports import RoutePortsAroundCorner

def annotate_label(ax, text, pos, **kwargs):
    ax.annotate(
        text, xy=pos, horizontalalignment="center", verticalalignment="center", xytext=pos, **kwargs
    )

def annotate_direction(ax, text, direction=i3.DIRECTION.NORTH, pos=(0.0, 0.0), **kwargs):
    kws = {
        "ha": "center",
        "va": "center",
        "rotation": i3.angle_deg(direction),
        "bbox": {
            "boxstyle": "rarrow,pad=0.3",
            "fc": "white",
        },
        "size": 15,
    }

    kws.update(kwargs)
    return ax.text(pos[0], pos[1], text, **kws)

def annotate_distance(
    ax, text, start=(0.0, 0.0), end=(0.0, 10.0), offset=0.0, offset_direction=i3.DIRECTION.EAST, **kwargs
):
    start = (offset_direction * offset) + start
    end = (offset_direction * offset) + end
    ax.annotate(
        "",
        xy=tuple(start),
        xycoords="data",
        xytext=tuple(end),
        textcoords="data",
        arrowprops={"arrowstyle": "<->"},
    )

    text_pos = tuple((e + s) / 2.0 for e, s in zip(start, end))

    if len(text) > 0:
        ax.annotate(text, xy=text_pos, xytext=text_pos, xycoords="data", textcoords="data")

def annotate_y(ax, y, label="", **kwargs):
    return ax.axhline(y, linestyle="dashed", label=label, **kwargs)

def annotate_x(ax, x, label="", **kwargs):
    return ax.axvline(x, linestyle="dashed", label=label, **kwargs)

def annotate(
    ax,
    output_direction=None,
    size_info=None,
    first_step_direction=None,
    first_step_spacing=None,
    reference_coordinate=None,
    reference_coordinate_first_step=None,
    target_coordinate=None,
    spacing=None,
    ports=None,
):
    annotate_label(ax, "contents", (0.0, 0.0), bbox={"fc": "white", "boxstyle": "round", "ec": "black"})

    legend_handles = []
    legend_labels = []
    if first_step_direction is not None:
        pos = (size_info.west - 10.0, (size_info.south + size_info.north) / 2.0)
        annotate_direction(ax, "first_step_direction", direction=first_step_direction, pos=pos)

    if output_direction is not None:
        pos = ((size_info.west + size_info.east) / 2.0, size_info.south - 5.0)
        annotate_direction(ax, "output_direction", direction=output_direction, pos=pos)

    if reference_coordinate is not None:
        legend_handles.append(annotate_y(ax, reference_coordinate, label="reference_coordinate", c="r"))
        legend_labels.append("reference_coordinate")

    if reference_coordinate_first_step is not None:
        legend_handles.append(
            annotate_x(
                ax, reference_coordinate_first_step, label="reference_coordinate_first_step", c="black"
            )
        )
        legend_labels.append("reference_coordinate_first_step")

    if target_coordinate is not None:
        legend_handles.append(annotate_x(ax, target_coordinate, label="target_coordinate"))
        legend_labels.append("target_coordinate")

    if spacing is not None:
        end = tuple(ports.east_ports[0].position)
        start = tuple(ports.east_ports[1].position)
        annotate_distance(ax, "spacing = {}".format(spacing), start=start, end=end, offset=1.0)

    ax.legend(legend_handles, legend_labels)

def visualize_routearoundports(layout):
    size_info = layout.size_info()
    margin = 15.0
    west_margin, east_margin, south_margin, north_margin = [margin] * 4
    box = (
        size_info.west - west_margin,
        size_info.east + east_margin,
        size_info.south - south_margin,
        size_info.north + north_margin,
    )

    fig = layout.visualize(show=False, box=box, canvas_size=(1000.0, 1000.0))
    ax = fig.get_axes()[-1]
    ax.set_aspect("equal", "datalim")

    annotate(
        ax,
        reference_coordinate=layout.reference_coordinate,
        reference_coordinate_first_step=layout.reference_coordinate_first_step,
        first_step_spacing=layout.first_step_spacing,
        target_coordinate=layout.target_coordinate,
        first_step_direction=layout.first_step_direction,
        spacing=layout.spacing,
        output_direction=layout.output_direction,
        ports=layout.ports,
        size_info=size_info,
    )

    from matplotlib.pyplot import show

    show()

my_ring = RingRect180DropFilter()

my_ring_routed = RoutePortsAroundCorner(contents=my_ring, port_labels=["W1", "W0"])  # ports to be routed

layout = my_ring_routed.Layout(
    first_step_direction=i3.DIRECTION.SOUTH,  # when rounding corner, go this direction first
    output_direction=i3.DIRECTION.EAST,  # final output direction
    target_coordinate=30.0,
    reference_coordinate_first_step=-20.0,
    first_step_spacing=15.0,  # Spacing between the waveguides.
)

visualize_routearoundports(layout)
../../_images/full-139.png
import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.container.route_ports import RoutePortsAroundCorner

my_ring = RingRect180DropFilter()

my_ring_routed = RoutePortsAroundCorner(contents=my_ring, port_labels=["W1", "W0"])  # ports to be routed

layout = my_ring_routed.Layout(
    first_step_direction=i3.DIRECTION.SOUTH,  # when rounding corner, go this direction first
    output_direction=i3.DIRECTION.EAST,  # final output direction
    first_step_spacing=8.0,  # Spacing between the waveguides.
)
layout.visualize(annotate=True)
../../_images/full-140.png
"""By default, the area between the routes is drawn,
you can override this using the area_layer_on parameter"""
import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.container.route_ports import RoutePortsAroundCorner

my_ring = RingRect180DropFilter()

my_ring_routed = RoutePortsAroundCorner(contents=my_ring, port_labels=["W1", "W0"])  # ports to be routed

layout = my_ring_routed.Layout(
    first_step_direction=i3.DIRECTION.SOUTH,  # when rounding corner, go this direction first
    output_direction=i3.DIRECTION.EAST,  # final output direction
    area_layer_on=False,
    first_step_spacing=8.0,  # Spacing between the waveguides.
)
layout.visualize(annotate=True)
../../_images/full-141.png
"""Instead of E0, W0, E1, (east 0, west 0 ) ...
we can also use the actual port names as port labels"""
import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.container.route_ports import RoutePortsAroundCorner

my_ring = RingRect180DropFilter()

my_ring_routed = RoutePortsAroundCorner(contents=my_ring, port_labels=["in1", "out2"])  # ports to be routed

layout = my_ring_routed.Layout(
    first_step_direction=i3.DIRECTION.SOUTH,  # when rounding corner, go this direction first
    output_direction=i3.DIRECTION.EAST,  # final output direction
    first_step_spacing=8.0,  # Spacing between the waveguides.
)
layout.visualize(annotate=True)
../../_images/full-142.png
"""Be aware that the order of the port_labels is used to determine to the order of the created routes.
If you encounter crossing routes, you might want to change the order of the labels"""
import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.container.route_ports import RoutePortsAroundCorner

my_ring = RingRect180DropFilter()
layout = my_ring.Layout()

# We first route the E0 (east0 ) port, if we had chosen
# ['W1', 'W0', 'E0'] this would have resulted in crossing waveguides
my_ring = RoutePortsAroundCorner(contents=layout, port_labels=["E0", "W1", "W0"])

layout = my_ring.Layout(
    first_step_direction=i3.DIRECTION.SOUTH,  # when rounding corner, go this direction first
    output_direction=i3.DIRECTION.EAST,  # final output direction
    reference_coordinate_first_step=-20.0,
    first_step_spacing=8.0,  # Spacing between the waveguides.
)
layout.visualize(annotate=True)
../../_images/full-143.png
"""As most containers, RoutePortsAroundCorner supports auto transitions.
This means that you can choose a trace template for the routes that's different
from the one used in the contents.
"""
import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.container.route_ports import RoutePortsAroundCorner
from picazzo3.traces.wire_wg import WireWaveguideTemplate

my_ring = RingRect180DropFilter()
my_ring.Layout()

wtpl = WireWaveguideTemplate()
wtpl.Layout(core_width=0.7)

my_ring = RoutePortsAroundCorner(
    trace_template=wtpl, auto_transition=True, contents=my_ring, port_labels=["E0", "W1", "W0"]
)

layout = my_ring.Layout(
    first_step_direction=i3.DIRECTION.SOUTH,  # when rounding corner, go this direction first
    output_direction=i3.DIRECTION.EAST,  # final output direction
    reference_coordinate_first_step=-20.0,
    target_coordinate=40.0,
    first_step_spacing=8.0,  # Spacing between the waveguides.
)
layout.visualize(annotate=True)
../../_images/full-144.png
"""The target_coordinate parameter can be used to specify
the 'target coordinate' of the routes. This is illustrated in this example"""

import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.container.route_ports import RoutePortsAroundCorner

my_ring = RingRect180DropFilter()
layout = my_ring.Layout()

# We first route the E0 (east0 ) port, if we had chosen
# ['W1', 'W0', 'E0'] this would have resulted in crossing waveguides
my_ring = RoutePortsAroundCorner(contents=layout, port_labels=["E0", "W1", "W0"])

layout = my_ring.Layout(
    first_step_direction=i3.DIRECTION.SOUTH,  # when rounding corner, go this direction first
    output_direction=i3.DIRECTION.EAST,  # final output direction
    reference_coordinate_first_step=-20.0,
    target_coordinate=40.0,
    first_step_spacing=8.0,  # Spacing between the waveguides.
)
layout.visualize(annotate=True)
../../_images/full-145.png

TerminatePorts

TerminatePorts

class picazzo3.container.terminate_ports.TerminatePorts

Wraps a PCell in a container and terminates the ports specified by the user. If None is given for the port_labels, all ports will be suppressed.

You can also provide another PCell to the property ‘termination’ which will be attached to each terminated port (a stub, to remove reflections). If None is provided, a logical termination is added to the Netlist, but no termination is added in the layout.

Parameters:
termination_external_port_name_map: str

dict to map the names of the termination ports that are exposed as external ports. The format is { ‘port_name_on_termination’ : ‘new_name_{port}’ }. The ‘{port}’ in the map will be replaced by the corresponding port name on the component.For instance, when you use grating couplers or detectors as terminations, this map allows you to map the name of the vertical port or the electrical ports to the name of the terminated port on the contents. Similarly, you can use {inst} to insert the name of the instance of the termination. By default, the behavior is ‘{inst}_{port}’.

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

label of the port on the termination that will be used to connect to the part of the contents. Default is ‘in’

termination: PCell

cell which will be used to terminate the ports

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.

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

Prefix for the instance names of the terminations. Default is taken from TECH.CONTAINER.TERMINATE_PORTS

auto_transition: ( bool, bool_ or int )

If True, automatically transition all ports of contents to the given trace template. If False, no transitions are applied, which might lead to a discontinuity in the waveguide. Also, if trace_template is None, no transitions are applied.

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

contents: PCell

the contents of the container: the child cell

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:
termination_external_port_name_maps: locked
termination_port_labels: locked
terminations: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

list of templates to apply to all ports

Examples

"""Layout example of terminated ring resonator"""
import si_fab.all as pdk  # noqa: F401
from picazzo3.filters.ring import RingRect180DropFilter

my_ring = RingRect180DropFilter()
my_ring.Layout()
from picazzo3.container.terminate_ports import TerminatePorts

# Optionally we can add a structure where the ports are suppressed
from picazzo3.apertures.basic import WireWgAperture
from picazzo3.traces.wire_wg import WireWaveguideTemplate

wire_t = WireWaveguideTemplate()
wire_t.Layout(core_width=2.0, cladding_width=6.0)
my_termination = WireWgAperture(name="my_termination", aperture_trace_template=wire_t)
my_termination.Layout(transition_length=4.0)
my_ring_terminated = TerminatePorts(contents=my_ring, port_labels=["E1"], termination=my_termination)
my_ring_terminated_layout = my_ring_terminated.Layout()
my_ring_terminated_layout.visualize(annotate=True)
../../_images/full-146.png
"""Simulation example of terminated ring resonator"""
import si_fab.all as pdk  # noqa: F401
import numpy as np
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.container.terminate_ports import TerminatePorts
from picazzo3.logical.termination import Termination
import pylab as plt

my_ring = RingRect180DropFilter()

cp = {
    "cross_coupling1": 1j * 0.05**0.5,  # The coupling from bus to ring and back
    "straight_coupling1": 0.95**0.5,  # Straight coupling
}

my_ring.CircuitModel(ring_length=2 * np.pi * 10.0, coupler_parameters=[cp, cp])

my_termination = Termination()
my_termination.CircuitModel(reflection=0.5**0.5)
my_ring_terminated = TerminatePorts(contents=my_ring, port_labels=["W1"], termination=my_termination)
my_ring_terminated.Netlist()
my_ring_terminated_cm = my_ring_terminated.CircuitModel()

wavelengths = np.linspace(1.535, 1.55, 800)
R = my_ring_terminated_cm.get_smatrix(wavelengths=wavelengths)

plt.figure()
plt.plot(wavelengths, 10 * np.log10(abs(R["in1", "in1"] ** 2)), "r-", label="reflection in1")
plt.plot(wavelengths, 10 * np.log10(abs(R["in1", "out1", :] ** 2)), "b-", label="in port to pass port (out1)")
plt.plot(wavelengths, 10 * np.log10(abs(R["in1", "in2", :] ** 2)), "g-", label="in port to add port (in2)")
plt.xlim([wavelengths[0], wavelengths[-1]])
plt.legend()
plt.show()
../../_images/full-147.png

Views

class Layout
Parameters:
termination_transformations: List with type restriction, allowed types: <class ‘ipkiss.geometry.transforms.no_distort.NoDistortTransform’>

Transformations of the terminations. By default, these are calculated to match the ports of the contents.

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

Electrical

ContactHole

class picazzo3.electrical.contact.cell.ContactHole

Regular via to connect M1 (top_layer) to the silicide layer (bottom_layer) using a contact layer (via_layer)

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

The unique name of the pcell

Views

class Layout

A standard electrical via connect M1 (top_layer) to the silicide layer (bottom_layer) using a contact layer (via_layer).

The shape of each layer in the via is a regular polygon with a n_o_sides sides. and each layer element (top, bottom and via) is defined through the following properties:

  • top_process

  • top_purpose

  • top_width

analogous properties are defined for the other layers.

All those properties can be overridden, but they are defaulting to the values found in TECH.VIAS.CONTACT_HOLE

Parameters:
via_width: float and number > 0

Width of the via layer (2 * inner radius of the polygon)

via_purpose: PatternPurpose

Purpose of the via layer.

via_process: ProcessLayer

Process of the via layer.

bottom_width: float and number > 0

Width of the bottom layer (2 * inner radius of the polygon)

bottom_purpose: PatternPurpose

Purpose of the bottom layer.

bottom_process: ProcessLayer

Process of the bottom layer.

top_width: float and number > 0

Width of the top layer (2 * inner radius of the polygon)

top_purpose: PatternPurpose

Purpose of the top layer.

top_process: ProcessLayer

Process of the top layer.

n_o_sides: int and number > 0

Number of sides of the polygon used for the contact hole

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:
via_shape: locked
via_layer: locked
layers: locked
shapes: locked
bottom_shape: locked
bottom_layer: locked
top_shape: locked
top_layer: locked

Examples

# Using the default contact hole.
import si_fab.all as pdk  # noqa: F401
from picazzo3.electrical.contact import ContactHole

cell = ContactHole()
layout = cell.Layout()
layout.visualize(annotate=True)
../../_images/full-148.png
import si_fab.all as pdk  # noqa: F401
from picazzo3.electrical.contact import ContactHole

cell = ContactHole()
layout = cell.Layout(n_o_sides=8, top_width=1.0, bottom_width=0.8, via_width=0.2)
layout.visualize(annotate=True)
../../_images/full-149.png

Via12

class picazzo3.electrical.contact.cell.Via12

Regular via to connect M2 (top_layer) to M1 (bottom_layer) using a contact layer (via_layer)

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

The unique name of the pcell

Views

class Layout

A standard electrical via connect M2 (top_layer) to M1 (bottom_layer) using a contact layer (via_layer).

The shape of each layer in the via is a regular polygon with a n_o_sides sides. and each layer element (top, bottom and via) is defined through the following properties:

  • top_process

  • top_purpose

  • top_width

analogous properties are defined for the other layers.

All those properties can be overridden, but they are defaulting to the values found in TECH.VIAS.VIA12

Parameters:
via_width: float and number > 0

Width of the via layer (2 * inner radius of the polygon)

via_purpose: PatternPurpose

Purpose of the via layer.

via_process: ProcessLayer

Process of the via layer.

bottom_width: float and number > 0

Width of the bottom layer (2 * inner radius of the polygon)

bottom_purpose: PatternPurpose

Purpose of the bottom layer.

bottom_process: ProcessLayer

Process of the bottom layer.

top_width: float and number > 0

Width of the top layer (2 * inner radius of the polygon)

top_purpose: PatternPurpose

Purpose of the top layer.

top_process: ProcessLayer

Process of the top layer.

n_o_sides: int and number > 0

Number of sides of the polygon used for the contact hole

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:
via_shape: locked
via_layer: locked
layers: locked
shapes: locked
bottom_shape: locked
bottom_layer: locked
top_shape: locked
top_layer: locked

Examples

# Using the default contact hole.
import si_fab.all as pdk  # noqa: F401
from picazzo3.electrical.contact import Via12

cell = Via12()
layout = cell.Layout()
layout.visualize(annotate=True)
../../_images/full-150.png
import si_fab.all as pdk  # noqa: F401
from picazzo3.electrical.contact import Via12

cell = Via12()
layout = cell.Layout(n_o_sides=8, top_width=1.0, bottom_width=0.8, via_width=0.2)
layout.visualize(annotate=True)
../../_images/full-151.png

Modulators

Phase Modulators

PhaseShifterWaveguideTemplate

class picazzo3.modulators.phase.trace.PhaseShifterWaveguideTemplate

Generic phase shifter waveguide trace template. When extruded into a (straight) waveguide, this template draws the necessary implant, contact and metallization layers on top of the underlying waveguide template. This waveguide template should be specified in the “trace_template” property.

This PCell can be used for several types of phase shifters, for example: * P(I)N junction injection or depletion phase shifters, with P and N implants, contacts and metal on two sides * Thermal phase shifters using a metal heater on top * Thermal phase shifters using an implanted waveguide

At the Layout level, windows can be specified separately for the implants (the silicon level), contacts (pre-metal/contact level) and the metallization (e.g. metal1 level). Just fill or leave open each of the three sets of windows, and use them to implement the desired type of phase shifter.

Subclass this PCell to create specialized phase shifters, and add electrical ports.

Parameters:
trace_template: PCell and _TraceTemplate

Refers to the other trace template from which information is taken to build this trace template.

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

The unique name of the pcell

Views

class Layout
Parameters:
metal_windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows for the metallization layers

contact_windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows for the contacts

implant_windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows for the implant layers

windows_for_ports: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows from which ports will be generated

core_width: float and number > 0

width of the waveguide core

core_layer: __Layer__

layer used to define the core of the waveguide

flatten_contents: ( bool, bool_ or int )

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

pin_shape: Shape

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout

Trace template to be used for the ports. Default = this template

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows to draw on top of the already defined TraceTemplate

keep_original_trace_template: ( bool, bool_ or int )
width: float and Real, number and number >= 0
control_shape_layer: __Layer__

layer on which the control shape is drawn

draw_control_shape: ( bool, bool_ or int )

draws the control shape on top of the waveguide

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

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

Examples

import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.modulators.phase import PhaseShifterWaveguideTemplate
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.electrical.contact import ContactHole

wire_t = RibWaveguideTemplate()
wire_t.Layout(core_width=0.9, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.9)

c = ContactHole(name="PNPS_CONT")
c.Layout()

contact_windows = [
    i3.PeriodicArrayReferenceTraceWindow(
        reference=c, offset=-4.0 - 2.5 * i, exclude_ends=(0.5 * 3.0, 0.5 * 3.0), pitch=3.0
    )
    for i in range(3)
]

contact_windows += [
    i3.PeriodicArrayReferenceTraceWindow(
        reference=c, offset=4.0 + 2.5 * i, exclude_ends=(0.5 * 3.0, 0.5 * 3.0), pitch=3.0
    )
    for i in range(3)
]

implant_windows = [
    i3.PathTraceWindow(layer=i3.TECH.PPLAYER.P, start_offset=0.0, end_offset=10.0),
    i3.PathTraceWindow(layer=i3.TECH.PPLAYER.N, start_offset=0.0, end_offset=-10.0),
]

metal_windows = [
    i3.PathTraceWindow(layer=i3.TECH.PPLAYER.M1, start_offset=3.0, end_offset=12.0),
    i3.PathTraceWindow(layer=i3.TECH.PPLAYER.M1, start_offset=-3.0, end_offset=-12.0),
]

ps_t = PhaseShifterWaveguideTemplate(trace_template=wire_t)
ps_t.Layout(contact_windows=contact_windows, implant_windows=implant_windows, metal_windows=metal_windows)

ps = ps_t(name="TestPhaseShifterWaveguideTemplate1")
ps_lay = ps.Layout(shape=[(0.0, 0.0), (50.0, 0.0)])
ps_lay.visualize(annotate=True)
../../_images/full-152.png
import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.modulators.phase import PhaseShifterWaveguideTemplate
from picazzo3.traces.rib_wg import RibWaveguideTemplate

wire_t = RibWaveguideTemplate()
wire_t.Layout(core_width=0.9, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.9)

metal_windows = [i3.PathTraceWindow(layer=i3.TECH.PPLAYER.M1, start_offset=-1.0, end_offset=1.0)]

ps_t = PhaseShifterWaveguideTemplate(trace_template=wire_t)
ps_t.Layout(metal_windows=metal_windows)

ps = ps_t(name="TestPhaseShifterWaveguideTemplate2")
ps_lay = ps.Layout(shape=[(0.0, 0.0), (50.0, 0.0)])
ps_lay.visualize(annotate=True)
../../_images/full-153.png

LateralPNPhaseShifterTemplate

class picazzo3.modulators.phase.trace.LateralPNPhaseShifterTemplate

PN or PIN junction phase shifter with a lateral junction. This is the most ‘classical’ type of phase shifter.

Parameters:
n_contact: PCell
p_contact: PCell
trace_template: PCell and _TraceTemplate

Refers to the other trace template from which information is taken to build this trace template.

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

The unique name of the pcell

Views

class Layout
Parameters:
n_bridge_pitch: float

pitch of the N-to-NPLUS bridge, longitudinal direction

n_bridge_width: float

width of the N-to-NPLUS bridge, longitudinal direction. Set equal to the pitch size to obtain a continuous area.

p_bridge_pitch: float

pitch of the P-to-PPLUS bridge, longitudinal direction

p_bridge_width: float

width of the P-to-PPLUS bridge, longitudinal direction. Set equal to the pitch size to obtain a continuous area.

junction_offset: float

offset of center of junction from the center of the waveguide

n_metal1_width: float

width of metal1 in the lateral direction, N side

n_metal1_offset: float

offset of metal1 in the lateral direction, N side

p_metal1_width: float

width of metal1 in the lateral direction, P side

p_metal1_offset: float

offset of metal1 in the lateral direction, P side

n_contact_offsets: list<number > 0>

offsets of the contact plugs in the lateral direction, N side

n_contact_pitch: float and number > 0

pitch of the contact plugs, longitudinal direction, N side

p_contact_offsets: list<number > 0>

offsets of the contact plugs in the lateral direction, P side

p_contact_pitch: float and number > 0

pitch of the contact plugs, longitudinal direction, P side

n_silicide_extension: float

extension of the silicide area from the trace in longitudinal direction, N side

n_silicide_width: float

width of the silicide area, in lateral direction, N side

n_silicide_offset: float

offset of the silicide area from the centerline in lateral direction, N side

p_silicide_extension: float

extension of the silicide area from the trace in longitudinal direction, P side

p_silicide_width: float

width of the silicide area, in lateral direction, P side

p_silicide_offset: float

offset of the silicide area from the centerline in lateral direction, P side

nplus_extension: float

extension of the P++ area from the trace in longitudinal direction

nplus_width: float

width of the N++ area, in lateral direction

nplus_offset: float

offset of the N++ area from the centerline in lateral direction

n_width: float and Real, number and number >= 0

width of the N+ area, in lateral direction

pplus_extension: float

extension of the P++ area from the trace in longitudinal direction

pplus_width: float

width of the P++ area, in lateral direction

pplus_offset: float

offset of the P++ area from the centerline in lateral direction

p_width: float and Real, number and number >= 0

width of the P+ area, in lateral direction

nplus_purpose: PatternPurpose

N++ drawing purpose

n_purpose: PatternPurpose

N+ drawing purpose

pplus_purpose: PatternPurpose

P++ drawing purpose

p_purpose: PatternPurpose

P+ drawing purpose

metal1_purpose: PatternPurpose

metal1 drawing purpose

silicide_purpose: PatternPurpose

silicide drawing purpose

nplus_process: ProcessLayer

N++ implant process, in the contacted area

n_process: ProcessLayer

N+ implant process (junction)

pplus_process: ProcessLayer

P++ implant process, in the contacted area

p_process: ProcessLayer

P+ implant process (junction)

metal1_process: ProcessLayer

metal1 process

silicide_process: ProcessLayer

silicide process, in th contacted area

flipped: ( bool, bool_ or int )

flips P and N side

junction_overlap: float

overlap of P and N regions. Set to a negative value to obtain a PIN junction

metal_windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows for the metallization layers

contact_windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows for the contacts

implant_windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows for the implant layers

windows_for_ports: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows from which ports will be generated

core_width: float and number > 0

width of the waveguide core

core_layer: __Layer__

layer used to define the core of the waveguide

flatten_contents: ( bool, bool_ or int )

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

pin_shape: Shape

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout

Trace template to be used for the ports. Default = this template

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows to draw on top of the already defined TraceTemplate

keep_original_trace_template: ( bool, bool_ or int )
width: float and Real, number and number >= 0
control_shape_layer: __Layer__

layer on which the control shape is drawn

draw_control_shape: ( bool, bool_ or int )

draws the control shape on top of the waveguide

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

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

Examples

"""PN phase shifter"""
import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.modulators.phase import LateralPNPhaseShifterTemplate
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.electrical.contact import ContactHole

wire_t = RibWaveguideTemplate()
wire_t.Layout(core_width=0.9, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.9)

c = ContactHole(name="LPNPS_CONT")

ps_t = LateralPNPhaseShifterTemplate(trace_template=wire_t, p_contact=c, n_contact=c)

ps = ps_t(name="ExampleLateralPNPhaseShifterTemplate")
ps_lay = ps.Layout(shape=[(0.0, 0.0), (10.0, 0.0)])
ps_lay.visualize(annotate=True)
../../_images/full-154.png
"""PN phase shifter with continuous P-PPLUS/N-NPLUS bridges"""
import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.modulators.phase import LateralPNPhaseShifterTemplate
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.electrical.contact import ContactHole

wire_t = RibWaveguideTemplate()
wire_t.Layout(core_width=0.9, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.9)

c = ContactHole(name="LPNPS2_CONT")

ps_t = LateralPNPhaseShifterTemplate(trace_template=wire_t, p_contact=c, n_contact=c)

ps_t.Layout(p_bridge_pitch=1.0, p_bridge_width=1.0, n_bridge_pitch=1.0, n_bridge_width=1.0)

ps = ps_t(name="ExampleLateralPNPhaseShifterTemplate2")
ps_lay = ps.Layout(shape=[(0.0, 0.0), (10.0, 0.0)])

ps_lay.visualize(annotate=True)
../../_images/full-155.png
"""PN phase shifter with offset junction and overlapping P and N"""
import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.modulators.phase import LateralPNPhaseShifterTemplate
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.electrical.contact import ContactHole

wire_t = RibWaveguideTemplate()
wire_t.Layout(core_width=0.9, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.9)

c = ContactHole(name="LPNPS3_CONT")

ps_t = LateralPNPhaseShifterTemplate(trace_template=wire_t, p_contact=c, n_contact=c)
ps_t.Layout(
    p_bridge_pitch=1.0,
    p_bridge_width=0.6,
    n_bridge_pitch=1.0,
    n_bridge_width=0.6,
    junction_offset=0.2,
    junction_overlap=0.1,
)

ps = ps_t(name="ExampleLateralPNPhaseShifterTemplate3")
ps_lay = ps.Layout(shape=[(0.0, 0.0), (10.0, 0.0)])

ps_lay.visualize(annotate=True)
../../_images/full-156.png
"""PN phase shifter with flipped P and N side"""
import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.modulators.phase import LateralPNPhaseShifterTemplate
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.electrical.contact import ContactHole

wire_t = RibWaveguideTemplate()
wire_t.Layout(core_width=0.9, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.9)

c = ContactHole(name="LPNPSF_CONT")

ps_t = LateralPNPhaseShifterTemplate(trace_template=wire_t, p_contact=c, n_contact=c)

ps_t.Layout(
    p_bridge_pitch=1.0,
    p_bridge_width=0.6,
    n_bridge_pitch=1.0,
    n_bridge_width=0.6,
    junction_offset=0.2,
    junction_overlap=0.1,
    flipped=True,
)

ps = ps_t(name="ExampleLateralPNPhaseShifterTemplateFlipped")
ps_lay = ps.Layout(shape=[(0.0, 0.0), (10.0, 0.0)])
ps_lay.visualize(annotate=True)
../../_images/full-157.png
"""PIN phase shifter"""
import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.modulators.phase import LateralPNPhaseShifterTemplate
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.electrical.contact import ContactHole

wire_t = RibWaveguideTemplate()
wire_t.Layout(core_width=0.9, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.9)

c = ContactHole(name="LPINPS_CONT")

ps_t = LateralPNPhaseShifterTemplate(trace_template=wire_t, p_contact=c, n_contact=c)
ps_t.Layout(
    p_bridge_pitch=1.0, p_bridge_width=0.6, n_bridge_pitch=1.0, n_bridge_width=0.6, junction_overlap=-0.15
)

ps = ps_t(name="ExampleLateralPINPhaseShifterTemplate")
ps_lay = ps.Layout(shape=[(0.0, 0.0), (10.0, 0.0)])
ps_lay.visualize(annotate=True)
../../_images/full-158.png

LongitudinalPNPhaseShifterTemplate

class picazzo3.modulators.phase.trace.LongitudinalPNPhaseShifterTemplate

PN or PIN junction phase shifter with a longitudinal (interdigited) junction.

Parameters:
n_contact: PCell
p_contact: PCell
trace_template: PCell and _TraceTemplate

Refers to the other trace template from which information is taken to build this trace template.

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

The unique name of the pcell

Views

class Layout
Parameters:
n_length: float and Real, number and number >= 0

length of the N+ area, in longitudinal direction (finger width)

p_length: float and Real, number and number >= 0

length of the P+ area, in longitudinal direction (finger width)

n_metal1_width: float

width of metal1 in the lateral direction, N side

n_metal1_offset: float

offset of metal1 in the lateral direction, N side

p_metal1_width: float

width of metal1 in the lateral direction, P side

p_metal1_offset: float

offset of metal1 in the lateral direction, P side

n_contact_offsets: list<number > 0>

offsets of the contact plugs in the lateral direction, N side

n_contact_pitch: float and number > 0

pitch of the contact plugs, longitudinal direction, N side

p_contact_offsets: list<number > 0>

offsets of the contact plugs in the lateral direction, P side

p_contact_pitch: float and number > 0

pitch of the contact plugs, longitudinal direction, P side

n_silicide_extension: float

extension of the silicide area from the trace in longitudinal direction, N side

n_silicide_width: float

width of the silicide area, in lateral direction, N side

n_silicide_offset: float

offset of the silicide area from the centerline in lateral direction, N side

p_silicide_extension: float

extension of the silicide area from the trace in longitudinal direction, P side

p_silicide_width: float

width of the silicide area, in lateral direction, P side

p_silicide_offset: float

offset of the silicide area from the centerline in lateral direction, P side

nplus_extension: float

extension of the P++ area from the trace in longitudinal direction

nplus_width: float

width of the N++ area, in lateral direction

nplus_offset: float

offset of the N++ area from the centerline in lateral direction

n_width: float and Real, number and number >= 0

width of the N+ area, in lateral direction

pplus_extension: float

extension of the P++ area from the trace in longitudinal direction

pplus_width: float

width of the P++ area, in lateral direction

pplus_offset: float

offset of the P++ area from the centerline in lateral direction

p_width: float and Real, number and number >= 0

width of the P+ area, in lateral direction

nplus_purpose: PatternPurpose

N++ drawing purpose

n_purpose: PatternPurpose

N+ drawing purpose

pplus_purpose: PatternPurpose

P++ drawing purpose

p_purpose: PatternPurpose

P+ drawing purpose

metal1_purpose: PatternPurpose

metal1 drawing purpose

silicide_purpose: PatternPurpose

silicide drawing purpose

nplus_process: ProcessLayer

N++ implant process, in the contacted area

n_process: ProcessLayer

N+ implant process (junction)

pplus_process: ProcessLayer

P++ implant process, in the contacted area

p_process: ProcessLayer

P+ implant process (junction)

metal1_process: ProcessLayer

metal1 process

silicide_process: ProcessLayer

silicide process, in th contacted area

flipped: ( bool, bool_ or int )

flips P and N side

junction_overlap: float

overlap of P and N regions. Set to a negative value to obtain a PIN junction

metal_windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows for the metallization layers

contact_windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows for the contacts

implant_windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows for the implant layers

windows_for_ports: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows from which ports will be generated

core_width: float and number > 0

width of the waveguide core

core_layer: __Layer__

layer used to define the core of the waveguide

flatten_contents: ( bool, bool_ or int )

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

pin_shape: Shape

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout

Trace template to be used for the ports. Default = this template

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>

List of Trace Windows to draw on top of the already defined TraceTemplate

keep_original_trace_template: ( bool, bool_ or int )
width: float and Real, number and number >= 0
control_shape_layer: __Layer__

layer on which the control shape is drawn

draw_control_shape: ( bool, bool_ or int )

draws the control shape on top of the waveguide

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

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

Examples

import si_fab.all as pdk  # noqa: F401
import ipkiss3.all as i3
from picazzo3.modulators.phase import LongitudinalPNPhaseShifterTemplate
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.electrical.contact import ContactHole

wire_t = RibWaveguideTemplate()
wire_t.Layout(core_width=0.9, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.9)

c = ContactHole(name="LPINPS_CONT")

ps_t = LongitudinalPNPhaseShifterTemplate(trace_template=wire_t, p_contact=c, n_contact=c)
ps_t.Layout(p_length=0.3, n_length=0.5, junction_overlap=0.05)

ps = ps_t(name="ExampleLongitundinalPNPhaseShifterTemplate")
ps_lay = ps.Layout(shape=[(0.0, 0.0), (10.0, 0.0)])
ps_lay.visualize(annotate=True)
../../_images/full-159.png

PhaseModulator

class picazzo3.modulators.phase.cell.PhaseModulator

Straight Phase Modulator PCell. Takes a trace template for the modulator, generates a phase modulator waveguide and adds transitions. Exposes the optical and electrical ports and terms of the (tapered) phase modulator waveguide.

Make sure to explicitly specify the ports to be tapered (the optical ports) in port_labels. Specify the length of the modulator in the Layout View.

Parameters:
contents: PCell

the contents of the container: the child cell

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’>

Transitions (of type WaveguideTransitionFromPort) attached the the ports given in port_labels. Should be in the same order as port_labels.

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

modulator_trace_template: PCell and _TraceTemplate and PhaseShifterWaveguideTemplate

trace template to use for the phase modulator waveguide

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:
trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked

list of templates to apply to all ports

Views

class Layout
Parameters:
flatten_contents: ( bool, bool_ or int )

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

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

contents_transformation: GenericNoDistortTransform
length: float and Real, number and number >= 0

length of the phase modulator waveguide

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
import ipkiss3.all as i3
from picazzo3.modulators.phase import LateralPNPhaseShifterTemplate, PhaseModulator
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.electrical.contact import ContactHole

wire_t = RibWaveguideTemplate()
wire_t.Layout(core_width=0.9, cladding_width=2 * i3.TECH.WG.TRENCH_WIDTH + 0.9)
c = ContactHole(name="LPNPS3_CONT")

ps_t = LateralPNPhaseShifterTemplate(trace_template=wire_t, p_contact=c, n_contact=c)
ps_t.Layout(
    p_bridge_pitch=1.0,
    p_bridge_width=0.6,
    n_bridge_pitch=1.0,
    n_bridge_width=0.6,
    junction_offset=0.2,
    junction_overlap=0.1,
)

pmod = PhaseModulator(modulator_trace_template=ps_t, port_labels=["in", "out"])
pmod_lay = pmod.Layout(length=100.0)
pmod_lay.visualize(annotate=True)
../../_images/full-160.png