Source code for quantify_scheduler.schedules.two_qubit_transmon_schedules

# Repository:
# Licensed according to the LICENCE file on the main branch
"""Module containing schedules for common two qubit experiments (transmon)."""
from __future__ import annotations

import numpy as np

from quantify_scheduler.operations.gate_library import Measure, Reset, X
from quantify_scheduler.operations.pulse_library import SquarePulse
from quantify_scheduler.schedules.schedule import Schedule

[docs] def chevron_cz_sched( lf_qubit: str, hf_qubit: str, amplitudes: float | np.ndarray, duration: float, flux_port: str | None = None, repetitions: int = 1, ) -> Schedule: r""" Chevron CZ calibration schedule that measures coupling of a qubit pair. This experiment provides information about the location of the :math:`|11\rangle \leftrightarrow |02\rangle` avoided crossing and distortions in the flux-control line. .. admonition:: Schedule sequence :class: tip .. jupyter-execute:: from quantify_scheduler.schedules.two_qubit_transmon_schedules import ( chevron_cz_sched ) sched = chevron_cz_sched( lf_qubit="q0", hf_qubit="q1", amplitudes=0.5, duration=20e-9, ) sched.plot_circuit_diagram(); .. note:: This schedule uses a unipolar square flux pulse, which will cause distortions and leakage. For a high quality CZ gate, distortions should be corrected for by modelling and subsequently inverting the transfer function of the flux-control line. See e.g. :cite:t:`Jerger2019` or :cite:t:`Rol2020` for more information. Parameters ---------- lf_qubit The name of a qubit, e.g., "q0", the qubit with lower frequency. hf_qubit The name of coupled qubit, the qubit with the higher frequency. amplitudes An array (or scalar) of the flux pulse amplitude(s) in V. duration A scalar specifying the flux pulse duration in s. flux_port An optional string for a flux port. If ``None``, this will default to the ``hf_qubit`` flux port (``"{hf_qubit}:fl"``). repetitions The amount of times the Schedule will be repeated. Returns ------- : An experiment schedule. """ sched = Schedule("Two-qubit Chevron CZ schedule", repetitions) # Ensure amplitudes is an iterable when passing a float amplitudes = np.asarray(amplitudes) amplitudes = amplitudes.reshape(amplitudes.shape or (1,)) # Set flux port flux_port = flux_port if flux_port is not None else f"{hf_qubit}:fl" for acq_index, amp in enumerate(amplitudes): # Reset to |00> sched.add(Reset(lf_qubit, hf_qubit), label=f"Reset {acq_index}") # Prepare |11> excite_lf = sched.add(X(lf_qubit), label=f"X({lf_qubit}) {acq_index}") sched.add( X(hf_qubit), ref_op=excite_lf, ref_pt="start", label=f"X({hf_qubit}) {acq_index}", ) # Go to |11> <=> |02> avoided crossing and come back sched.add( SquarePulse( amp=amp, duration=duration, port=flux_port, clock="cl0.baseband", ), label=f"SquarePulse({flux_port}) {acq_index}", ) # Measure system sched.add( Measure(lf_qubit, hf_qubit, acq_index=acq_index), label=f"Measure({lf_qubit},{hf_qubit}) {acq_index}", ) return sched