Source code for qblox_scheduler.backends.qblox.schedule
# Repository: https://gitlab.com/qblox/packages/software/qblox-scheduler
# Licensed according to the LICENSE file on the main branch
#
# Copyright 2020-2025, Quantify Consortium
# Copyright 2025, Qblox B.V.
"""Qblox backend specific schedule classes and associated utilities."""
from collections import UserDict
from typing import Any
from IPython.display import display
from qblox_scheduler.backends.qblox.visualization import _display_compiled_instructions
from qblox_scheduler.helpers.importers import export_python_object_to_path_string
[docs]
class CompiledInstructions(UserDict):
"""
Create an interactive table that represents the compiled instructions.
When displayed in an interactive environment such as a jupyter notebook, the
dictionary is displayed as an interactive table (if supported by the
backend), otherwise is displayed as a regular dictionary. Each key from the
compiled instructions can be retrieved with the usual ``[key]`` and
``.get(key)`` syntax. A raw dictionary can also be obtained via the
``.data`` attribute.
These values typically contain a combination of sequence files, waveform
definitions, and parameters to configure on the instrument.
See examples below as well.
.. admonition:: Examples
.. admonition:: Example
.. jupyter-execute::
:hide-code:
from qblox_scheduler import (
BasicTransmonElement,
QuantumDevice,
SerialCompiler,
TimeableSchedule,
)
from qblox_scheduler.operations import (
Measure,
Reset,
X,
Y,
)
from qblox_scheduler.schemas.examples import utils
from qcodes.instrument import Instrument
Instrument.close_all()
q0 = BasicTransmonElement("q0")
q4 = BasicTransmonElement("q4")
for qubit in [q0, q4]:
qubit.rxy.amp180 = 0.115
qubit.rxy.beta = 2.5e-10
qubit.clock_freqs.f01 = 7.3e9
qubit.clock_freqs.f12 = 7.0e9
qubit.clock_freqs.readout = 8.0e9
qubit.measure.acq_delay = 100e-9
quantum_device = QuantumDevice(name="quantum_device0")
quantum_device.add_element(q0)
quantum_device.add_element(q4)
hardware_config = utils.load_json_example_scheme(
"qblox_hardware_config_transmon.json"
)
quantum_device.hardware_config = hardware_config
compiler = SerialCompiler("compiler")
compiler.quantum_device = quantum_device
.. jupyter-execute::
schedule = TimeableSchedule("demo compiled instructions")
schedule.add(Reset("q0", "q4"))
schedule.add(X("q0"))
schedule.add(Y("q4"))
schedule.add(Measure("q0", acq_channel=0, acq_protocol="ThresholdedAcquisition"))
schedule.add(Measure("q4", acq_channel=1, acq_protocol="ThresholdedAcquisition"))
compiled_schedule = compiler.compile(schedule)
compiled_instructions = compiled_schedule.compiled_instructions
compiled_instructions
.. admonition:: CompiledInstructions behave like dictionaries
.. jupyter-execute::
compiled_instructions["cluster0"]["cluster0_module4"]["sequencers"]["seq0"].integration_length_acq
Parameters
----------
compiled_instructions: dict
Instructions in a dictionary form that are sent to the hardware.
"""
# note for developers: We're inheriting from UserDict so that an instance of
# CompiledInstructions behaves as a regular dictionary with all the
# __get_item__ and similar methods.
def __init__(
self,
compiled_instructions: dict[Any, Any],
) -> None:
[docs]
self.data = compiled_instructions
"""The raw compiled instructions in a dictionary form."""
[docs]
def _ipython_display_(self) -> None:
"""Generate interactive table when running in jupyter notebook."""
tab = _display_compiled_instructions(self.data)
display(tab)
def __repr__(self) -> str:
return str(self.data)
def __setstate__(self, state: dict[str, dict]) -> None:
self.data = state["data"]
def __getstate__(self) -> dict[str, Any]:
return {
"deserialization_type": export_python_object_to_path_string(self.__class__),
"data": self.data,
}