RingRect180DropFilter
- class picazzo3.filters.ring.cell.RingRect180DropFilter
Rectangular ring filter with two straight access waveguide. This component is often called a channel drop filter. The access waveguides are placed north and south of the Ring
The ring shape is a rounded rectangle of which the bend radius can be specified, as well as the horizontal and vertical straight sections. it is also possible to specify the rounding algorithm of the bends.
The waveguide template of the ring and the couplers can be chosen independently.
- Parameters:
- coupler_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of trace_templates for the ring couplers. By default the same template as the ring is taken
- ring_trace_template: PCell and _WaveguideTemplate
Trace template for the ring waveguide
- ring_segments: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of Ring PCells
- couplers: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>
list of coupler PCells
- name: String that contains only ISO/IEC 8859-1 (extended ASCII py3) or pure ASCII (py2) characters
The unique name of the pcell
- Other Parameters:
- ring_trace_templates: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, locked
Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.
Examples
"""This example illustrates the basic ring resonator model without creating a layout. It also illustrates the effect of resonance peak splitting due to back-reflection in the coupler. """ import si_fab.all as pdk # noqa: F401 import pylab as plt import numpy as np from picazzo3.filters.ring import RingRect180DropFilter # To get an FSR of 10 nm at 1.55 um, we use the following formula n_g = 2.86 # default value used in picazzo3, see TECH.PCELLS.WG.DEFAULT L_fsr_10nm = 1.55**2 / (n_g * 0.01) # 1. Define the ring my_ring = RingRect180DropFilter(name="my_example_ring") # coupler parameters cp = { "cross_coupling1": 1j * 0.0784**0.5, "straight_coupling1": 0.9216**0.5, "reflection_in1": 1j * 0.030, } my_ring_cm = my_ring.CircuitModel( ring_length=L_fsr_10nm, # we can manually specify the ring length coupler_parameters=[cp, cp], # 2 couplers ) # 2. Simulate wavelengths = np.linspace(1.54, 1.56, 2000) R = my_ring_cm.get_smatrix(wavelengths=wavelengths) # 3. Plot the results plt.plot(wavelengths, np.abs(R["in1", "out1"]) ** 2, "b", label="pass") plt.plot(wavelengths, np.abs(R["in1", "out2"]) ** 2, "g", label="drop") plt.plot(wavelengths, np.abs(R["in1", "in2"]) ** 2, "r", label="add") plt.legend() plt.show()
"""This example illustrates a simulation of a single ring resonator model based on the layout that is first generated.""" import si_fab.all as pdk # noqa: F401 import pylab as plt import numpy as np from picazzo3.filters.ring import RingRect180DropFilter # 1. Define the ring my_ring = RingRect180DropFilter(name="my_example_ring2") my_ring.Layout(straights=(6.0, 0.0)) # set model in couplers and ring waveguides TODO: change the models cp = {"delta_n_eff": 0.02} # coupler parameters for coupler in my_ring.couplers: coupler.set_default_view(coupler.SimpleCircuitModel) # based on delta_n_eff for ring_wg in my_ring.ring_segments: ring_wg.set_default_view(ring_wg.CircuitModel) # based on the actual waveguide length # ring model my_ring_cm = my_ring.CircuitModel(coupler_parameters=[cp, cp]) # 2 couplers # 2. Simulate wavelengths = np.linspace(1.55, 1.58, 400) R = my_ring_cm.get_smatrix(wavelengths=wavelengths) # 3. Plot the results plt.plot(wavelengths, np.abs(R["in1", "out1"]) ** 2, "b", label="pass") plt.plot(wavelengths, np.abs(R["in1", "out2"]) ** 2, "g", label="drop") plt.show()
Views
- class Layout
- Parameters:
- coupler_extensions: list<Coord2 and number >= 0>
additional length of the couplers. By default, the couplers will be extended to the size of the ring.
- coupler_lengths: list<number >= 0>
straight lengths of the coupling section. By default, same lengths as the ring will be used
- coupler_offsets: list<Real, number>
list of offsets of the ring couplers along the centerline
- coupler_spacings: list<Real, number>
list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers)
- straights: Coord2 and number >= 0
- shape_position: Coord2
Translation of the shape.
- coupler_transformations:
list of coupler transformations
- area_layer_on: ( bool, bool_ or int )
When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template.
- coupler_parameters:
Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers
- view_name: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3.
The name of the view
- manhattan: ( bool, bool_ or int )
Adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles.
- angle_step: float and number > 0
Angle step for rounding.
- rounding_algorithm:
Rounding algorithm used to generate the bends. Can be circular, spline, ….
- bend_radius: float and number > 0
Bend radius for the auto-generated bends.
- Other Parameters:
- shape: locked
- shapes: locked
Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead
Examples
import si_fab.all as pdk # noqa: F401 from ipkiss3 import all as i3 from picazzo3.filters.ring import RingRect180DropFilter from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate wg1_t = WireWaveguideTemplate(name="wg_template_6") wg1_t.Layout(core_width=0.5) wg2_t = WireWaveguideTemplate(name="wg_template_7") wg2_t.Layout(core_width=0.4) wg3_t = WireWaveguideTemplate(name="wg_template_8") wg3_t.Layout(core_width=0.6) ring = RingRect180DropFilter( name="my_ringrectdropring", ring_trace_template=wg1_t, coupler_trace_templates=[wg2_t, wg3_t] ) # In a list!!! layout = ring.Layout( coupler_spacings=[0.65, 0.70], # This results in a 200nm and 250nm gap straights=(i3.TECH.WG.SHORT_STRAIGHT, i3.TECH.WG.SHORT_STRAIGHT + 3.0), ) layout.visualize(annotate=True)