quchip.devices.transmon.flux_tunable

Symmetric/asymmetric-SQUID flux-tunable transmon.

freq is the calibrated local 0 -> 1 transition at flux_bias. Together they anchor a SQUID dispersion. Moving flux_bias keeps that calibration and updates freq, so the local Duffing Hamiltonian follows the new operating point. Supplying both freq and flux_bias defines a new anchor instead. FluxTunableTransmon.frequency_at() and FluxTunableTransmon.flux_for_frequency() inspect the same dispersion without changing the device.

Declared approximations

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

  • Duffing truncation: the cosine Josephson potential is expanded to quartic order. The anharmonicity is α ≈ −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.

  • Harmonic charge scale: the charge and phase operators scale with the zero-point amplitudes E_J^(1/4) and E_J^(-1/4) at fixed E_C. Capacitive g and charge-drive amplitudes refer to Φ = 0 (see FluxTunableTransmon.charge_coupling_operator()).

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, and the Josephson parameters are derived internally:

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

frequency_at() and flux_for_frequency() always show a mutated or swept parameter (no stale SQUID metadata).

References

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

  • 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=unbound, anharmonicity=unbound, flux_bias=0.0, asymmetry=0.0, *, levels=3, label=None, T1=None, T2=None, thermal_occupation=None)[source]

Bases: FockDevice

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. Can be a JAX tracer.

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

  • flux_bias (float, default 0.0) – Current operating point Φ/Φ₀ and calibration-anchor coordinate. 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()). Rebinding only this value keeps the inferred SQUID calibration and updates freq, and rebinding it with freq defines a new anchor. It also sets the charge scale of charge_coupling_operator(). It is a JAX pytree leaf and can be differentiated or swept through the public chip API.

  • 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.

  • T1 (float or None, default None) – Energy-relaxation time in ns. None disables T1 relaxation.

  • T2 (float or None, default None) – Total 0-1 coherence time in ns. If both are set, T2 <= 2*T1.

  • thermal_occupation (float or None, default None) – Dimensionless mean bath occupation. None disables absorption.

tunable_param_names = ('freq', 'anharmonicity', 'flux_bias')

Parameters eligible for inverse design. DeviceModel derives these from declared fields unless the class or an ancestor supplies a tuple. Explicit tuples remain authoritative when inherited; an empty tuple excludes the device from inverse design. Plain BaseDevice subclasses default to an empty tuple without derivation.

dressed_fit_target_fields = (('freq', 'freq'), ('anharmonicity', 'anharmonicity'))

(dressed_observable, declared_field) pairs used when this device appears in the desired-chip form of fit_a_dress. Empty means that the model makes no automatic dressed-target claim; circuit-level models can remain fixed until the user supplies explicit constraints.

dressed_fit_param_names = ('freq', 'anharmonicity')

Bare parameters normally varied to reproduce dressed_fit_target_fields. This remains separate from tunable_param_names: a model may expose parameters for sweeps without claiming that inverse design can identify all of them from its default dressed observables.

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); harmonic charge scale (E_J/E_J,max)^(1/4) at the static flux_bias.'

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=unbound, positive=True, nonnegative=False, serialize=True, unit='GHz', symbol='\\omega', noise=False, kw_only=False, required=False)
anharmonicity: Scalar = Parameter(default=unbound, positive=False, nonnegative=False, serialize=True, unit='GHz', symbol='\\alpha', noise=False, kw_only=False, required=False)
flux_bias: Scalar = Parameter(default=0.0, positive=False, nonnegative=False, serialize=True, unit='Phi_0', symbol='\\Phi', noise=False, kw_only=False, required=False)
asymmetry: Scalar = Parameter(default=0.0, positive=False, nonnegative=False, serialize=True, unit=None, symbol='d', noise=False, kw_only=False, required=False)
validate()[source]

Check the ranges of concrete scalars only. Traced values pass unchecked.

set_parameter_values(values)[source]

Apply flux and calibration overrides without mapping-order effects.

Parameters:

values (mapping[str, Any]) – Parameter updates. Flux-only updates retune freq.

tunable_param_bounds(name, value)[source]

Use one SQUID period as the default bound for explicit flux fitting.

Parameters:
  • name (str) – Tunable parameter name.

  • value (float) – Concrete optimizer seed.

local_hamiltonian(op, p)[source]

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

Parameters:
  • op (LocalOps) – Fock operator namespace.

  • p (ParameterNamespace) – Symbolic calibrated and flux parameters.

  • updates (H = ω n + (α/2) n(n − I). Rebinding flux_bias first)

  • dispersion. (the stored freq through the anchored SQUID)

charge_coupling_operator()[source]

Return the charge operator s(Φ) i(a − a†).

Notes

At fixed E_C, the transmon charge zero-point amplitude scales as E_J^(1/4) (Koch et al. 2007, §III). The factor s(Φ) = (E_J(Φ)/E_J,max)^(1/4) = (cos²(πΦ) + d² sin²(πΦ))^(1/8) takes it relative to Φ = 0, so g of a capacitive coupling and a charge-drive amplitude refer to the sweet spot. s depends on the static flux_bias. A FluxDrive pulse does not change it.

phase_coupling_operator()[source]

Return the phase operator (a + a†)/s(Φ).

The phase zero-point amplitude scales as E_J^(-1/4), the inverse of the charge scale in charge_coupling_operator().

frequency_at(flux)[source]

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

Parameters:

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

flux_for_frequency(target_freq)[source]

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

Parameters:

target_freq (float or array-like) – Desired transition frequency in GHz.

Notes

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 and the returned flux clips to the lobe endpoint, so out-of-domain behavior is undefined for traced inputs.

physics_notes()[source]

Return declared SQUID-transmon calibration-anchor assumptions.