Skip to content

Latest commit

 

History

History
52 lines (43 loc) · 2.93 KB

mzi.rst

File metadata and controls

52 lines (43 loc) · 2.93 KB

Mach-Zehnder Interferometers

Regular Mach-Zehnder

.. automodule:: picwriter.components
   :members: MachZehnder

Mach-Zehnder Switches

Same as the type above, but instead places a 1x2 MMI for the input, and a 2x2 MMI at the output. Tuning of the respective arms allows for optical switching between the two output paths.

.. automodule:: picwriter.components
   :members: MachZehnderSwitch1x2, MachZehnderSwitchDC1x2, MachZehnderSwitchDC2x2

imgs/mzi.png

The above image of an unbalanced Mach-Zehnder with heaters for thermo-optic phase modulation is easily generated from the following code:

top = gdspy.Cell("top")
wgt = WaveguideTemplate(bend_radius=50, wg_width=1.0, resist='+')
htr_mt = MetalTemplate(width=25, clad_width=25, bend_radius=wgt.bend_radius, resist='+', fab="ETCH", metal_layer=13, metal_datatype=0, clad_layer=14, clad_datatype=0)
mt = MetalTemplate(width=25, clad_width=25, resist='+', fab="ETCH", metal_layer=11, metal_datatype=0, clad_layer=12, clad_datatype=0)

wg_in = Waveguide([(0,0), (300,0)], wgt)
tk.add(top, wg_in)
mzi = MachZehnder(wgt, MMIlength=50, MMIwidth=10, MMItaper_width=2.0, MMIwg_sep=3, arm1=0, arm2=100, heater=True, heater_length=400, mt=htr_mt, **wg_in.portlist["output"])
tk.add(top, mzi)
wg_out = Waveguide([mzi.portlist["output"]["port"], (mzi.portlist["output"]["port"][0]+300, mzi.portlist["output"]["port"][1])], wgt)
tk.add(top, wg_out)

mt1=MetalRoute([mzi.portlist["heater_top_in"]["port"],
                (mzi.portlist["heater_top_in"]["port"][0]-150, mzi.portlist["heater_top_in"]["port"][1]),
                (mzi.portlist["heater_top_in"]["port"][0]-150, mzi.portlist["heater_top_in"]["port"][1]+200)], mt)
mt2=MetalRoute([mzi.portlist["heater_top_out"]["port"],
                (mzi.portlist["heater_top_out"]["port"][0]+150, mzi.portlist["heater_top_out"]["port"][1]),
                (mzi.portlist["heater_top_out"]["port"][0]+150, mzi.portlist["heater_top_out"]["port"][1]+200)], mt)
mt3=MetalRoute([mzi.portlist["heater_bot_in"]["port"],
                (mzi.portlist["heater_bot_in"]["port"][0]-150, mzi.portlist["heater_bot_in"]["port"][1]),
                (mzi.portlist["heater_bot_in"]["port"][0]-150, mzi.portlist["heater_bot_in"]["port"][1]-200)], mt)
mt4=MetalRoute([mzi.portlist["heater_bot_out"]["port"],
                (mzi.portlist["heater_bot_out"]["port"][0]+150, mzi.portlist["heater_bot_out"]["port"][1]),
                (mzi.portlist["heater_bot_out"]["port"][0]+150, mzi.portlist["heater_bot_out"]["port"][1]-200)], mt)
tk.add(top, mt1)
tk.add(top, mt2)
tk.add(top, mt3)
tk.add(top, mt4)
tk.add(top, Bondpad(mt, **mt1.portlist["output"]))
tk.add(top, Bondpad(mt, **mt2.portlist["output"]))
tk.add(top, Bondpad(mt, **mt3.portlist["output"]))
tk.add(top, Bondpad(mt, **mt4.portlist["output"]))