Beneš switch and nominal simulation

We shall be analyzing the performance corners of an optical switch — namely, the Beneš switch, a well-known architecture in photonics. There are several architectures to implement switches, each with trade-offs depending on design goals such as power consumption or optical loss.

A basic \(2\times2\) Beneš switch is implemented by at least two directional couplers and a controllable heater connecting one of the arms.

../../../../_images/Benes_2x2.png

Beneš switch 2x2

You can find the code for this circuit in our Luceda Academy. Using the default settings for the circuit (voltage difference between the two heaters is zero and MZIs are balanced), we expect that input light from one port 1/2 to be fully directed to the opposite output due to \(90^{\circ}\) phase shift introduced by the balanced beam splitters.

luceda-academy/training/topical_training/benes_switch_circuit_analyzer/switch_network.py
    start_wavelength: float = 1.45
    end_wavelength: float = 1.55
    n_wavelength_points: int = 501
    wavelengths = np.linspace(start_wavelength, end_wavelength, n_wavelength_points)

    switch_2x2 = Switch_MZI2x2(name="switch_2x2")
    switch_2x2.Layout().visualize()
    s_total = switch_2x2.CircuitModel().get_smatrix(wavelengths=wavelengths)
    s_total.visualize(title="Beneš switch 2x2")

Which returns the following results, as expected:

../../../../_images/Benes_2x2_in2.png

S-matrix results of the benes_2x2 for excitation at input 2

This plot shows us the result derived from the matrices that relate the input ports to the output ports, both optical and electrical signals. In order to run the circuit simulation, another option is to export the circuit to IPKISS Canvas, drag and drop the SMatrixSweep Codelet under generic_devices and press start button. With the Codelets section, we can find CornerAnalysis Codelet which can be used to run corner analysis as we will elaborate later.

To visualize the optical intensity over the layout, we can use the Tracer. This tool, part of the Circuit Analyzer, allows to visualize the propagation of light through the circuit including intensity levels, reflection at different components and much more. In order to use it, we can write the following lines of code, similar as to circuit simulation:

luceda-academy/training/topical_training/benes_switch_circuit_analyzer/CA_tracer.py
from switch_network import Switch_MZI2x2, Switch4x4_Benes
import circuit_analyzer.all as ca
import numpy as np

switch_2x2 = Switch_MZI2x2(name="Benes 2x2")
switch_2x2_layout = switch_2x2.Layout()

tracer_2x2 = ca.Tracer(circuit=switch_2x2_layout)
tracer_2x2_res = tracer_2x2.run(wavelengths=np.linspace(1.5, 1.6, 11))
tracer_2x2_res.visualize()

This will open a visualizer window. Clicking on the button “Show/Hide Signal Tracer” will result in a similar window to the standard circuit visualizer. There, we can see port markers (yellow triangles); pressing one simulates light propagation in the circuit from that port as the light source.

../../../../_images/Tracer_2x2_window.png

Signal Tracer window

Selecting the top input, as for previous simulation, and slightly adjusting the predefined color range, we obtain the following:

../../../../_images/Tracer_2x2_in2.png

Signal Tracer window with one selected input port (top one)

Since the orange colour is set at -3.5 dB, one can visually observe that the light is split into nearly equal intensities in both arms of the MZI. To extract the exact intensity of light, one can hover the mouse over the ports in the circuit to probe the intensity. There is also the option to zoom in, as shown in the visual below where we zoom into the directional coupler.

../../../../_images/Tracer_2x2.gif

Signal Tracer running. Hovering over existing ports also shows their names and light power.

One can change the panels between Signal Tracer and Layers to hide distracting layers and make the visualization clearer.

Scaling up to a \(4\times4\) Beneš switch, the circuit includes 6 MZIs, each controlled using a parametric voltage, connected in the Beneš architecture. There are two points where the waveguides cross each other so we added Crossing components which is a component that allows to have these overlapping waveguides with low insertion loss, crosstalk and back-reflection. It results in the following circuit:

../../../../_images/Benes_4x4.png

Benes switch 4x4

For simplicity, and as defined in the Beneš circuit script, let’s consider the voltage difference on all heaters set to:

\([2.416, 2.416, 2.416, 2.416, 2.416, 2.416]\)

This voltage setting (\(v_{bar} = 2.416V\)) configures each MZI switch to the “bar” state, where inputs are routed straight through (e.g., in_1 to out_1, in_2 to out_2). You can find an analysis determining these voltages in the MZI Unit Cell section of the PPC application example.

As a result, we expect light to enter and exit through the same numbered port (assuming a labeled and ordered port convention).

Similarly, for the same wavelengths as the \(2\times2\) switch simulation, we ran the following:

luceda-academy/training/topical_training/benes_switch_circuit_analyzer/switch_network.py
    switch_4x4 = Switch4x4_Benes(name="switch_4x4")
    switch_4x4.Layout().visualize()
    circuit_model_4x4 = switch_4x4.CircuitModel()

    S_total = circuit_model_4x4.get_smatrix(wavelengths=wavelengths)
    S_total.visualize(
        term_pairs=[("in_4", "out_1"), ("in_4", "out_2"), ("in_4", "out_3"), ("in_4", "out_4")],
        title="Beneš switch 4x4 - default vbias",
    )

Which returns the plot below. As expected, the majority of power exits output port number 4 while a small fraction leaks to the other ports.

../../../../_images/Benes_4x4_in4.png

S-matrix results of the switch_4x4 for excitation at input 4 showing the transmission to every output port

To demonstrate a different routing configuration, we can adjust the voltage difference setting four of the MZI switches to the “cross” state.

    v_bar, v_cross = 2.416, 0.000
    vbias = [v_bar, v_cross, v_bar, v_cross, v_cross, v_cross]

Resulting in:

../../../../_images/Benes_4x4_in4_cross.png

Simulation results for switch_4x4, excitation at input 4 with “cross” configuration

Let us see the results in the signal Tracer writing the following code:

luceda-academy/training/topical_training/benes_switch_circuit_analyzer/CA_tracer.py
v_bar, v_cross = 2.416, 0.000
vbias = [v_bar, v_cross, v_bar, v_cross, v_cross, v_cross]

switch_4x4 = Switch4x4_Benes(name="Benes 4x4", vbias=vbias)
switch_4x4_layout = switch_4x4.Layout()

tracer_4x4 = ca.Tracer(circuit=switch_4x4_layout)
tracer_4x4_res = tracer_4x4.run(wavelengths=np.linspace(1.5, 1.6, 11))
tracer_4x4_res.visualize()

It is worth noting that the wavelengths we selected are in a similar range but with only 11 points as signal Tracer calculation can become heavy. Adjusting the color settings to match the simulation before and selecting input 4:

../../../../_images/Tracer_4x4_in4.png

Not every port marker appears in the picture because light is outside of the \([-50, 0]\) dB range and each marker’s color adjusts to the light intensity in that port. If we run it and zoom in on the first upper Directional Coupler, we observe the following:

../../../../_images/Tracer_4x4_DC.gif

Unlike in the \(2\times2\) switch, here we see backwards propagation. This indicates that light is reflected somewhere in the circuit. The component introducing this reflection is the crossing. Let us zoom in on the first crossing.

../../../../_images/Tracer_4x4_Crossing1.gif

Light enters the crossing with \(-0.00\) dB, and we have \(-45.00\) dB being reflected, \(-0.05\) dB being transmitted, and \(-40\) dB transferred to each of the crossing arms.

Limiting to the \([-50, 0]\) dB range is a good reference but we can change it to \([-100, 0]\) dB for example. In this case, we can already see that there is noise in the second crossing at around \(-60\) dB.

../../../../_images/Tracer_4x4_Crossing2.gif

At the output, we have \(-63.78\), \(-40.02\), \(-68.96\), and \(-0.07\) dB for output ports \(1\), \(2\), \(3\), and \(4\), matching the simulation done before.

To wrap up, we have validated the expected nominal behavior of both the \(2\times2\) and \(4\times4\) Beneš switches and used the Tracer to gain spatial insight into light propagation, and reflections. With this baseline in place, we are now ready to move beyond ideal conditions and explore how process variations impact performance using corner analysis.