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 phase term makes the instantaneous frequency of the output follow its power, \(\delta\nu = (\alpha_c/4\pi)\,{\rm d}\ln P/{\rm d}t\).
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
Interpolatorover 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) – Chirp parameter \(\alpha_c\) as quoted on modulator datasheets: the output frequency deviates by \(\delta\nu = (\alpha_c/4\pi)\,{\rm d}\ln P/{\rm d}t\). Positive values blue-shift the rising optical edge and red-shift the falling one.
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
biasplus that voltage. Reverse bias is negative.Important
chirptakes the value quoted on a datasheet unchanged, and it has the same sign convention aslinewidth_enhancement_factorin the laser and semiconductor amplifier models: in every one of them a positive value shifts the light to higher frequency while its power rises. Values measured with the opposite sign convention must be negated.Note
PhotonForge uses the \(e^{-j\omega t}\) time convention, so an envelope \(e^{-j2\pi\Delta f\,t}\) is light at \(f_c + \Delta f\), with \(f_c\) the carrier frequency. The instantaneous frequency deviation of an output envelope
ais therefore \(-(1/2\pi)\,{\rm d}\arg a/{\rm d}t\), for example-numpy.gradient(numpy.unwrap(numpy.angle(a)), time_step) / (2 * numpy.pi), and the frequency axis of anumpy.fftspectrum must be reversed.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
z0is not supported here.See also
franz_keldysh_absorption()can be used to generateabsorptionfrom tabular data.Methods
bind_native(step, keys[, state, cstate, context])Bind a compiled step function.
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_functionFunction used to update the time stepper.
parametric_kwargsKeyword arguments used to update the time stepper.
path_delaysMinimum delay in time steps of each (input key, output key) signal path; missing pairs have no path and None means every input reaches every output within the time step.
propertiesObject properties.
random_variablesRandom variables associated to the time stepper's parameters.
- 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