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
- Grating Couplers
- Ringresonators
- Multi-mode Interferometers
- Mach-Zehnder Interferometers (MZI)
- Generic Photonic Crystals
- Photonic Crystal HeteroWaveguide Layouts
- Photonic Crystal W1 Waveguides and Cavities
- Rib Waveguides
- Slot Waveguides
- Socket Waveguides
- Thinned Waveguides
- Wire Waveguides
- Rib Transitions
- Slot Transitions
- Socket Transitions
- Thinned Transitions
- Wire Transitions
- Bends
- Crossings
- Gratings
- Directional Couplers
- Splitters
- Waveguide Bundles
- Spirals
- AutoTransitionPorts
- FanoutPorts
- IoFibcoup
- ContainerWithWaveguides
- ExtendPorts
- Route Ports
- TerminatePorts
- Phase Modulators
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: name:
The unique name of the pcell
Other Parameters: n_inputs: int and number > 0, locked
Number of input channels.
n_outputs: int and number > 0, locked
Number of output channels.
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: name:
The unique name of the pcell
Other Parameters: n_inputs: int and number > 0, locked
Number of input channels.
n_outputs: int and number > 0, locked
Number of output channels.
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: name:
The unique name of the pcell
Other Parameters: n_inputs: int and number > 0, locked
Number of input channels.
n_outputs: int and number > 0, locked
Number of output channels.
Reflector¶
-
class
picazzo3.logical.reflector.cell.
Reflector
(*args, **kwargs) Logical reflector: reflects a part of the light and passes on the rest
Parameters: name:
The unique name of the pcell
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
Waveguide template at the input
wg_template_out: PCell and _WaveguideTemplate
Waveguide template at the output
name:
The unique name of the pcell
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 unconnected terms
Parameters: name:
The unique name of the pcell
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 unconnected terms
Parameters: name:
The unique name of the pcell
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
out-of-plane angle of the grating coupler
socket: PCell and WgSocket
socket of the fiber coupler
grating: PCell
grating of this fiber coupler
start_trace_template: PCell and _WaveguideTemplate
start waveguide for the socket waveguide (narrow side)
wide_trace_template: PCell and _WaveguideTemplate
end waveguide for the socket waveguide (broad side)
name:
The unique name of the pcell
Views
-
Layout
Parameters: fill_factor: float and fraction
Fill factor used to calculate the trench widths. 0 means no trench a all and 1 means that the trench covers the entire period
grating_transformation: GenericNoDistortTransform
n_o_lines: int and number > 0
Number of lines in the grating. By default this number is chosen so that the curves fit in the box width.
period_x: float and number > 0
Period in the x direction.
process: ProcessLayer
default process used for the grating
socket_extension: float and Real, number and number >= 0
extension of the wide side of the socket, asymmetric with respect to the specified center. By default this is calculated such that the entire grating fits in the socket with a margin of TECH.IO.FIBCOUP.CURVED.DEFAULT_SOCKET_MARGIN_FROM_GRATING
socket_straight_extension: Coord2
tuple: straight extension at start and end of socket
spread_angle: float
Angle in degrees of the far field radiation field of the socket. By default this is set to be equal to the angle of the taper that is set by its length and the width of the core of input and output waveguides.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
min_x: float and number > 0
Miniumum distance from the first line to the focus. By default it is set to the focal distance.
focal_distance_x: float
Distance between the vertical port of the grating and the focal point. By default this is TECH.IO.FIBCOUP.CURVED.GRATING.FOCAL_DISTANCE.
period_y: float and number > 0
Period in the y direction. By default equal to
period_x
start_radius_y: float and number > 0
Starting radius in the y direction. By default this is set to
start_period_x
box_width: float and number > 0
Width of the box used that contains the grating.
purpose:
socket_transformation: GenericNoDistortTransform
Other Parameters: 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(annotate=True)
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(annotate=True)
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(annotate=True)
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(annotate=True)
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(annotate=True)
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(annotate=True)
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(annotate=True)
-
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
out-of-plane angle of the grating coupler
socket: PCell and WgSocket
socket of the fiber coupler
grating: PCell
grating of this fiber coupler
start_trace_template: PCell and _WaveguideTemplate
start waveguide for the socket waveguide (narrow side)
wide_trace_template: PCell and _WaveguideTemplate
end waveguide for the socket waveguide (broad side)
name:
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
andgrating_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
process: ProcessLayer
default process used for the grating
socket_straight_extension: Coord2
tuple: straight extension at start and end of socket
spread_angle: float
Angle in degrees of the far field radiation field of the socket. By default this is set to be equal to the angle of the taper that is set by its length and the width of the core of input and output waveguides.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
centers: list and List with type restriction, allowed types: <class ‘ipkiss.geometry.coord.Coord2’>
List of centers for the ellipses. By default [i3.Coord2(0, 0)] * TECH.IO.FIBCOUP.CURVED.GRATING.N_O_LINES
ellipse_radii_x: list
List of x radii of the ellipses. By default a list of radii matching the number of center and a period of TECH.IO.FIBCOUP.CURVED.GRATING.PERIOD
ellipse_radii_y: list
List of y radii of the ellipses. By default identical to
ellipse_radii_y
end_angles: list
List of the end angle for each ellipse. By default 360 -
start_angles
line_widths: list
List of the linewidth of the trench of each ellipse. By default TECH.IO.FIBCOUP.CURVED.GRATING.PERIOD / 2.0 for all lines
purpose:
start_angles: list
List of the start angle in degrees for each ellipse. By default 180 - TECH.FIBCOUP.DEFAULT_ANGLE_SPAN / 2.0 for all lines
socket_extension: float and Real, number and number >= 0
extension of the wide side of the socket, asymmetric with respect to the specified center
socket_length: float and number > 0
length of the straight waveguide socket
socket_transformation: GenericNoDistortTransform
Other Parameters: 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(annotate=True)
-
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
out-of-plane angle of the grating coupler
socket: PCell and WgSocket
socket of the fiber coupler
grating: PCell
grating of this fiber coupler
trace_template: PCell and _TraceTemplate
trace template for the socket waveguide
name:
The unique name of the pcell
Views
-
Layout
Parameters: grating_transformation: GenericNoDistortTransform
line_length: float and number > 0
length of the grating trenches (perpendicular to the socket waveguide)
line_width: float and number > 0
width of the grating trenches, drawn in the given layer
n_o_periods: int and number > 0
number of periods of the grating
origin: Coord2
local origin of the grating (first trench)
period: float and number > 0
period of the grating
process: ProcessLayer
process layer for the grating
purpose: PatternPurpose
drawing purpose for the grating lines
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
socket_length: float and number > 0
length of the straight waveguide socket
socket_transformation: GenericNoDistortTransform
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(annotate=True)
-
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 circuitmodel, 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
socket of the fiber coupler
grating: PCell
grating of this fiber coupler
inclination: float
out-of-plane angle of the grating coupler
name:
The unique name of the pcell
Views
-
Layout
Parameters: grating_transformation: GenericNoDistortTransform
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
socket_length: float and number > 0
length of the straight waveguide socket
socket_transformation: GenericNoDistortTransform
-
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
Trace template for the ring waveguide
couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of coupler PCells
ring_segments: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of Ring PCells
name:
The unique name of the pcell
Other Parameters: ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.
See also
RingTraces
,RingShape
,RingRoundedShape
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
coupler_parameters:
Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
straights: Coord2
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
shape_position: Coord2
Translation of the shape.
area_layer_on: ( bool, bool_, bool or int )
When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.
coupler_transformations:
list of coupler transformations
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: shape: locked
shapes: locked
Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead
Examples
""" This example demonstrates a simple rounded rectangular ring consisting 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(annotate=True)
""" 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(annotate=True)
-
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’>
list of trace_templates for the ring couplers. By default the same template as the ring is taken
ring_trace_template: PCell and _WaveguideTemplate
Trace template for the ring waveguide
couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of coupler PCells
ring_segments: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of Ring PCells
name:
The unique name of the pcell
Other Parameters: ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.
See also
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
Angle step for rounding.
coupler_lengths: list<number >= 0>
straight lengths of the coupling section. By default, same lengths as the ring will be used
coupler_parameters:
Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
coupler_extensions: list<Coord2>
additional length of the couplers. By default, the couplers will be extended to the size of the ring.
coupler_offsets: list<Real, number>
list of offsets of the ring couplers along the centerline
coupler_spacings: list<Real, number>
list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)
straights: Coord2
shape_position: Coord2
Translation of the shape.
area_layer_on: ( bool, bool_, bool or int )
When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.
coupler_transformations:
list of coupler transformations
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: 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(annotate=True)
-
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
Trace template for the ring waveguide
couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of coupler PCells
ring_segments: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of Ring PCells
name:
The unique name of the pcell
Other Parameters: ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.
See also
RingTraces
,RingShape
,RingRect
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
coupler_parameters:
Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
shape: Shape
Shape of the ring
shape_position: Coord2
Translation of the shape.
area_layer_on: ( bool, bool_, bool or int )
When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.
coupler_transformations:
list of coupler transformations
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: shapes: locked
Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead
Examples
""" This example demonstrates a generic ring consisting of a user-defined control shape which is drawn by rounding using the provided trace template with a given bend radius """ 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(annotate=True)
-
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’>
list of trace_templates for the ring couplers. By default the same template as the ring is taken
ring_trace_template: PCell and _WaveguideTemplate
Trace template for the ring waveguide
couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of coupler PCells
ring_segments: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of Ring PCells
name:
The unique name of the pcell
Other Parameters: ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.
See also
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
coupler_lengths: list<number >= 0>
straight lengths of the coupling section. By default, same lengths as the ring will be used
coupler_parameters:
Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
coupler_extensions: list<Coord2>
additional length of the couplers. By default, the couplers will be extended to the size of the ring.
coupler_offsets: list<Real, number>
list of offsets of the ring couplers along the centerline
coupler_spacings: list<Real, number>
list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)
straights: Coord2
shape_position: Coord2
Translation of the shape.
area_layer_on: ( bool, bool_, bool or int )
When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.
coupler_transformations:
list of coupler transformations
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: 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(annotate=True)
-
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’>
list of trace_templates for the ring couplers. By default the same template as the ring is taken
ring_trace_template: PCell and _WaveguideTemplate
Trace template for the ring waveguide
couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of coupler PCells
ring_segments: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of Ring PCells
name:
The unique name of the pcell
Other Parameters: ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.
See also
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
Angle step for rounding.
coupler_lengths: list<number >= 0>
straight lengths of the coupling section. By default, same lengths as the ring will be used
coupler_parameters:
Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
coupler_extensions: list<Coord2>
additional length of the couplers. By default, the couplers will be extended to the size of the ring.
coupler_offsets: list<Real, number>
list of offsets of the ring couplers along the centerline
coupler_spacings: list<Real, number>
list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)
straights: Coord2
shape_position: Coord2
Translation of the shape.
area_layer_on: ( bool, bool_, bool or int )
When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.
coupler_transformations:
list of coupler transformations
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: 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(annotate=True)
-
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’>
list of trace_templates for the ring couplers. By default the same template as the ring is taken
ring_trace_template: PCell and _WaveguideTemplate
Trace template for the ring waveguide
couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of coupler PCells
ring_segments: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of Ring PCells
name:
The unique name of the pcell
Other Parameters: ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.
See also
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
coupler_lengths: list<number >= 0>
straight lengths of the coupling section. By default, same lengths as the ring will be used
coupler_parameters:
Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
coupler_extensions: list<Coord2>
additional length of the couplers. By default, the couplers will be extended to the size of the ring.
coupler_offsets: list<Real, number>
list of offsets of the ring couplers along the centerline
coupler_spacings: list<Real, number>
list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)
straights: Coord2
shape_position: Coord2
Translation of the shape.
area_layer_on: ( bool, bool_, bool or int )
When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.
coupler_transformations:
list of coupler transformations
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: 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(annotate=True)
-
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’>
list of trace_templates for the ring couplers. By default the same template as the ring is taken
ring_trace_template: PCell and _WaveguideTemplate
Trace template for the ring waveguide
couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of coupler PCells
ring_segments: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of Ring PCells
name:
The unique name of the pcell
Other Parameters: ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.
See also
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
coupler_angles: list<[-90,90]>
coupler_lengths: list<number >= 0>
straight lengths of the couplers. if None, same lengths as the ring will be used
coupler_parameters:
Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
shape_position: Coord2
Translation of the shape.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
coupler_sbend_straights: list<number >= 0>
coupler_radii: list<number >= 0>
radii of the couplers. if None, same radius as the ring will be used
coupler_rounding_algorithms:
rounding algorithm of the couplers. if None, same radius as the ring will be used
coupler_offsets: list<Real, number>
list of offsets of the ring couplers along the centerline
coupler_spacings: list<Real, number>
list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)
straights: Coord2
area_layer_on: ( bool, bool_, bool or int )
When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.
coupler_transformations:
list of coupler transformations
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: 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(annotate=True)
-
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’>
list of trace_templates for the ring couplers. By default the same template as the ring is taken
ring_trace_template: PCell and _WaveguideTemplate
Trace template for the ring waveguide
couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of coupler PCells
ring_segments: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of Ring PCells
name:
The unique name of the pcell
Other Parameters: ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.
See also
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
coupler_angles: list<[-90,90]>
coupler_lengths: list<number >= 0>
straight lengths of the couplers. if None, same lengths as the ring will be used
coupler_parameters:
Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
shape_position: Coord2
Translation of the shape.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
coupler_sbend_straights: list<number >= 0>
coupler_radii: list<number >= 0>
radii of the couplers. if None, same radius as the ring will be used
coupler_rounding_algorithms:
rounding algorithm of the couplers. if None, same radius as the ring will be used
coupler_offsets: list<Real, number>
list of offsets of the ring couplers along the centerline
coupler_spacings: list<Real, number>
list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)
straights: Coord2
area_layer_on: ( bool, bool_, bool or int )
When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.
coupler_transformations:
list of coupler transformations
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: 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(annotate=True)
-
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’>
list of trace_templates for the ring couplers. By default the same template as the ring is taken
ring_trace_template: PCell and _WaveguideTemplate
Trace template for the ring waveguide
couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of coupler PCells
ring_segments: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of Ring PCells
name:
The unique name of the pcell
Other Parameters: ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.
See also
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
coupler_angles: list<[0,90]>
coupler_lengths: list<number >= 0>
straight lengths of the couplers. if None, same lengths as the ring will be used
coupler_parameters:
Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
shape_position: Coord2
Translation of the shape.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
coupler_straights: list<number >= 0>
lengths of the straigth sections at the start and end of the couplers
coupler_radii: list<number >= 0>
radii of the couplers. if None, same radius as the ring will be used
coupler_rounding_algorithms:
rounding algorithm of the couplers. if None, same radius as the ring will be used
coupler_offsets: list<Real, number>
list of offsets of the ring couplers along the centerline
coupler_spacings: list<Real, number>
list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)
straights: Coord2
area_layer_on: ( bool, bool_, bool or int )
When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.
coupler_transformations:
list of coupler transformations
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: 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(annotate=True)
-
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’>
list of trace_templates for the ring couplers. By default the same template as the ring is taken
ring_trace_template: PCell and _WaveguideTemplate
Trace template for the ring waveguide
couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of coupler PCells
ring_segments: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of Ring PCells
name:
The unique name of the pcell
Other Parameters: ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
coupler_angles: list<[0,90]>
coupler_lengths: list<number >= 0>
straight lengths of the couplers. if None, same lengths as the ring will be used
coupler_parameters:
Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
shape_position: Coord2
Translation of the shape.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
coupler_straights: list<number >= 0>
lengths of the straigth sections at the start and end of the couplers
coupler_radii: list<number >= 0>
radii of the couplers. if None, same radius as the ring will be used
coupler_rounding_algorithms:
rounding algorithm of the couplers. if None, same radius as the ring will be used
coupler_offsets: list<Real, number>
list of offsets of the ring couplers along the centerline
coupler_spacings: list<Real, number>
list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)
straights: Coord2
area_layer_on: ( bool, bool_, bool or int )
When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.
coupler_transformations:
list of coupler transformations
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: 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(annotate=True)
-
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’>
list of trace_templates for the ring couplers. By default the same template as the ring is taken
ring_trace_template: PCell and _WaveguideTemplate
Trace template for the ring waveguide
couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of coupler PCells
ring_segments: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of Ring PCells
name:
The unique name of the pcell
Other Parameters: ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
coupler_angles: list<[0,90]>
coupler_lengths: list<number >= 0>
straight lengths of the couplers. if None, same lengths as the ring will be used
coupler_parameters:
Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
shape_position: Coord2
Translation of the shape.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
coupler_straights: list<number >= 0>
lengths of the straigth sections at the start and end of the couplers
coupler_radii: list<number >= 0>
radii of the couplers. if None, same radius as the ring will be used
coupler_rounding_algorithms:
rounding algorithm of the couplers. if None, same radius as the ring will be used
coupler_offsets: list<Real, number>
list of offsets of the ring couplers along the centerline
coupler_spacings: list<Real, number>
list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)
straights: Coord2
area_layer_on: ( bool, bool_, bool or int )
When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.
coupler_transformations:
list of coupler transformations
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: 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(annotate=True)
-
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’>
list of trace_templates for the ring couplers. By default the same template as the ring is taken
ring_trace_template: PCell and _WaveguideTemplate
Trace template for the ring waveguide
couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of coupler PCells
ring_segments: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of Ring PCells
name:
The unique name of the pcell
Other Parameters: ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.
See also
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
coupler_angles: list<[0,90]>
coupler_lengths: list<number >= 0>
straight lengths of the couplers. if None, same lengths as the ring will be used
coupler_parameters:
Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
shape_position: Coord2
Translation of the shape.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
coupler_sbend_straights: list<number >= 0>
coupler_radii: list<number >= 0>
radii of the couplers. if None, same radius as the ring will be used
coupler_rounding_algorithms:
rounding algorithm of the couplers. if None, same radius as the ring will be used
coupler_offsets: list<Real, number>
list of offsets of the ring couplers along the centerline
coupler_spacings: list<Real, number>
list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)
straights: Coord2
area_layer_on: ( bool, bool_, bool or int )
When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.
coupler_transformations:
list of coupler transformations
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: 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(annotate=True)
-
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’>
list of trace_templates for the ring couplers. By default the same template as the ring is taken
ring_trace_template: PCell and _WaveguideTemplate
Trace template for the ring waveguide
couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of coupler PCells
ring_segments: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of Ring PCells
name:
The unique name of the pcell
Other Parameters: ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.
See also
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
coupler_angles: list<[0,90]>
coupler_lengths: list<number >= 0>
straight lengths of the couplers. if None, same lengths as the ring will be used
coupler_parameters:
Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
shape_position: Coord2
Translation of the shape.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
coupler_sbend_straights: list<number >= 0>
coupler_radii: list<number >= 0>
radii of the couplers. if None, same radius as the ring will be used
coupler_rounding_algorithms:
rounding algorithm of the couplers. if None, same radius as the ring will be used
coupler_offsets: list<Real, number>
list of offsets of the ring couplers along the centerline
coupler_spacings: list<Real, number>
list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)
straights: Coord2
area_layer_on: ( bool, bool_, bool or int )
When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.
coupler_transformations:
list of coupler transformations
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: 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(annotate=True)
-
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:
Dictionary for remapping of the port names of the contents to the external ports
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
port_labels: ( List with type restriction, allowed types: <type ‘str’> ), *None allowed*
Labels of the ports to be processed. Set to None to process all ports.
transitions: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
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’>
List of the input trace templates.
output_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
List of the output trace templates.
trace_template: ( PCell and _WaveguideTemplate ), *None allowed*
Template for all ports, defaults to TECH.PCELLS.WG.DEFAULT.When set to None, the waveguide templates of the ports will be used.
transition_database: AutoTransitionDatabase
AutoTransitionDatabase in which the correct transition between the two trace templates can be looked up.
name:
The unique name of the pcell
Other Parameters: contents: PCell, locked
Contains the base MMI without the tapers
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.
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
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the contents as elements in the layout, rather than as an Instance
input_y_positions: list<Real, number>
Positions in the y direction at the input where ports are be added
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
zero_length_if_identical: ( bool, bool_, bool or int )
uses a zero-length transition if the trace templates are identical
length: float and number > 0
Length of the MMI
output_y_positions: list<Real, number>
Positions in the y direction at the output where ports are be added
transition_length: ( float and Real, number and number >= 0 ), *None allowed*
Length of the transition. Set to None to take the standard transition length.
straight_extension: ( Coord2 ), *None allowed*
Tuple: straight extensions of the transitions. Set to None to take the standard straight extensions
Other Parameters: 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(annotate=True)
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(annotate=True)
-
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:
Dictionary for remapping of the port names of the contents to the external ports
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
output_trace_template: PCell
Output trace template.
port_labels: ( List with type restriction, allowed types: <type ‘str’> ), *None allowed*
Labels of the ports to be processed. Set to None to process all ports.
trace_template: ( PCell and _WaveguideTemplate ), *None allowed*
Template for all ports, defaults to TECH.PCELLS.WG.DEFAULT.When set to None, the waveguide templates of the ports will be used.
input_trace_template: PCell
Input trace template.
n_inputs: int and number > 0
Number of input channels
n_outputs: int and number > 0
Number of output channels.
transitions: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
List of transistions that is used on this MMI. By default Autotracetransition is used on all the transitions
transition_database: AutoTransitionDatabase
AutoTransitionDatabase in which the correct transition between the two trace templates can be looked up.
name:
The unique name of the pcell
Other Parameters: 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
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the contents as elements in the layout, rather than as an Instance
input_y_positions: list<Real, number>
Positions in the y direction at the input where ports are be added
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
zero_length_if_identical: ( bool, bool_, bool or int )
uses a zero-length transition if the trace templates are identical
length: float and number > 0
Length of the MMI
output_y_positions: list<Real, number>
Positions in the y direction at the output where ports are be added
transition_length: ( float and Real, number and number >= 0 ), *None allowed*
Length of the transition. Set to None to take the standard transition length.
straight_extension: ( Coord2 ), *None allowed*
Tuple: straight extensions of the transitions. Set to None to take the standard straight extensions
Other Parameters: 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(annotate=True)
-
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:
Dictionary for remapping of the port names of the contents to the external ports
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
output_trace_template: PCell
Output trace template.
port_labels: ( List with type restriction, allowed types: <type ‘str’> ), *None allowed*
Labels of the ports to be processed. Set to None to process all ports.
trace_template: ( PCell and _WaveguideTemplate ), *None allowed*
Template for all ports, defaults to TECH.PCELLS.WG.DEFAULT.When set to None, the waveguide templates of the ports will be used.
input_trace_template: PCell
Input trace template.
n_inputs: int and number > 0
Number of input channels
n_outputs: int and number > 0
Number of output channels.
transitions: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
List of transistions that is used on this MMI. By default Autotracetransition is used on all the transitions
transition_database: AutoTransitionDatabase
AutoTransitionDatabase in which the correct transition between the two trace templates can be looked up.
name:
The unique name of the pcell
Other Parameters: 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
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the contents as elements in the layout, rather than as an Instance
trace_spacing: float and Real, number and number >= 0
Offset between the traces at the input and the output
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
zero_length_if_identical: ( bool, bool_, bool or int )
uses a zero-length transition if the trace templates are identical
length: float and number > 0
Length of the MMI
transition_length: ( float and Real, number and number >= 0 ), *None allowed*
Length of the transition. Set to None to take the standard transition length.
straight_extension: ( Coord2 ), *None allowed*
Tuple: straight extensions of the transitions. Set to None to take the standard straight extensions
Other Parameters: input_y_positions: list<Real, number>, locked
Positions in the y direction at the input where ports are be added
transition_lengths: locked
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(annotate=True)
-
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:
Dictionary for remapping of the port names of the contents to the external ports
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
output_trace_template: PCell
Output trace template.
port_labels: ( List with type restriction, allowed types: <type ‘str’> ), *None allowed*
Labels of the ports to be processed. Set to None to process all ports.
trace_template: ( PCell and _WaveguideTemplate ), *None allowed*
Template for all ports, defaults to TECH.PCELLS.WG.DEFAULT.When set to None, the waveguide templates of the ports will be used.
input_trace_template: PCell
Input trace template.
transitions: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
List of transistions that is used on this MMI. By default Autotracetransition is used on all the transitions
transition_database: AutoTransitionDatabase
AutoTransitionDatabase in which the correct transition between the two trace templates can be looked up.
name:
The unique name of the pcell
Other Parameters: 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.
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
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the contents as elements in the layout, rather than as an Instance
trace_spacing: float and Real, number and number >= 0
Offset between the traces at the input and the output
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
zero_length_if_identical: ( bool, bool_, bool or int )
uses a zero-length transition if the trace templates are identical
length: float and number > 0
Length of the MMI
transition_length: ( float and Real, number and number >= 0 ), *None allowed*
Length of the transition. Set to None to take the standard transition length.
straight_extension: ( Coord2 ), *None allowed*
Tuple: straight extensions of the transitions. Set to None to take the standard straight extensions
Other Parameters: input_y_positions: list<Real, number>, locked
Positions in the y direction at the input where ports are be added
transition_lengths: locked
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(annotate=True)
-
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:
Dictionary for remapping of the port names of the contents to the external ports
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
output_trace_template: PCell
Output trace template.
port_labels: ( List with type restriction, allowed types: <type ‘str’> ), *None allowed*
Labels of the ports to be processed. Set to None to process all ports.
trace_template: ( PCell and _WaveguideTemplate ), *None allowed*
Template for all ports, defaults to TECH.PCELLS.WG.DEFAULT.When set to None, the waveguide templates of the ports will be used.
input_trace_template: PCell
Input trace template.
transitions: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
List of transistions that is used on this MMI. By default Autotracetransition is used on all the transitions
transition_database: AutoTransitionDatabase
AutoTransitionDatabase in which the correct transition between the two trace templates can be looked up.
name:
The unique name of the pcell
Other Parameters: 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.
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
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the contents as elements in the layout, rather than as an Instance
trace_spacing: float and Real, number and number >= 0
Offset between the traces at the input and the output
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
zero_length_if_identical: ( bool, bool_, bool or int )
uses a zero-length transition if the trace templates are identical
length: float and number > 0
Length of the MMI
transition_length: ( float and Real, number and number >= 0 ), *None allowed*
Length of the transition. Set to None to take the standard transition length.
straight_extension: ( Coord2 ), *None allowed*
Tuple: straight extensions of the transitions. Set to None to take the standard straight extensions
Other Parameters: input_y_positions: list<Real, number>, locked
Positions in the y direction at the input where ports are be added
transition_lengths: locked
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(annotate=True)
-
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:
Dictionary for remapping of the port names of the contents to the external ports
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
output_trace_template: PCell
Output trace template.
port_labels: ( List with type restriction, allowed types: <type ‘str’> ), *None allowed*
Labels of the ports to be processed. Set to None to process all ports.
trace_template: ( PCell and _WaveguideTemplate ), *None allowed*
Template for all ports, defaults to TECH.PCELLS.WG.DEFAULT.When set to None, the waveguide templates of the ports will be used.
input_trace_template: PCell
Input trace template.
transitions: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
List of transistions that is used on this MMI. By default Autotracetransition is used on all the transitions
transition_database: AutoTransitionDatabase
AutoTransitionDatabase in which the correct transition between the two trace templates can be looked up.
name:
The unique name of the pcell
Other Parameters: 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.
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
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the contents as elements in the layout, rather than as an Instance
trace_spacing: float and Real, number and number >= 0
Offset between the traces at the input and the output
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
zero_length_if_identical: ( bool, bool_, bool or int )
uses a zero-length transition if the trace templates are identical
length: float and number > 0
Length of the MMI
transition_length: ( float and Real, number and number >= 0 ), *None allowed*
Length of the transition. Set to None to take the standard transition length.
straight_extension: ( Coord2 ), *None allowed*
Tuple: straight extensions of the transitions. Set to None to take the standard straight extensions
Other Parameters: input_y_positions: list<Real, number>, locked
Positions in the y direction at the input where ports are be added
transition_lengths: locked
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(annotate=True)
-
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:
Dictionary for remapping of the port names of the contents to the external ports
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
output_trace_template: PCell
Output trace template.
port_labels: ( List with type restriction, allowed types: <type ‘str’> ), *None allowed*
Labels of the ports to be processed. Set to None to process all ports.
trace_template: ( PCell and _WaveguideTemplate ), *None allowed*
Template for all ports, defaults to TECH.PCELLS.WG.DEFAULT.When set to None, the waveguide templates of the ports will be used.
input_trace_template: PCell
Input trace template.
n_inputs: int and number > 0
Number of input channels
n_outputs: int and number > 0
Number of output channels.
transitions: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
List of transistions that is used on this MMI. By default Autotracetransition is used on all the transitions
transition_database: AutoTransitionDatabase
AutoTransitionDatabase in which the correct transition between the two trace templates can be looked up.
name:
The unique name of the pcell
Other Parameters: 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
extra_line_thickness: float and Real, number and number >= 0
Extra width added to minimum_space to calculate the width of the line correction (usually you do not have to modify this)
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the contents as elements in the layout, rather than as an Instance
input_y_positions: list<Real, number>
Positions in the y direction at the input where ports are be added
minimum_space: float and number > 0
Minimum space between the tapers needed for the line corrections be added (usually you do not have to modify this)
rib_cover_purpose: PatternPurpose
Drawing purpose for covering the mmi and rib-only part of the tapers
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
zero_length_if_identical: ( bool, bool_, bool or int )
uses a zero-length transition if the trace templates are identical
length: float and number > 0
Length of the MMI
output_y_positions: list<Real, number>
Positions in the y direction at the output where ports are be added
transition_length: ( float and Real, number and number >= 0 ), *None allowed*
Length of the transition. Set to None to take the standard transition length.
straight_extension: ( Coord2 ), *None allowed*
Tuple: straight extensions of the transitions. Set to None to take the standard straight extensions
Other Parameters: 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(annotate=True)
-
RibMMISymmetricTapered¶
-
class
picazzo3.filters.mmi_rib.
RibMMISymmetricTapered
(*args, **kwargs) Rib MMI with symmetrically distributed access templates and with tapers.
Parameters: external_port_names:
Dictionary for remapping of the port names of the contents to the external ports
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
output_trace_template: PCell
Output trace template.
port_labels: ( List with type restriction, allowed types: <type ‘str’> ), *None allowed*
Labels of the ports to be processed. Set to None to process all ports.
trace_template: ( PCell and _WaveguideTemplate ), *None allowed*
Template for all ports, defaults to TECH.PCELLS.WG.DEFAULT.When set to None, the waveguide templates of the ports will be used.
input_trace_template: PCell
Input trace template.
n_inputs: int and number > 0
Number of input channels
n_outputs: int and number > 0
Number of output channels.
transitions: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
List of transistions that is used on this MMI. By default Autotracetransition is used on all the transitions
transition_database: AutoTransitionDatabase
AutoTransitionDatabase in which the correct transition between the two trace templates can be looked up.
name:
The unique name of the pcell
Other Parameters: 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
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the contents as elements in the layout, rather than as an Instance
trace_spacing: float and Real, number and number >= 0
Offset between the traces at the input and the output
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
extra_line_thickness: float and Real, number and number >= 0
Extra width added to minimum_space to calculate the width of the line correction (usually you do not have to modify this)
minimum_space: float and number > 0
Minimum space between the tapers needed for the line corrections be added (usually you do not have to modify this)
rib_cover_purpose: PatternPurpose
Drawing purpose for covering the mmi and rib-only part of the tapers
zero_length_if_identical: ( bool, bool_, bool or int )
uses a zero-length transition if the trace templates are identical
length: float and number > 0
Length of the MMI
transition_length: ( float and Real, number and number >= 0 ), *None allowed*
Length of the transition. Set to None to take the standard transition length.
straight_extension: ( Coord2 ), *None allowed*
Tuple: straight extensions of the transitions. Set to None to take the standard straight extensions
Other Parameters: input_y_positions: list<Real, number>, locked
Positions in the y direction at the input where ports are be added
transition_lengths: locked
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(annotate=True)
-
RibMMI1x2Tapered¶
-
class
picazzo3.filters.mmi_rib.
RibMMI1x2Tapered
(*args, **kwargs) Rib 1x2 MMI with symmetrically distributed access templates and with tapers.
Parameters: external_port_names:
Dictionary for remapping of the port names of the contents to the external ports
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
output_trace_template: PCell
Output trace template.
port_labels: ( List with type restriction, allowed types: <type ‘str’> ), *None allowed*
Labels of the ports to be processed. Set to None to process all ports.
trace_template: ( PCell and _WaveguideTemplate ), *None allowed*
Template for all ports, defaults to TECH.PCELLS.WG.DEFAULT.When set to None, the waveguide templates of the ports will be used.
input_trace_template: PCell
Input trace template.
transitions: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
List of transistions that is used on this MMI. By default Autotracetransition is used on all the transitions
transition_database: AutoTransitionDatabase
AutoTransitionDatabase in which the correct transition between the two trace templates can be looked up.
name:
The unique name of the pcell
Other Parameters: 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.
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
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the contents as elements in the layout, rather than as an Instance
trace_spacing: float and Real, number and number >= 0
Offset between the traces at the input and the output
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
extra_line_thickness: float and Real, number and number >= 0
Extra width added to minimum_space to calculate the width of the line correction (usually you do not have to modify this)
minimum_space: float and number > 0
Minimum space between the tapers needed for the line corrections be added (usually you do not have to modify this)
rib_cover_purpose: PatternPurpose
Drawing purpose for covering the mmi and rib-only part of the tapers
zero_length_if_identical: ( bool, bool_, bool or int )
uses a zero-length transition if the trace templates are identical
length: float and number > 0
Length of the MMI
transition_length: ( float and Real, number and number >= 0 ), *None allowed*
Length of the transition. Set to None to take the standard transition length.
straight_extension: ( Coord2 ), *None allowed*
Tuple: straight extensions of the transitions. Set to None to take the standard straight extensions
Other Parameters: input_y_positions: list<Real, number>, locked
Positions in the y direction at the input where ports are be added
transition_lengths: locked
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(annotate=True)
-
RibMMI2x1Tapered¶
-
class
picazzo3.filters.mmi_rib.
RibMMI2x1Tapered
(*args, **kwargs) Rib 2x1 MMI with symmetrically distributed access templates and with tapers.
Parameters: external_port_names:
Dictionary for remapping of the port names of the contents to the external ports
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
output_trace_template: PCell
Output trace template.
port_labels: ( List with type restriction, allowed types: <type ‘str’> ), *None allowed*
Labels of the ports to be processed. Set to None to process all ports.
trace_template: ( PCell and _WaveguideTemplate ), *None allowed*
Template for all ports, defaults to TECH.PCELLS.WG.DEFAULT.When set to None, the waveguide templates of the ports will be used.
input_trace_template: PCell
Input trace template.
transitions: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
List of transistions that is used on this MMI. By default Autotracetransition is used on all the transitions
transition_database: AutoTransitionDatabase
AutoTransitionDatabase in which the correct transition between the two trace templates can be looked up.
name:
The unique name of the pcell
Other Parameters: 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.
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
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the contents as elements in the layout, rather than as an Instance
trace_spacing: float and Real, number and number >= 0
Offset between the traces at the input and the output
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
extra_line_thickness: float and Real, number and number >= 0
Extra width added to minimum_space to calculate the width of the line correction (usually you do not have to modify this)
minimum_space: float and number > 0
Minimum space between the tapers needed for the line corrections be added (usually you do not have to modify this)
rib_cover_purpose: PatternPurpose
Drawing purpose for covering the mmi and rib-only part of the tapers
zero_length_if_identical: ( bool, bool_, bool or int )
uses a zero-length transition if the trace templates are identical
length: float and number > 0
Length of the MMI
transition_length: ( float and Real, number and number >= 0 ), *None allowed*
Length of the transition. Set to None to take the standard transition length.
straight_extension: ( Coord2 ), *None allowed*
Tuple: straight extensions of the transitions. Set to None to take the standard straight extensions
Other Parameters: input_y_positions: list<Real, number>, locked
Positions in the y direction at the input where ports are be added
transition_lengths: locked
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(annotate=True)
-
RibMMI2x2Tapered¶
-
class
picazzo3.filters.mmi_rib.
RibMMI2x2Tapered
(*args, **kwargs) Rib 2x2 MMI with symmetrically distributed access templates and with tapers.
Parameters: external_port_names:
Dictionary for remapping of the port names of the contents to the external ports
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
output_trace_template: PCell
Output trace template.
port_labels: ( List with type restriction, allowed types: <type ‘str’> ), *None allowed*
Labels of the ports to be processed. Set to None to process all ports.
trace_template: ( PCell and _WaveguideTemplate ), *None allowed*
Template for all ports, defaults to TECH.PCELLS.WG.DEFAULT.When set to None, the waveguide templates of the ports will be used.
input_trace_template: PCell
Input trace template.
transitions: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
List of transistions that is used on this MMI. By default Autotracetransition is used on all the transitions
transition_database: AutoTransitionDatabase
AutoTransitionDatabase in which the correct transition between the two trace templates can be looked up.
name:
The unique name of the pcell
Other Parameters: 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.
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
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the contents as elements in the layout, rather than as an Instance
trace_spacing: float and Real, number and number >= 0
Offset between the traces at the input and the output
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
extra_line_thickness: float and Real, number and number >= 0
Extra width added to minimum_space to calculate the width of the line correction (usually you do not have to modify this)
minimum_space: float and number > 0
Minimum space between the tapers needed for the line corrections be added (usually you do not have to modify this)
rib_cover_purpose: PatternPurpose
Drawing purpose for covering the mmi and rib-only part of the tapers
zero_length_if_identical: ( bool, bool_, bool or int )
uses a zero-length transition if the trace templates are identical
length: float and number > 0
Length of the MMI
transition_length: ( float and Real, number and number >= 0 ), *None allowed*
Length of the transition. Set to None to take the standard transition length.
straight_extension: ( Coord2 ), *None allowed*
Tuple: straight extensions of the transitions. Set to None to take the standard straight extensions
Other Parameters: input_y_positions: list<Real, number>, locked
Positions in the y direction at the input where ports are be added
transition_lengths: locked
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(annotate=True)
-
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’>
List of the input trace templates.
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
output_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
List of the output trace templates.
name:
The unique name of the pcell
Other Parameters: 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: view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
input_y_positions: list<Real, number>
Positions in the y direction at the input where ports are be added
length: float and number > 0
Length of the MMI
output_y_positions: list<Real, number>
Positions in the y direction at the output where ports are be added
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(annotate=True)
-
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
Input trace template.
n_inputs: int and number > 0
Number of input channels
n_outputs: int and number > 0
Number of output channels.
output_trace_template: PCell
Output trace template.
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
name:
The unique name of the pcell
Other Parameters: 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: view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
input_y_positions: list<Real, number>
Positions in the y direction at the input where ports are be added
length: float and number > 0
Length of the MMI
output_y_positions: list<Real, number>
Positions in the y direction at the output where ports are be added
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(annotate=True)
-
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
Input trace template.
n_inputs: int and number > 0
Number of input channels
n_outputs: int and number > 0
Number of output channels.
output_trace_template: PCell
Output trace template.
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
name:
The unique name of the pcell
Other Parameters: 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: view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
trace_spacing: float and Real, number and number >= 0
Offset between the traces at the input and the output
length: float and number > 0
Length of the MMI
Other Parameters: 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(annotate=True)
-
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
Input trace template.
output_trace_template: PCell
Output trace template.
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
name:
The unique name of the pcell
Other Parameters: n_inputs: int and number > 0, locked
Number of input channels.
n_outputs: int and number > 0, locked
Number of output channels.
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: view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
trace_spacing: float and Real, number and number >= 0
Offset between the traces at the input and the output
length: float and number > 0
Length of the MMI
Other Parameters: 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(annotate=True)
-
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
Input trace template.
output_trace_template: PCell
Output trace template.
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
name:
The unique name of the pcell
Other Parameters: n_inputs: int and number > 0, locked
Number of input channels.
n_outputs: int and number > 0, locked
Number of output channels.
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: view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
trace_spacing: float and Real, number and number >= 0
Offset between the traces at the input and the output
length: float and number > 0
Length of the MMI
Other Parameters: 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(annotate=True)
-
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
Input trace template.
output_trace_template: PCell
Output trace template.
mmi_trace_template: PCell and _WaveguideTemplate
Trace template used for the MMI section
name:
The unique name of the pcell
Other Parameters: n_inputs: int and number > 0, locked
Number of input channels.
n_outputs: int and number > 0, locked
Number of output channels.
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: view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
trace_spacing: float and Real, number and number >= 0
Offset between the traces at the input and the output
length: float and number > 0
Length of the MMI
Other Parameters: 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(annotate=True)
-
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
The South arm of the MZI
arm1_port_names: length == 2
port names for the south arm ports connected to splitter and combiner. Default = (‘in’, ‘out’)
arm2: PCell and MZIArm
The North arm of the MZI
arm2_port_names: length == 2
port names for the north arm ports connected to splitter and combiner. Default = (‘in’, ‘out’)
combiner: PCell
The combiner of the MZI
combiner_port_names: length == 2
port names for the combiner ports to the arms. Default = (‘in1’, ‘in2’)
splitter: PCell
The splitter of the MZI
splitter_port_names: length == 2
port names for the splitter ports to the arms. Default = (‘out1’, ‘out2’)
external_port_names:
Map of the free instance terms/ports to the names of external terms/ports.Format is a dict {‘inst:term’ : ‘new_term_name’}.If a term/port is not listed, the format instname_portname will be used
name:
The unique name of the pcell
Other Parameters: child_cells: locked
links: locked
Views
-
Layout
Parameters: combiner_transformation: GenericNoDistortTransform
splitter_transformation: GenericNoDistortTransform
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
flyline_layer: ( __Layer__ ), *None allowed*
layer to draw flylines of physically unconnected links
flyline_width: float and number > 0
line width of the flylines
netlist_view: NetlistView
Netlist view in the same cell on which this Layout is based. Normally no need to manually override.
Other Parameters: 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(annotate=True)
-
MZIWaveguides¶
-
class
picazzo3.filters.mzi.cell.
MZIWaveguides
(*args, **kwargs) A MZI with two simple waveguide arms. The splitter and combiner are safely spaced, but this can be manually optimized. The difference in length between the delay lines can be set in the layout.
Parameters: auto_transition: ( bool, bool_, bool or int )
if True, splitter and combiner are transitioned to the correct waveguide template
trace_template: PCell and _WaveguideTemplate
arm1_port_names: length == 2
port names for the south arm ports connected to splitter and combiner. Default = (‘in’, ‘out’)
arm2_port_names: length == 2
port names for the north arm ports connected to splitter and combiner. Default = (‘in’, ‘out’)
combiner: PCell
The combiner of the MZI
combiner_port_names: length == 2
port names for the combiner ports to the arms. Default = (‘in1’, ‘in2’)
splitter: PCell
The splitter of the MZI
splitter_port_names: length == 2
port names for the splitter ports to the arms. Default = (‘out1’, ‘out2’)
external_port_names:
Map of the free instance terms/ports to the names of external terms/ports.Format is a dict {‘inst:term’ : ‘new_term_name’}.If a term/port is not listed, the format instname_portname will be used
name:
The unique name of the pcell
Other Parameters: arm1: PCell, locked
arm2: PCell, locked
child_cells: locked
links: locked
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
delay_length: float
if positive, the upper arms is longer, if negative, the lower arm
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
arm1_direction:
direction of routing (DIRECTION.NORTH or DIRECTION.SOUTH)
arm2_direction:
direction of routing (DIRECTION.NORTH or DIRECTION.SOUTH)
flatten_contents: ( bool, bool_, bool or int )
allows for enabling/disabling the flattening of the splitter and combiner, default is True
min_straight: float and Real, number and number >= 0
Minimum straight length between two bends
combiner_transformation: GenericNoDistortTransform
splitter_transformation: GenericNoDistortTransform
flyline_layer: ( __Layer__ ), *None allowed*
layer to draw flylines of physically unconnected links
flyline_width: float and number > 0
line width of the flylines
netlist_view: NetlistView
Netlist view in the same cell on which this Layout is based. Normally no need to manually override.
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: child_transformations: locked
Examples
from technologies import silicon_photonics from picazzo3.filters.mzi import MZIWaveguides from picazzo3.wg.splitters import WgY90Splitter, WgY180Combiner from ipkiss3 import all as i3 split = WgY90Splitter(name="my_splitter_5") split_layout = split.Layout() comb = WgY180Combiner(name="my_combiner_5") comb_layout = comb.Layout() mzi = MZIWaveguides(name="my_mzi_waveguides_1", splitter=split, combiner=comb, splitter_port_names=['arm1','arm2'], combiner_port_names=['arm1','arm2']) layout = mzi.Layout(delay_length=100.0) layout.visualize(annotate=True)
from technologies import silicon_photonics from picazzo3.filters.mzi import MZIWaveguides from picazzo3.wg.dircoup import BendDirectionalCoupler from ipkiss3 import all as i3 split = BendDirectionalCoupler(name="my_splitter_6") split.Layout(bend_angle=30.0) mzi = MZIWaveguides(name="my_mzi_waveguides_2", splitter=split, combiner=split) layout = mzi.Layout(delay_length=-50.0, splitter_transformation=i3.Rotation(rotation=90.0), combiner_transformation=i3.Rotation(rotation=-90.0) + i3.Translation((25.0, 0.0)), arm1_direction=i3.DIRECTION.NORTH) layout.visualize(annotate=True)
-
MZIWithCells¶
-
class
picazzo3.filters.mzi.cell.
MZIWithCells
(*args, **kwargs) An MZI which contains another cell in one or both arms.
Parameters: arm1_contents: ( PCell ), *None allowed*
Cell to place in the SOUTH arm. Use None when only a waveguide is required.
arm1_contents_port_names: length == 2
port names for the contents ports in arm1. Default = (‘in’, ‘out’)
arm2_contents: ( PCell ), *None allowed*
Cell to place in the NORTH arm. Use None when only a waveguide is required.
arm2_contents_port_names: length == 2
port names for the contents ports in arm2. Default = (‘in’, ‘out’)
auto_transition: ( bool, bool_, bool or int )
if True, splitter and combiner are transitioned to the correct waveguide template
trace_template: PCell and _WaveguideTemplate
arm1: PCell and MZIArm
The South arm of the MZI
arm1_port_names: length == 2
port names for the south arm ports connected to splitter and combiner. Default = (‘in’, ‘out’)
arm2: PCell and MZIArm
The North arm of the MZI
arm2_port_names: length == 2
port names for the north arm ports connected to splitter and combiner. Default = (‘in’, ‘out’)
combiner: PCell
The combiner of the MZI
combiner_port_names: length == 2
port names for the combiner ports to the arms. Default = (‘in1’, ‘in2’)
splitter: PCell
The splitter of the MZI
splitter_port_names: length == 2
port names for the splitter ports to the arms. Default = (‘out1’, ‘out2’)
external_port_names:
Map of the free instance terms/ports to the names of external terms/ports.Format is a dict {‘inst:term’ : ‘new_term_name’}.If a term/port is not listed, the format instname_portname will be used
name:
The unique name of the pcell
Other Parameters: 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(annotate=True)
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
arm1_contents_length: ( float and Real, number and number >= 0 ), *None allowed*
Specify manually the physical length of the content in the South arm. If None, it will be calculated by the arms from the distance between the ports.
arm1_contents_transformation: GenericNoDistortTransform
arm2_contents_length: ( float and Real, number and number >= 0 ), *None allowed*
Specify manually the physical length of the content in the North arm. If None, it will be calculated by the arms from the distance between the ports.
arm2_contents_transformation: GenericNoDistortTransform
extra_length: float
if positive, the lower (south) arm is longer, if negative, the upper (north) arm
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
arm1_direction:
direction of routing (DIRECTION.NORTH or DIRECTION.SOUTH)
arm2_direction:
direction of routing (DIRECTION.NORTH or DIRECTION.SOUTH)
flatten_contents: ( bool, bool_, bool or int )
allows for enabling/disabling the flattening of the splitter and combiner, default is True
min_straight: float and Real, number and number >= 0
Minimum straight length between two bends
combiner_transformation: GenericNoDistortTransform
splitter_transformation: GenericNoDistortTransform
flyline_layer: ( __Layer__ ), *None allowed*
layer to draw flylines of physically unconnected links
flyline_width: float and number > 0
line width of the flylines
netlist_view: NetlistView
Netlist view in the same cell on which this Layout is based. Normally no need to manually override.
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: 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
external_port_names:
Dictionary for remapping of the port names of the contents to the external ports
name:
The unique name of the pcell
Other Parameters: contents: PCell and _Trace, locked
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
combiner_port: OpticalPort
Port interface of the combiner to which the output of this arm is connected
control_shape_layer: __Layer__
layer on which the control shape is drawn
cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>
layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)
draw_control_shape: ( bool, bool_, bool or int )
draws the control shape on top of the waveguide
extra_length: float and Real, number and number >= 0
Extra length that will be added in the arm
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
splitter_port: OpticalPort
Port interface of the splitter to which the input of this arm is connected
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
min_straight: float and Real, number and number >= 0
Minimum straight length between bends
routing_direction:
direction of routing (DIRECTION.NORTH or DIRECTION.SOUTH)
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the contents as elements in the layout, rather than as an Instance
core_layer: __Layer__
layer used to define the core of the waveguide
bend_radii: list<number > 0>
Bend radius for every individual bend.
remove_straight_angles: ( bool, bool_, bool or int )
Removes the waypoints with straight angles. Set to False if the algorithm uses waypoint-specific information.
reverse_bends: ( bool, bool_, bool or int )
When set to True, it will generate the bends backwards. This has only effect when the bend algorithm is not symmetric.
reverse_individual_bends: list<( bool, bool_, bool or int )>
When set to True, it will generate the individual bends backwards. This has only effect when the bend algorithm is not symmetric. Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes.
rounding_algorithms:
Rounding algorithm for every individual bend. Can be circular, spline, … Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes.
input_port: TracePort
output_port: TracePort
trace_template_for_ports: _TraceTemplate.Layout
Trace template to be used for the ports.
contents_transformation: GenericNoDistortTransform
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: 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(annotate=True)
-
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: ( bool, bool_, bool or int )
if True, Automatic transitions will be added to the contents if the trace templates are not matched
port_labels: List with type restriction, allowed types: <type ‘str’> and length == 2
Names of the two ports to be processed
trace_template: ( PCell and _WaveguideTemplate ), *None allowed*
Template for all ports, defaults to TECH.PCELLS.WG.DEFAULT.When set to None, the waveguide templates of the ports will be used.
contents: PCell
the contents of the container: the child cell
external_port_names:
Dictionary for remapping of the port names of the contents to the external ports
name:
The unique name of the pcell
Other Parameters: trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
list of templates to apply to all ports
waveguides: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
contents_length: float and Real, number and number >= 0
The physical length of the optical path of the content. If not set manually, it will default to the distance between the content ports used.
extra_length: float and Real, number and number >= 0
Extra length that will be added in the arm
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the contents as elements in the layout, rather than as an Instance
horizontal_contents_offset: float
Horizontal offset (from the center of the MZI Arm) of the transformed content
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
min_straight: float and Real, number and number >= 0
Minimum straight length between bends
routing_direction:
direction of routing (DIRECTION.NORTH or DIRECTION.SOUTH)
splitter_port: OpticalPort
Port interface of the splitter to which the input of this arm is connected
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
combiner_port: OpticalPort
Port interface of the combiner to which the output of this arm is connected
routes:
routes along which the waveguides will be generated
contents_transformation: GenericNoDistortTransform
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
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(annotate=True)
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(annotate=True)
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(annotate=True)
-
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: name:
The unique name of the pcell
See also
Views
-
Layout
Parameters: lattice_pitches: Coord2
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
Purpose of the layer on which the holes should be drawn.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
cells:
dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. The default value of this property is automatically calculated from the 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
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
Process of the layer on which the holes should be drawn.
pitch: float and Real, number and number >= 0
Lattice constant for a uniform triangular lattice. This property will be ignored if ‘lattice_pitches’ or ‘pitches’ are set manually
pitches:
Cartesian (X, Y) pitches of the lattice. If this is specified, the properties ‘lattice_pitches’ and ‘pitch’ will be ignored
map: str
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:
list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])
process_hfw: ProcessLayer
process for underetching
purpose_hfw: PatternPurpose
drawing purpose for underetching
zero_line_y: float
line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .
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(annotate=True)
-
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: name:
The unique name of the pcell
See also
Views
-
Layout
Parameters: lattice_pitches: Coord2
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
Purpose of the layer on which the holes should be drawn.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
cells:
dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. The default value of this property is automatically calculated from the 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
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
Process of the layer on which the holes should be drawn.
pitch: float and Real, number and number >= 0
Lattice constant for a uniform triangular lattice. This property will be ignored if ‘lattice_pitches’ or ‘pitches’ are set manually
pitches:
Cartesian (X, Y) pitches of the lattice. If this is specified, the properties ‘lattice_pitches’ and ‘pitch’ will be ignored
map: str
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:
list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])
process_hfw: ProcessLayer
process for underetching
purpose_hfw: PatternPurpose
drawing purpose for underetching
zero_line_y: float
line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .
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(annotate=True)
-
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: name:
The unique name of the pcell
See also
Views
-
Layout
Parameters: pitch: float and Real, number and number >= 0
Lattice constant for a uniform square lattice. This property will be ignored if the property ‘pitches’ is set manually
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
cells:
dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. The default value of this property is automatically calculated from the 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
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
Process of the layer on which the holes should be drawn.
purpose: PatternPurpose
Purpose of the layer on which the holes should be drawn.
map: str
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
X and Y pitch of the photonic crystal
ports_coordinates:
list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])
process_hfw: ProcessLayer
process for underetching
purpose_hfw: PatternPurpose
drawing purpose for underetching
zero_line_y: float
line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .
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(annotate=True)
-
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: name:
The unique name of the pcell
See also
Views
-
Layout
Parameters: pitch: float and Real, number and number >= 0
Lattice constant for a uniform square lattice. This property will be ignored if the property ‘pitches’ is set manually
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
cells:
dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. The default value of this property is automatically calculated from the 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
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
Process of the layer on which the holes should be drawn.
purpose: PatternPurpose
Purpose of the layer on which the holes should be drawn.
map: str
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
X and Y pitch of the photonic crystal
ports_coordinates:
list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])
process_hfw: ProcessLayer
process for underetching
purpose_hfw: PatternPurpose
drawing purpose for underetching
zero_line_y: float
line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .
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(annotate=True)
-
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: name:
The unique name of the pcell
See also
PhCLayout
,RectangularPhCLayout
Views
-
Layout
Parameters: lattice_pitches: Coord2
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
Lattice constant for a uniform triangular lattice. This property will be ignored if ‘lattice_pitches’ or ‘pitches’ are set manually
pitches:
Cartesian (X, Y) pitches of the lattice. If this is specified, the properties ‘lattice_pitches’ and ‘pitch’ will be ignored
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
cells: dict
dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map
map: str
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:
list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])
process_hfw: ProcessLayer
process for underetching
purpose_hfw: PatternPurpose
drawing purpose for underetching
zero_line_y: float
line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .
-
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: name:
The unique name of the pcell
See also
PhCLayout
,TriangularPhCLayout
Views
-
Layout
Parameters: pitch: float and Real, number and number >= 0
Lattice constant for a uniform square lattice. This property will be ignored if the property ‘pitches’ is set manually
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
cells: dict
dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map
map: str
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
X and Y pitch of the photonic crystal
ports_coordinates:
list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])
process_hfw: ProcessLayer
process for underetching
purpose_hfw: PatternPurpose
drawing purpose for underetching
zero_line_y: float
line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .
-
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
The cavity child cell (autogenerated)
cavity_defect_unit_cell: PCell
The Photonic Crystal unit cell of the cavity lattice. By default it is empty.
cavity_unit_cell: PCell
The Photonic Crystal unit cell of the cavity lattice
mirror: PCell
The mirror child cell (autogenerated)
mirror_defect_unit_cell: PCell
The Photonic Crystal unit cell of the mirror waveguide. By default it is empty.
mirror_unit_cell: PCell
The Photonic Crystal unit cell of the mirror lattice
n_o_cladding_layers: int and number > 0
name:
The unique name of the pcell
Views
-
Layout
Parameters: mirror_pos2:
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
cavity_pitch: float and number > 0
cavity_pos: Coord2
mirror_pitch: float and number > 0
mirror_pos: Coord2
n_o_cavity_periods: int and number > 0
n_o_mirror_periods: int and number > 0
process_hfw: ProcessLayer
purpose_hfw: PatternPurpose
vertical_cavity_pitch: float and number > 0
off-axis pitch of the cavity lattice: default = matched to mirror)
vertical_mirror_pitch: float and number > 0
off-axis pitch of the mirror lattice: default = same as mirror_pitch)
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(annotate=True)
-
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
The cavity child cell (autogenerated)
cavity_defect_unit_cell: PCell
The Photonic Crystal unit cell of the cavity lattice. By default it is empty.
cavity_unit_cell: PCell
The Photonic Crystal unit cell of the cavity lattice
mirror: PCell
The mirror child cell (autogenerated)
mirror_defect_unit_cell: PCell
The Photonic Crystal unit cell of the mirror waveguide. By default it is empty.
mirror_unit_cell: PCell
The Photonic Crystal unit cell of the mirror lattice
n_o_cladding_layers: int and number > 0
name:
The unique name of the pcell
Views
-
Layout
Parameters: cavity_pitch: float and number > 0
cavity_pos: Coord2
mirror_pitch: float and number > 0
mirror_pos: Coord2
n_o_cavity_periods: int and number > 0
n_o_mirror_periods: int and number > 0
process_hfw: ProcessLayer
purpose_hfw: PatternPurpose
vertical_cavity_pitch: float and number > 0
off-axis pitch of the cavity lattice: default = matched to mirror)
vertical_mirror_pitch: float and number > 0
off-axis pitch of the mirror lattice: default = same as mirror_pitch)
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
-
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
The cavity child cell (autogenerated)
cavity_defect_unit_cell: PCell
The Photonic Crystal unit cell of the cavity lattice. By default it is empty.
cavity_unit_cell: PCell
The Photonic Crystal unit cell of the cavity lattice
mirror: PCell
The mirror child cell (autogenerated)
mirror_defect_unit_cell: PCell
The Photonic Crystal unit cell of the mirror waveguide. By default it is empty.
mirror_unit_cell: PCell
The Photonic Crystal unit cell of the mirror lattice
n_o_cladding_layers: int and number > 0
name:
The unique name of the pcell
Views
-
Layout
Parameters: cavity_period: float and number > 0
repetition period of the cavity. By default it is calculated automatically.
n_o_cavities: int and number > 0
number of cavities in series
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
mirror_pos2:
cavity_pitch: float and number > 0
cavity_pos: Coord2
mirror_pitch: float and number > 0
mirror_pos: Coord2
n_o_cavity_periods: int and number > 0
n_o_mirror_periods: int and number > 0
process_hfw: ProcessLayer
purpose_hfw: PatternPurpose
vertical_cavity_pitch: float and number > 0
off-axis pitch of the cavity lattice: default = matched to mirror)
vertical_mirror_pitch: float and number > 0
off-axis pitch of the mirror lattice: default = same as mirror_pitch)
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(annotate=True)
-
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’>
List of unit cells: center row to outside rows (symmetric)
name:
The unique name of the pcell
Views
-
Layout
Parameters: view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
n_o_periods: int and number > 0
number of lattice periods in the propagation direction of the W1 waveguide
port_offset: float
Horizontal offset of the port width respect to the first and last column of the W1 waveguide.
port_row: ( int and number >= 0 ), *None allowed*
Row of the photonic crystal waveguide where the input/output ports are located. If none, it will be the center.
port_width: ( float and number > 0 ), *None allowed*
width of the waveguide ports of the photonic crystal waveguide. If none, a width of sqrt(3)*pitch is taken.
start_even: ( bool, bool_, bool or int )
If true, start the crystal on an even row, if false, on an odd row.
lattice_pitches: Coord2
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
Lattice constant for a uniform triangular lattice. This property will be ignored if ‘lattice_pitches’ or ‘pitches’ are set manually
pitches:
Cartesian (X, Y) pitches of the lattice. If this is specified, the properties ‘lattice_pitches’ and ‘pitch’ will be ignored
cells: dict
dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map
map: str
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:
list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])
process_hfw: ProcessLayer
process for underetching
purpose_hfw: PatternPurpose
drawing purpose for underetching
zero_line_y: float
line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .
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(annotate=True)
-
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: name:
The unique name of the pcell
Views
-
Layout
Parameters: lattice_pitches: Coord2
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
Purpose of the layer on which the holes should be drawn.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
defect_diameter: float and Real, number and number >= 0
Diameter of the defect holes. If zero, no holes are drawn.
diameter: float and number > 0
diameter of the photonic crystal lattice holes
n_o_cladding_layers: int and number > 0
Number of cladding layers north and south.
n_o_periods: int and number > 0
Number of lattice periods in the propagation direction.
cells:
dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. The default value of this property is automatically calculated from the 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
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
Process of the layer on which the holes should be drawn.
pitch: float and Real, number and number >= 0
Lattice constant for a uniform triangular lattice. This property will be ignored if ‘lattice_pitches’ or ‘pitches’ are set manually
pitches:
Cartesian (X, Y) pitches of the lattice. If this is specified, the properties ‘lattice_pitches’ and ‘pitch’ will be ignored
map: str
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:
list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])
process_hfw: ProcessLayer
process for underetching
purpose_hfw: PatternPurpose
drawing purpose for underetching
zero_line_y: float
line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .
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(annotate=True)
""" 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(annotate=True)
-
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: name:
The unique name of the pcell
Views
-
Layout
Parameters: cavity_hole_diameters: list<number >= 0>
list of hole diameters in the cavity, including mirrors
lattice_pitches: Coord2
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
Purpose of the layer on which the holes should be drawn.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
defect_diameter: float and Real, number and number >= 0
Diameter of the defect holes. If zero, no holes are drawn.
diameter: float and number > 0
diameter of the photonic crystal lattice holes
n_o_cladding_layers: int and number > 0
Number of cladding layers north and south.
n_o_periods: int and number > 0
Number of lattice periods in the propagation direction.
cells:
dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. The default value of this property is automatically calculated from the 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
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
Process of the layer on which the holes should be drawn.
pitch: float and Real, number and number >= 0
Lattice constant for a uniform triangular lattice. This property will be ignored if ‘lattice_pitches’ or ‘pitches’ are set manually
pitches:
Cartesian (X, Y) pitches of the lattice. If this is specified, the properties ‘lattice_pitches’ and ‘pitch’ will be ignored
map: str
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:
list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])
process_hfw: ProcessLayer
process for underetching
purpose_hfw: PatternPurpose
drawing purpose for underetching
zero_line_y: float
line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .
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(annotate=True)
-
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: name:
The unique name of the pcell
Views
-
Layout
Parameters: cavity_length: int and number > 0
number of holes the cavity should be long
cavity_offset: int and number > 0
side row on which the cavity should be located
lattice_pitches: Coord2
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
Purpose of the layer on which the holes should be drawn.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
defect_diameter: float and Real, number and number >= 0
Diameter of the defect holes. If zero, no holes are drawn.
diameter: float and number > 0
diameter of the photonic crystal lattice holes
n_o_cladding_layers: int and number > 0
Number of cladding layers north and south.
n_o_periods: int and number > 0
Number of lattice periods in the propagation direction.
cells:
dictionary of Unit Cells for a Photonic Crystal. The value should be of the form {‘x’: cell1, ‘y’: cell2}. The keys of the dictionary should be characters and each character can be used to identify the unit cell in the map. The default value of this property is automatically calculated from the 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
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
Process of the layer on which the holes should be drawn.
pitch: float and Real, number and number >= 0
Lattice constant for a uniform triangular lattice. This property will be ignored if ‘lattice_pitches’ or ‘pitches’ are set manually
pitches:
Cartesian (X, Y) pitches of the lattice. If this is specified, the properties ‘lattice_pitches’ and ‘pitch’ will be ignored
map: str
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:
list of tuple with (coordinate (in pitches), angle, waveguide_template, [name])
process_hfw: ProcessLayer
process for underetching
purpose_hfw: PatternPurpose
drawing purpose for underetching
zero_line_y: float
line in the map which corresponds to the coordinate y=0. This can be a fractional number, and the unit is relative to pitches.y .
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(annotate=True)
-
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: name:
The unique name of the pcell
Views
-
Layout
Parameters: cladding_width: float and number > 0
total width of the waveguide with cladding
control_shape_layer: __Layer__
layer on which the control shape is drawn
core_process: ProcessLayer
process of the rib
core_width: float and number > 0
width of the rib
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>
List of Trace Windows that know how to draw themselves relative to the shape of the Trace
cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>
layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)
cladding_process: ProcessLayer
process for the waveguide cladding, defaults to the core process
cladding_purpose: PatternPurpose
drawing purpose layer for the cladding
core_purpose: PatternPurpose
drawing purpose for the waveguide core
core_layer: __Layer__
layer used to define the core of the waveguide
pin_shape: Shape
shape to be used for the pins
trace_template_for_ports: _TraceTemplate.Layout
Trace template to be used for the ports. Default = this template
draw_control_shape: ( bool, bool_, bool or int )
draws the control shape on top of the waveguide
width: float and Real, number and number >= 0
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(annotate=True)
-
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: name:
The unique name of the pcell
Views
-
Layout
Parameters: cladding_width: float and number > 0
total width of the waveguide with cladding
control_shape_layer: __Layer__
layer on which the control shape is drawn
core_process: ProcessLayer
process for the shallow-etched core
core_width: float and number > 0
width of the shallow-etched core
cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>
layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)
strip_cladding_purpose: PatternPurpose
drawing purpose for the strip wire cladding
strip_process: ProcessLayer
process for the strip wire
strip_purpose: PatternPurpose
drawing purpose for the strip wire
strip_width: float and number > 0
width of the deep-etched strip wire
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>
List of Trace Windows that know how to draw themselves relative to the shape of the Trace
cladding_process: ProcessLayer
process for the waveguide cladding, defaults to the core process
cladding_purpose: PatternPurpose
drawing purpose layer for the cladding
core_purpose: PatternPurpose
drawing purpose for the waveguide core
core_layer: __Layer__
layer used to define the core of the waveguide
pin_shape: Shape
shape to be used for the pins
trace_template_for_ports: _TraceTemplate.Layout
Trace template to be used for the ports. Default = this template
draw_control_shape: ( bool, bool_, bool or int )
draws the control shape on top of the waveguide
width: float and Real, number and number >= 0
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(annotate=True)
-
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: name:
The unique name of the pcell
Views
-
Layout
Parameters: cladding_width: float and number > 0
total width of the waveguide with cladding
control_shape_layer: __Layer__
layer on which the control shape is drawn
core_process: ProcessLayer
process for the waveguide ribs
core_purpose: PatternPurpose
drawing purpose for the waveguide ribs
cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>
layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)
slot_process: ProcessLayer
process for the slot
slot_purpose: PatternPurpose
drawing purpose for the slot
slot_width: float and number > 0
width of the slot
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>
List of Trace Windows that know how to draw themselves relative to the shape of the Trace
cladding_process: ProcessLayer
process for the waveguide cladding, defaults to the core process
cladding_purpose: PatternPurpose
drawing purpose layer for the cladding
core_layer: __Layer__
layer used to define the core of the waveguide
core_width: float and number > 0
width of the waveguide core
pin_shape: Shape
shape to be used for the pins
trace_template_for_ports: _TraceTemplate.Layout
Trace template to be used for the ports. Default = this template
draw_control_shape: ( bool, bool_, bool or int )
draws the control shape on top of the waveguide
width: float and Real, number and number >= 0
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(annotate=True)
-
DoubleSlotWaveguideTemplate¶
-
class
picazzo3.traces.slot_wg.
DoubleSlotWaveguideTemplate
(*args, **kwargs) This waveguide is a strip-like waveguide with a two slots in the middle
___ __ ___ | | | | | | | | | | | | _______________|___|_| |_|___|_________________
Parameters: name:
The unique name of the pcell
Views
-
Layout
Parameters: center_core_width: float and number > 0
control_shape_layer: __Layer__
layer on which the control shape is drawn
core_width: float and number > 0
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>
List of Trace Windows that know how to draw themselves relative to the shape of the Trace
cladding_width: float and number > 0
total width of the waveguide with cladding
core_process: ProcessLayer
process for the waveguide ribs
core_purpose: PatternPurpose
drawing purpose for the waveguide ribs
cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>
layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)
slot_process: ProcessLayer
process for the slot
slot_purpose: PatternPurpose
drawing purpose for the slot
slot_width: float and number > 0
width of the slot
cladding_process: ProcessLayer
process for the waveguide cladding, defaults to the core process
cladding_purpose: PatternPurpose
drawing purpose layer for the cladding
core_layer: __Layer__
layer used to define the core of the waveguide
pin_shape: Shape
shape to be used for the pins
trace_template_for_ports: _TraceTemplate.Layout
Trace template to be used for the ports. Default = this template
draw_control_shape: ( bool, bool_, bool or int )
draws the control shape on top of the waveguide
width: float and Real, number and number >= 0
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(annotate=True)
-
Socket Waveguides¶
SocketWaveguideTemplate¶
-
class
picazzo3.traces.socket_wg.
SocketWaveguideTemplate
(*args, **kwargs) Socket-style waveguide template: deep etched rib waveguide
___________ | | _______________| |________________ ____________________________________________
Parameters: name:
The unique name of the pcell
Views
-
Layout
Parameters: cladding_width: float and number > 0
total width of the waveguide with cladding
control_shape_layer: __Layer__
layer on which the control shape is drawn
core_process: ProcessLayer
process for the rib
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>
List of Trace Windows that know how to draw themselves relative to the shape of the Trace
core_width: float and number > 0
width of the rib
cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>
layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)
cladding_process: ProcessLayer
process for the waveguide cladding, defaults to the core process
cladding_purpose: PatternPurpose
drawing purpose layer for the cladding
core_purpose: PatternPurpose
drawing purpose for the waveguide core
core_layer: __Layer__
layer used to define the core of the waveguide
pin_shape: Shape
shape to be used for the pins
trace_template_for_ports: _TraceTemplate.Layout
Trace template to be used for the ports. Default = this template
draw_control_shape: ( bool, bool_, bool or int )
draws the control shape on top of the waveguide
width: float and Real, number and number >= 0
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(annotate=True)
-
SlottedSocketWaveguideTemplate¶
-
class
picazzo3.traces.socket_wg.
SlottedSocketWaveguideTemplate
(*args, **kwargs) Socket waveguide with a deep etched slot
____ ____ | | | | _______________| | | |________________ ____________________|_|_____________________
Parameters: name:
The unique name of the pcell
Views
-
Layout
Parameters: cladding_width: float and number > 0
total width of the waveguide with cladding
control_shape_layer: __Layer__
layer on which the control shape is drawn
core_process: ProcessLayer
process for the rib
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>
List of Trace Windows that know how to draw themselves relative to the shape of the Trace
core_purpose: PatternPurpose
drawing purpose for the waveguide ribs
cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>
layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)
slot_process: ProcessLayer
process for the slot
slot_purpose: PatternPurpose
drawing purpose for the slot
slot_width: float and number > 0
width of the slot
cladding_process: ProcessLayer
process for the waveguide cladding, defaults to the core process
cladding_purpose: PatternPurpose
drawing purpose layer for the cladding
core_layer: __Layer__
layer used to define the core of the waveguide
core_width: float and number > 0
width of the waveguide core
pin_shape: Shape
shape to be used for the pins
trace_template_for_ports: _TraceTemplate.Layout
Trace template to be used for the ports. Default = this template
draw_control_shape: ( bool, bool_, bool or int )
draws the control shape on top of the waveguide
width: float and Real, number and number >= 0
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(annotate=True)
-
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
Refers to the other trace template from which information is taken to build this trace template.
name:
The unique name of the pcell
Views
-
Layout
Parameters: control_shape_layer: __Layer__
layer on which the control shape is drawn
keep_original_trace_template: ( bool, bool_, bool or int )
pin_shape: Shape
shape to be used for the pins
thin_process: ProcessLayer
thinning process
thin_purpose: PatternPurpose
drawing purpose for the thinning region
thin_width: float and Real, number and number >= 0
width of the thinning layer
trace_template_for_ports: _TraceTemplate.Layout
Trace template to be used for the ports. Default = this template
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>
List of Trace Windows to draw on top of the already defined TraceTemplate
cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>
layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)
cladding_process: ProcessLayer
process for the waveguide cladding, defaults to the core process
cladding_purpose: PatternPurpose
drawing purpose layer for the cladding
cladding_width: float and number > 0
total width of the waveguide with cladding
core_process: ProcessLayer
process for the waveguide core
core_purpose: PatternPurpose
drawing purpose for the waveguide core
core_layer: __Layer__
layer used to define the core of the waveguide
core_width: float and number > 0
width of the waveguide core
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the referred trace as elements in the layout, rather than as an Instance
draw_control_shape: ( bool, bool_, bool or int )
draws the control shape on top of the waveguide
Other Parameters: 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(annotate=True)
-
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
Refers to the other trace template from which information is taken to build this trace template.
name:
The unique name of the pcell
Views
-
Layout
Parameters: control_shape_layer: __Layer__
layer on which the control shape is drawn
keep_original_trace_template: ( bool, bool_, bool or int )
pin_shape: Shape
shape to be used for the pins
thin_process: ProcessLayer
thinning process
thin_purpose: PatternPurpose
drawing purpose for the thinning region
thin_width: float and Real, number and number >= 0
width of the thinning layer
trace_template_for_ports: _TraceTemplate.Layout
Trace template to be used for the ports. Default = this template
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>
List of Trace Windows to draw on top of the already defined TraceTemplate
cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>
layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)
cladding_process: ProcessLayer
process for the waveguide cladding, defaults to the core process
cladding_purpose: PatternPurpose
drawing purpose layer for the cladding
cladding_width: float and number > 0
total width of the waveguide with cladding
core_process: ProcessLayer
process for the waveguide core
core_purpose: PatternPurpose
drawing purpose for the waveguide core
core_layer: __Layer__
layer used to define the core of the waveguide
core_width: float and number > 0
width of the waveguide core
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the referred trace as elements in the layout, rather than as an Instance
draw_control_shape: ( bool, bool_, bool or int )
draws the control shape on top of the waveguide
Other Parameters: 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(annotate=True)
-
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: name:
The unique name of the pcell
Views
-
Layout
Parameters: control_shape_layer: __Layer__
layer on which the control shape is drawn
cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>
layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>
List of Trace Windows that know how to draw themselves relative to the shape of the Trace
cladding_process: ProcessLayer
process for the waveguide cladding, defaults to the core process
cladding_purpose: PatternPurpose
drawing purpose layer for the cladding
cladding_width: float and number > 0
total width of the waveguide with cladding
core_process: ProcessLayer
process for the waveguide core
core_purpose: PatternPurpose
drawing purpose for the waveguide core
core_layer: __Layer__
layer used to define the core of the waveguide
core_width: float and number > 0
width of the waveguide core
pin_shape: Shape
shape to be used for the pins
trace_template_for_ports: _TraceTemplate.Layout
Trace template to be used for the ports. Default = this template
draw_control_shape: ( bool, bool_, bool or int )
draws the control shape on top of the waveguide
width: float and Real, number and number >= 0
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(annotate=True)
""" 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(annotate=True)
""" 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(annotate=True)
-
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
modified_start_wg_template: PCell and _TraceTemplate
Modified start waveguide template (using the end_trace_template, but with the dimensions of the start_trace_template)
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, RibWaveguideTemplate
wire_only_wg_template: PCell and _TraceTemplate
name:
The unique name of the pcell
Other Parameters: reverse_templates: ( bool, bool_, bool or int ), locked
When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.
Views
-
Layout
Parameters: view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
wire_end_width: float and Real, number and number >= 0
width of the wire core at its end point.
wire_only_length: ( float and Real, number and number >= 0 ), *None allowed*
Length of transition where shallow part is built up.
straight_extension: Coord2
tuple: straight extension at start and end of transition
end_position: Coord2
end position of the transition
start_position: Coord2
start position of the transition
Other Parameters: length: float and Real, number and number >= 0, locked
length of the transition
Examples
"""This example shows how you transition from a wire to a rib waveguide. """ 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(annotate=True)
-
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: modified_start_wg_template: PCell and _TraceTemplate
Modified start waveguide template (using the end_trace_template, but with the dimensions of the start_trace_template)
end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, RibWaveguideTemplate
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, RibWaveguideTemplate
wire_only_wg_template: PCell and _TraceTemplate
start_port: _PortInterface
the port on which to extract trace template, position and angle
name:
The unique name of the pcell
Other Parameters: reverse_templates: ( bool, bool_, bool or int ), locked
When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.
Views
-
Layout
Parameters: straight_extension: Coord2
tuple: straight extension at start and end of transition
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
wire_end_width: float and Real, number and number >= 0
width of the wire core at its end point.
wire_only_length: ( float and Real, number and number >= 0 ), *None allowed*
Length of transition where shallow part is built up.
length: float and Real, number and number >= 0
length of the transition
end_position: Coord2
end position of the transition
start_position: Coord2
start position of the transition
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(annotate=True)
-
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
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SlotWaveguideTemplate
name:
The unique name of the pcell
Other Parameters: reverse_templates: ( bool, bool_, bool or int ), locked
When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.
Views
-
Layout
Parameters: slot_extension_length: float and number > 0
tip_width: float and number > 0
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
straight_extension: Coord2
tuple: straight extension at start and end of transition
end_position: Coord2
end position of the transition
start_position: Coord2
start position of the transition
Other Parameters: length: float and Real, number and number >= 0, locked
length of the transition
Examples
"""This example shows how you transition from a wire to a slotted waveguide. """ 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(annotate=True)
-
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
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SlotWaveguideTemplate
start_port: _PortInterface
the port on which to extract trace template, position and angle
name:
The unique name of the pcell
Other Parameters: reverse_templates: ( bool, bool_, bool or int ), locked
When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.
Views
-
Layout
Parameters: straight_extension: Coord2
tuple: straight extension at start and end of transition
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
slot_extension_length: float and number > 0
tip_width: float and number > 0
length: float and Real, number and number >= 0
length of the transition
end_position: Coord2
end position of the transition
start_position: Coord2
start position of the transition
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(annotate=True)
-
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
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SocketWaveguideTemplate
modified_start_wg_template: PCell and _TraceTemplate
Modified start waveguide template (using the end_trace_template, but with the dimensions of the start_trace_template)
wire_only_wg_template: PCell and _TraceTemplate
name:
The unique name of the pcell
Other Parameters: reverse_templates: ( bool, bool_, bool or int ), locked
When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.
Views
-
Layout
Parameters: view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
wire_end_width: float and Real, number and number >= 0
width of the wire core at its end point.
wire_only_length: ( float and Real, number and number >= 0 ), *None allowed*
Length of transition where shallow part is built up.
straight_extension: Coord2
tuple: straight extension at start and end of transition
end_position: Coord2
end position of the transition
start_position: Coord2
start position of the transition
Other Parameters: length: float and Real, number and number >= 0, locked
length of the transition
Examples
""" This example shows how you use the template as a parameter for a rounded Waveguide PCell. """ import 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(annotate=True)
-
WireSocketWaveguideTransitionFromPortLinear¶
-
class
picazzo3.traces.socket_wg.
WireSocketWaveguideTransitionFromPortLinear
(*args, **kwargs) Linear Transition between Wire and Socket Waveguides.
Parameters: modified_start_wg_template: PCell and _TraceTemplate
Modified start waveguide template (using the end_trace_template, but with the dimensions of the start_trace_template)
end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SocketWaveguideTemplate
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, SocketWaveguideTemplate
wire_only_wg_template: PCell and _TraceTemplate
start_port: _PortInterface
the port on which to extract trace template, position and angle
name:
The unique name of the pcell
Other Parameters: reverse_templates: ( bool, bool_, bool or int ), locked
When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.
Views
-
Layout
Parameters: straight_extension: Coord2
tuple: straight extension at start and end of transition
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
wire_end_width: float and Real, number and number >= 0
width of the wire core at its end point.
wire_only_length: ( float and Real, number and number >= 0 ), *None allowed*
Length of transition where shallow part is built up.
length: float and Real, number and number >= 0
length of the transition
end_position: Coord2
end position of the transition
start_position: Coord2
start position of the transition
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(annotate=True)
-
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
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, ThinnedWaveguideTemplate
name:
The unique name of the pcell
Other Parameters: reverse_templates: ( bool, bool_, bool or int ), locked
When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.
Views
-
Layout
Parameters: tip_width: float and number > 0
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
straight_extension: Coord2
tuple: straight extension at start and end of transition
end_position: Coord2
end position of the transition
start_position: Coord2
start position of the transition
Other Parameters: length: float and Real, number and number >= 0, locked
length of the transition
Examples
"""This example shows how you transition from a thinned wire to a wire waveguide. """ 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(annotate=True)
-
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: end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, ThinnedWaveguideTemplate
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate, ThinnedWaveguideTemplate
start_port: _PortInterface
the port on which to extract trace template, position and angle
name:
The unique name of the pcell
Other Parameters: reverse_templates: ( bool, bool_, bool or int ), locked
When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.
Views
-
Layout
Parameters: straight_extension: Coord2
tuple: straight extension at start and end of transition
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
tip_width: float and number > 0
length: float and Real, number and number >= 0
length of the transition
end_position: Coord2
end position of the transition
start_position: Coord2
start position of the transition
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(annotate=True)
-
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
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate
name:
The unique name of the pcell
Other Parameters: reverse_templates: ( bool, bool_, bool or int ), locked
When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.
Views
-
Layout
Parameters: view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
straight_extension: Coord2
tuple: straight extension at start and end of transition
end_position: Coord2
end position of the transition
start_position: Coord2
start position of the transition
Other Parameters: length: float and Real, number and number >= 0, locked
length of the transition
Examples
""" This example shows how you use the template as a parameter for a rounded Waveguide PCell. """ import 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(annotate=True)
-
WireWaveguideTransitionFromPortLinear¶
-
class
picazzo3.traces.wire_wg.
WireWaveguideTransitionFromPortLinear
(*args, **kwargs) A linear transition between two WireWaveguideTemplates.
Parameters: end_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate
start_trace_template: PCell and _TraceTemplate and WireWaveguideTemplate
start_port: _PortInterface
the port on which to extract trace template, position and angle
name:
The unique name of the pcell
Other Parameters: reverse_templates: ( bool, bool_, bool or int ), locked
When True, treat start_trace_template as end_trace_template and vice versa. To use the correct templates, use the _{start/stop}_trace_template properties. This should not be set manually, but calculated by the transition itself.
Views
-
Layout
Parameters: straight_extension: Coord2
tuple: straight extension at start and end of transition
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
length: float and Real, number and number >= 0
length of the transition
end_position: Coord2
end position of the transition
start_position: Coord2
start position of the transition
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(annotate=True)
-
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
external_port_names:
Dictionary for remapping of the port names of the contents to the external ports
name:
The unique name of the pcell
Other Parameters: contents: PCell and _Trace, locked
Views
-
Layout
Parameters: angle: float
angular coverage of the bend
angle_step: float and number > 0
Angle step for rounding.
control_shape_layer: __Layer__
layer on which the control shape is drawn
cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>
layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)
draw_control_shape: ( bool, bool_, bool or int )
draws the control shape on top of the waveguide
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
start_angle: float
start_angle of the bend. Negative is clockwise, positive is counterclockwise
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the contents as elements in the layout, rather than as an Instance
core_layer: __Layer__
layer used to define the core of the waveguide
bend_radii: list<number > 0>
Bend radius for every individual bend.
remove_straight_angles: ( bool, bool_, bool or int )
Removes the waypoints with straight angles. Set to False if the algorithm uses waypoint-specific information.
reverse_bends: ( bool, bool_, bool or int )
When set to True, it will generate the bends backwards. This has only effect when the bend algorithm is not symmetric.
reverse_individual_bends: list<( bool, bool_, bool or int )>
When set to True, it will generate the individual bends backwards. This has only effect when the bend algorithm is not symmetric. Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes.
rounding_algorithms:
Rounding algorithm for every individual bend. Can be circular, spline, … Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes.
input_port: TracePort
output_port: TracePort
trace_template_for_ports: _TraceTemplate.Layout
Trace template to be used for the ports.
shape: Shape
Shape from which the Trace is calculated
contents_transformation: GenericNoDistortTransform
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: 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(annotate=True)
-
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
external_port_names:
Dictionary for remapping of the port names of the contents to the external ports
name:
The unique name of the pcell
Other Parameters: contents: PCell and _Trace, locked
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
clockwise: ( bool, bool_, bool or int )
clockwise or counterclockwise propagation. By default it is calculated from ‘quadrant’
control_shape_layer: __Layer__
layer on which the control shape is drawn
cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>
layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)
draw_control_shape: ( bool, bool_, bool or int )
draws the control shape on top of the waveguide
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
quadrant: int
quadrant on the circle. (-4=>4)positive numbers is counterclockwise, negative numbers is clockwise
start_angle: float
start_angle of the bend. By default it is calculated from ‘quadrant’
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
flatten_contents: ( bool, bool_, bool or int )
if True, it will insert the contents as elements in the layout, rather than as an Instance
core_layer: __Layer__
layer used to define the core of the waveguide
bend_radii: list<number > 0>
Bend radius for every individual bend.
remove_straight_angles: ( bool, bool_, bool or int )
Removes the waypoints with straight angles. Set to False if the algorithm uses waypoint-specific information.
reverse_bends: ( bool, bool_, bool or int )
When set to True, it will generate the bends backwards. This has only effect when the bend algorithm is not symmetric.
reverse_individual_bends: list<( bool, bool_, bool or int )>
When set to True, it will generate the individual bends backwards. This has only effect when the bend algorithm is not symmetric. Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes.
rounding_algorithms:
Rounding algorithm for every individual bend. Can be circular, spline, … Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes.
input_port: TracePort
output_port: TracePort
trace_template_for_ports: _TraceTemplate.Layout
Trace template to be used for the ports.
shape: Shape
Shape from which the Trace is calculated
contents_transformation: GenericNoDistortTransform
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Other Parameters: angle: locked
angle of the bend (locked at 90 degrees)
center_line_shape: locked
Automatically calculated shape of the center line of the trace
Examples
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(annotate=True)
-
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
Trace template used to define the crossing
waveguides: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
the waveguides through the crossing
name:
The unique name of the pcell
Views
-
Layout
Parameters: view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
length: float and number > 0
straight_stub: float and number > 0
length of the straigth sections of the crossing
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(annotate=True)
-
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
Trace template used to define the crossing
waveguides: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
the waveguides through the crossing
name:
The unique name of the pcell
Views
-
Layout
Parameters: cladding_process: ProcessLayer
process for the full etched strip cladding
cladding_purpose: PatternPurpose
pattern purpose for the full etched strip cladding
core_cladding_process: ProcessLayer
process for the shallow etched core cladding
core_cladding_purpose: PatternPurpose
pattern purpose for the shallow etched core cladding
core_cladding_width: float and number > 0
width of the cladding of the shallow etched core
core_process: ProcessLayer
process for the shallow etched core
core_purpose: PatternPurpose
pattern purpose for the shallow etched core
core_width: float and number > 0
width of the shallow waveguide etch at the ports. defaults to same value as deep waveguide
core_width_center: float and number > 0
shallowetched core width at the center
length: float and number > 0
length of the parabolic section (from start to crossing center to the end)
strip_process: ProcessLayer
process for the full etched strip
strip_purpose: PatternPurpose
pattern purpose for the full etched strip
strip_width_center: float and number > 0
full etched strip width at the center
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
width_step: float and number > 0
discretisation in width for the parabolic shapes
straight_stub: float and number > 0
length of the straigth sections of the crossing
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(annotate=True)
-
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
The number of periods
period_cell: PCell and _WaveguideGratingPeriod
The unit cell of the grating
name:
The unique name of the pcell
Views
-
Layout
Parameters: view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
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(annotate=True)
-
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’>
name:
The unique name of the pcell
Views
-
Layout
Parameters: view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
Examples
""" How to create a fully customized non-uniform grating using 3 different unit cells constructed from two waveguide templates. """ 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(annotate=True)
-
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:
Dict of the parameters of the waveguide template that should be modified for the different sections of the Grating Period.
n_o_sections: int and number > 0
Number of sections in the grating period
wg_template: PCell and _WaveguideTemplate
Waveguide template of start and end of the period (and ports)
name:
The unique name of the pcell
Other Parameters: wg_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Views
-
Layout
Parameters: view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
section_lengths: list<number >= 0>
List of lengths for the waveguide templates
length: float and Real, number and number >= 0
Length of the grating period.
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(annotate=True)
-
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
Number of sections in the grating period
wg_template: PCell and _WaveguideTemplate
Waveguide template of start and end of the period (and ports)
name:
The unique name of the pcell
Other Parameters: modified_waveguide_parameters: locked
wg_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Views
-
Layout
Parameters: relative_widths: ( bool, bool_, bool or int )
If True, the values of the width are relative to the original value.
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
width_parameter_name: str and ( Alphanumeric string or Contains _$ )
Name of the property of the waveguide template that is to be adjusted by the values in ‘widths’.
widths: list<Real, number>
The modified widths of the waveguide core. If ‘relative_widths’ is True, the values are relative to the original core width. It is also possible to adjust another parameter than ‘core_width’ by overriding the ‘width_parameter_name’.
section_lengths: list<number >= 0>
List of lengths for the waveguide templates
length: float and Real, number and number >= 0
Length of the grating period.
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(annotate=True)
-
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
waveguide template used by the south arm of the directional coupler
trace_template2: PCell and _WaveguideTemplate
waveguide template used by the north arm of the directional coupler. If not set, it defaults to the template of the south arm
wg1a: PCell
South-west waveguide
wg1b: PCell
South-east waveguide
wg2a: PCell
North-west waveguide
wg2b: PCell
North-east waveguide
coupler_length: float and Real, number and number >= 0
length of the directional coupler
name:
The unique name of the pcell
Other Parameters: n_inputs: int and number > 0, locked
Number of input channels.
n_outputs: int and number > 0, locked
Number of output channels.
Views
-
Layout
Parameters: straight_extensions: Coord2
additional lengths of the couplers at start and end
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
coupler_spacing: float
Spacing between the two waveguide centerlines.
wg1a_shape: Shape
Shape for the south-west part of the waveguide
wg1b_shape: Shape
Shape for the south-east part of the waveguide
wg2a_shape: Shape
Shape for the north-west part of the waveguide
wg2b_shape: Shape
Shape for the north-east part of the waveguide
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(annotate=True)
-
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
waveguide template used by the south arm of the directional coupler
trace_template2: PCell and _WaveguideTemplate
waveguide template used by the north arm of the directional coupler. If not set, it defaults to the template of the south arm
wg1a: PCell
South-west waveguide
wg1b: PCell
South-east waveguide
wg2a: PCell
North-west waveguide
wg2b: PCell
North-east waveguide
coupler_length: float and Real, number and number >= 0
length of the directional coupler
name:
The unique name of the pcell
Other Parameters: n_inputs: int and number > 0, locked
Number of input channels.
n_outputs: int and number > 0, locked
Number of output channels.
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
bend_angle: float
angle at which the directional coupler is bent
bend_angles1: tuple2
Input and output angle of the bends of arm 1. Defaults to bend_angle. If set, bend_angle will be ignored.
bend_angles2: tuple2
Input and output angle of the bends of arm 2. Defaults to bend_angle. If set, bend_angle will be ignored.
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
straight_after_bend: float and Real, number and number >= 0
length of the straight waveguide after the bend
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
reverse_bends: ( bool, bool_, bool or int )
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’>
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’>
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’>
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’>
List of booleans to indicate whether the individual bends in arm2 should be reversed
coupler_spacing: float
Spacing between the two waveguide centerlines.
wg1a_shape: Shape
Shape for the south-west part of the waveguide
wg1b_shape: Shape
Shape for the south-east part of the waveguide
wg2a_shape: Shape
Shape for the north-west part of the waveguide
wg2b_shape: Shape
Shape for the north-east part of the waveguide
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
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(annotate=True)
-
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
waveguide template used by the south arm of the directional coupler
trace_template2: PCell and _WaveguideTemplate
waveguide template used by the north arm of the directional coupler. If not set, it defaults to the template of the south arm
wg1a: PCell
South-west waveguide
wg1b: PCell
South-east waveguide
wg2a: PCell
North-west waveguide
wg2b: PCell
North-east waveguide
coupler_length: float and Real, number and number >= 0
length of the directional coupler
name:
The unique name of the pcell
Other Parameters: n_inputs: int and number > 0, locked
Number of input channels.
n_outputs: int and number > 0, locked
Number of output channels.
Views
-
Layout
Parameters: angle_step: float and number > 0
Angle step for rounding.
manhattan: ( bool, bool_, bool or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
sbend_straight: float and Real, number and number >= 0
length of the straight section in the S-bend
view_name: str and ( Alphanumeric string or Contains _$ )
The name of the view
bend_angle: float
angle at which the directional coupler is bent
bend_angles1: tuple2
Input and output angle of the bends of arm 1. Defaults to bend_angle. If set, bend_angle will be ignored.
bend_angles2: tuple2
Input and output angle of the bends of arm 2. Defaults to bend_angle. If set, bend_angle will be ignored.
straight_after_bend: float and Real, number and number >= 0
length of the straight waveguide after the bend
reverse_bends: ( bool, bool_, bool or int )
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’>
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’>
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’>
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’>
List of booleans to indicate whether the individual bends in arm2 should be reversed
coupler_spacing: float
Spacing between the two waveguide centerlines.
wg1a_shape: Shape
Shape for the south-west part of the waveguide
wg1b_shape: Shape
Shape for the south-east part of the waveguide
wg2a_shape: Shape
Shape for the north-west part of the waveguide
wg2b_shape: Shape
Shape for the north-east part of the waveguide
bend_radius: float and number > 0
Bend radius for the auto-generated bends.
rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
Examples
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(annotate=True)
""" 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(annotate=True)
-
Splitters¶
WgYSplitter¶
-
class
picazzo3.wg.splitters.cell.
WgYSplitter
(*args, **kwargs