quchip.devices.transmon.flux_tunable

Symmetric/asymmetric-SQUID flux-tunable transmon.

freq and anharmonicity are the simulated physics: the calibrated local 0 -> 1 transition frequency and anharmonicity of the device at the stored flux_bias. FluxTunableTransmon.local_hamiltonian() builds the Duffing Hamiltonian from freq and anharmonicity alone — it does not reference flux_bias. FluxTunableTransmon.frequency_at() and FluxTunableTransmon.flux_for_frequency() answer counterfactual questions — what frequency the SQUID would reach at a different bias — via the SQUID dispersion relative to this calibrated anchor. Mutating flux_bias therefore records a new nominal operating point without retuning the device: it does not change freq, anharmonicity, or the Hamiltonian.

Declared approximations

  • Transmon regime: E_J ≫ E_C (exponential charge-dispersion suppression).

  • Duffing truncation: the cosine Josephson potential is expanded to quartic order; anharmonicity α ≈ −E_C.

  • Adiabatic flux: the SQUID dispersion underlying frequency_at() / flux_for_frequency() is a static calibration-anchor relation with no Landau–Zener physics. Time-dependent flux tuning during gates is applied through an external FluxDrive whose real-baseband envelope carries δω(t) in GHz.

SQUID dispersion

\[ \begin{align}\begin{aligned}E_J(\Phi) = E_{J,\max} \sqrt{\cos^2(\pi \Phi/\Phi_0) + d^2 \sin^2(\pi \Phi/\Phi_0)}\\\omega(\Phi) = \sqrt{8\, E_C\, E_J(\Phi)} - E_C\end{aligned}\end{align} \]

where d = (E_{J1} E_{J2}) / (E_{J1} + E_{J2}) is the junction asymmetry and Φ/Φ₀ is the reduced flux. The user supplies the calibrated local freq and anharmonicity; the Josephson parameters are derived internally:

α = −E_C → E_C = |α| (ω + E_C)² = 8 E_C E_J(flux_bias) → E_J_max via SQUID inversion

The SQUID parameters _E_C / _E_J_max are derived on read from the current freq / anharmonicity / flux_bias / asymmetry — they carry no cached state, so frequency_at() and flux_for_frequency() always reflect a mutated or swept parameter (no stale SQUID metadata).

References

  • Koch et al., PRA 76, 042319 (2007), §II.

  • Krantz et al., APR 6, 021318 (2019), §II.B and §V.A.

  • Renger et al., A superconducting qubit-resonator quantum processor with effective all-to-all connectivity — flux-tunable qubits and MOVE/CZ gates.

Examples

>>> from quchip.devices.transmon import FluxTunableTransmon
>>> q = FluxTunableTransmon(freq=4.47, anharmonicity=-0.2006, levels=3)
>>> round(q.freq, 3)
4.47
>>> round(q.anharmonicity, 4)
-0.2006
>>> round(float(q.frequency_at(0.0)), 3)
4.47

Classes

FluxTunableTransmon(freq, anharmonicity[, ...])

SQUID-dispersion flux-tunable transmon.

class quchip.devices.transmon.flux_tunable.FluxTunableTransmon(freq, anharmonicity, flux_bias=0.0, asymmetry=0.0, *, levels=3, label=None, T1=None, T2=None, thermal_population=None)[source]

Bases: DeviceModel

SQUID-dispersion flux-tunable transmon.

The constructor takes the calibrated local physical parameters; SQUID metadata is derived on read and is not part of the public interface.

Parameters:
  • freq (float) – Calibrated local 0 -> 1 transition frequency ω in GHz, at the stored flux_bias. Must be positive. May be a JAX tracer.

  • anharmonicity (float) – Calibrated local anharmonicity α in GHz, at the stored flux_bias. Must be negative (α ≈ −E_C). May be a JAX tracer.

  • flux_bias (float, default 0.0) – Calibration-anchor operating point Φ/Φ₀. Any real value; the SQUID inversion is undefined only at the symmetric-SQUID degenerate point (asymmetry == 0 and flux_bias a half-integer — see validate()). The local Hamiltonian does not reference this value directly — freq and anharmonicity already carry it. A pytree leaf, so it is differentiable / sweepable like every other device parameter.

  • asymmetry (float, default 0.0) – SQUID junction asymmetry d = (E_{J1}−E_{J2})/(E_{J1}+E_{J2}). Must be in [0, 1).

  • levels (int, default 3) – Fock-space truncation.

  • label (str | None, default None) – Auto-generated as fluxtunable_{idx} when omitted.

  • **noise_kwargs – Forwarded to BaseDeviceT1, T2, thermal_population.

tunable_param_names = ('freq', 'anharmonicity')

Bare parameters this device exposes as differentiable / tunable scalars. fit_a_dress walks this tuple to discover what it is allowed to optimize on each device, decoupling the inverse-design surface from any specific device model. Three states, keyed on whether the value is explicitly declared:

  • No explicit declaration anywhere in the DeviceModel lineage — the default is derived: every declared parameter() field, in declaration order (see DeviceModel.__init_subclass__).

  • Explicit tuple on the class or an ancestor — exact curation, validated at class-definition time; authoritative and inherited until a subclass explicitly replaces it.

  • Explicit empty tuple — deliberately freezes the device (and its subclasses, until one replaces it) out of inverse design.

On a plain (non-DeviceModel) BaseDevice subclass there is no derivation; the default stays empty unless the subclass declares its own tuple — e.g. Fluxonium uses ("E_C", "E_J", "E_L", "phi_ext").

computational = True

Whether this device represents a computational qubit, as opposed to e.g. a bus resonator or a coupler element.

approximation = 'Duffing-approximated SQUID transmon; adiabatic flux (calibration-anchor, no Landau-Zener).'

Declared approximation-regime statement surfaced by physics_notes() — the mechanism that keeps a model’s stated validity range attached to the class rather than buried in a docstring a caller may not read.

freq: Scalar = Parameter(default=<object object>, positive=True, nonnegative=False, serialize=True, unit='GHz')
anharmonicity: Scalar = Parameter(default=<object object>, positive=False, nonnegative=False, serialize=True, unit='GHz')
flux_bias: Scalar = Parameter(default=0.0, positive=False, nonnegative=False, serialize=True, unit='Phi_0')
asymmetry: Scalar = Parameter(default=0.0, positive=False, nonnegative=False, serialize=True, unit=None)
validate()[source]

Range checks on concrete scalars only; traced values pass unchecked.

Return type:

None

local_hamiltonian(op)[source]

Return the Duffing Hamiltonian built from the calibrated freq and anharmonicity.

H = ω n + (α/2) n(n I). Does not reference flux_bias.

Parameters:

op (LocalOps)

Return type:

PhysicsExpr

frequency_at(flux)[source]

SQUID dispersion ω(Φ/Φ₀) in GHz, using derived E_C and E_J_max.

Parameters:

flux (float) – Reduced flux Φ/Φ₀. JAX-traceable.

Return type:

Any

flux_for_frequency(target_freq)[source]

Inverse SQUID dispersion on the monotonic lobe Φ/Φ₀ ∈ [0, 0.5).

Derivation:

ω(Φ) = sqrt(8 E_C E_J_max sqrt(cos²(πΦ) + d²sin²(πΦ))) − E_C → let S = (ω + E_C)² / (8 E_C E_J_max) → cos²(πΦ)(1 − d²) + d² = S² → cos²(πΦ) = (S² − d²) / (1 − d²)

Raises:

ValueError – If target_freq is concrete and lands outside the frequency range frequency_at() reaches over Φ/Φ₀ ∈ [0, 0.5) at the current calibration anchor. A traced target_freq (or a traced anchor) skips this check; the returned flux clips to the lobe endpoint, so out-of-domain behavior is undefined for traced inputs.

Parameters:

target_freq (Any)

Return type:

Any

physics_notes()[source]

Return declared SQUID-transmon calibration-anchor assumptions.

Return type:

list[str]