quchip.control¶
Classical control surface: lines, signal chain, and envelopes.
- class quchip.control.BaseDrive(target=None, *, label=None, rwa=None)[source]¶
Bases:
RegistrableBase class for classical control lines driving a single device.
Drives own their local Hamiltonian contribution and are auto-labelled from their
_type_prefix(e.g.charge_0,flux_0) unless label is given. Subclasses are auto-registered for serialization via the sharedRegistrablemixin.- Parameters:
target (BaseDevice | None) – Device to attach this drive to. May be connected later via
connect().label (str | None) – Optional explicit label; otherwise auto-generated.
rwa (bool | None) – Per-drive RWA override.
Nonemeans follow the chip-level setting.
Examples
>>> from quchip import DuffingTransmon, ChargeDrive >>> q = DuffingTransmon(freq=5.0, anharmonicity=-0.25, levels=3) >>> drive = ChargeDrive(target=q) >>> drive.device_label == q.label True
- target_kind: ClassVar[str] = 'device'¶
"device"for drives targeting a device (the default),"edge"for drives targeting a coupling (seeParametricDrive).- Type:
Structural dispatch key for equipment/chip/sequence code
- connect(device)[source]¶
Attach (or re-attach) this drive to device.
If the drive was previously attached to another device, it is detached from that device’s
_connected_driveslist so that only the new attachment is visible on the chip.- Parameters:
device (BaseDevice)
- Return type:
None
- property target_label: str | None¶
Label of this drive’s target, or
Noneif unconnected.Device-target drives (
target_kind == "device") aliasdevice_label;ParametricDriveoverrides this to resolve its coupling target instead.
- collapse_operators(device)[source]¶
Lindblad collapse operators contributed by this drive.
Default: none. Override to model drive-induced dissipation (e.g. photon loss on a drive line).
- Parameters:
device (BaseDevice)
- Return type:
- local_channels(device)[source]¶
Return the Hamiltonian channels this drive exposes on device.
A simple single-channel drive declares
_coupling_protocol,_coupling_accessor,_fallback, and_modulation; this method then dispatches generically — the device’s physical coupling operator when it conforms to the Protocol, the structural fallback otherwise. Returned operators are in the device’s local basis (no chip-wide embedding). Drives with a non-standard decomposition override this method instead.- Parameters:
device (BaseDevice)
- Return type:
- physics_notes()[source]¶
Return human-readable declarations of this drive’s approximations.
Returns the shared target/RWA lines plus this drive’s
_coupling_notewhen declared. Subclasses with extra notessuper().physics_notes()and append their own. Aggregated byChip.physics_notes().
- signal_spec(drive_op, device)[source]¶
Build the frame-agnostic signal spec for one scheduled pulse.
- Parameters:
drive_op (DriveOp) – Scheduled pulse with envelope, start time, phase offset, and (for microwave drives) carrier frequency. Typed as
AnybecauseDriveOplives in the engine IR, which drives must not import.device (BaseDevice) – Target device. Unused in the default implementation, kept as an extension hook so subclasses can emit device-aware specs (e.g. flux-tunable drives that query the device’s tuning curve).
- Returns:
Frame-agnostic description of the pulse — envelope, start time, duration, phase offset, and carrier frequency (or
Nonefor baseband drives) — built directly from drive_op, with no frame or IR commitment.- Return type:
Notes
The default implementation produces a
DriveSignalSpecdescribing a phase-rotated, time-shifted, finite-duration envelope. Stage 2 of the engine turns the spec into the rawSignalProgramScale(Shift(Window(env, 0, duration), start), exp(i·phi))before applying the modulation dispatch.
- copy(*, target=None)[source]¶
Return a shallow copy, optionally rebound to a new target.
- Parameters:
target (BaseDevice | None)
- Return type:
- class quchip.control.SignalTransform[source]¶
Bases:
Registrable,ABCAbstract base for signal-map transforms, auto-registered for serialization.
The type registry, the
{"type": ...}to_dict()stamp, and thefrom_dictdispatch are owned by the sharedRegistrablemixin; the parameter-less default reconstruction (cls()) covers transforms that carry no persisted state, while payload-carrying transforms overrideto_dict()/from_dict().- abstractmethod apply(signals)[source]¶
Return the transformed signal map.
- Parameters:
signals (dict[tuple[str, int], SignalNode])
- Return type:
dict[tuple[str, int], SignalNode]
- without_line(line)[source]¶
Return this transform without line, or
Nonewhen it must be dropped.- Parameters:
line (str)
- Return type:
SignalTransform | None
- class quchip.control.Crosstalk(source, victim, beta, theta=0.0, delay=0.0)[source]¶
Bases:
SignalTransformLinear crosstalk from a source drive line onto a victim line.
For each scheduled operation on the source line, adds
\[\beta\, e^{i\theta}\, s_\mathrm{src}(t - \Delta t)\]onto the victim line, where \(s_\mathrm{src}\) is the source’s raw line signal — the frame-agnostic, carrier-free envelope signal the signal chain operates on, before stage 2 attaches any carrier or RWA modulation. Fidelity to classical microwave crosstalk is preserved downstream instead: stage 2 builds the victim’s Hamiltonian term using the source drive’s own carrier frequency for the leaked entry, not the victim’s, so a leaked pulse still lands at the source’s frequency (Balewski et al., arXiv:2502.05362, Eq. (3); Sheldon et al., PRA 93, 060302 (2016); Sarovar et al., Quantum 4, 321 (2020)). The
delayshifts the baseband envelope; the carrier-phase part of a physical path delay (\(2\pi f \tau\)) belongs intheta.- Parameters:
- apply(signals)[source]¶
Add the phase-rotated, delayed source signal onto the victim line.
- Parameters:
signals (dict[tuple[str, int], SignalNode])
- Return type:
dict[tuple[str, int], SignalNode]
- classmethod from_dict(d)[source]¶
Reconstruct from
to_dict()output.On the registry root, dispatch to the concrete subclass named by
data["type"](forwarding*args/**kwargs). On a concrete subclass, defer to_from_dict_payload(). Concrete subclasses that carry payload override this method directly.
- class quchip.control.Delay(line, delta_t)[source]¶
Bases:
SignalTransformShift every signal on line in time by
delta_tns.- apply(signals)[source]¶
Time-shift every signal on
linebydelta_tns.- Parameters:
signals (dict[tuple[str, int], SignalNode])
- Return type:
dict[tuple[str, int], SignalNode]
- classmethod from_dict(d)[source]¶
Reconstruct from
to_dict()output.On the registry root, dispatch to the concrete subclass named by
data["type"](forwarding*args/**kwargs). On a concrete subclass, defer to_from_dict_payload(). Concrete subclasses that carry payload override this method directly.
- class quchip.control.Gain(line, factor)[source]¶
Bases:
SignalTransformScale every signal on line by a complex factor.
- apply(signals)[source]¶
Scale every signal on
lineby the complexfactor.- Parameters:
signals (dict[tuple[str, int], SignalNode])
- Return type:
dict[tuple[str, int], SignalNode]
- classmethod from_dict(d)[source]¶
Reconstruct from
to_dict()output.On the registry root, dispatch to the concrete subclass named by
data["type"](forwarding*args/**kwargs). On a concrete subclass, defer to_from_dict_payload(). Concrete subclasses that carry payload override this method directly.
- class quchip.control.DriveSignalSpec(envelope, start_time, duration, phase_offset, drive_freq)[source]¶
Bases:
objectFrame-agnostic description of one scheduled drive pulse.
The spec carries everything the engine needs to build the raw line signal and later compose it with the frame + carrier during modulation — expressed in ordinary GHz (frequencies) and ns (times), with no IR references.
- Parameters:
envelope (BaseEnvelope) – Pulse envelope reference. Its
waveform(t)is called at evaluation time; all differentiable pulse parameters live as leaves on the envelope (quchip.control.envelopes).start_time (float) – Onset of the pulse in ns.
duration (float) – Envelope duration in ns (the pulse is zero outside
[start_time, start_time + duration]).phase_offset (float) – Phase rotation applied to the raw line signal, in radians.
drive_freq (float | None) – Microwave carrier frequency in ordinary GHz for
DriveModulation.SINGLE_TONEchannels;Nonefor baseband (DriveModulation.DIRECT_REAL) drives.
- envelope: BaseEnvelope¶
- class quchip.control.DriveModulation(value)[source]¶
Bases:
EnumHow a drive channel’s operator is time-modulated.
SINGLE_TONE— microwave IQ-style carrier mixing. In the lab frame the raw signal is mixed withexp(-i·2π·ν_d·t)and projected to its real part; under RWA the signal is decomposed into co- and counter-rotating components per Fourier band (Krantz et al. 2019, Eq. 89–90).DIRECT_REAL— real-valued baseband coupling (no carrier, no RWA), appropriate for flux-like drives (Koch et al. 2007, Sec. II; Krantz et al. 2019, Sec. V.A on flux tunability).EDGE_PUMP— real pump δ(t) on a modulable coupling’s strength: basebandδ(t) = Re s(t)when the scheduled op has no carrier, single-toneδ(t) = Re[s(t)·e^{-i·2π·ν_d·t}]when it does. The tone is never RWA-split — the coupling’s parametric hook already selected the retained operator structure (Didier et al., PRA 97, 022330 (2018) on parametric gate activation).
The engine dispatches on this tag in a single code path; adding a new modulation kind is an infrastructure change, not a per-drive special case.
- SINGLE_TONE = 'single_tone'¶
- DIRECT_REAL = 'direct_real'¶
- EDGE_PUMP = 'edge_pump'¶
- class quchip.control.ChargeDrive(target=None, *, label=None, rwa=None)[source]¶
Bases:
BaseDriveMicrowave charge drive on a transmon-like device.
Contributes the standard charge-coupling Hamiltonian
\[H_d(t) = \epsilon(t)\, i(\hat a - \hat a^\dagger)\]with \(\epsilon(t)\) the (real-projected) mixed signal built by the
SINGLE_TONEdispatch in stage 2. This is the canonical transmon microwave drive (Koch et al., PRA 76, 042319 (2007); Krantz et al., APR 6, 021318 (2019), Eq. 90).Examples
>>> from quchip import DuffingTransmon, ChargeDrive, Gaussian >>> q = DuffingTransmon(freq=5.0, anharmonicity=-0.25, levels=3) >>> drive = ChargeDrive(target=q) >>> channels = drive.local_channels(q) >>> len(channels) == 1 True
- Parameters:
target (BaseDevice | None)
label (str | None)
rwa (bool | None)
- class quchip.control.DriveChannel(operator, modulation)[source]¶
Bases:
objectOne Hamiltonian channel exposed by a drive on a target device.
A channel pairs a local-basis operator with a
DriveModulationtag that tells the engine how the channel’s coefficient is built from the drive’s line signal. A drive may expose multiple channels if, for example, it contributes both in-phase and quadrature couplings.- Parameters:
operator (Any)
modulation (DriveModulation)
- modulation: DriveModulation¶
- class quchip.control.FluxDrive(target=None, *, label=None, rwa=None)[source]¶
Bases:
BaseDriveReal-valued flux drive coupling to \(\hat n\).
Uses
DIRECT_REAL— no carrier, no RWA — as appropriate for a baseband flux line that modulates the device frequency through its number operator (Koch et al. 2007, Sec. II; Krantz et al. 2019, Sec. V.A on flux tunability).The
rwakwarg is rejected: applying RWA to a baseband drive is ill-defined.Examples
>>> from quchip import DuffingTransmon, FluxDrive >>> q = DuffingTransmon(freq=5.0, anharmonicity=-0.25, levels=3) >>> flux = FluxDrive(target=q) >>> flux.rwa is None True
- Parameters:
target (BaseDevice | None)
label (str | None)
rwa (bool | None)
- class quchip.control.ParametricDrive(coupling, *, label=None, **kwargs)[source]¶
Bases:
BaseDriveControl line pumping a modulable coupling’s strength δ(t) in GHz.
Targets a coupling (object or label string; labels late-bind via
Chip.connect()). The scheduled envelope is the real amplitudeA(t): with an explicitfreqthe pump isδ(t) = A(t)·cos(2π·freq·t - phase); withfreqomitted the pump is baseband,δ(t) = A(t)directly. The pump tone is never RWA-split — the coupling’s RWA policy selects the operator structure via its parametric hook; the tone keeps both sidebands (declared, the solver integrates the fast one).Accepted couplings implement
parametric_interaction(); a static coupling raisesTypeErrornaming the hook.- Parameters:
coupling (BaseCoupling | str) – Modulable coupling to pump, given as the coupling object or its label. A string label late-binds to the coupling instance via
Chip.connect().label (str | None) – Optional explicit label; otherwise auto-generated from
"parametric".kwargs (Any)
- Raises:
TypeError – coupling does not implement
parametric_interaction()(a static coupling), or an unexpected keyword argument is passed.ValueError – An explicit
rwakeyword argument is passed — the RWA policy is fixed by the coupling’s parametric hook, not per-drive.
- target_kind: ClassVar[str] = 'edge'¶
"device"for drives targeting a device (the default),"edge"for drives targeting a coupling (seeParametricDrive).- Type:
Structural dispatch key for equipment/chip/sequence code
- property device_label: None¶
an edge pump has no device target.
Device-keyed paths (drive-noise collection, device-line bookkeeping) treat
Noneas “skip this line”; edge code readstarget_labelinstead.- Type:
Always
None
- connect(coupling)[source]¶
Rebind to coupling (no device-side handshake — couplings hold no drive list).
- Parameters:
coupling (Any)
- Return type:
None
- class quchip.control.PhaseDrive(target=None, *, label=None, rwa=None)[source]¶
Bases:
BaseDriveMicrowave phase drive coupling to \(\hat a + \hat a^\dagger\).
Same carrier machinery as
ChargeDrivebut with an in-phase (rather than quadrature) coupling. Useful when modeling phase-noise channels or drives whose physical coupling is already referenced to the field quadrature. See Krantz et al. 2019, Sec. IV.A for the two conventions.- Parameters:
target (BaseDevice | None)
label (str | None)
rwa (bool | None)
- class quchip.control.TwoPhotonDrive(target=None, *, label=None, rwa=None)[source]¶
Bases:
BaseDriveParametric two-photon drive for Kerr-cat qubit stabilisation.
Coupling operator:
a^2 + a_dag^2The drive should be scheduled at twice the cavity frequency (
freq = 2 * cavity.freq) so that in the rotating frame the interaction is static:eps2(t) * (a_dag^2 + a^2). This combination of Kerr nonlinearity and two-photon drive creates and stabilises cat states.Uses the standard
DriveModulation.SINGLE_TONEcarrier dispatch – no engine modifications required. The engine band-decomposesa^2 + a_dag^2into bands of excitation weight Delta_n = +2 and Delta_n = -2, attaching the correct two-photon carrier automatically.SINGLE_TONE’s real-field projection contributes only half the scheduled envelope amplitude to each band: the coefficient landing on
a_dag^2 + a^2in the rotating frame isA(t)/2, whereA(t)is the amplitude scheduled on this drive’s envelope. Scheduleamplitude=2*eps2(t)to realize the target two-photon drive strengtheps2(t)used above and inalpha^2 = eps2/K.- Parameters:
target (BaseDevice | None) – Device to connect this drive to.
Nonemeans unconnected.label (str | None) – Optional explicit label; otherwise auto-generated.
rwa (bool | None) – Per-drive RWA override.
Nonemeans follow the chip-level setting.
References
Examples
>>> from quchip.devices.kerr_cavity import KerrCavity >>> from quchip.control.drives_two_photon import TwoPhotonDrive >>> cav = KerrCavity(freq=5.0, kerr=1.0, levels=10, label="cav") >>> d2 = TwoPhotonDrive(target=cav) >>> channels = d2.local_channels(cav) >>> len(channels) 1
- local_channels(device)[source]¶
Return the two-photon coupling channel
a^2 + a_dag^2.- Parameters:
device (BaseDevice) – The cavity device being driven.
- Returns:
One channel with operator
a^2 + a_dag^2andDriveModulation.SINGLE_TONEmodulation.- Return type:
- class quchip.control.ControlEquipment(lines, *, signal_chain=None)[source]¶
Bases:
objectOrdered drive lines plus a sequence of signal-chain transforms.
Drives produce raw line signals; the equipment pipes them through
signal_chainin order before the engine assembles Hamiltonian terms.- Parameters:
signal_chain (list[SignalTransform] | None)
- property signal_chain: list[SignalTransform]¶
Signal-chain transforms (defensive copy).
- apply_signal_chain(signals)[source]¶
Apply every signal-chain transform to signals, in order.
Each transform receives the previous transform’s output, so transforms compose sequentially: reordering
signal_chainchanges the result (e.g. aDelayapplied before aGainsees the undelayed signal).- Parameters:
signals (SignalMap) –
{(drive_label, drive_index): SignalProgram}map of raw line signals.drive_indexdistinguishes multiple ops on the same drive line and is assigned by the engine when it enumerates the chip’s scheduled drive ops.- Returns:
Transformed signal map. May contain keys absent from signals: a
Crosstalktransform, for example, adds an entry under the victim drive’s label for every source entry it leaks from.- Return type:
SignalMap
- crosstalk_matrix()[source]¶
Return a dense matrix view of the
Crosstalktransforms.The matrix uses wiring order (
self.lines) as the stable axis ordering. Column index = source drive, row index = victim drive. Diagonal entries arebeta=1,theta=0,delay=0by convention (self-coupling). Off-diagonal entries aggregate everyCrosstalktransform present in the signal chain; lines with no corresponding transform contribute zeros.Non-
Crosstalktransforms (Gain,Delay) are ignored here; this is strictly a view of the crosstalk edges.- Returns:
labels(wiring order),beta,theta,delayas[n, n]arrays. Arrays usejax.numpywhen any stored entry is a JAX tracer or array, otherwisenumpy.- Return type:
- set_crosstalk_matrix(beta, theta=None, delay=None, *, labels=None)[source]¶
Rehydrate the crosstalk edges from dense matrices.
Removes every crosstalk transform currently in the signal chain and replaces them with one
CrosstalkMatrix. Other signal-chain transforms (Gain,Delay, and user-defined subclasses) are preserved in order.- Parameters:
beta (Any) –
[n, n]amplitude matrix.beta[i, j]is emitted as the leakage amplitude from sourcelabels[j]onto victimlabels[i]. Diagonal entries are ignored (self-coupling belongs to the drive itself, not to a crosstalk edge).theta (Any, optional) –
[n, n]phase matrix (radians). Defaults to zeros.delay (Any, optional) –
[n, n]delay matrix (ns). Defaults to zeros.labels (tuple[str, ...] | list[str] | None, optional) – Axis ordering. Defaults to wiring order (
self.lines). Must matchbeta.shape[0].
- Return type:
None
Notes
Traced JAX entries flow unchanged into
CrosstalkMatrixand therefore into the signal-program IR. No concretization occurs.
- copy(device_map, coupling_map=None)[source]¶
Return a structural copy with drive lines rebound to device_map / coupling_map.
Edge lines (
target_kind == "edge") rebind via coupling_map, keyed by coupling label; device lines rebind via device_map as before.
- classmethod from_dict(d, dev_map, coupling_map=None)[source]¶
Reconstruct from
to_dict()output, rebinding drives via dev_map / coupling_map.Each line’s
target_labelis resolved against dev_map first, then coupling_map — device and coupling labels are disjoint by Chip construction, so at most one map holds the label.
- class quchip.control.CrosstalkMatrix(labels, beta, theta, delay)[source]¶
Bases:
SignalTransformDense crosstalk transform and matrix view in control-line order.
- labels¶
Drive labels in wiring order (the order drives appear in
ControlEquipment.lines). Row / columnicorresponds tolabels[i].
- beta¶
[n, n]amplitude matrix.beta[i, j]is the leakage amplitude from sourcelabels[j]onto victimlabels[i](column = source, row = victim). Diagonals represent self-coupling and are conventionally1.0.- Type:
Any
- theta¶
[n, n]phase matrix (radians), same indexing asbeta.- Type:
Any
- delay¶
[n, n]delay matrix (ns), same indexing asbeta.- Type:
Any
Notes
Every off-diagonal edge reads the same input signal map, so reciprocal entries form one linear mixing stage without recursively leaking one another’s output. Matrix entries flow directly into the signal-program IR (
PolarScale/Shift), preserving end-to-end JAX traceability.- apply(signals)[source]¶
Apply all directed leakage edges to one shared input snapshot.
- Parameters:
signals (dict[tuple[str, int], SignalNode])
- Return type:
dict[tuple[str, int], SignalNode]
- without_line(line)[source]¶
Return this transform without line, or
Nonewhen it must be dropped.- Parameters:
line (str)
- Return type:
CrosstalkMatrix | None
- classmethod from_dict(d)[source]¶
Reconstruct from
to_dict()output.On the registry root, dispatch to the concrete subclass named by
data["type"](forwarding*args/**kwargs). On a concrete subclass, defer to_from_dict_payload(). Concrete subclasses that carry payload override this method directly.- Parameters:
- Return type:
- class quchip.control.Gaussian(duration, sigmas=3, amplitude=1.0)[source]¶
Bases:
EnvelopeShapeCentered Gaussian pulse.
\[E(t) = A \exp\!\left[-\frac{(t - \tau/2)^2}{2 \sigma^2}\right], \qquad \sigma = \frac{\tau}{2 N_\sigma}.\]The
sigmasparameter \(N_\sigma\) is the number of standard deviations from the pulse center to its edge att = 0ort = duration. Gaussian pulses minimize spectral leakage onto higher transmon levels and are the starting point for DRAG corrections (Motzoi et al., PRL 103, 110501 (2009)).The scheduled window
[0, duration]starts and ends atamplitude * exp(-sigmas**2 / 2), not zero — about0.011 * amplitudeat the defaultsigmas=3. The pulse turns on and off with that jump; the Gaussian waveform itself is unchanged.- duration: Any = Parameter(default=<object object>, positive=True, nonnegative=False, serialize=True, unit='ns')¶
- class quchip.control.GaussianEdge(duration, edge_duration, sigmas=3, amplitude=1.0)[source]¶
Bases:
EnvelopeShapeFlat-top pulse with Gaussian ramp-up and ramp-down edges.
Each edge is a Gaussian of width \(\sigma = \tau_e / (2 N_\sigma)\) where \(\tau_e\) =
edge_duration; the plateau between edges holds a constant amplitude \(A\). Totaldurationincludes both edges. Commonly used for two-qubit gates (Krantz et al. 2019, Sec. IV.C) because the flat top sets the gate area while the Gaussian edges suppress spectral leakage.- Parameters:
See also
SquareWithGaussianEdgesSame shape parameterized by
edge_frac(fraction) instead of absoluteedge_duration.
References
Krantz et al., APR 6, 021318 (2019), Sec. IV.C.
- duration: Any = Parameter(default=<object object>, positive=True, nonnegative=False, serialize=True, unit='ns')¶
- edge_duration: Any = Parameter(default=<object object>, positive=True, nonnegative=False, serialize=True, unit='ns')¶
- amplitude: Any = Parameter(default=1.0, positive=False, nonnegative=False, serialize=True, unit=None)¶
- class quchip.control.LinearRamp(duration, ramp_duration, amplitude=1.0)[source]¶
Bases:
EnvelopeShapeLinearly rising ramp that holds at peak amplitude.
The envelope rises linearly from 0 to
amplitudeover the firstramp_durationnanoseconds, then holds constant atamplitudefor the remainder of the pulse.\[E(t) = A \cdot \min\!\left(\frac{t}{\tau_r},\, 1\right), \qquad 0 \le t \le \tau,\]where \(\tau_r\) is
ramp_durationand \(\tau\) isduration.- Parameters:
Notes
For an adiabatic ramp into a Kerr-cat qubit, choose
ramp_durationlong compared to1 / (2 * K)(the inverse gap at the bifurcation point). See Grimm et al., Nature 584, 205 (2020).The waveform is JAX-traceable:
ramp_durationandamplitudemay be JAX tracers so the ramp parameters are differentiable.Examples
>>> from quchip.control.envelopes import LinearRamp >>> ramp = LinearRamp(duration=60.0, ramp_duration=50.0, amplitude=4.0) >>> import numpy as np >>> t = np.array([0.0, 25.0, 50.0, 55.0]) >>> np.real(ramp.waveform(t)).tolist() [0.0, 2.0, 4.0, 4.0]
- duration: Any = Parameter(default=<object object>, positive=True, nonnegative=False, serialize=True, unit='ns')¶
- ramp_duration: Any = Parameter(default=<object object>, positive=True, nonnegative=False, serialize=True, unit='ns')¶
- amplitude: Any = Parameter(default=1.0, positive=False, nonnegative=False, serialize=True, unit=None)¶
- class quchip.control.Square(duration, amplitude=1.0, phase=0.0)[source]¶
Bases:
EnvelopeShapeConstant-amplitude pulse with optional global phase.
\[E(t) = A\, e^{i\phi}, \qquad 0 \le t \le \tau.\]- Parameters:
- duration: Any = Parameter(default=<object object>, positive=True, nonnegative=False, serialize=True, unit='ns')¶
- class quchip.control.SquareWithGaussianEdges(duration, amplitude=1.0, edge_frac=0.25, sigmas=3)[source]¶
Bases:
EnvelopeShapeFlat-top pulse with Gaussian ramp-up and ramp-down edges.
Each ramp has duration \(\tau_e = f_e \cdot \tau\) with \(f_e\) =
edge_frac; the plateau between ramps holds amplitude \(A\). Totaldurationincludes both edges. The Gaussian width is \(\sigma = \tau_e / (2 N_\sigma)\) with \(N_\sigma\) =sigmas.This is the canonical shape used in Krantz et al. 2019 (Sec. IV.C) for two-qubit gates — the flat top sets the gate area while the Gaussian edges suppress spectral leakage. Parametrizing the ramp as a fraction of the total duration makes the shape shape-invariant under changes of
duration.- Parameters:
duration (float) – Total pulse length in ns (includes both ramps).
amplitude (float) – Plateau amplitude \(A\).
edge_frac (float) – Ramp length as a fraction of the total duration. Must satisfy
0 < edge_fracand2 * edge_frac <= 1.sigmas (float) – Number of standard deviations spanned by each ramp.
- duration: Any = Parameter(default=<object object>, positive=True, nonnegative=False, serialize=True, unit='ns')¶
- amplitude: Any = Parameter(default=1.0, positive=False, nonnegative=False, serialize=True, unit=None)¶
Modules
Batch / sweep-axis machinery for |
|
Drive classes and Hamiltonian channel definitions. |
|
TwoPhotonDrive -- parametric two-photon drive for Kerr-cat qubits. |
|
Pulse envelope models for quantum control. |
|
Control-equipment container: drive lines and signal chain. |
|
Declarative pulse programming for a |
|
Signal-chain transforms for control equipment. |
|
Frame-agnostic drive signal specifications. |