# 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: , optional list of trace_templates for the ring couplers. By default the same template as the ring is taken ring_trace_template: PCell and _WaveguideTemplate, optional Trace template for the ring waveguide couplers: List with type restriction, allowed types: , optional list of coupler PCells ring_segments: List with type restriction, allowed types: , optional list of Ring PCells cell_instances: _PCellInstanceDict, optional name: optional The unique name of the pcell ring_trace_templates: List with type restriction, allowed types: , locked Trace templates for the ring segments. Locked, as there is only one segment in this Ring. Use ‘ring_trace_template’ instead.

Examples

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

It also illustrates the effect of resonance peak splitting due to back-reflection in the coupler.
"""
from technologies import silicon_photonics
import ipkiss3.all as i3 # ipkiss
import pylab as plt, numpy as np #matplotlib and numpy

from picazzo3.filters.ring import RingRect180DropFilter

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

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

# coupler parameters
cp = dict(cross_coupling1=1j*0.0784**0.5,
straight_coupling1=0.9216**0.5,
reflection_in1=1j * 0.030, # The backreflection in the coupler
)

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

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

# 3. Plot the results
plt.plot(wavelengths, np.abs(R['in1', 'out1']) ** 2, 'b', label='pass')
plt.plot(wavelengths, np.abs(R['in1', 'out2']) ** 2, 'g', label='drop')
plt.plot(wavelengths, np.abs(R['in1', 'in2']) ** 2, 'r', label='add')
plt.legend()
plt.show()

""" This example illustrates a simulation of a single ring resonator model based on the
layout that is first generated."""
from technologies import silicon_photonics
import ipkiss3.all as i3 # ipkiss
import pylab as plt, numpy as np #matplotlib and numpy

from picazzo3.filters.ring import RingRect180DropFilter

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

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

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

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

# 3. Plot the results
plt.plot(wavelengths, np.abs(R['in1', 'out1']) ** 2, 'b', label='pass')
plt.plot(wavelengths, np.abs(R['in1', 'out2']) ** 2, 'g', label='drop')
plt.show()


Views

Layout
Parameters: angle_step: float and number > 0, optional angle step for rounding coupler_lengths: list= 0>, optional straight lengths of the coupling section. By default, same lengths as the ring will be used coupler_parameters: optional Parameters for the couplers. This is a list of dicts, and the length of the list should be the same as the number of couplers grid: float and number > 0, optional design grid. Extracted by default from TECH.METRICS.GRID grids_per_unit: optional Number of grid cells per design unit manhattan: optional adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles rounding_algorithm: optional rounding algorithm used to generate the bends. Can be circular, spline, … units_per_grid: optional Ratio of grid cell and design unit view_name: str, optional The name of the view coupler_extensions: list, optional additional length of the couplers. By default, the couplers will be extended to the size of the ring. coupler_offsets: list, optional list of offsets of the ring couplers along the centerline coupler_spacings: list, optional list of centerline-to-centerline spacings of the ring couplers.When negative, the ring and coupler waveguide will cross, which ispossible when the ring traces template and the coupler trace templateare on different process layers (vertical couplers) straights: Coord2, optional shape_position: Coord2, optional Translation of the shape. area_layer_on: optional When True, the Ring area will be covered by i3.Rectangles on all cover layers of the ring waveguide template. coupler_transformations: optional list of coupler transformations unit: float and number > 0, optional design unit. Extracted by default from TECH.METRICS.UNIT bend_radius: float and number > 0, optional bend radius for the auto-generated bends shape: locked shapes: locked Shapes of the ring segments. Locked, as there is only 1 ring segment. Use ‘shape’ instead

Examples

from technologies import silicon_photonics
from ipkiss3 import all as i3
from picazzo3.filters.ring import RingRect180DropFilter
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

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

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

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

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

layout.visualize()