ElectroAbsorptionModTimeStepper

class photonforge.ElectroAbsorptionModTimeStepper(*, absorption, length, confinement_factor=1.0, bias=0.0, residual_loss=0.0, chirp=0.0, f_3dB=None, quantum_efficiency=1.0, n_group=0.0, voltage_samples=401, z0=None, ports=None)[source]

Time-stepper for an electro-absorption modulator (EAM).

Reverse-biased absorbing waveguide driven by one electrical port. The absorption table is sliced at the carrier wavelength during setup, giving \(\alpha(V)\), and the field transfer:

\[A_{\rm out} = A_{\rm in}\,10^{-L_0/20} \exp\!\left[-\frac{\Gamma\alpha(V)\ell}{2} \left(1 + j\alpha_c\right)\right]\]

Transmission is exponential in \(\alpha\) while \(\alpha(V)\) itself rises then saturates, so the transfer curve in dB is S-shaped.

The drive passes through an optional first-order low-pass representing the junction RC. Absorbed light produces photocurrent

\[I_{ph} = \eta\frac{q}{h\nu}P_{\rm in} \left(1 - e^{-\Gamma\alpha(V)\ell}\right)\]

emitted on the electrical port as \(-I_{ph}\sqrt{\Re Z_0}\).

Parameters:
  • absorption (Interpolator) – Material absorption in 1/μm, as an Interpolator over voltage and wavelength.

  • length (Annotated[float, exclusiveMinimum=0, units='μm']) – Interaction length.

  • confinement_factor (Annotated[float, maximum=1, minimum=0]) – Fraction of the optical mode overlapping the absorbing region.

  • bias (Annotated[float, units='V']) – Constant bias, in V, added to the voltage read from the electrical port. Reverse bias is negative.

  • residual_loss (Annotated[float, minimum=0, units='dB']) – Bias-independent insertion loss, in dB.

  • chirp (float) – Modulator chirp parameter \(\alpha_c\), defined by \({\rm d}\phi/{\rm d}t = (\alpha_c/2)\,{\rm d}\ln P/{\rm d}t\).

  • f_3dB (Annotated[Annotated[float, minimum=0, units='Hz'] | None, _]) – -3 dB cutoff of the junction RC low-pass on the drive. Only active for positive values.

  • quantum_efficiency (Annotated[float, maximum=1, minimum=0]) – Fraction of absorbed photons collected as photocurrent. Set to 0 to disable the photocurrent output.

  • n_group (Annotated[float, minimum=0]) – Group index for the optical transit delay. A value of 0 disables the delay.

  • voltage_samples (Annotated[int, minimum=2]) – Number of points used to resample alpha(V) at the carrier during setup. The original sample points are always kept, so this only adds fill between them.

  • z0 (Annotated[complex, units='Ω'] | None) – Characteristic impedance of the electrical port, used to convert the input field amplitude to a voltage. If None, taken from the port spec impedance, else 50 Ohm.

  • ports (Annotated[Sequence[str], maxItems=2, minItems=2] | None) – Optical input and output port names, in that order. If not set, the sorted list of optical port names is used.

Important

The electrical input \(A\) becomes a voltage through the port impedance, \(V = \Re\{A\}\sqrt{\Re Z_0}\), and the applied bias is bias plus that voltage. Reverse bias is negative.

Important

chirp follows the modulator convention quoted on datasheets, opposite in sign to linewidth_enhancement_factor in the laser and semiconductor amplifier models. Positive values blue-shift the falling optical edge.

Note

A single band at the carrier is assumed: the absorption edge varies over terahertz while the signal occupies tens of gigahertz, so \(\alpha\) is evaluated once at the carrier wavelength. Absorption saturation from state filling is not modelled, and mode-solving for z0 is not supported here.

See also

franz_keldysh_absorption() can be used to generate absorption from tabular data.

Methods

reset()

Reset internal state.

setup(component, time_step, *[, ...])

Initialize the time stepper.

setup_state(*, component, time_step, ...)

Initialize internal state.

step([inputs, steps, time_step, show_progress])

Compute the outputs of this time stepper, given inputs.

step_single(inputs, outputs, time_index, ...)

Take a single time step on the given inputs.

update(*args, **kwargs)

Update this time stepper.

write_verilog_a(path, *[, backend, ...])

Write this configured time stepper as one Verilog-A module.

Attributes

parametric_function

Function used to update the time stepper.

parametric_kwargs

Keyword arguments used to update the time stepper.

properties

Object properties.

random_variables

Random variables associated to the time stepper's parameters.

reset()[source]

Reset internal state.

Return type:

None

setup_state(*, component, time_step, carrier_frequency, **kwargs)[source]

Initialize internal state.

Parameters:
  • component (Component) – Component representing the modulator.

  • time_step (Annotated[float, minimum=0, units='s']) – The interval between time steps (in seconds).

  • carrier_frequency (Annotated[float, minimum=0, units='Hz']) – Carrier frequency. Sets the wavelength at which the absorption table is sliced and the photon energy used for the photocurrent.

  • kwargs (object) – Unused.

Return type:

None

step_single(inputs, outputs, time_index, update_state, shutdown)[source]

Take a single time step on the given inputs.

Parameters:
  • inputs (ndarray) – Input values at the current time step. Must be a 1D array of complex values ordered according to keys.

  • outputs (ndarray) – Pre-allocated output array where results will be stored. Same size and type as inputs.

  • time_index (int) – Time series index for the current input.

  • update_state (bool) – Whether to update the internal stepper state.

  • shutdown (bool) – Whether this is the last call to the single stepping function for the provided photonforge.TimeSeries.

Return type:

None