AvalanchePhotodiodeTimeStepper

class photonforge.AvalanchePhotodiodeTimeStepper(*, responsivity, gain=1.0, multiplication=1.0, bias=0.0, ionization_ratio=0.0, gain_bandwidth_product=0.0, intrinsic_bandwidth=0.0, dark_current=0.0, bulk_dark_current=0.0, thermal_noise=.0, saturation_current=0.0, roll_off=2.0, reflection=0.0, z0=None, seed=None)[source]

Avalanche photodiode with excess noise and a gain-bandwidth limit.

The primary photocurrent \(I_p = R_0 \lvert A \rvert^2\) and bulk dark current are multiplied by \(M\):

\[I = M\left(I_p + I_{d,\rm bulk}\right) + I_{d,\rm surf}\]

The one-sided current noise power spectral density and McIntyre excess noise factor are:

\[ \begin{align}\begin{aligned}S_I = 2q\left[M^2 F(M)\left(I_p + I_{d,\rm bulk}\right) + I_{d,\rm surf}\right] + S_{\rm th}\\F(M) = k M + \left(1 - k\right)\left(2 - \frac{1}{M}\right)\end{aligned}\end{align} \]

The signal grows as \(M\) while the shot noise grows as \(M\sqrt{F(M)}\), so the SNR improves only while the multiplied shot noise stays below the fixed thermal noise.

Parameters:
  • responsivity (Annotated[float, exclusiveMinimum=0, units='A/W']) – Primary responsivity at unity gain.

  • gain (Annotated[float, units='V/A']) – Transimpedance gain.

  • multiplication (Interpolator | Annotated[float, exclusiveMinimum=0]) – Mean multiplication \(M\). A number, or an Interpolator of \(M\) against reverse bias evaluated at bias.

  • bias (Annotated[float, minimum=0, units='V']) – Reverse bias magnitude. Only used when multiplication is an interpolator.

  • ionization_ratio (Annotated[float, maximum=1, minimum=0]) – \(k\) for the excess noise factor.

  • gain_bandwidth_product (Annotated[float, minimum=0, units='Hz']) – If positive, set the avalanche bandwidth limit.

  • intrinsic_bandwidth (Annotated[float, minimum=0, units='Hz']) – If positive, transit and RC limited bandwidth.

  • dark_current (Annotated[float, minimum=0, units='A']) – Surface dark current, not multiplied, in A.

  • bulk_dark_current (Annotated[float, minimum=0, units='A']) – Bulk dark current at unity gain, multiplied along with the signal.

  • thermal_noise (Annotated[float, minimum=0, units='A²/Hz']) – One-sided thermal noise density of the front end.

  • saturation_current (Annotated[float, minimum=0, units='A']) – Space-charge saturation current. Zero disables saturation. Applied to the multiplied current.

  • roll_off (Annotated[float, exclusiveMinimum=0]) – Sharpness of the saturation knee.

  • reflection (complex) – Field reflection coefficient for light incident on the optical port. Reflected power never reaches the junction, so it produces no photocurrent.

  • z0 (Annotated[complex, units='Ω'] | None) – Reference impedance of the electrical port.

  • seed (int | None) – Seed for the noise generator.

See also

miller_gain() can be used as a helper to create multiplication.

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=0.0, **kwargs)[source]

Initialize internal state.

Parameters:
  • component (Component) – Component with one optical and one electrical port.

  • time_step (float) – The interval between time steps (in seconds).

  • carrier_frequency (Annotated[float, minimum=0, units='Hz']) – Unused; the responsivity already carries the wavelength dependence.

  • 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, ordered by keys.

  • outputs (ndarray) – Pre-allocated output array, 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 for the current series.

Return type:

None