Picazzo Reference

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(*args, **kwargs)

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 tranmission: 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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

Views

Coupler2x1

class picazzo3.logical.coupler.cell.Coupler2x1(*args, **kwargs)

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 tranmission: 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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

Views

Coupler2x2

class picazzo3.logical.coupler.cell.Coupler2x2(*args, **kwargs)

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 tranmission: 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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

Views

Reflector

class picazzo3.logical.reflector.cell.Reflector(*args, **kwargs)

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

Parameters:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

WaveguideReflector

class picazzo3.logical.reflector.cell.WaveguideReflector(*args, **kwargs)

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

Parameters:

wg_template_in: PCell and _WaveguideTemplate, optional

Waveguide template at the input

wg_template_out: PCell and _WaveguideTemplate, optional

Waveguide template at the output

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Termination

class picazzo3.logical.termination.cell.Termination(*args, **kwargs)

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 dangling terms

Parameters:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

PerfectTermination

class picazzo3.logical.termination.cell.PerfectTermination(*args, **kwargs)

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 dangling terms

Parameters:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Grating Couplers

FiberCouplerCurvedGrating

class picazzo3.fibcoup.curved.cell.FiberCouplerCurvedGrating(*args, **kwargs)

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

Parameters:

inclination: float, optional

out-of-plane angle of the grating coupler

socket: PCell and WgSocket, optional

socket of the fiber coupler

grating: PCell, optional

grating of this fiber coupler

start_trace_template: PCell and _WaveguideTemplate, optional

start waveguide for the socket waveguide (narrow side)

wide_trace_template: PCell and _WaveguideTemplate, optional

end waveguide for the socket waveguide (broad side)

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

box_width: float and number > 0, optional

Width of the box used that contains the grating.

fill_factor: float and fraction, optional

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

grating_transformation: GenericNoDistortTransform, optional

grids_per_unit: optional

Number of grid cells per design unit

period_x: float and number > 0, optional

Period in the x direction.

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

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_straight_extension: Coord2, optional

tuple: straight extension at start and end of socket

spread_angle: float, optional

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.

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

min_x: float and number > 0, optional

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

n_o_lines: int and number > 0, optional

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

focal_distance_x: float, optional

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

period_y: float and number > 0, optional

Period in the y direction. By default equal to period_x

start_radius_y: float and number > 0, optional

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

process: ProcessLayer, optional

default process used for the grating

purpose: optional

socket_transformation: GenericNoDistortTransform, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

socket_length: locked

line_widths: locked

Line width of the grating coupler

start_radius_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

ellipse_radii_x: locked

ellipse_radii_y: locked

end_angles: locked

start_angles: locked

Examples

Basic use:

# Example demonstrating the basic use of the FiberGratingCoupler.
from technologies import silicon_photonics
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

fc_layout.visualize()
../_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
from technologies import silicon_photonics
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()
../_images/full-2.png

Changing the ``box_width:

# Example demonstrating how to change the box_width.
from technologies import silicon_photonics
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()
../_images/full-3.png

Changing the fill_factor to set the line width:

# Example demonstrating how to change the fill_factor.
import technologies.silicon_photonics
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()
../_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.

from technologies import silicon_photonics
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()
../_images/full-5.png

Changing the socket extensions:

# Example demonstrating how to change the socket_extension.
import technologies.silicon_photonics
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()
../_images/full-6.png

Changing the straight socket extensions:

# Example demonstrating how to change the socket_straight_extensions.
import technologies.silicon_photonics
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,
                           socket_straight_extension=(10.0,5.0))# A straight extension of 10.0 will be added at the
                                                                #narrow side and 5.0 at the wide part of the socket.

fc_layout.visualize()
../_images/full-7.png

FiberCouplerCurvedGratingGeneric

class picazzo3.fibcoup.curved.cell.FiberCouplerCurvedGratingGeneric(*args, **kwargs)

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, optional

out-of-plane angle of the grating coupler

socket: PCell and WgSocket, optional

socket of the fiber coupler

grating: PCell, optional

grating of this fiber coupler

start_trace_template: PCell and _WaveguideTemplate, optional

start waveguide for the socket waveguide (narrow side)

wide_trace_template: PCell and _WaveguideTemplate, optional

end waveguide for the socket waveguide (broad side)

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

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 of numbers. A fiber grating coupler composed of ellispes 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:

grating_transformation: GenericNoDistortTransform, optional

grids_per_unit: optional

Number of grid cells per design unit

purpose: optional

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

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

socket_length: float and number > 0, optional

length of the straight waveguide socket

socket_straight_extension: Coord2, optional

tuple: straight extension at start and end of socket

spread_angle: float, optional

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.

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

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

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

ellipse_radii_x: list, optional

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

ellipse_radii_y: list, optional

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

end_angles: list, optional

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

line_widths: list, optional

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

process: ProcessLayer, optional

default process used for the grating

start_angles: list, optional

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

socket_transformation: GenericNoDistortTransform, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

n_o_lines: int and number > 0, locked

Number of trenches.

Examples

from technologies import silicon_photonics
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 i 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 i in range(30)],
                           end_angles=[180.0 + 15 for i in range(30)],
                           line_widths=[0.2 for i 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()
../_images/full-8.png

UniformLineGrating

class picazzo3.fibcoup.uniform.cell.UniformLineGrating(*args, **kwargs)

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

Parameters:

inclination: float, optional

out-of-plane angle of the grating coupler

socket: PCell and WgSocket, optional

socket of the fiber coupler

grating: PCell, optional

grating of this fiber coupler

trace_template: PCell and _TraceTemplate, optional

trace template for the socket waveguide

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grating_transformation: GenericNoDistortTransform, optional

grids_per_unit: optional

Number of grid cells per design unit

line_length: float and number > 0, optional

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

line_width: float and number > 0, optional

width of the grating trenches, drawn in the given layer

n_o_periods: int and number > 0, optional

number of periods of the grating

origin: Coord2, optional

local origin of the grating (first trench)

period: float and number > 0, optional

period of the grating

process: ProcessLayer, optional

process layer for the grating

purpose: PatternPurpose, optional

drawing purpose for the grating lines

socket_length: float and number > 0, optional

length of the straight waveguide socket

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

socket_transformation: GenericNoDistortTransform, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

# Creation of a uniform grating coupler with a taper.
from technologies import silicon_photonics
from ipkiss3 import all as i3
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 = 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()
../_images/full-9.png

FiberCouplerGrating

class picazzo3.fibcoup.base.FiberCouplerGrating(*args, **kwargs)

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 Caphe model, when light is incident from the vertical (through vertical_in) and couples to the out port

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

socket: PCell and WgSocket, optional

socket of the fiber coupler

grating: PCell, optional

grating of this fiber coupler

inclination: float, optional

out-of-plane angle of the grating coupler

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grating_transformation: GenericNoDistortTransform, optional

grids_per_unit: optional

Number of grid cells per design unit

socket_length: float and number > 0, optional

length of the straight waveguide socket

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

socket_transformation: GenericNoDistortTransform, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Ringresonators

RingRect

class picazzo3.filters.ring.cell.RingRect(*args, **kwargs)

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, optional

Trace template for the ring waveguide

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

list of coupler PCells

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

list of Ring PCells

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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.

See also

RingTraces, RingShape, RingRoundedShape

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

coupler_parameters: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

straights: Coord2, optional

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

shape_position: Coord2, optional

Translation of the shape.

area_layer_on: optional

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

coupler_transformations: optional

list of coupler transformations

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

shape: locked

shapes: locked

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

Examples

"""
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.
"""
from technologies import silicon_photonics
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 = 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()
../_images/full-10.png
""" This example demonstrates a simple rounded rectangular ring consisting
drawns with a user-defined waveguide template. The straights parameter
defines the straigths section along the X and Y axis.
"""
from technologies import silicon_photonics
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()
../_images/full-11.png

RingRect180DropFilter

class picazzo3.filters.ring.cell.RingRect180DropFilter(*args, **kwargs)

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’>, optional

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

ring_trace_template: PCell and _WaveguideTemplate, optional

Trace template for the ring waveguide

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

list of coupler PCells

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

list of Ring PCells

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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.
"""
from technologies import silicon_photonics
import ipkiss3.all as i3 # ipkiss
import pylab as plt, numpy as np #matplotlib and numpy

from picazzo3.filters.ring import RingRect180DropFilter

# To get a 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 = dict(cross_coupling1=1j*0.0784**0.5,
          straight_coupling1=0.9216**0.5,
          reflection_in1=1j * 0.030, # The backreflection in the coupler
          )

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()
""" This example illustrates a simulation of a single ring resonator model based on the
layout that is first generated."""
from technologies import silicon_photonics
import ipkiss3.all as i3 # ipkiss
import pylab as plt, numpy as np #matplotlib and numpy

from picazzo3.filters.ring import RingRect180DropFilter

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

# set model in couplers and ring waveguides TODO: change the models
cp = dict(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()

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

coupler_lengths: list<number >= 0>, optional

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

coupler_parameters: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

coupler_extensions: list<Coord2>, optional

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

coupler_offsets: list<Real, number>, optional

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>, optional

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, optional

shape_position: Coord2, optional

Translation of the shape.

area_layer_on: optional

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

coupler_transformations: optional

list of coupler transformations

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

shape: locked

shapes: locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-14.png

RingRoundedShape

class picazzo3.filters.ring.cell.RingRoundedShape(*args, **kwargs)

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, optional

Trace template for the ring waveguide

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

list of coupler PCells

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

list of Ring PCells

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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.

See also

RingTraces, RingShape, RingRect

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

coupler_parameters: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

shape: Shape, optional

Shape of the ring

shape_position: Coord2, optional

Translation of the shape.

area_layer_on: optional

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

coupler_transformations: optional

list of coupler transformations

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

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
"""
from technologies import silicon_photonics
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()
../_images/full-15.png

RingRectNotchFilter

class picazzo3.filters.ring.cell.RingRectNotchFilter(*args, **kwargs)

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’>, optional

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

ring_trace_template: PCell and _WaveguideTemplate, optional

Trace template for the ring waveguide

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

list of coupler PCells

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

list of Ring PCells

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

coupler_lengths: list<number >= 0>, optional

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

coupler_parameters: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

coupler_extensions: list<Coord2>, optional

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

coupler_offsets: list<Real, number>, optional

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>, optional

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, optional

shape_position: Coord2, optional

Translation of the shape.

area_layer_on: optional

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

coupler_transformations: optional

list of coupler transformations

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

shape: locked

shapes: locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-16.png

RingRect180DropFilter

class picazzo3.filters.ring.cell.RingRect180DropFilter(*args, **kwargs)

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’>, optional

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

ring_trace_template: PCell and _WaveguideTemplate, optional

Trace template for the ring waveguide

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

list of coupler PCells

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

list of Ring PCells

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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.
"""
from technologies import silicon_photonics
import ipkiss3.all as i3 # ipkiss
import pylab as plt, numpy as np #matplotlib and numpy

from picazzo3.filters.ring import RingRect180DropFilter

# To get a 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 = dict(cross_coupling1=1j*0.0784**0.5,
          straight_coupling1=0.9216**0.5,
          reflection_in1=1j * 0.030, # The backreflection in the coupler
          )

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()
""" This example illustrates a simulation of a single ring resonator model based on the
layout that is first generated."""
from technologies import silicon_photonics
import ipkiss3.all as i3 # ipkiss
import pylab as plt, numpy as np #matplotlib and numpy

from picazzo3.filters.ring import RingRect180DropFilter

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

# set model in couplers and ring waveguides TODO: change the models
cp = dict(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()

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

coupler_lengths: list<number >= 0>, optional

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

coupler_parameters: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

coupler_extensions: list<Coord2>, optional

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

coupler_offsets: list<Real, number>, optional

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>, optional

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, optional

shape_position: Coord2, optional

Translation of the shape.

area_layer_on: optional

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

coupler_transformations: optional

list of coupler transformations

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

shape: locked

shapes: locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-19.png

RingRect90DropFilter

class picazzo3.filters.ring.cell.RingRect90DropFilter(*args, **kwargs)

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’>, optional

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

ring_trace_template: PCell and _WaveguideTemplate, optional

Trace template for the ring waveguide

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

list of coupler PCells

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

list of Ring PCells

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

coupler_lengths: list<number >= 0>, optional

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

coupler_parameters: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

coupler_extensions: list<Coord2>, optional

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

coupler_offsets: list<Real, number>, optional

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>, optional

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, optional

shape_position: Coord2, optional

Translation of the shape.

area_layer_on: optional

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

coupler_transformations: optional

list of coupler transformations

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

shape: locked

shapes: locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-20.png

RingRectWrappedNotchFilter

class picazzo3.filters.ring.cell.RingRectWrappedNotchFilter(*args, **kwargs)

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’>, optional

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

ring_trace_template: PCell and _WaveguideTemplate, optional

Trace template for the ring waveguide

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

list of coupler PCells

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

list of Ring PCells

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

coupler_angles: list<[-90,90]>, optional

coupler_lengths: list<number >= 0>, optional

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

coupler_parameters: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

shape_position: Coord2, optional

Translation of the shape.

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

coupler_sbend_straights: list<number >= 0>, optional

coupler_straights: list<number >= 0>, optional

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

coupler_radii: list<number >= 0>, optional

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

coupler_rounding_algorithms: list<ShapeRound>, optional

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

coupler_offsets: list<Real, number>, optional

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>, optional

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, optional

area_layer_on: optional

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

coupler_transformations: optional

list of coupler transformations

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

shape: locked

shapes: locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-21.png

RingRectWrapped180DropFilter

class picazzo3.filters.ring.cell.RingRectWrapped180DropFilter(*args, **kwargs)

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’>, optional

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

ring_trace_template: PCell and _WaveguideTemplate, optional

Trace template for the ring waveguide

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

list of coupler PCells

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

list of Ring PCells

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

coupler_angles: list<[-90,90]>, optional

coupler_lengths: list<number >= 0>, optional

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

coupler_parameters: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

shape_position: Coord2, optional

Translation of the shape.

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

coupler_sbend_straights: list<number >= 0>, optional

coupler_straights: list<number >= 0>, optional

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

coupler_radii: list<number >= 0>, optional

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

coupler_rounding_algorithms: list<ShapeRound>, optional

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

coupler_offsets: list<Real, number>, optional

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>, optional

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, optional

area_layer_on: optional

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

coupler_transformations: optional

list of coupler transformations

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

shape: locked

shapes: locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-22.png

RingRectSymmNotchFilter

class picazzo3.filters.ring.cell.RingRectSymmNotchFilter(*args, **kwargs)

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’>, optional

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

ring_trace_template: PCell and _WaveguideTemplate, optional

Trace template for the ring waveguide

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

list of coupler PCells

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

list of Ring PCells

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

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

coupler_lengths: list<number >= 0>, optional

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

coupler_parameters: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

shape_position: Coord2, optional

Translation of the shape.

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

coupler_straights: list<number >= 0>, optional

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

coupler_radii: list<number >= 0>, optional

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

coupler_rounding_algorithms: list<ShapeRound>, optional

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

coupler_offsets: list<Real, number>, optional

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>, optional

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, optional

area_layer_on: optional

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

coupler_transformations: optional

list of coupler transformations

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

shape: locked

shapes: locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-23.png

RingRectSymm180DropFilter

class picazzo3.filters.ring.cell.RingRectSymm180DropFilter(*args, **kwargs)

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’>, optional

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

ring_trace_template: PCell and _WaveguideTemplate, optional

Trace template for the ring waveguide

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

list of coupler PCells

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

list of Ring PCells

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

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

coupler_lengths: list<number >= 0>, optional

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

coupler_parameters: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

shape_position: Coord2, optional

Translation of the shape.

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

coupler_straights: list<number >= 0>, optional

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

coupler_radii: list<number >= 0>, optional

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

coupler_rounding_algorithms: list<ShapeRound>, optional

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

coupler_offsets: list<Real, number>, optional

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>, optional

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, optional

area_layer_on: optional

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

coupler_transformations: optional

list of coupler transformations

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

shape: locked

shapes: locked

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

Examples

from technologies import silicon_photonics
from ipkiss3 import all as i3
TECH = i3.TECH
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()
../_images/full-24.png

RingRectSymm90DropFilter

class picazzo3.filters.ring.cell.RingRectSymm90DropFilter(*args, **kwargs)

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’>, optional

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

ring_trace_template: PCell and _WaveguideTemplate, optional

Trace template for the ring waveguide

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

list of coupler PCells

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

list of Ring PCells

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

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

coupler_lengths: list<number >= 0>, optional

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

coupler_parameters: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

shape_position: Coord2, optional

Translation of the shape.

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

coupler_straights: list<number >= 0>, optional

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

coupler_radii: list<number >= 0>, optional

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

coupler_rounding_algorithms: list<ShapeRound>, optional

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

coupler_offsets: list<Real, number>, optional

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>, optional

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, optional

area_layer_on: optional

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

coupler_transformations: optional

list of coupler transformations

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

shape: locked

shapes: locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-25.png

RingRectSBendNotchFilter

class picazzo3.filters.ring.cell.RingRectSBendNotchFilter(*args, **kwargs)

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’>, optional

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

ring_trace_template: PCell and _WaveguideTemplate, optional

Trace template for the ring waveguide

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

list of coupler PCells

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

list of Ring PCells

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

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

coupler_lengths: list<number >= 0>, optional

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

coupler_parameters: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

shape_position: Coord2, optional

Translation of the shape.

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

coupler_sbend_straights: list<number >= 0>, optional

coupler_straights: list<number >= 0>, optional

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

coupler_radii: list<number >= 0>, optional

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

coupler_rounding_algorithms: list<ShapeRound>, optional

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

coupler_offsets: list<Real, number>, optional

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>, optional

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, optional

area_layer_on: optional

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

coupler_transformations: optional

list of coupler transformations

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

shape: locked

shapes: locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-26.png

RingRectSBend180DropFilter

class picazzo3.filters.ring.cell.RingRectSBend180DropFilter(*args, **kwargs)

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’>, optional

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

ring_trace_template: PCell and _WaveguideTemplate, optional

Trace template for the ring waveguide

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

list of coupler PCells

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

list of Ring PCells

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

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

coupler_lengths: list<number >= 0>, optional

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

coupler_parameters: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

shape_position: Coord2, optional

Translation of the shape.

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

coupler_sbend_straights: list<number >= 0>, optional

coupler_straights: list<number >= 0>, optional

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

coupler_radii: list<number >= 0>, optional

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

coupler_rounding_algorithms: list<ShapeRound>, optional

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

coupler_offsets: list<Real, number>, optional

list of offsets of the ring couplers along the centerline

coupler_spacings: list<Real, number>, optional

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, optional

area_layer_on: optional

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

coupler_transformations: optional

list of coupler transformations

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

shape: locked

shapes: locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-27.png

Multi-mode Interferometers

MMITapered

class picazzo3.filters.mmi.MMITapered(*args, **kwargs)

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

Parameters:

external_port_names: optional

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

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

port_labels: optional

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

trace_template: optional

Template for all ports. If None, the waveguide templates of the ports will be used

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

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

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

List of the input trace templates.

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

List of the output trace templates.

transition_database: AutoTransitionDatabase, optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

contents: PCell, locked

Contains the base MMI without the tapers

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

Views

Layout
Parameters:

contents_transformation: GenericNoDistortTransform, optional

flatten_contents: optional

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

grids_per_unit: optional

Number of grid cells per design unit

straight_extension: optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

zero_length_if_identical: optional

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

input_y_positions: list<Real, number>, optional

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

length: float and number > 0, optional

Length of the MMI

output_y_positions: list<Real, number>, optional

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

transition_length: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

transition_lengths: locked

Examples

from technologies import silicon_photonics
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()
../_images/full-28.png

Tapered MMI with matched claddings:

from technologies import silicon_photonics
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 an 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 acces 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 calulate 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
    access_cladding_width = np.min([width_to_top,width_to_bottom])*2 #Just as wide as to reach the nearest cladding of the mmi.
    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()
../_images/full-29.png

MMIIdenticalTapered

class picazzo3.filters.mmi.MMIIdenticalTapered(*args, **kwargs)

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

Parameters:

external_port_names: optional

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

input_trace_template: PCell, optional

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

n_outputs: int and number > 0, optional

Number of output channels.

output_trace_template: PCell, optional

Output trace template.

port_labels: optional

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

n_inputs: int and number > 0, optional

Number of input channels

trace_template: optional

Template for all ports. If None, the waveguide templates of the ports will be used

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

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

transition_database: AutoTransitionDatabase, optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

mmi_trace: PCell, locked

Trace of the MMI section

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

List of the input trace templates.

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

List of the output trace templates.

contents: PCell, locked

Contains the base MMI without the tapers

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

list of templates to apply to all ports

Views

Layout
Parameters:

contents_transformation: GenericNoDistortTransform, optional

flatten_contents: optional

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

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

straight_extension: optional

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

zero_length_if_identical: optional

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

input_y_positions: list<Real, number>, optional

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

length: float and number > 0, optional

Length of the MMI

output_y_positions: list<Real, number>, optional

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

transition_length: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

transition_lengths: locked

Examples

from technologies import silicon_photonics
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()
../_images/full-30.png

MMISymmetricTapered

class picazzo3.filters.mmi.MMISymmetricTapered(*args, **kwargs)

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

Parameters:

external_port_names: optional

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

input_trace_template: PCell, optional

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

n_outputs: int and number > 0, optional

Number of output channels.

output_trace_template: PCell, optional

Output trace template.

port_labels: optional

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

n_inputs: int and number > 0, optional

Number of input channels

trace_template: optional

Template for all ports. If None, the waveguide templates of the ports will be used

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

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

transition_database: AutoTransitionDatabase, optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

mmi_trace: PCell, locked

Trace of the MMI section

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

List of the input trace templates.

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

List of the output trace templates.

contents: PCell, locked

Contains the base MMI without the tapers

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

list of templates to apply to all ports

Views

Layout
Parameters:

contents_transformation: GenericNoDistortTransform, optional

flatten_contents: optional

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

grids_per_unit: optional

Number of grid cells per design unit

trace_spacing: float and Real, number and number >= 0, optional

Offset between the traces at the input and the output

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

straight_extension: optional

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

zero_length_if_identical: optional

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

length: float and number > 0, optional

Length of the MMI

transition_length: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

transition_lengths: locked

input_y_positions: list<Real, number>, locked

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

output_y_positions: list<Real, number>, locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-31.png

MMI1x2Tapered

class picazzo3.filters.mmi.MMI1x2Tapered(*args, **kwargs)

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:

external_port_names: optional

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

input_trace_template: PCell, optional

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

output_trace_template: PCell, optional

Output trace template.

port_labels: optional

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

trace_template: optional

Template for all ports. If None, the waveguide templates of the ports will be used

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

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

transition_database: AutoTransitionDatabase, optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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.

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

List of the input trace templates.

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

List of the output trace templates.

contents: PCell, locked

Contains the base MMI without the tapers

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

list of templates to apply to all ports

Views

Layout
Parameters:

contents_transformation: GenericNoDistortTransform, optional

flatten_contents: optional

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

grids_per_unit: optional

Number of grid cells per design unit

trace_spacing: float and Real, number and number >= 0, optional

Offset between the traces at the input and the output

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

straight_extension: optional

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

zero_length_if_identical: optional

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

length: float and number > 0, optional

Length of the MMI

transition_length: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

transition_lengths: locked

input_y_positions: list<Real, number>, locked

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

output_y_positions: list<Real, number>, locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-32.png

MMI2x1Tapered

class picazzo3.filters.mmi.MMI2x1Tapered(*args, **kwargs)

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:

external_port_names: optional

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

input_trace_template: PCell, optional

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

output_trace_template: PCell, optional

Output trace template.

port_labels: optional

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

trace_template: optional

Template for all ports. If None, the waveguide templates of the ports will be used

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

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

transition_database: AutoTransitionDatabase, optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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.

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

List of the input trace templates.

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

List of the output trace templates.

contents: PCell, locked

Contains the base MMI without the tapers

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

list of templates to apply to all ports

Views

Layout
Parameters:

contents_transformation: GenericNoDistortTransform, optional

flatten_contents: optional

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

grids_per_unit: optional

Number of grid cells per design unit

trace_spacing: float and Real, number and number >= 0, optional

Offset between the traces at the input and the output

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

straight_extension: optional

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

zero_length_if_identical: optional

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

length: float and number > 0, optional

Length of the MMI

transition_length: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

transition_lengths: locked

input_y_positions: list<Real, number>, locked

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

output_y_positions: list<Real, number>, locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-33.png

MMI2x2Tapered

class picazzo3.filters.mmi.MMI2x2Tapered(*args, **kwargs)

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:

external_port_names: optional

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

input_trace_template: PCell, optional

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

output_trace_template: PCell, optional

Output trace template.

port_labels: optional

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

trace_template: optional

Template for all ports. If None, the waveguide templates of the ports will be used

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

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

transition_database: AutoTransitionDatabase, optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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.

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

List of the input trace templates.

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

List of the output trace templates.

contents: PCell, locked

Contains the base MMI without the tapers

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

list of templates to apply to all ports

Views

Layout
Parameters:

contents_transformation: GenericNoDistortTransform, optional

flatten_contents: optional

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

grids_per_unit: optional

Number of grid cells per design unit

trace_spacing: float and Real, number and number >= 0, optional

Offset between the traces at the input and the output

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

straight_extension: optional

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

zero_length_if_identical: optional

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

length: float and number > 0, optional

Length of the MMI

transition_length: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

transition_lengths: locked

input_y_positions: list<Real, number>, locked

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

output_y_positions: list<Real, number>, locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-34.png

RibMMIIdenticalTapered

class picazzo3.filters.mmi_rib.RibMMIIdenticalTapered(*args, **kwargs)

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 modifcations intended to avoid sharp corners DRC errors with the tapers.

Parameters:

external_port_names: optional

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

input_trace_template: PCell, optional

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

n_outputs: int and number > 0, optional

Number of output channels.

output_trace_template: PCell, optional

Output trace template.

port_labels: optional

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

n_inputs: int and number > 0, optional

Number of input channels

trace_template: optional

Template for all ports. If None, the waveguide templates of the ports will be used

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

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

transition_database: AutoTransitionDatabase, optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

mmi_trace: PCell, locked

Trace of the MMI section

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

List of the input trace templates.

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

List of the output trace templates.

contents: PCell, locked

Contains the base MMI without the tapers

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

list of templates to apply to all ports

Views

Layout
Parameters:

contents_transformation: GenericNoDistortTransform, optional

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

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

flatten_contents: optional

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

grids_per_unit: optional

Number of grid cells per design unit

minimum_space: float and number > 0, optional

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

rib_cover_purpose: PatternPurpose, optional

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

view_name: str, optional

The name of the view

units_per_grid: optional

Ratio of grid cell and design unit

straight_extension: optional

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

zero_length_if_identical: optional

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

input_y_positions: list<Real, number>, optional

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

length: float and number > 0, optional

Length of the MMI

output_y_positions: list<Real, number>, optional

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

transition_length: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

transition_lengths: locked

Examples

import technologies.silicon_photonics
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()
../_images/full-35.png

RibMMISymmetricTapered

class picazzo3.filters.mmi_rib.RibMMISymmetricTapered(*args, **kwargs)

Rib MMI with symmetrically distributed access templates and with tapers.

Parameters:

external_port_names: optional

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

input_trace_template: PCell, optional

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

n_outputs: int and number > 0, optional

Number of output channels.

output_trace_template: PCell, optional

Output trace template.

port_labels: optional

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

n_inputs: int and number > 0, optional

Number of input channels

trace_template: optional

Template for all ports. If None, the waveguide templates of the ports will be used

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

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

transition_database: AutoTransitionDatabase, optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

mmi_trace: PCell, locked

Trace of the MMI section

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

List of the input trace templates.

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

List of the output trace templates.

contents: PCell, locked

Contains the base MMI without the tapers

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

list of templates to apply to all ports

Views

Layout
Parameters:

contents_transformation: GenericNoDistortTransform, optional

flatten_contents: optional

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

grids_per_unit: optional

Number of grid cells per design unit

trace_spacing: float and Real, number and number >= 0, optional

Offset between the traces at the input and the output

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

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

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, optional

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

rib_cover_purpose: PatternPurpose, optional

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

straight_extension: optional

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

zero_length_if_identical: optional

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

length: float and number > 0, optional

Length of the MMI

transition_length: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

transition_lengths: locked

input_y_positions: list<Real, number>, locked

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

output_y_positions: list<Real, number>, locked

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

Examples

import technologies.silicon_photonics
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()
../_images/full-36.png

RibMMI1x2Tapered

class picazzo3.filters.mmi_rib.RibMMI1x2Tapered(*args, **kwargs)

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

Parameters:

external_port_names: optional

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

input_trace_template: PCell, optional

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

output_trace_template: PCell, optional

Output trace template.

port_labels: optional

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

trace_template: optional

Template for all ports. If None, the waveguide templates of the ports will be used

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

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

transition_database: AutoTransitionDatabase, optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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.

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

List of the input trace templates.

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

List of the output trace templates.

contents: PCell, locked

Contains the base MMI without the tapers

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

list of templates to apply to all ports

Views

Layout
Parameters:

contents_transformation: GenericNoDistortTransform, optional

flatten_contents: optional

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

grids_per_unit: optional

Number of grid cells per design unit

trace_spacing: float and Real, number and number >= 0, optional

Offset between the traces at the input and the output

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

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

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, optional

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

rib_cover_purpose: PatternPurpose, optional

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

straight_extension: optional

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

zero_length_if_identical: optional

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

length: float and number > 0, optional

Length of the MMI

transition_length: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

transition_lengths: locked

input_y_positions: list<Real, number>, locked

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

output_y_positions: list<Real, number>, locked

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

Examples

import technologies.silicon_photonics
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()
../_images/full-37.png

RibMMI2x1Tapered

class picazzo3.filters.mmi_rib.RibMMI2x1Tapered(*args, **kwargs)

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

Parameters:

external_port_names: optional

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

input_trace_template: PCell, optional

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

output_trace_template: PCell, optional

Output trace template.

port_labels: optional

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

trace_template: optional

Template for all ports. If None, the waveguide templates of the ports will be used

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

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

transition_database: AutoTransitionDatabase, optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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.

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

List of the input trace templates.

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

List of the output trace templates.

contents: PCell, locked

Contains the base MMI without the tapers

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

list of templates to apply to all ports

Views

Layout
Parameters:

contents_transformation: GenericNoDistortTransform, optional

flatten_contents: optional

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

grids_per_unit: optional

Number of grid cells per design unit

trace_spacing: float and Real, number and number >= 0, optional

Offset between the traces at the input and the output

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

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

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, optional

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

rib_cover_purpose: PatternPurpose, optional

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

straight_extension: optional

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

zero_length_if_identical: optional

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

length: float and number > 0, optional

Length of the MMI

transition_length: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

transition_lengths: locked

input_y_positions: list<Real, number>, locked

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

output_y_positions: list<Real, number>, locked

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

Examples

import technologies.silicon_photonics
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()
../_images/full-38.png

RibMMI2x2Tapered

class picazzo3.filters.mmi_rib.RibMMI2x2Tapered(*args, **kwargs)

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

Parameters:

external_port_names: optional

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

input_trace_template: PCell, optional

Input trace template.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

output_trace_template: PCell, optional

Output trace template.

port_labels: optional

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

trace_template: optional

Template for all ports. If None, the waveguide templates of the ports will be used

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

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

transition_database: AutoTransitionDatabase, optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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.

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

List of the input trace templates.

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

List of the output trace templates.

contents: PCell, locked

Contains the base MMI without the tapers

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

list of templates to apply to all ports

Views

Layout
Parameters:

contents_transformation: GenericNoDistortTransform, optional

flatten_contents: optional

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

grids_per_unit: optional

Number of grid cells per design unit

trace_spacing: float and Real, number and number >= 0, optional

Offset between the traces at the input and the output

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

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

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, optional

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

rib_cover_purpose: PatternPurpose, optional

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

straight_extension: optional

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

zero_length_if_identical: optional

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

length: float and number > 0, optional

Length of the MMI

transition_length: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

transition_lengths: locked

input_y_positions: list<Real, number>, locked

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

output_y_positions: list<Real, number>, locked

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

Examples

import technologies.silicon_photonics
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()
../_images/full-39.png

MMI

class picazzo3.filters.mmi.MMI(*args, **kwargs)

Rectangular multimode interferometer, generated from a waveguide template

Parameters:

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

List of the input trace templates.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

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

List of the output trace templates.

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

mmi_trace: PCell, locked

Trace of the MMI section

n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

Views

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:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

input_y_positions: list<Real, number>, optional

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

length: float and number > 0, optional

Length of the MMI

output_y_positions: list<Real, number>, optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

from technologies import silicon_photonics
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()
../_images/full-40.png

MMIIdentical

class picazzo3.filters.mmi.MMIIdentical(*args, **kwargs)

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

Parameters:

input_trace_template: PCell, optional

Input trace template.

n_inputs: int and number > 0, optional

Number of input channels

n_outputs: int and number > 0, optional

Number of output channels.

output_trace_template: PCell, optional

Output trace template.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

List of the input trace templates.

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

List of the output trace templates.

mmi_trace: PCell, locked

Trace of the MMI section

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

input_y_positions: list<Real, number>, optional

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

length: float and number > 0, optional

Length of the MMI

output_y_positions: list<Real, number>, optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

from technologies import silicon_photonics
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()
../_images/full-41.png

MMISymmetric

class picazzo3.filters.mmi.MMISymmetric(*args, **kwargs)

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

Parameters:

input_trace_template: PCell, optional

Input trace template.

n_inputs: int and number > 0, optional

Number of input channels

n_outputs: int and number > 0, optional

Number of output channels.

output_trace_template: PCell, optional

Output trace template.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

List of the input trace templates.

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

List of the output trace templates.

mmi_trace: PCell, locked

Trace of the MMI section

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

trace_spacing: float and Real, number and number >= 0, optional

Offset between the traces at the input and the output

length: float and number > 0, optional

Length of the MMI

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

input_y_positions: list<Real, number>, locked

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

output_y_positions: list<Real, number>, locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-42.png

MMI1x2

class picazzo3.filters.mmi.MMI1x2(*args, **kwargs)

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:

input_trace_template: PCell, optional

Input trace template.

output_trace_template: PCell, optional

Output trace template.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

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

List of the input trace templates.

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

List of the output trace templates.

mmi_trace: PCell, locked

Trace of the MMI section

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

trace_spacing: float and Real, number and number >= 0, optional

Offset between the traces at the input and the output

length: float and number > 0, optional

Length of the MMI

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

input_y_positions: list<Real, number>, locked

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

output_y_positions: list<Real, number>, locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-43.png

MMI2x1

class picazzo3.filters.mmi.MMI2x1(*args, **kwargs)

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:

input_trace_template: PCell, optional

Input trace template.

output_trace_template: PCell, optional

Output trace template.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

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

List of the input trace templates.

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

List of the output trace templates.

mmi_trace: PCell, locked

Trace of the MMI section

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

trace_spacing: float and Real, number and number >= 0, optional

Offset between the traces at the input and the output

length: float and number > 0, optional

Length of the MMI

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

input_y_positions: list<Real, number>, locked

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

output_y_positions: list<Real, number>, locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-44.png

MMI2x2

class picazzo3.filters.mmi.MMI2x2(*args, **kwargs)

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:

input_trace_template: PCell, optional

Input trace template.

output_trace_template: PCell, optional

Output trace template.

mmi_trace_template: PCell and _WaveguideTemplate, optional

Trace template used for the MMI section

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

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

List of the input trace templates.

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

List of the output trace templates.

mmi_trace: PCell, locked

Trace of the MMI section

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

trace_spacing: float and Real, number and number >= 0, optional

Offset between the traces at the input and the output

length: float and number > 0, optional

Length of the MMI

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

input_y_positions: list<Real, number>, locked

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

output_y_positions: list<Real, number>, locked

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

Examples

from technologies import silicon_photonics
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()
../_images/full-45.png

Mach-Zehnder Interferometers (MZI)

MZI

class picazzo3.filters.mzi.cell.MZI(*args, **kwargs)

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

Parameters:

arm1: PCell and MZIArm, optional

The South arm of the MZI

arm1_port_names: length == 2, optional

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

arm2: PCell and MZIArm, optional

The North arm of the MZI

arm2_port_names: length == 2, optional

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

combiner: PCell, optional

The combiner of the MZI

combiner_port_names: length == 2, optional

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

splitter: PCell, optional

The splitter of the MZI

splitter_port_names: length == 2, optional

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

external_port_names: optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

child_cells: locked

links: locked

Views

Layout
Parameters:

combiner_transformation: GenericNoDistortTransform, optional

grids_per_unit: optional

Number of grid cells per design unit

splitter_transformation: GenericNoDistortTransform, optional

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

flyline_layer: optional

layer to draw flylines of physically unconnected links

flyline_width: float and number > 0, optional

line width of the flylines

netlist_view: NetlistView, optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

child_transformations: locked

Examples

from technologies import silicon_photonics
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()
../_images/full-46.png

MZIWithCells

class picazzo3.filters.mzi.cell.MZIWithCells(*args, **kwargs)

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

Parameters:

arm1_contents: optional

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

arm1_contents_port_names: length == 2, optional

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

arm2_contents: optional

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

arm2_contents_port_names: length == 2, optional

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

auto_transition: optional

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

trace_template: PCell and _WaveguideTemplate, optional

arm1: PCell and MZIArm, optional

The South arm of the MZI

arm1_port_names: length == 2, optional

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

arm2: PCell and MZIArm, optional

The North arm of the MZI

arm2_port_names: length == 2, optional

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

combiner: PCell, optional

The combiner of the MZI

combiner_port_names: length == 2, optional

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

splitter: PCell, optional

The splitter of the MZI

splitter_port_names: length == 2, optional

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

external_port_names: optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

child_cells: locked

links: locked

Examples

from technologies import silicon_photonics
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()
../_images/full-47.png

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

arm1_contents_length: optional

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.

arm1_contents_transformation: GenericNoDistortTransform, optional

arm2_contents_length: optional

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.

arm2_contents_transformation: GenericNoDistortTransform, optional

extra_length: float, optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

arm1_direction: optional

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

arm2_direction: optional

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

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

Minimum straight length between two bends

combiner_transformation: GenericNoDistortTransform, optional

splitter_transformation: GenericNoDistortTransform, optional

flyline_layer: optional

layer to draw flylines of physically unconnected links

flyline_width: float and number > 0, optional

line width of the flylines

netlist_view: NetlistView, optional

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

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

rounding_algorithm: optional

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

child_transformations: locked

MZIWaveguideArm

class picazzo3.filters.mzi.cell.MZIWaveguideArm(*args, **kwargs)

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

Parameters:

trace_template: PCell and _WaveguideTemplate, optional

external_port_names: optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

contents: PCell and _Trace, locked

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

combiner_port: OpticalPort, optional

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

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

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

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

draw_control_shape: optional

draws the control shape on top of the waveguide

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

Extra length that will be added in the arm

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

splitter_port: OpticalPort, optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

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

Minimum straight length between bends

routing_direction: optional

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

contents_transformation: GenericNoDistortTransform, optional

core_layer: __Layer__, optional

layer used to define the core of the waveguide

bend_radii: list<number > 0>, optional

bend radius for every individual bend

remove_straight_angles: optional

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

reverse_bends: optional

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

reverse_individual_bends: list<>, optional

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: optional

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

input_port: TracePort, optional

output_port: TracePort, optional

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports.

flatten_contents: optional

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

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

center_line_shape: locked

Automatically calculated shape of the center line of the trace

shape: locked

Examples

from technologies import silicon_photonics
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()
../_images/full-48.png

MZIContainerArm

class picazzo3.filters.mzi.cell.MZIContainerArm(*args, **kwargs)

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

Parameters:

auto_transition: optional

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: <type ‘str’> and length == 2, optional

Names of the two ports to be processed

trace_template: optional

Template for all ports. If None, the waveguide templates of the ports will be used

contents: PCell, optional

the contents of the container: the child cell

external_port_names: optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

list of templates to apply to all ports

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

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

contents_length: float and Real, number and number >= 0, optional

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.

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

Extra length that will be added in the arm

flatten_contents: optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

horizontal_contents_offset: float, optional

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

manhattan: optional

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

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

Minimum straight length between bends

rounding_algorithm: optional

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

splitter_port: OpticalPort, optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

combiner_port: OpticalPort, optional

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

routing_direction: optional

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

routes: optional

routes along which the waveguides will be generated

contents_transformation: GenericNoDistortTransform, optional

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

Examples

from technologies import silicon_photonics
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()
../_images/full-49.png
from technologies import silicon_photonics
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()
../_images/full-50.png
from technologies import silicon_photonics
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()
../_images/full-51.png

Generic Photonic Crystals

DodecPhCLayout

class picazzo3.phc.generic.cell.DodecPhCLayout(*args, **kwargs)

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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

lattice_pitches: Coord2, optional

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.

purpose: PatternPurpose, optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

cells: optional

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 dictiornary ‘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.

hole_sizes: dict, optional

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.

process_wg: ProcessLayer, optional

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

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

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

pitches: optional

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

map: str, optional

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

ports_coordinates: optional

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

process_hfw: ProcessLayer, optional

process for underetching

purpose_hfw: PatternPurpose, optional

drawing purpose for underetching

zero_line_y: float, optional

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 .

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

import technologies.silicon_photonics
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()
../_images/full-52.png

HexPhCLayout

class picazzo3.phc.generic.cell.HexPhCLayout(*args, **kwargs)

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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

lattice_pitches: Coord2, optional

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.

purpose: PatternPurpose, optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

cells: optional

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 dictiornary ‘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.

hole_sizes: dict, optional

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.

process_wg: ProcessLayer, optional

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

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

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

pitches: optional

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

map: str, optional

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

ports_coordinates: optional

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

process_hfw: ProcessLayer, optional

process for underetching

purpose_hfw: PatternPurpose, optional

drawing purpose for underetching

zero_line_y: float, optional

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 .

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

import technologies.silicon_photonics
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()
../_images/full-53.png

OctPhCLayout

class picazzo3.phc.generic.cell.OctPhCLayout(*args, **kwargs)

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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

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

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

cells: optional

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 dictiornary ‘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.

hole_sizes: dict, optional

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.

process_wg: ProcessLayer, optional

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

purpose: PatternPurpose, optional

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

map: str, optional

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

pitches: Coord2, optional

X and Y pitch of the photonic crystal

ports_coordinates: optional

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

process_hfw: ProcessLayer, optional

process for underetching

purpose_hfw: PatternPurpose, optional

drawing purpose for underetching

zero_line_y: float, optional

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 .

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

import technologies.silicon_photonics
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()
../_images/full-54.png

SquarePhCLayout

class picazzo3.phc.generic.cell.SquarePhCLayout(*args, **kwargs)

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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

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

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

cells: optional

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 dictiornary ‘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.

hole_sizes: dict, optional

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.

process_wg: ProcessLayer, optional

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

purpose: PatternPurpose, optional

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

map: str, optional

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

pitches: Coord2, optional

X and Y pitch of the photonic crystal

ports_coordinates: optional

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

process_hfw: ProcessLayer, optional

process for underetching

purpose_hfw: PatternPurpose, optional

drawing purpose for underetching

zero_line_y: float, optional

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 .

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

from technologies import silicon_photonics
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()
../_images/full-55.png

TriangularPhCLayout

class picazzo3.phc.generic.cell.TriangularPhCLayout(*args, **kwargs)

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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

See also

PhCLayout, RectangularPhCLayout

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

lattice_pitches: Coord2, optional

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.

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

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

pitches: optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

cells: dict, optional

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

map: str, optional

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

ports_coordinates: optional

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

process_hfw: ProcessLayer, optional

process for underetching

purpose_hfw: PatternPurpose, optional

drawing purpose for underetching

zero_line_y: float, optional

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 .

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

RectangularPhCLayout

class picazzo3.phc.generic.cell.RectangularPhCLayout(*args, **kwargs)

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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

See also

PhCLayout, TriangularPhCLayout

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

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

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

cells: dict, optional

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

map: str, optional

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

pitches: Coord2, optional

X and Y pitch of the photonic crystal

ports_coordinates: optional

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

process_hfw: ProcessLayer, optional

process for underetching

purpose_hfw: PatternPurpose, optional

drawing purpose for underetching

zero_line_y: float, optional

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 .

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Photonic Crystal HeteroWaveguide Layouts

W1HeteroCavity

class picazzo3.phc.hetero.cell.W1HeteroCavity(*args, **kwargs)

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:

cavity: PCell, optional

The cavity child cell (autogenerated)

cavity_defect_unit_cell: PCell, optional

The Photonic Crystal unit cell of the cavity lattice. By default it is empty.

cavity_unit_cell: PCell, optional

The Photonic Crystal unit cell of the cavity lattice

mirror: PCell, optional

The mirror child cell (autogenerated)

mirror_defect_unit_cell: PCell, optional

The Photonic Crystal unit cell of the mirror waveguide. By default it is empty.

mirror_unit_cell: PCell, optional

The Photonic Crystal unit cell of the mirror lattice

n_o_cladding_layers: int and number > 0, optional

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

mirror_pos2: optional

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

cavity_pitch: float and number > 0, optional

cavity_pos: Coord2, optional

mirror_pitch: float and number > 0, optional

mirror_pos: Coord2, optional

n_o_cavity_periods: int and number > 0, optional

n_o_mirror_periods: int and number > 0, optional

process_hfw: ProcessLayer, optional

purpose_hfw: PatternPurpose, optional

vertical_cavity_pitch: float and number > 0, optional

off-axis pitch of the cavity lattice: default = matched to mirror)

vertical_mirror_pitch: float and number > 0, optional

off-axis pitch of the mirror lattice: default = same as mirror_pitch)

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

""" We combine three photonic crystal lattices into a heterocavity"""
from technologies import silicon_photonics
from ipkiss3 import all as i3
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()
../_images/full-56.png

W1HeteroCavity1Mirror

class picazzo3.phc.hetero.cell.W1HeteroCavity1Mirror(*args, **kwargs)

this partial component class forms a Cavity with a single mirror. It requires a second mirror to form a complete cavity

Parameters:

cavity: PCell, optional

The cavity child cell (autogenerated)

cavity_defect_unit_cell: PCell, optional

The Photonic Crystal unit cell of the cavity lattice. By default it is empty.

cavity_unit_cell: PCell, optional

The Photonic Crystal unit cell of the cavity lattice

mirror: PCell, optional

The mirror child cell (autogenerated)

mirror_defect_unit_cell: PCell, optional

The Photonic Crystal unit cell of the mirror waveguide. By default it is empty.

mirror_unit_cell: PCell, optional

The Photonic Crystal unit cell of the mirror lattice

n_o_cladding_layers: int and number > 0, optional

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

cavity_pitch: float and number > 0, optional

cavity_pos: Coord2, optional

grids_per_unit: optional

Number of grid cells per design unit

mirror_pitch: float and number > 0, optional

mirror_pos: Coord2, optional

n_o_cavity_periods: int and number > 0, optional

n_o_mirror_periods: int and number > 0, optional

process_hfw: ProcessLayer, optional

purpose_hfw: PatternPurpose, optional

units_per_grid: optional

Ratio of grid cell and design unit

vertical_cavity_pitch: float and number > 0, optional

off-axis pitch of the cavity lattice: default = matched to mirror)

vertical_mirror_pitch: float and number > 0, optional

off-axis pitch of the mirror lattice: default = same as mirror_pitch)

view_name: str, optional

The name of the view

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

W1HeteroCavityMulti

class picazzo3.phc.hetero.cell.W1HeteroCavityMulti(*args, **kwargs)

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 seperately, as well as the different lattice pitches.

Parameters:

cavity: PCell, optional

The cavity child cell (autogenerated)

cavity_defect_unit_cell: PCell, optional

The Photonic Crystal unit cell of the cavity lattice. By default it is empty.

cavity_unit_cell: PCell, optional

The Photonic Crystal unit cell of the cavity lattice

mirror: PCell, optional

The mirror child cell (autogenerated)

mirror_defect_unit_cell: PCell, optional

The Photonic Crystal unit cell of the mirror waveguide. By default it is empty.

mirror_unit_cell: PCell, optional

The Photonic Crystal unit cell of the mirror lattice

n_o_cladding_layers: int and number > 0, optional

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

cavity_period: float and number > 0, optional

repetition period of the cavity. By default it is calculated automatically.

grids_per_unit: optional

Number of grid cells per design unit

n_o_cavities: int and number > 0, optional

number of cavities in series

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

mirror_pos2: optional

cavity_pitch: float and number > 0, optional

cavity_pos: Coord2, optional

mirror_pitch: float and number > 0, optional

mirror_pos: Coord2, optional

n_o_cavity_periods: int and number > 0, optional

n_o_mirror_periods: int and number > 0, optional

process_hfw: ProcessLayer, optional

purpose_hfw: PatternPurpose, optional

vertical_cavity_pitch: float and number > 0, optional

off-axis pitch of the cavity lattice: default = matched to mirror)

vertical_mirror_pitch: float and number > 0, optional

off-axis pitch of the mirror lattice: default = same as mirror_pitch)

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

from technologies import silicon_photonics
from ipkiss3 import all as i3
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()
../_images/full-57.png

Photonic Crystal W1 Waveguides and Cavities

GenericW1Waveguide

class picazzo3.phc.w1.cell.GenericW1Waveguide(*args, **kwargs)

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’>, optional

List of unit cells: center row to outside rows (symmetric)

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

n_o_periods: int and number > 0, optional

number of lattice periods in the propagation direction of the W1 waveguide

port_offset: float, optional

Horizontal offset of the port width respect to the first and last column of the W1 waveguide.

port_row: optional

Row of the photonic crystal waveguide where the input/output ports are located. If none, it will be the center.

port_width: optional

width of the waveguide ports of the photonic crystal waveguide. If none, a width of sqrt(3)*pitch is taken.

start_even: optional

If true, start the crystal on an even row, if false, on an odd row.

lattice_pitches: Coord2, optional

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.

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

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

pitches: optional

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

cells: dict, optional

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

map: str, optional

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

ports_coordinates: optional

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

process_hfw: ProcessLayer, optional

process for underetching

purpose_hfw: PatternPurpose, optional

drawing purpose for underetching

zero_line_y: float, optional

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 .

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

""" We will generate a W1 with a lattice pitch which is slightly
different along the horizontal and oblique direction
"""

from technologies import silicon_photonics
from ipkiss3 import all as i3
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()
../_images/full-58.png

W1Waveguide

class picazzo3.phc.w1.cell.W1Waveguide(*args, **kwargs)

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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

lattice_pitches: Coord2, optional

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.

purpose: PatternPurpose, optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

defect_diameter: float and Real, number and number >= 0, optional

Diameter of the defect holes. If zero, no holes are drawn.

diameter: float and number > 0, optional

diameter of the photonic crystal lattice holes

n_o_cladding_layers: int and number > 0, optional

Number of cladding layers north and south.

n_o_periods: int and number > 0, optional

Number of lattice periods in the propagation direction.

cells: optional

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 dictiornary ‘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.

hole_sizes: dict, optional

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.

process_wg: ProcessLayer, optional

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

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

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

pitches: optional

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

map: str, optional

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

ports_coordinates: optional

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

process_hfw: ProcessLayer, optional

process for underetching

purpose_hfw: PatternPurpose, optional

drawing purpose for underetching

zero_line_y: float, optional

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 .

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

""" A W1 waveguide with a missing row of holes """
from technologies import silicon_photonics
from ipkiss3 import all as i3
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()
../_images/full-59.png
""" A W1 waveguide with a center row of holes of different size"""
from technologies import silicon_photonics
from ipkiss3 import all as i3
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()
../_images/full-60.png

W1WaveguideWithInlineCavity

class picazzo3.phc.w1.cell.W1WaveguideWithInlineCavity(*args, **kwargs)

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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

cavity_hole_diameters: list<number >= 0>, optional

list of hole diameters in the cavity, including mirrors

grids_per_unit: optional

Number of grid cells per design unit

lattice_pitches: Coord2, optional

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.

purpose: PatternPurpose, optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

defect_diameter: float and Real, number and number >= 0, optional

Diameter of the defect holes. If zero, no holes are drawn.

diameter: float and number > 0, optional

diameter of the photonic crystal lattice holes

n_o_cladding_layers: int and number > 0, optional

Number of cladding layers north and south.

n_o_periods: int and number > 0, optional

Number of lattice periods in the propagation direction.

cells: optional

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 dictiornary ‘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.

hole_sizes: dict, optional

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.

process_wg: ProcessLayer, optional

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

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

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

pitches: optional

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

map: str, optional

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

ports_coordinates: optional

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

process_hfw: ProcessLayer, optional

process for underetching

purpose_hfw: PatternPurpose, optional

drawing purpose for underetching

zero_line_y: float, optional

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 .

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

from technologies import silicon_photonics
from ipkiss3 import all as i3
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()
../_images/full-61.png

W1WaveguideWithAllpass

class picazzo3.phc.w1.cell.W1WaveguideWithAllpass(*args, **kwargs)

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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

cavity_length: int and number > 0, optional

number of holes the cavity should be long

cavity_offset: int and number > 0, optional

side row on which the cavity should be located

grids_per_unit: optional

Number of grid cells per design unit

lattice_pitches: Coord2, optional

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.

purpose: PatternPurpose, optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

defect_diameter: float and Real, number and number >= 0, optional

Diameter of the defect holes. If zero, no holes are drawn.

diameter: float and number > 0, optional

diameter of the photonic crystal lattice holes

n_o_cladding_layers: int and number > 0, optional

Number of cladding layers north and south.

n_o_periods: int and number > 0, optional

Number of lattice periods in the propagation direction.

cells: optional

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 dictiornary ‘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.

hole_sizes: dict, optional

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.

process_wg: ProcessLayer, optional

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

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

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

pitches: optional

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

map: str, optional

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

ports_coordinates: optional

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

process_hfw: ProcessLayer, optional

process for underetching

purpose_hfw: PatternPurpose, optional

drawing purpose for underetching

zero_line_y: float, optional

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 .

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

from technologies import silicon_photonics
from ipkiss3 import all as i3
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()
../_images/full-62.png

Rib Waveguides

RibWaveguideTemplate

class picazzo3.traces.rib_wg.RibWaveguideTemplate(*args, **kwargs)

This waveguide is a (shallow etched) rib waveguide, with no specific bound in the slab.

                 core_width
               <----------->
               cladding_width
<------------------------------------------>
                ___________
_______________|           |________________   

____________________________________________
Parameters:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

cladding_width: float and number > 0, optional

total width of the waveguide with cladding

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

core_process: ProcessLayer, optional

process of the rib

core_width: float and number > 0, optional

width of the rib

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>, optional

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

cladding_process: ProcessLayer, optional

process for the waveguide cladding, defaults to the core process

cladding_purpose: PatternPurpose, optional

drawing purpose layer for the cladding

core_purpose: PatternPurpose, optional

drawing purpose for the waveguide core

core_layer: __Layer__, optional

layer used to define the core of the waveguide

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

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

pin_shape: Shape, optional

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports. Default = this template

draw_control_shape: optional

draws the control shape on top of the waveguide

width: float and Real, number and number >= 0, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

""" This example shows how you use the template to directly create a rib waveguide PCell
and its layout. """
from technologies import silicon_photonics
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()
../_images/full-63.png

RibWireWaveguideTemplate

class picazzo3.traces.rib_wg.RibWireWaveguideTemplate(*args, **kwargs)

This waveguide is a (shallow etched) rib waveguide, loaded on top of a (finite) strip wire.

                 core_width
               <----------->
                 strip_width
          <--------------------->
               cladding_width
<------------------------------------------>
                ___________
           ____|           |____   
          |                     |
__________|_____________________|___________
Parameters:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

cladding_width: float and number > 0, optional

total width of the waveguide with cladding

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

core_process: ProcessLayer, optional

process for the shallow-etched core

core_width: float and number > 0, optional

width of the shallow-etched core

grids_per_unit: optional

Number of grid cells per design unit

strip_cladding_purpose: PatternPurpose, optional

drawing purpose for the strip wire cladding

strip_process: ProcessLayer, optional

process for the strip wire

strip_purpose: PatternPurpose, optional

drawing purpose for the strip wire

strip_width: float and number > 0, optional

width of the deep-etched strip wire

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>, optional

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

cladding_process: ProcessLayer, optional

process for the waveguide cladding, defaults to the core process

cladding_purpose: PatternPurpose, optional

drawing purpose layer for the cladding

core_purpose: PatternPurpose, optional

drawing purpose for the waveguide core

core_layer: __Layer__, optional

layer used to define the core of the waveguide

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

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

pin_shape: Shape, optional

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports. Default = this template

draw_control_shape: optional

draws the control shape on top of the waveguide

width: float and Real, number and number >= 0, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

""" This example shows how you use the template to directly create a rib-wire waveguide PCell
and its layout. """
from technologies import silicon_photonics
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()
../_images/full-64.png

Slot Waveguides

SlotWaveguideTemplate

class picazzo3.traces.slot_wg.SlotWaveguideTemplate(*args, **kwargs)

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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

cladding_width: float and number > 0, optional

total width of the waveguide with cladding

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

core_process: ProcessLayer, optional

process for the waveguide ribs

core_purpose: PatternPurpose, optional

drawing purpose for the waveguide ribs

grids_per_unit: optional

Number of grid cells per design unit

slot_process: ProcessLayer, optional

process for the slot

slot_purpose: PatternPurpose, optional

drawing purpose for the slot

slot_width: float and number > 0, optional

width of the slot

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>, optional

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

cladding_process: ProcessLayer, optional

process for the waveguide cladding, defaults to the core process

cladding_purpose: PatternPurpose, optional

drawing purpose layer for the cladding

core_layer: __Layer__, optional

layer used to define the core of the waveguide

core_width: float and number > 0, optional

width of the waveguide core

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

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

pin_shape: Shape, optional

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports. Default = this template

draw_control_shape: optional

draws the control shape on top of the waveguide

width: float and Real, number and number >= 0, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

""" This example shows how you use the template to directly create a slot waveguide PCell
and its layout. """
from technologies import silicon_photonics
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)

wg = wg_t(name="my_slot_waveguide1")
layout = wg.Layout(shape=[(0.0, 0.0), (10.0, 0.0)])

layout.visualize()
../_images/full-65.png

DoubleSlotWaveguideTemplate

class picazzo3.traces.slot_wg.DoubleSlotWaveguideTemplate(*args, **kwargs)

This waveguide is a strip-like waveguide with a two slots in the middle

                ___   __   ___
               |   | |  | |   |
               |   | |  | |   |
_______________|___|_|  |_|___|_________________
Parameters:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

center_core_width: float and number > 0, optional

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

core_width: float and number > 0, optional

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>, optional

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

cladding_width: float and number > 0, optional

total width of the waveguide with cladding

core_process: ProcessLayer, optional

process for the waveguide ribs

core_purpose: PatternPurpose, optional

drawing purpose for the waveguide ribs

slot_process: ProcessLayer, optional

process for the slot

slot_purpose: PatternPurpose, optional

drawing purpose for the slot

slot_width: float and number > 0, optional

width of the slot

cladding_process: ProcessLayer, optional

process for the waveguide cladding, defaults to the core process

cladding_purpose: PatternPurpose, optional

drawing purpose layer for the cladding

core_layer: __Layer__, optional

layer used to define the core of the waveguide

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

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

pin_shape: Shape, optional

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports. Default = this template

draw_control_shape: optional

draws the control shape on top of the waveguide

width: float and Real, number and number >= 0, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

""" This example shows how you use the template to directly create a slot waveguide PCell
and its layout. """
from technologies import silicon_photonics
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()
../_images/full-66.png

Socket Waveguides

SocketWaveguideTemplate

class picazzo3.traces.socket_wg.SocketWaveguideTemplate(*args, **kwargs)

Socket-style waveguide template: deep etched rib waveguide

                ___________
               |           |
_______________|           |________________
____________________________________________
Parameters:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

cladding_width: float and number > 0, optional

total width of the waveguide with cladding

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

core_process: ProcessLayer, optional

process for the rib

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>, optional

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

core_width: float and number > 0, optional

width of the rib

cladding_process: ProcessLayer, optional

process for the waveguide cladding, defaults to the core process

cladding_purpose: PatternPurpose, optional

drawing purpose layer for the cladding

core_purpose: PatternPurpose, optional

drawing purpose for the waveguide core

core_layer: __Layer__, optional

layer used to define the core of the waveguide

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

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

pin_shape: Shape, optional

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports. Default = this template

draw_control_shape: optional

draws the control shape on top of the waveguide

width: float and Real, number and number >= 0, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

"""This example shows how you use the template to directly create a socket waveguide PCell
and its layout."""
from technologies import silicon_photonics
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()
../_images/full-67.png

SlottedSocketWaveguideTemplate

class picazzo3.traces.socket_wg.SlottedSocketWaveguideTemplate(*args, **kwargs)

Socket waveguide with a deep etched slot

                ____   ____
               |    | |    |
_______________|    | |    |________________   
____________________|_|_____________________
Parameters:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

cladding_width: float and number > 0, optional

total width of the waveguide with cladding

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

core_process: ProcessLayer, optional

process for the rib

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>, optional

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

core_purpose: PatternPurpose, optional

drawing purpose for the waveguide ribs

slot_process: ProcessLayer, optional

process for the slot

slot_purpose: PatternPurpose, optional

drawing purpose for the slot

slot_width: float and number > 0, optional

width of the slot

cladding_process: ProcessLayer, optional

process for the waveguide cladding, defaults to the core process

cladding_purpose: PatternPurpose, optional

drawing purpose layer for the cladding

core_layer: __Layer__, optional

layer used to define the core of the waveguide

core_width: float and number > 0, optional

width of the waveguide core

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

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

pin_shape: Shape, optional

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports. Default = this template

draw_control_shape: optional

draws the control shape on top of the waveguide

width: float and Real, number and number >= 0, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

""" This example shows how you use the template to directly create a slotted socket waveguide PCell
and its layout. """
from technologies import silicon_photonics
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()
../_images/full-68.png

Thinned Waveguides

ThinnedWaveguideTemplate

class picazzo3.traces.thin_wg.ThinnedWaveguideTemplate(*args, **kwargs)

Thinned waveguide.

Takes an existing waveguide template (given by trace_template) and overlay with a thinning layer.

Parameters:

trace_template: PCell and _TraceTemplate, optional

Refers to the other trace template from which information is taken to build this trace template.

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

grids_per_unit: optional

Number of grid cells per design unit

keep_original_trace_template: optional

pin_shape: Shape, optional

shape to be used for the pins

thin_process: ProcessLayer, optional

thinning process

thin_purpose: PatternPurpose, optional

drawing purpose for the thinning region

thin_width: float and Real, number and number >= 0, optional

width of the thinning layer

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports. Default = this template

view_name: str, optional

The name of the view

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>, optional

List of Trace Windows to draw on top of the already defined TraceTemplate

units_per_grid: optional

Ratio of grid cell and design unit

cladding_process: ProcessLayer, optional

process for the waveguide cladding, defaults to the core process

cladding_purpose: PatternPurpose, optional

drawing purpose layer for the cladding

cladding_width: float and number > 0, optional

total width of the waveguide with cladding

core_process: ProcessLayer, optional

process for the waveguide core

core_purpose: PatternPurpose, optional

drawing purpose for the waveguide core

core_layer: __Layer__, optional

layer used to define the core of the waveguide

core_width: float and number > 0, optional

width of the waveguide core

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

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

flatten_contents: optional

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

draw_control_shape: optional

draws the control shape on top of the waveguide

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

width: locked

Examples

"""This example shows how you use the template to directly create a thinned waveguide PCell
and its layout.
"""
from technologies import silicon_photonics
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()
../_images/full-69.png

ThinnedWaveguideTemplate

class picazzo3.traces.thin_wg.ThinnedWaveguideTemplate(*args, **kwargs)

Thinned waveguide.

Takes an existing waveguide template (given by trace_template) and overlay with a thinning layer.

Parameters:

trace_template: PCell and _TraceTemplate, optional

Refers to the other trace template from which information is taken to build this trace template.

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

grids_per_unit: optional

Number of grid cells per design unit

keep_original_trace_template: optional

pin_shape: Shape, optional

shape to be used for the pins

thin_process: ProcessLayer, optional

thinning process

thin_purpose: PatternPurpose, optional

drawing purpose for the thinning region

thin_width: float and Real, number and number >= 0, optional

width of the thinning layer

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports. Default = this template

view_name: str, optional

The name of the view

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>, optional

List of Trace Windows to draw on top of the already defined TraceTemplate

units_per_grid: optional

Ratio of grid cell and design unit

cladding_process: ProcessLayer, optional

process for the waveguide cladding, defaults to the core process

cladding_purpose: PatternPurpose, optional

drawing purpose layer for the cladding

cladding_width: float and number > 0, optional

total width of the waveguide with cladding

core_process: ProcessLayer, optional

process for the waveguide core

core_purpose: PatternPurpose, optional

drawing purpose for the waveguide core

core_layer: __Layer__, optional

layer used to define the core of the waveguide

core_width: float and number > 0, optional

width of the waveguide core

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

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

flatten_contents: optional

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

draw_control_shape: optional

draws the control shape on top of the waveguide

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

width: locked

Examples

"""This example shows how you use the template to directly create a thinned waveguide PCell
and its layout.
"""
from technologies import silicon_photonics
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()
../_images/full-70.png

Wire Waveguides

WireWaveguideTemplate

class picazzo3.traces.wire_wg.WireWaveguideTemplate(*args, **kwargs)

Wire-like waveguide definition, with a core and a cladding. The waveguide is defined as a ‘cladding area’ (i.e. an 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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>, optional

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

cladding_process: ProcessLayer, optional

process for the waveguide cladding, defaults to the core process

cladding_purpose: PatternPurpose, optional

drawing purpose layer for the cladding

cladding_width: float and number > 0, optional

total width of the waveguide with cladding

core_process: ProcessLayer, optional

process for the waveguide core

core_purpose: PatternPurpose, optional

drawing purpose for the waveguide core

core_layer: __Layer__, optional

layer used to define the core of the waveguide

core_width: float and number > 0, optional

width of the waveguide core

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

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

pin_shape: Shape, optional

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports. Default = this template

draw_control_shape: optional

draws the control shape on top of the waveguide

width: float and Real, number and number >= 0, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

""" This example shows how you use the template to directly create a waveguide PCell
and its layout. """
from technologies import silicon_photonics
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()
../_images/full-71.png
""" This example shows how you use the template as a parameter for a generic
Waveguide PCell. """
from technologies import silicon_photonics
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()
../_images/full-72.png
""" This example shows how you use the template as a parameter for a rounded
Waveguide PCell. """
from technologies import silicon_photonics
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()
../_images/full-73.png

Transitions

Rib Transitions

WireRibWaveguideTransitionLinear

class picazzo3.traces.rib_wg.WireRibWaveguideTransitionLinear(*args, **kwargs)

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 vica 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:

end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, RibWaveguideTemplate, optional

modified_start_wg_template: PCell and _TraceTemplate, optional

Modified start waveguide template (using the end_trace_template, but with the dimensions of the start_trace_template)

start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, RibWaveguideTemplate, optional

wire_only_wg_template: PCell and _TraceTemplate, optional

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

reverse_templates: 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

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

wire_end_width: float and Real, number and number >= 0, optional

width of the wire core at its end point.

wire_only_length: optional

Length of transition where shallow part is built up.

straight_extension: Coord2, optional

tuple: straight extension at start and end of transition

end_position: Coord2, optional

end position of the transition

start_position: Coord2, optional

start position of the transition

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

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.
"""
from technologies import silicon_photonics
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()
../_images/full-74.png

WireRibWaveguideTransitionFromPortLinear

class picazzo3.traces.rib_wg.WireRibWaveguideTransitionFromPortLinear(*args, **kwargs)

Transition from/to wire (deep etched) to/from rib (shallow etched) waveguides.

You can provide a start_port and end_trace_template.

Parameters:

start_port: _PortInterface, optional

the port on which to extract trace template, position and angle

end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, RibWaveguideTemplate, optional

modified_start_wg_template: PCell and _TraceTemplate, optional

Modified start waveguide template (using the end_trace_template, but with the dimensions of the start_trace_template)

start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, RibWaveguideTemplate, optional

wire_only_wg_template: PCell and _TraceTemplate, optional

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

reverse_templates: 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

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

straight_extension: Coord2, optional

tuple: straight extension at start and end of transition

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

wire_end_width: float and Real, number and number >= 0, optional

width of the wire core at its end point.

wire_only_length: optional

Length of transition where shallow part is built up.

length: float and Real, number and number >= 0, optional

length of the transition

end_position: Coord2, optional

end position of the transition

start_position: Coord2, optional

start position of the transition

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

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.
"""
from technologies import silicon_photonics

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()
../_images/full-75.png

Slot Transitions

SlottedWireWaveguideTransitionLinear

class picazzo3.traces.slot_wg.SlottedWireWaveguideTransitionLinear(*args, **kwargs)

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, optional

start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SlotWaveguideTemplate, optional

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

reverse_templates: 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

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

slot_extension_length: float and number > 0, optional

tip_width: float and number > 0, optional

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

straight_extension: Coord2, optional

tuple: straight extension at start and end of transition

end_position: Coord2, optional

end position of the transition

start_position: Coord2, optional

start position of the transition

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

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.
"""
from technologies import silicon_photonics
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()
../_images/full-76.png

SlottedWireWaveguideTransitionFromPortLinear

class picazzo3.traces.slot_wg.SlottedWireWaveguideTransitionFromPortLinear(*args, **kwargs)

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:

end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SlotWaveguideTemplate, optional

start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SlotWaveguideTemplate, optional

start_port: _PortInterface, optional

the port on which to extract trace template, position and angle

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

reverse_templates: 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

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

straight_extension: Coord2, optional

tuple: straight extension at start and end of transition

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

slot_extension_length: float and number > 0, optional

tip_width: float and number > 0, optional

length: float and Real, number and number >= 0, optional

length of the transition

end_position: Coord2, optional

end position of the transition

start_position: Coord2, optional

start position of the transition

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

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.
"""
from technologies import silicon_photonics
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()
../_images/full-77.png

Socket Transitions

WireSocketWaveguideTransitionLinear

class picazzo3.traces.socket_wg.WireSocketWaveguideTransitionLinear(*args, **kwargs)

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 vica 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:

end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SocketWaveguideTemplate, optional

start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SocketWaveguideTemplate, optional

modified_start_wg_template: PCell and _TraceTemplate, optional

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, optional

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

reverse_templates: 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

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

wire_end_width: float and Real, number and number >= 0, optional

width of the wire core at its end point.

wire_only_length: optional

Length of transition where shallow part is built up.

straight_extension: Coord2, optional

tuple: straight extension at start and end of transition

end_position: Coord2, optional

end position of the transition

start_position: Coord2, optional

start position of the transition

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

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 technologies.silicon_photonics
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()
../_images/full-78.png

WireSocketWaveguideTransitionFromPortLinear

class picazzo3.traces.socket_wg.WireSocketWaveguideTransitionFromPortLinear(*args, **kwargs)

Linear Transition between Wire and Socket Waveguides.

Parameters:

start_port: _PortInterface, optional

the port on which to extract trace template, position and angle

end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SocketWaveguideTemplate, optional

start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SocketWaveguideTemplate, optional

modified_start_wg_template: PCell and _TraceTemplate, optional

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, optional

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

reverse_templates: 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

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

straight_extension: Coord2, optional

tuple: straight extension at start and end of transition

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

wire_end_width: float and Real, number and number >= 0, optional

width of the wire core at its end point.

wire_only_length: optional

Length of transition where shallow part is built up.

length: float and Real, number and number >= 0, optional

length of the transition

end_position: Coord2, optional

end position of the transition

start_position: Coord2, optional

start position of the transition

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

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.
"""
from technologies import silicon_photonics

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()
../_images/full-79.png

Thinned Transitions

ThinnedWireWireWaveguideTransitionLinear

class picazzo3.traces.thin_wg.ThinnedWireWireWaveguideTransitionLinear(*args, **kwargs)

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, optional

start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, ThinnedWaveguideTemplate, optional

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

reverse_templates: 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

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

tip_width: float and number > 0, optional

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

straight_extension: Coord2, optional

tuple: straight extension at start and end of transition

end_position: Coord2, optional

end position of the transition

start_position: Coord2, optional

start position of the transition

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

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.
"""
from technologies import silicon_photonics
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()
../_images/full-80.png

ThinnedWireWireWaveguideTransitionFromPortLinear

class picazzo3.traces.thin_wg.ThinnedWireWireWaveguideTransitionFromPortLinear(*args, **kwargs)

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, optional

the port on which to extract trace template, position and angle

end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, ThinnedWaveguideTemplate, optional

start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, ThinnedWaveguideTemplate, optional

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

reverse_templates: 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

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

straight_extension: Coord2, optional

tuple: straight extension at start and end of transition

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

tip_width: float and number > 0, optional

length: float and Real, number and number >= 0, optional

length of the transition

end_position: Coord2, optional

end position of the transition

start_position: Coord2, optional

start position of the transition

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

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.
"""
from technologies import silicon_photonics
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()
../_images/full-81.png

Wire Transitions

WireWaveguideTransitionLinear

class picazzo3.traces.wire_wg.WireWaveguideTransitionLinear(*args, **kwargs)

A transition between two WireWaveguideTemplates.

Parameters:

end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, optional

start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, optional

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

reverse_templates: 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

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

straight_extension: Coord2, optional

tuple: straight extension at start and end of transition

end_position: Coord2, optional

end position of the transition

start_position: Coord2, optional

start position of the transition

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

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 ipkiss3.all as i3

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()
../_images/full-82.png

WireWaveguideTransitionFromPortLinear

class picazzo3.traces.wire_wg.WireWaveguideTransitionFromPortLinear(*args, **kwargs)

A linear transition between two WireWaveguideTemplates.

Parameters:

end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, optional

start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, optional

start_port: _PortInterface, optional

the port on which to extract trace template, position and angle

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

reverse_templates: 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

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

straight_extension: Coord2, optional

tuple: straight extension at start and end of transition

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

length: float and Real, number and number >= 0, optional

length of the transition

end_position: Coord2, optional

end position of the transition

start_position: Coord2, optional

start position of the transition

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

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.
"""
from technologies import silicon_photonics

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()
../_images/full-83.png

Bends

WgBend

class picazzo3.wg.bend.cell.WgBend(*args, **kwargs)

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, optional

external_port_names: optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

contents: PCell and _Trace, locked

Views

Layout
Parameters:

angle: float, optional

angular coverage of the bend

angle_step: float and number > 0, optional

angle step for rounding

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

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

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

shape: Shape, optional

Shape from which the Trace is calculated

start_angle: float, optional

start_angle of the bend. Negative is clockwise, positive is counterclockwise

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

contents_transformation: GenericNoDistortTransform, optional

rounding_algorithm: optional

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

core_layer: __Layer__, optional

layer used to define the core of the waveguide

bend_radii: list<number > 0>, optional

bend radius for every individual bend

remove_straight_angles: optional

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

reverse_bends: optional

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

reverse_individual_bends: list<>, optional

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: optional

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

input_port: TracePort, optional

output_port: TracePort, optional

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports.

draw_control_shape: optional

draws the control shape on top of the waveguide

flatten_contents: optional

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

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

center_line_shape: locked

Automatically calculated shape of the center line of the trace

Examples

from technologies import silicon_photonics
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()
../_images/full-84.png

WgBend90

class picazzo3.wg.bend.cell.WgBend90(*args, **kwargs)

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, optional

external_port_names: optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

contents: PCell and _Trace, locked

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

clockwise: optional

clockwise or counterclockwise propagation. By default it is calculated from ‘quadrant’

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

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

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

quadrant: int, optional

quadrant on the circle. (-4=>4)positive numbers is counterclockwise, negative numbers is clockwise

shape: Shape, optional

Shape from which the Trace is calculated

start_angle: float, optional

start_angle of the bend. By default it is calculated from ‘quadrant’

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

contents_transformation: GenericNoDistortTransform, optional

rounding_algorithm: optional

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

core_layer: __Layer__, optional

layer used to define the core of the waveguide

bend_radii: list<number > 0>, optional

bend radius for every individual bend

remove_straight_angles: optional

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

reverse_bends: optional

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

reverse_individual_bends: list<>, optional

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: optional

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

input_port: TracePort, optional

output_port: TracePort, optional

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports.

draw_control_shape: optional

draws the control shape on top of the waveguide

flatten_contents: optional

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

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

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

from technologies import silicon_photonics
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()
../_images/full-85.png

Crossings

WgDirectCrossing

class picazzo3.wg.crossing.cell.WgDirectCrossing(*args, **kwargs)

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:

trace_template: PCell and _WaveguideTemplate, optional

Trace template used to define the crossing

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

the waveguides through the crossing

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

length: float and number > 0, optional

straight_stub: float and number > 0, optional

length of the straigth sections of the crossing

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

from technologies import silicon_photonics
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()
../_images/full-86.png

WgParabolicCrossing

class picazzo3.wg.crossing.cell.WgParabolicCrossing(*args, **kwargs)

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 cnter 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:

trace_template: PCell and _WaveguideTemplate, optional

Trace template used to define the crossing

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

the waveguides through the crossing

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

cladding_process: ProcessLayer, optional

process for the full etched strip cladding

cladding_purpose: PatternPurpose, optional

pattern purpose for the full etched strip cladding

core_cladding_process: ProcessLayer, optional

process for the shallow etched core cladding

core_cladding_purpose: PatternPurpose, optional

pattern purpose for the shallow etched core cladding

core_cladding_width: float and number > 0, optional

width of the cladding of the shallow etched core

core_process: ProcessLayer, optional

process for the shallow etched core

core_purpose: PatternPurpose, optional

pattern purpose for the shallow etched core

core_width: float and number > 0, optional

width of the shallow waveguide etch at the ports. defaults to same value as deep waveguide

core_width_center: float and number > 0, optional

shallowetched core width at the center

grids_per_unit: optional

Number of grid cells per design unit

length: float and number > 0, optional

length of the parabolic section (from start to crossing center to the end)

strip_process: ProcessLayer, optional

process for the full etched strip

strip_purpose: PatternPurpose, optional

pattern purpose for the full etched strip

strip_width_center: float and number > 0, optional

full etched strip width at the center

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

width_step: float and number > 0, optional

discretisation in width for the parabolic shapes

straight_stub: float and number > 0, optional

length of the straigth sections of the crossing

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

from technologies import silicon_photonics
from ipkiss3 import all as i3
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()
../_images/full-87.png

Gratings

WaveguideUniformGrating

class picazzo3.wg.grating.cell.WaveguideUniformGrating(*args, **kwargs)

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, optional

The number of periods

period_cell: PCell and _WaveguideGratingPeriod, optional

The unit cell of the grating

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

""" How to create a uniform grating with a custom unit cell.
"""
from technologies import silicon_photonics
from ipkiss3 import all as i3
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()
../_images/full-88.png

WaveguideNonUniformGrating

class picazzo3.wg.grating.cell.WaveguideNonUniformGrating(*args, **kwargs)

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’>, optional

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

""" How to create a fully customized non-uniform grating using
3 different unit cells constructed from two waveguide templates.
"""

from technologies import silicon_photonics
from ipkiss3 import all as i3
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()
../_images/full-89.png

ModifiedWaveguideGratingPeriod

class picazzo3.wg.grating.cell.ModifiedWaveguideGratingPeriod(*args, **kwargs)

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: optional

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, optional

Number of sections in the grating period

wg_template: PCell and _WaveguideTemplate, optional

Waveguide template of start and end of the period (and ports)

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

section_lengths: list<number >= 0>, optional

List of lengths for the waveguide templates

length: float and Real, number and number >= 0, optional

Length of the grating period.

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

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.
"""
from technologies import silicon_photonics
from ipkiss3 import all as i3
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()
../_images/full-90.png

WaveguideSideGratingPeriod

class picazzo3.wg.grating.cell.WaveguideSideGratingPeriod(*args, **kwargs)

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, optional

Number of sections in the grating period

wg_template: PCell and _WaveguideTemplate, optional

Waveguide template of start and end of the period (and ports)

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

modified_waveguide_parameters: locked

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

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

relative_widths: optional

If True, the values of the width are relative to the original value.

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

width_parameter_name: str, optional

Name of the property of the waveguide template that is to be adjusted by the values in ‘widths’.

widths: list<Real, number>, optional

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>, optional

List of lengths for the waveguide templates

length: float and Real, number and number >= 0, optional

Length of the grating period.

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

""" We make a grating based on a wire waveguide and modify the width of the core
to create side gratings:
"""
from technologies import silicon_photonics
from ipkiss3 import all as i3
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()
../_images/full-91.png

Generic Couplers

Coupler1x2

class picazzo3.logical.coupler.cell.Coupler1x2(*args, **kwargs)

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 tranmission: 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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

Views

Coupler2x1

class picazzo3.logical.coupler.cell.Coupler2x1(*args, **kwargs)

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 tranmission: 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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

Views

Coupler2x2

class picazzo3.logical.coupler.cell.Coupler2x2(*args, **kwargs)

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 tranmission: 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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

Views

Terminations

PerfectTermination

class picazzo3.logical.termination.PerfectTermination(*args, **kwargs)

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 dangling terms

Parameters:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Directional Couplers

StraightDirectionalCoupler

class picazzo3.wg.dircoup.cell.StraightDirectionalCoupler(*args, **kwargs)

A directional coupler consisting of 2 parallel (horizontal) straight waveguides.

Parameters:

trace_template1: PCell and _WaveguideTemplate, optional

waveguide template used by the south arm of the directional coupler

trace_template2: PCell and _WaveguideTemplate, optional

waveguide template used by the north arm of the directional coupler. If not set, it defaults to the template of the south arm

wg1a: PCell, optional

South-west waveguide

wg1b: PCell, optional

South-east waveguide

wg2a: PCell, optional

North-west waveguide

wg2b: PCell, optional

North-east waveguide

coupler_length: float and Real, number and number >= 0, optional

length of the directional coupler

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

straight_extensions: Coord2, optional

additional lengths of the couplers at start and end

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

coupler_spacing: float, optional

Spacing between the two waveguide centerlines.

wg1a_shape: Shape, optional

Shape for the south-west part of the waveguide

wg1b_shape: Shape, optional

Shape for the south-east part of the waveguide

wg2a_shape: Shape, optional

Shape for the north-west part of the waveguide

wg2b_shape: Shape, optional

Shape for the north-east part of the waveguide

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

from technologies import silicon_photonics
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()
../_images/full-92.png

BendDirectionalCoupler

class picazzo3.wg.dircoup.cell.BendDirectionalCoupler(*args, **kwargs)

A directional coupler consisting of 2 parallel (horizontal) waveguides with bends at the start and end.

Parameters:

trace_template1: PCell and _WaveguideTemplate, optional

waveguide template used by the south arm of the directional coupler

trace_template2: PCell and _WaveguideTemplate, optional

waveguide template used by the north arm of the directional coupler. If not set, it defaults to the template of the south arm

wg1a: PCell, optional

South-west waveguide

wg1b: PCell, optional

South-east waveguide

wg2a: PCell, optional

North-west waveguide

wg2b: PCell, optional

North-east waveguide

coupler_length: float and Real, number and number >= 0, optional

length of the directional coupler

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

bend_angle: float, optional

angle at which the directional coupler is bent

bend_angles1: tuple2, optional

Input and output angle of the bends of arm 1. Defaults to bend_angle. If set, bend_angle will be ignored.

bend_angles2: tuple2, optional

Input and output angle of the bends of arm 2. Defaults to bend_angle. If set, bend_angle will be ignored.

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

straight_after_bend: float and Real, number and number >= 0, optional

length of the straight waveguide after the bend

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

reverse_bends: optional

If True, all bends will be reversed. This has only an effect on assymetric bends, such as splines

reverse_individual_bends1a: List with type restriction, allowed types: <type ‘bool’>, optional

List of booleans to indicate whether the individual bends in arm1 should be reversed

reverse_individual_bends1b: List with type restriction, allowed types: <type ‘bool’>, optional

List of booleans to indicate whether the individual bends in arm1 should be reversed

reverse_individual_bends2a: List with type restriction, allowed types: <type ‘bool’>, optional

List of booleans to indicate whether the individual bends in arm2 should be reversed

reverse_individual_bends2b: List with type restriction, allowed types: <type ‘bool’>, optional

List of booleans to indicate whether the individual bends in arm2 should be reversed

coupler_spacing: float, optional

Spacing between the two waveguide centerlines.

wg1a_shape: Shape, optional

Shape for the south-west part of the waveguide

wg1b_shape: Shape, optional

Shape for the south-east part of the waveguide

wg2a_shape: Shape, optional

Shape for the north-west part of the waveguide

wg2b_shape: Shape, optional

Shape for the north-east part of the waveguide

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

Examples

from technologies import silicon_photonics

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()
../_images/full-93.png

SBendDirectionalCoupler

class picazzo3.wg.dircoup.cell.SBendDirectionalCoupler(*args, **kwargs)

A directional coupler consisting of 2 parallel (horizontal) waveguides with S-shaped bends at the start and end.

Parameters:

trace_template1: PCell and _WaveguideTemplate, optional

waveguide template used by the south arm of the directional coupler

trace_template2: PCell and _WaveguideTemplate, optional

waveguide template used by the north arm of the directional coupler. If not set, it defaults to the template of the south arm

wg1a: PCell, optional

South-west waveguide

wg1b: PCell, optional

South-east waveguide

wg2a: PCell, optional

North-west waveguide

wg2b: PCell, optional

North-east waveguide

coupler_length: float and Real, number and number >= 0, optional

length of the directional coupler

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

n_inputs: int and number > 0, locked

Number of input channels.

n_outputs: int and number > 0, locked

Number of output channels.

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

sbend_straight: float and Real, number and number >= 0, optional

length of the straight section in the S-bend

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

bend_angle: float, optional

angle at which the directional coupler is bent

bend_angles1: tuple2, optional

Input and output angle of the bends of arm 1. Defaults to bend_angle. If set, bend_angle will be ignored.

bend_angles2: tuple2, optional

Input and output angle of the bends of arm 2. Defaults to bend_angle. If set, bend_angle will be ignored.

rounding_algorithm: optional

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

straight_after_bend: float and Real, number and number >= 0, optional

length of the straight waveguide after the bend

reverse_bends: optional

If True, all bends will be reversed. This has only an effect on assymetric bends, such as splines

reverse_individual_bends1a: List with type restriction, allowed types: <type ‘bool’>, optional

List of booleans to indicate whether the individual bends in arm1 should be reversed

reverse_individual_bends1b: List with type restriction, allowed types: <type ‘bool’>, optional

List of booleans to indicate whether the individual bends in arm1 should be reversed

reverse_individual_bends2a: List with type restriction, allowed types: <type ‘bool’>, optional

List of booleans to indicate whether the individual bends in arm2 should be reversed

reverse_individual_bends2b: List with type restriction, allowed types: <type ‘bool’>, optional

List of booleans to indicate whether the individual bends in arm2 should be reversed

coupler_spacing: float, optional

Spacing between the two waveguide centerlines.

wg1a_shape: Shape, optional

Shape for the south-west part of the waveguide

wg1b_shape: Shape, optional

Shape for the south-east part of the waveguide

wg2a_shape: Shape, optional

Shape for the north-west part of the waveguide

wg2b_shape: Shape, optional

Shape for the north-east part of the waveguide

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

Examples

""" A more complicated example using asymmetric spline bends and different
waveguide definition in the two arms.
"""
from technologies import silicon_photonics
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()
../_images/full-94.png
from technologies import silicon_photonics
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()
../_images/full-95.png

Splitters

WgYSplitter

class picazzo3.wg.splitters.cell.WgYSplitter(*args, **kwargs)

Y-splitter PCell with branches that fan out specifiable angle.

Parameters:

trace_template: PCell and _WaveguideTemplate, optional

Waveguide template of the Y splitter

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

angle_out: float, optional

Angle at which the waveguide exit the splitter.

center_waveguide_length: float and Real, number and number >= 0, optional

Length of the center waveguide

cladding_width: float and number > 0, optional

Width of the cladding. The default is taken from the trace template.

core_width: float and number > 0, optional

Width of the core. The default is taken from the trace template.

grids_per_unit: optional

Number of grid cells per design unit

split_stub_width: float and number > 0, optional

Width of the stub where the wavegudie split

taper_length: float and Real, number and number >= 0, optional

Length of the tapered section

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

bend_radius: float and number > 0, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

from technologies import silicon_photonics
from ipkiss3 import all as i3
from picazzo3.wg.splitters import WgYSplitter

C = WgYSplitter(name="my_splitter90")
layout = C.Layout(bend_radius=4.5, angle_out=60.0)

layout.visualize()
../_images/full-96.png

WgYCombiner

class picazzo3.wg.splitters.cell.WgYCombiner(*args, **kwargs)

Y-Combiner PCell with branches that fan out specifiable angle.

Parameters:

trace_template: PCell and _WaveguideTemplate, optional

Waveguide template of the Y splitter

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

angle_out: float, optional

Angle at which the waveguide exit the splitter.

center_waveguide_length: float and Real, number and number >= 0, optional

Length of the center waveguide

cladding_width: float and number > 0, optional

Width of the cladding. The default is taken from the trace template.

core_width: float and number > 0, optional

Width of the core. The default is taken from the trace template.

split_stub_width: float and number > 0, optional

Width of the stub where the wavegudie split

taper_length: float and Real, number and number >= 0, optional

Length of the tapered section

bend_radius: float and number > 0, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

from technologies import silicon_photonics
from ipkiss3 import all as i3
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()
../_images/full-97.png

WgY90Splitter

class picazzo3.wg.splitters.cell.WgY90Splitter(*args, **kwargs)

Y-splitter PCell with branches that fan out at right angles to the input waveguide.

Parameters:

trace_template: PCell and _WaveguideTemplate, optional

Waveguide template of the Y splitter

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

center_waveguide_length: float and Real, number and number >= 0, optional

Length of the center waveguide

cladding_width: float and number > 0, optional

Width of the cladding. The default is taken from the trace template.

core_width: float and number > 0, optional

Width of the core. The default is taken from the trace template.

split_stub_width: float and number > 0, optional

Width of the stub where the wavegudie split

taper_length: float and Real, number and number >= 0, optional

Length of the tapered section

bend_radius: float and number > 0, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

angle_out: float, locked

Angle at which the waveguide exit the splitter.

Examples

from technologies import silicon_photonics
from ipkiss3 import all as i3
from picazzo3.wg.splitters import WgY90Splitter

C = WgY90Splitter(name="my_splitter90")
layout = C.Layout(bend_radius=4.5)

layout.visualize()
../_images/full-98.png

WgY90Combiner

class picazzo3.wg.splitters.cell.WgY90Combiner(*args, **kwargs)

Y-shaped combiner with branches that come in at right angles to the output waveguide.

Parameters:

trace_template: PCell and _WaveguideTemplate, optional

Waveguide template of the Y splitter

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

center_waveguide_length: float and Real, number and number >= 0, optional

Length of the center waveguide

cladding_width: float and number > 0, optional

Width of the cladding. The default is taken from the trace template.

core_width: float and number > 0, optional

Width of the core. The default is taken from the trace template.

split_stub_width: float and number > 0, optional

Width of the stub where the wavegudie split

taper_length: float and Real, number and number >= 0, optional

Length of the tapered section

bend_radius: float and number > 0, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

angle_out: float, locked

Angle at which the waveguide exit the splitter.

Examples

from technologies import silicon_photonics
from ipkiss3 import all as i3
from picazzo3.wg.splitters import WgY90Combiner

C = WgY90Combiner(name="my_combiner90")
layout = C.Layout(bend_radius=4.5,
                  core_width=0.6)

layout.visualize()
../_images/full-99.png

WgY180Splitter

class picazzo3.wg.splitters.cell.WgY180Splitter(*args, **kwargs)

Y-splitter PCell with branches that fan out at right angles to the input waveguide and then come back to the horizomtal direction.

Parameters:

trace_template: PCell and _WaveguideTemplate, optional

Waveguide template of the Y splitter

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

bend_radius: float and number > 0, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

from technologies import silicon_photonics
from ipkiss3 import all as i3
from picazzo3.wg.splitters import WgY180Splitter

C = WgY180Splitter(name="my_splitter180")
layout = C.Layout(bend_radius=4.5)

layout.visualize()
../_images/full-100.png

WgY180Combiner

class picazzo3.wg.splitters.cell.WgY180Combiner(*args, **kwargs)

Y-shaped combiner with branches that come in horizontally and combine with the output waveguide at right angles.

Parameters:

trace_template: PCell and _WaveguideTemplate, optional

Waveguide template of the Y splitter

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

bend_radius: float and number > 0, optional

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

from technologies import silicon_photonics
from ipkiss3 import all as i3
from picazzo3.wg.splitters import WgY180Combiner

C = WgY180Combiner(name="my_combiner180")
layout = C.Layout(bend_radius=4.5)

layout.visualize()
../_images/full-101.png

Waveguide Bundles

WaveguideBundle

class picazzo3.wg.bundle.cell.WaveguideBundle(*args, **kwargs)

Bundle of waveguides, routed together

Parameters:

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

the traces in this bundle

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

area_layer_on: optional

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’>, optional

transformations to be applied to each of the traces

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

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

from technologies import silicon_photonics
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()
../_images/full-102.png

#pcell: picazzo3.wg.bundle.cell.TemplatedWaveguideBundle#

Spirals

SingleSpiral

class picazzo3.wg.spirals.cell.SingleSpiral(*args, **kwargs)

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, optional

Number of loops in the spiral

trace_template: PCell and _TraceTemplate, optional

Trace template used in the chain.

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

shapes: list, optional

List of shapes used to build the traces

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

inner_size: Coord2, optional

Inner size of the the spiral, defaults to 3 * spacing + 2 * bend_radius, in each direction

spacing: float and Real, number and number >= 0, optional

spacing between the individual loops.

spiral_center: Coord2, optional

locatation of the center of the spiral.

flatten: optional

If true the instances are flattened

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

auto_transform: locked

Examples

# Example of single spiral using a trace template.
from technologies import silicon_photonics
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()
../_images/full-103.png

SingleSpiralRounded

class picazzo3.wg.spirals.cell.SingleSpiralRounded(*args, **kwargs)

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, optional

Number of loops in the spiral

trace_template: PCell and _TraceTemplate, optional

Trace template used in the chain.

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

shapes: list, optional

List of shapes used to build the traces

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

inner_size: Coord2, optional

Inner size of the the spiral, defaults to 3 * spacing + 2 * bend_radius, in each direction

spacing: float and Real, number and number >= 0, optional

spacing between the individual loops.

spiral_center: Coord2, optional

locatation of the center of the spiral.

flatten: optional

If true the instances are flattened

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

auto_transform: locked

Examples

from technologies import silicon_photonics
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()
../_images/full-104.png

DoubleSpiral

class picazzo3.wg.spirals.cell.DoubleSpiral(*args, **kwargs)

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, optional

Number of loops in the spiral

trace_template: PCell and _TraceTemplate, optional

Trace template used in the chain.

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

shapes: list, optional

List of shapes used to build the traces

stub_direction: optional

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

inner_size: Coord2, optional

Inner size of the the spiral, defaults to 3 * spacing + 2 * bend_radius, in each direction

spacing: float and Real, number and number >= 0, optional

spacing between the individual loops.

spiral_center: Coord2, optional

locatation of the center of the spiral.

flatten: optional

If true the instances are flattened

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

auto_transform: locked

Examples

from technologies import silicon_photonics
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",  # either H or V
                     spiral_center=(0, 0))

layout.visualize()
../_images/full-105.png

DoubleSpiralRounded

class picazzo3.wg.spirals.cell.DoubleSpiralRounded(*args, **kwargs)
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, optional

Number of loops in the spiral

trace_template: PCell and _TraceTemplate, optional

Trace template used in the chain.

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

rounding_algorithm: optional

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

shapes: list, optional

List of shapes used to build the traces

stub_direction: optional

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

inner_size: Coord2, optional

Inner size of the the spiral, defaults to 3 * spacing + 2 * bend_radius, in each direction

spacing: float and Real, number and number >= 0, optional

spacing between the individual loops.

spiral_center: Coord2, optional

locatation of the center of the spiral.

flatten: optional

If true the instances are flattened

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

auto_transform: locked

Examples

from technologies import silicon_photonics
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()
../_images/full-106.png

DoubleSpiralWithInCoupling

class picazzo3.wg.spirals.cell.DoubleSpiralWithInCoupling(*args, **kwargs)

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, optional

Number of loops in the spiral

trace_template: PCell and _TraceTemplate, optional

Trace template used in the chain.

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

shapes: list, optional

List of shapes used to build the traces

stub_direction: optional

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

incoupling_length: float and Real, number and number >= 0, optional

length of the incoupling section.

inner_size: Coord2, optional

Inner size of the the spiral, defaults to 3 * spacing + 2 * bend_radius, in each direction

spacing: float and Real, number and number >= 0, optional

spacing between the individual loops.

flatten: optional

If true the instances are flattened

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

spiral_center: locked

auto_transform: locked

Examples

from technologies import silicon_photonics
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()
../_images/full-107.png

DoubleSpiralWithInCouplingRounded

class picazzo3.wg.spirals.cell.DoubleSpiralWithInCouplingRounded(*args, **kwargs)

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, optional

Number of loops in the spiral

trace_template: PCell and _TraceTemplate, optional

Trace template used in the chain.

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

shapes: list, optional

List of shapes used to build the traces

stub_direction: optional

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

incoupling_length: float and Real, number and number >= 0, optional

length of the incoupling section.

rounding_algorithm: optional

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

inner_size: Coord2, optional

Inner size of the the spiral, defaults to 3 * spacing + 2 * bend_radius, in each direction

spacing: float and Real, number and number >= 0, optional

spacing between the individual loops.

flatten: optional

If true the instances are flattened

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

spiral_center: locked

auto_transform: locked

Examples

from technologies import silicon_photonics
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()
../_images/full-108.png

FixedLengthSpiral

class picazzo3.wg.spirals.cell.FixedLengthSpiral(*args, **kwargs)

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, optional

Total design length of the spiral.

n_o_loops: int and number > 0, optional

Number of loops in the spiral

trace_template: PCell and _TraceTemplate, optional

Trace template used in the chain.

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

Views

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:

grids_per_unit: optional

Number of grid cells per design unit

growth_direction: optional

shapes: list, optional

List of shapes used to build the traces

stub_direction: optional

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

incoupling_length: float and Real, number and number >= 0, optional

length of the incoupling section.

spacing: float and Real, number and number >= 0, optional

spacing between the individual loops.

flatten: optional

If true the instances are flattened

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

inner_size: locked

spiral_center: locked

auto_transform: locked

Examples

from technologies import silicon_photonics
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()
../_images/full-109.png

FixedLengthSpiralRounded

class picazzo3.wg.spirals.cell.FixedLengthSpiralRounded(*args, **kwargs)

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, optional

Total design length of the spiral.

n_o_loops: int and number > 0, optional

Number of loops in the spiral

trace_template: PCell and _TraceTemplate, optional

Trace template used in the chain.

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

n_o_traces: int and number > 0, locked

Total number of traces used in the spiral.

Views

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:

angle_step: float and number > 0, optional

angle step for rounding

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

manhattan: optional

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

shapes: list, optional

List of shapes used to build the traces

stub_direction: optional

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

growth_direction: optional

incoupling_length: float and Real, number and number >= 0, optional

length of the incoupling section.

rounding_algorithm: optional

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

spacing: float and Real, number and number >= 0, optional

spacing between the individual loops.

flatten: optional

If true the instances are flattened

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

inner_size: locked

spiral_center: locked

auto_transform: locked

Examples

from technologies import silicon_photonics
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()
../_images/full-110.png

PlaceComponents

class picazzo3.routing.place_route.cell.PlaceComponents(*args, **kwargs)

Parametric Cell for manual Placement of 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
              }

In the layout, the placement is specified manually using the child_transformations property, which defines a transformation for each instance. If no transformation if 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))}

On the netlist level, no connectivity is defined. 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"
                      }

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:

child_cells: optional

dict to create the instances of the child cells. Format is {‘inst_name1’: PCell}

external_port_names: optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

child_transformations: optional

dictionary with the transformation of each child instance.

grids_per_unit: optional

Number of grid cells per design unit

netlist_view: NetlistView, optional

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

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

""" Here we place 2 splitters and two rings.
    We use the splitter twice but use two different rings.
    """
from technologies import silicon_photonics
from ipkiss3 import all as i3

from picazzo3.filters.ring import RingRect180DropFilter, RingRectNotchFilter
from picazzo3.wg.splitters import WgY90Splitter

from picazzo3.routing.place_route import PlaceComponents

ring1 = RingRectNotchFilter()
ring2 = RingRect180DropFilter()
splitter = WgY90Splitter()

pc = PlaceComponents(child_cells={"spl": splitter,
                                   "com": splitter,
                                   "arm1": ring1,
                                   "arm2": ring2},
                     )

layout = pc.Layout(child_transformations={"arm1": (30, -30),
                                          "arm2": (30, 30),
                                          "com": i3.HMirror(0.0)+i3.Translation((60, 0))}
                   )

layout.visualize()
../_images/full-111.png

ConnectComponents

class picazzo3.routing.place_route.cell.ConnectComponents(*args, **kwargs)

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 ‘_abcoll.Sequence’>], optional

list of tuples connecting the instances. Format is [(‘inst1:term1’,’inst2:term2’), …]

child_cells: optional

dict to create the instances of the child cells. Format is {‘inst_name1’: PCell}

external_port_names: optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

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.
    """
from technologies import silicon_photonics
from ipkiss3 import all as i3
import numpy as np
import pylab as plt

from picazzo3.filters.ring import RingRectNotchFilter
from picazzo3.wg.splitters import WgY90Splitter

from picazzo3.routing.place_route import ConnectComponents

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 = 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("Wavelength ($\mu m$)")
plt.ylabel("Power transmission")
plt.legend()
plt.show()

Views

Layout
Parameters:

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

PlaceAndConnect

class picazzo3.routing.place_route.cell.PlaceAndConnect(*args, **kwargs)

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 if 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:

child_cells: optional

dict to create the instances of the child cells. Format is {‘inst_name1’: PCell}

links: list and List with type restriction, allowed types: [<class ‘_abcoll.Sequence’>], optional

list of tuples connecting the instances. Format is [(‘inst1:term1’,’inst2:term2’), …]

external_port_names: optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

flyline_layer: optional

layer to draw flylines of physically unconnected links

flyline_width: float and number > 0, optional

line width of the flylines

grids_per_unit: optional

Number of grid cells per design unit

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

child_transformations: optional

dictionary with the transformation of each child instance.

netlist_view: NetlistView, optional

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

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

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 the attach correctly to the splitter and combiner
    """
from technologies import silicon_photonics
from ipkiss3 import all as i3

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()
../_images/full-113.png

PlaceAndAutoRoute

class picazzo3.routing.place_route.cell.PlaceAndAutoRoute(*args, **kwargs)

Parametric Cell for manual placement and Automatic Routing.

The PCells objects that need to be placed as instances are specified 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")
        ]

Based on this connectivity list, the PCell will generate waveguides for all links, using the trace_template property. This requires that all ports have a compatible trace template.

The instances’ terms/ports that are not specified in the links parameter will be considered to be external ports. You can override the default external term/port names using the external_port_names property, and specify the individual names of the external terms. If no name is specified, the default pattern of ‘instname_portname’ will be used.

external_port_names={ "spl:in1"  : "input",
                      "com:out1" : "output"
                      }

In the layout, the placement is specified manually using the child_transformations property, which defines a transformation for each instance. If no transformation if 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))}

Of course, this smart place and route cell will only work with PCells which are well constructed: an important requirement is that the Terms in the netlist match the Ports in the layout: the same number, as well as the same names. The same for the instances. The generation of links and waveguides is done based on the instance and port names.

By default, the routes of the waveguides are automatically generated using RouteManhattan. It is possible to override one or more specific routes manually by adjusting the waveguide_shapes parameters (see example).

All connecting waveguides will use the same trace definition. Tapers will automatically be added for those ports of child cells which have a different trace template.

When traces or waveguides cross, these crossings can be visually marked in the layout view by flagging highlight_waveguide_crossings=True.

Parameters:

trace_template: PCell and _TraceTemplate, optional

Trace template used to connect the instances

child_cells: optional

dict to create the instances of the child cells. Format is {‘inst_name1’: PCell}

links: list and List with type restriction, allowed types: [<class ‘_abcoll.Sequence’>], optional

list of tuples connecting the instances. Format is [(‘inst1:term1’,’inst2:term2’), …]

external_port_names: optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

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

list of waveguides created based on the links property

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

grid: float and number > 0, optional

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: optional

Number of grid cells per design unit

highlight_waveguide_crossings: optional

If True, waveguide crossings will be indicated on a seperate layer

manhattan: optional

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

rounding_algorithm: optional

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

unit: float and number > 0, optional

design unit. Extracted by default from TECH.METRICS.UNIT

units_per_grid: optional

Ratio of grid cell and design unit

view_name: str, optional

The name of the view

waveguide_crossing_layer: __Layer__, optional

Layer on which crossings between the autorouted waveguides are indicated in the layout.

waveguide_shapes: optional

List of shapes/routes for the waveguides. The order is the same as in ‘links’. If you want a waveguide to be autorouted, fill in None for that shape.

flyline_layer: optional

layer to draw flylines of physically unconnected links

flyline_width: float and number > 0, optional

line width of the flylines

child_transformations: optional

dictionary with the transformation of each child instance.

netlist_view: NetlistView, optional

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

end_straight: float and Real, number and number >= 0, optional

The length of the straight end section of the route

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

The minimum length of any straight sections in the route

start_straight: float and Real, number and number >= 0, optional

The length of the straight start section of the route

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

Examples

""" This example shows how to indicate crossings between the routed waveguides,
using the `highlight_waveguide_crossings=True` flag.
This is especially useful to identify errors in the circuit topology."""
from technologies import silicon_photonics
from ipkiss3 import all as i3

from picazzo3.filters.ring import RingRect180DropFilter, RingRectNotchFilter
from picazzo3.wg.splitters import WgY90Splitter
from picazzo3.routing.place_route import PlaceAndAutoRoute

ring = RingRectNotchFilter()
ring.Layout(bend_radius=20.0)
splitter = WgY90Splitter()

pr = PlaceAndAutoRoute(child_cells={"spl": splitter,
                                    "com": splitter,
                                    "arm1": ring},
                       links=[("spl:arm1", "arm1:in"),
                              ("arm1:out", "com:arm2"),
                              ("spl:arm2", "com:arm1")]
                       )

layout = pr.Layout(child_transformations={"arm1": (60, -40),
                                          "com": i3.HMirror(0.0)+i3.Rotation(rotation=90.0)+i3.Translation((200, 100))},
                   bend_radius=10.0,
                   highlight_waveguide_crossings=True
                   )

layout.visualize()
../_images/full-114.png
""" This example shows how to detect crossings between the routed waveguides and manually correct
for them, using the `highlight_waveguide_crossings=True` flag."""
from technologies import silicon_photonics
from ipkiss3 import all as i3

from picazzo3.filters.ring import RingRect180DropFilter, RingRectNotchFilter
from picazzo3.wg.splitters import WgY90Splitter
from picazzo3.routing.place_route import PlaceAndAutoRoute

ring = RingRectNotchFilter()
ring.Layout(bend_radius=20.0)
splitter = WgY90Splitter()

pr = PlaceAndAutoRoute(child_cells={"spl": splitter,
                                    "com": splitter,
                                    "arm1": ring},
                       links=[("spl:arm1", "arm1:in"),
                              ("arm1:out", "com:arm2"),
                              ("spl:arm2", "com:arm1")]
                       )

layout = pr.Layout(child_transformations={"arm1": (60, -40),
                                          "com": i3.HMirror(0.0)+i3.Rotation(rotation=90.0)+i3.Translation((200, 100))},
                   bend_radius=10.0,
                   highlight_waveguide_crossings=True
                   )

# print the coordinates of the crossings
print layout.get_waveguide_crossing_points()

# Remove the crossing by manually overriding the shape of the final waveguide.
s = layout.get_waveguide_shapes()[2]
new_shape_wg2 = i3.Shape([s[0],
                          (s[0].x, 200.0),
                          (250.0, 200.0),
                          (250.0, s[-1].y),
                          s[-1]])
# re-initialize the layout with the new waveguide shape
layout = pr.Layout(child_transformations={"arm1": (60, -40),
                                          "com": i3.HMirror(0.0)+i3.Rotation(rotation=90.0)+i3.Translation((200, 100))},
                   bend_radius=10.0,
                   highlight_waveguide_crossings=True,
                   waveguide_shapes = [None, None, new_shape_wg2]
                   )
layout.visualize()
../_images/full-115.png
""" In this example we arrange 4 identical rings in a loop and connect them back-to-back."""
from technologies import silicon_photonics
from ipkiss3 import all as i3

from picazzo3.filters.ring import RingRect180DropFilter

from picazzo3.routing.place_route import PlaceAndAutoRoute

ring = RingRect180DropFilter()

pr = PlaceAndAutoRoute(child_cells={"ring1": ring,
                                    "ring2": ring,
                                    "ring3": ring,
                                    "ring4": ring},
                       links=[("ring1:out1", "ring2:in1"),
                              ("ring1:in2", "ring2:out2"),
                              ("ring2:out1", "ring3:in1"),
                              ("ring2:in2", "ring3:out2"),
                              ("ring3:out1", "ring4:in1"),
                              ("ring3:in2", "ring4:out2"),
                              ("ring4:in2", "ring1:out2"),
                              ]
                       )

layout = pr.Layout(child_transformations={"ring1": (0, 0),
                                          "ring2": i3.Rotation(rotation=90) + i3.Translation((25.0, 25.0)),
                                          "ring3": i3.Rotation(rotation=180) + i3.Translation((0.0, 50.0)),
                                          "ring4": i3.Rotation(rotation=-90) + i3.Translation((-25.0, 25.0))
                                          }
                   )

layout.visualize()
../_images/full-116.png
""" 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.
    """
from technologies import silicon_photonics
from ipkiss3 import all as i3

from picazzo3.filters.ring import RingRect180DropFilter, RingRectNotchFilter
from picazzo3.wg.splitters import WgY90Splitter

from picazzo3.routing.place_route import PlaceAndAutoRoute

ring1 = RingRectNotchFilter()
ring2 = RingRect180DropFilter()
splitter = WgY90Splitter()

pr = PlaceAndAutoRoute(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")]
                       )

layout = pr.Layout(child_transformations={"arm1": (30, -30),
                                          "arm2": (30, 30),
                                          "com": i3.HMirror(0.0)+i3.Translation((60, 0))},
                   bend_radius=10.0,
                   manhattan=True
                   )

layout.visualize()
../_images/full-117.png
""" Here we show how you can influence the internal routing of the
PlaceAndAutoRoute, by setting the min_straight parameter to 0.0.
This way we can create a more compact component.
"""
from technologies import silicon_photonics
from ipkiss3 import all as i3

from picazzo3.filters.ring import RingRect180DropFilter, RingRectNotchFilter
from picazzo3.wg.splitters import WgY90Splitter

from picazzo3.routing.place_route import PlaceAndAutoRoute

ring1 = RingRectNotchFilter()
ring2 = RingRect180DropFilter()
splitter = WgY90Splitter()

pr = PlaceAndAutoRoute(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")]
                       )

layout = pr.Layout(child_transformations={"arm1": (20, -30),
                                          "arm2": (20, 30),
                                          "com": i3.HMirror(0.0)+i3.Translation((40, 0))},
                   bend_radius=5.0,
                   manhattan=True,
                   min_straight=0.0  # we set min_straight to 0.0
                   )

layout.visualize()
../_images/full-118.png
# This example illustrates how the necessary transitions
# are automatically added...
from technologies import silicon_photonics
from ipkiss3 import all as i3

from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.traces.rib_wg import RibWaveguideTemplate, RibWireWaveguideTemplate
from picazzo3.traces.slot_wg import SlotWaveguideTemplate

# making 4 very different waveguides
wg1_t = WireWaveguideTemplate()
wg1_t.Layout(core_width=0.8)
wg1 = wg1_t()
wg1.Layout(shape=[(-40, -60), (-60, -40)])

wg2_t = RibWaveguideTemplate()
wg2_t.Layout(core_width=0.8)
wg2 = wg2_t()
wg2.Layout(shape=[(-60, 40), (-40, 60)])
wg3_t = RibWireWaveguideTemplate()
wg3_t.Layout(core_width=0.8)
wg3 = wg3_t()
wg3.Layout(shape=[(40, 60), (60, 40)])

wg4_t = SlotWaveguideTemplate()
wg4_t.Layout(core_width=0.6)
wg4 = wg4_t()
wg4.Layout(shape=[(60, -40), (40, -60)])

from picazzo3.routing.place_route import PlaceAndAutoRoute

pr = PlaceAndAutoRoute(child_cells={"wg1": wg1,
                                    "wg2": wg2,
                                    "wg3": wg3,
                                    "wg4": wg4},
                       links=[("wg1:out", "wg2:in"),
                              ("wg2:out", "wg3:in"),
                              ("wg3:out", "wg4:in"),
                              ("wg4:out", "wg1:in")
                              ]