---
file_format: mystnb
kernelspec:
name: python3
---
# Deprecated code suggestions
```{seealso}
Download the notebook: {nb-download}`deprecated.ipynb`
```
| **Target** | **Deprecated** | **Removed** | **Alternatives** |
|---|---|---|---|
| `convert_hw_config_to_portclock_configs_spec` | 0.13 | - | See {ref}`Qblox Hardware Configuration` |
| `instruction_generated_pulses_enabled` hardware configuration setting | 0.13 | - | See {ref}`Instruction-generated pulses (Qblox only)` |
| `quantify_scheduler.visualization` | 0.12 | 0.15 | See {ref}`Circuit diagrams and pulse diagrams` |
| `acq_channel` (in {class}`~quantify_scheduler.operations.gate_library.Measure` and {class}`~quantify_scheduler.operations.nv_native_library.CRCount`) | 0.10 | 0.12 | See {ref}`acq_channel` |
| `quantify_scheduler.compilation.qcompile`
`quantify_scheduler.compilation.device_compile`
`quantify_scheduler.compilation.hardware_compile` | 0.10 | 0.12 | See {ref}`Qcompile => SerialCompiler` |
| The `data` parameter in `Operation` subclasses | 0.9 | 0.15 | - |
| Old Qblox hardware configuration | 0.8 | 0.12 | See {ref}`Qblox Hardware Configuration` |
| `TransmonElement` | 0.7 | 0.12 | See {ref}`TransmonElement => BasicTransmonElement` |
| `add_pulse_information_transmon` | 0.6 | 0.12 | See {ref}`add_pulse_information_transmon => compile_circuit_to_device` |
| `plot_circuit_diagram_mpl` | 0.6 | 0.9 | {meth}`~quantify_scheduler.schedules.schedule.ScheduleBase.plot_circuit_diagram` |
| `plot_pulse_diagram_mpl` | 0.6 | 0.9 | {meth}`~quantify_scheduler.schedules.schedule.ScheduleBase.plot_pulse_diagram` |
As of `quantify-scheduler==0.10.0`, deprecation warnings are shown by default (as `FutureWarning`).
## Compilation Setup
```{code-cell} ipython3
---
tags: [hide-cell]
mystnb:
code_prompt_show: "Set up an InstrumentCoordinator, MeasurementControl and a Cluster"
---
from quantify_core.data import handling as dh
from quantify_core.measurement.control import MeasurementControl
from quantify_scheduler.instrument_coordinator import InstrumentCoordinator
from quantify_scheduler.instrument_coordinator.components.qblox import ClusterComponent
from qblox_instruments import Cluster, ClusterType
from qcodes import Instrument
dh.set_datadir(dh.default_datadir())
Instrument.close_all()
meas_ctrl = MeasurementControl("meas_ctrl")
ic = InstrumentCoordinator("ic")
cluster = Cluster(
"cluster",
dummy_cfg={
1: ClusterType.CLUSTER_QRM_RF,
},
)
ic_cluster = ClusterComponent(cluster)
ic.add_component(ic_cluster)
# Always picks the first module of a certain type, and ignores the others of same type!
qcm_rf, qrm_rf, qcm, qrm = [None] * 4
for module in cluster.modules:
try:
if module.is_rf_type:
if module.is_qcm_type:
if qcm_rf is None:
qcm_rf = module
else:
if qrm_rf is None:
qrm_rf = module
else:
if module.is_qcm_type:
if qcm is None:
qcm = module
else:
if qrm is None:
qrm = module
except KeyError:
continue
print(f"qcm => {qcm}\nqrm => {qrm}\nqcm_rf => {qcm_rf}\nqrm_rf => {qrm_rf}")
```
```{code-cell} ipython3
---
tags: [hide-cell]
mystnb:
code_prompt_show: "Set up a QuantumDevice with one BasicTransmonElement"
---
from quantify_scheduler.device_under_test.quantum_device import QuantumDevice
from quantify_scheduler.device_under_test.transmon_element import BasicTransmonElement
q0 = BasicTransmonElement("q0")
quantum_device = QuantumDevice("quantum_device")
quantum_device.add_element(q0)
quantum_device.instr_measurement_control(meas_ctrl.name)
quantum_device.instr_instrument_coordinator(ic.name)
q0.clock_freqs.f01(7.3e9)
q0.clock_freqs.f12(7.0e9)
q0.clock_freqs.readout(8.2e9)
q0.measure.acq_delay(100e-9)
q0.measure.acq_channel(0)
q0.measure.pulse_amp(0.2)
device_cfg = quantum_device.generate_device_config()
```
```{code-cell} ipython3
---
tags: [hide-cell]
mystnb:
code_prompt_show: "Provide the hardware configuration"
---
hardware_cfg = {
"backend": "quantify_scheduler.backends.qblox_backend.hardware_compile",
"cluster": {
"ref": "internal",
"instrument_type": "Cluster",
f"cluster_module{qrm_rf.slot_idx}": {
"instrument_type": "QRM_RF",
"complex_output_0": {
"lo_freq": 2e9,
"portclock_configs": [
{
"port": "q0:res",
"clock": "q0.ro",
},
],
},
},
},
}
```
```{code-cell} ipython3
---
tags: [hide-cell]
mystnb:
code_prompt_show: "Define a simple schedule function"
---
from quantify_scheduler import Schedule
from quantify_scheduler.operations.gate_library import Measure, Reset
from quantify_scheduler.operations.pulse_library import DRAGPulse
from quantify_scheduler.resources import ClockResource
def simple_trace_sched(
repetitions: int,
pulse_amp: float = 0.2,
) -> Schedule:
sched = Schedule("Simple trace schedule", repetitions)
port = "q0:res"
clock = "q0.ro"
sched.add(Reset("q0"))
sched.add(Measure("q0", acq_index=0, acq_protocol="Trace"))
sched.add(
DRAGPulse(
G_amp=pulse_amp,
D_amp=0,
phase=0,
duration=160e-9,
port=port,
clock=clock,
)
)
return sched
sched = simple_trace_sched(repetitions=1)
```
## Circuit diagrams and pulse diagrams
The functions to plot circuit and pulse diagrams have moved to a private module in version 0.12.0.
Instead, to plot circuit and pulse diagrams, call, directly on the schedule, {meth}`~quantify_scheduler.schedules.schedule.ScheduleBase.plot_circuit_diagram` and {meth}`~quantify_scheduler.schedules.schedule.ScheduleBase.plot_pulse_diagram`.
For example, the line
```python
pulse_diagram_plotly(schedule)
pulse_diagram_matplotlib(schedule)
```
should now be written as
```python
schedule.plot_pulse_diagram(plot_backend="plotly")
schedule.plot_pulse_diagram(plot_backend="mpl")
```
More examples can be found in the {ref}`Schedules and Pulses` and {ref}`Operations and Qubits` tutorials.
## acq_channel
In the {class}`~quantify_scheduler.operations.gate_library.Measure` and {class}`~quantify_scheduler.operations.nv_native_library.CRCount` classes, the `acq_channel` parameter has been removed from the initializers. For gate-level operations, the acquisition channel can be set in the {class}`~quantify_scheduler.device_under_test.device_element.DeviceElement` subclasses, such as {class}`~quantify_scheduler.device_under_test.transmon_element.BasicTransmonElement`, instead. See, for example, `q0.measure.acq_channel(0)` in the {ref}`Compilation Setup`.
## Qcompile => SerialCompiler
The `qcompile`, `device_compile` and `hardware_compile` compilation functions have been replaced by the {class}`~quantify_scheduler.backends.graph_compilation.SerialCompiler`. For step-by-step guides on how to perform compilation to the device level and hardware, please see {ref}`Compiling to Hardware` and {ref}`Operations and Qubits`. A brief example is shown below.
First, run {ref}`Compilation Setup`.
```{code-cell} ipython3
# Old way:
# from quantify_scheduler.compilation import qcompile
# compiled_schedule = qcompile(sched, device_cfg, hardware_cfg)
```
```{code-cell} ipython3
from quantify_scheduler.backends.graph_compilation import SerialCompiler
quantum_device.hardware_config(hardware_cfg)
compiler = SerialCompiler(name="compiler")
compiled_schedule = compiler.compile(
schedule=sched, config=quantum_device.generate_compilation_config()
)
```
```{code-cell} ipython3
compiled_schedule.timing_table
```
## add_pulse_information_transmon => compile_circuit_to_device
The compilation step `add_pulse_information_transmon` has been replaced by `compile_circuit_to_device`. For steps on how to add device configuration to your compilation steps, please see {ref}`Operations and Qubits`.
## Qblox Hardware Configuration
In quantify-scheduler 0.8.0, the schema for the Qblox hardware configuration was revised. From version 0.13.0, old hardware configurations will no longer be automatically converted. Below is a summary of the changes.
1. `seqx` => `portclock_configs`
1. `latency_correction` => standalone/top-level `latency_corrections`
1. `line_gain_db` removed
The code below can be used to convert old-style to new-style hardware configurations.
Note that helper function `convert_hw_config_to_portclock_configs_spec` will be removed in version 0.17.0.
```{code-cell} ipython3
depr_hardware_cfg = {
"backend": "quantify_scheduler.backends.qblox_backend.hardware_compile",
"cluster": {
"ref": "internal",
"instrument_type": "Cluster",
"cluster_module1": {
"instrument_type": "QRM_RF",
"complex_output_0": {
"line_gain_db": 0,
"seq0": {
"port": "q6:res",
"clock": "q6.ro",
"latency_correction": 4e-9,
},
"seq1": {
"port": "q1:res",
"clock": "q1.ro",
},
},
},
},
}
```
```{code-cell} ipython3
from quantify_scheduler.backends.qblox.helpers import (
convert_hw_config_to_portclock_configs_spec,
)
new_hardware_cfg = convert_hw_config_to_portclock_configs_spec(depr_hardware_cfg)
fnc = lambda sub: {
key1: fnc(val1) if isinstance(val1, dict) else val1
for key1, val1 in sub.items()
if key1 != "line_gain_db"
}
new_hardware_cfg = fnc(new_hardware_cfg)
```
```{code-cell} ipython3
import json
print(json.dumps(new_hardware_cfg, indent=4))
```
## TransmonElement => BasicTransmonElement
In quantify-scheduler 0.7.0, the {class}`~quantify_scheduler.device_under_test.transmon_element.BasicTransmonElement` class was added and replaced the `TransmonElement` class.
```{code-cell} ipython3
---
tags:
- hide-cell
---
from qcodes import Instrument
Instrument.close_all()
```
```{code-cell} ipython3
# Before:
# from quantify_scheduler.device_under_test.transmon_element import TransmonElement
# transmon = TransmonElement("transmon")
# print(f"{transmon.name}: {list(transmon.parameters.keys())}")
# After:
from quantify_scheduler.device_under_test.transmon_element import BasicTransmonElement
basic = BasicTransmonElement("basic")
print(f"{basic.name}: {list(basic.parameters.keys()) + list(basic.submodules.keys())}")
for submodule_name, submodule in basic.submodules.items():
print(f"{basic.name}.{submodule_name}: {list(submodule.parameters.keys())}")
```
The block below shows how the attributes of the `TransmonElement` (`transmon`) are converted to attributes of the `BasicTransmonElement` (`basic`).
```
transmon.IDN => basic.IDN
transmon.instrument_coordinator => None
transmon.init_duration => basic.reset.duration
transmon.mw_amp180 => basic.rxy.amp180
transmon.mw_motzoi => basic.rxy.motzoi
transmon.mw_pulse_duration => basic.rxy.duration
transmon.mw_ef_amp180 => None
transmon.mw_port => basic.ports.microwave
transmon.fl_port => basic.ports.flux
transmon.ro_port => basic.ports.readout
transmon.mw_01_clock => no longer settable, always "basic.01"
transmon.mw_12_clock => no longer settable, always "basic.12"
transmon.ro_clock => no longer settable, always "basic.ro"
transmon.freq_01 => basic.clock_freqs.f01
transmon.freq_12 => basic.clock_freqs.f12
transmon.ro_freq => basic.clock_freqs.readout
transmon.ro_pulse_amp => basic.measure.pulse_amp
transmon.ro_pulse_duration => basic.measure.pulse_duration
transmon.ro_pulse_type => basic.measure.pulse_type
transmon.ro_pulse_delay => via: schedule.add(..., rel_time=...)
transmon.ro_acq_channel => basic.measure.acq_channel
transmon.ro_acq_delay => basic.measure.acq_delay
transmon.ro_acq_integration_time => basic.measure.integration_time
transmon.spec_pulse_duration => via: schedule.add(SpectroscopyOperation("basic")), not implemented for BasicTransmonElement, see BasicElectronicNVElement.spectroscopy_operation
transmon.spec_pulse_frequency => via: schedule.add(SpectroscopyOperation("basic")), not implemented for BasicTransmonElement, see BasicElectronicNVElement.spectroscopy_operation
transmon.spec_pulse_amp => via: schedule.add(SpectroscopyOperation("basic")), not implemented for BasicTransmonElement, see BasicElectronicNVElement.spectroscopy_operation
transmon.spec_pulse_clock => via: schedule.add(SpectroscopyOperation("basic")), not implemented for BasicTransmonElement, see BasicElectronicNVElement.spectroscopy_operation
transmon.acquisition => via: schedule.add(Measure("basic", acq_protocol=...))
transmon.ro_acq_weight_type => basic.measure.acq_weight_type
schedule.add(Measure("transmon", acq_channel=...)) => basic.measure.acq_channel
```
Both classes will generate the same device configuration.
```{code-cell} ipython3
import pprint
# device_config_transmon = transmon.generate_device_config().dict()
# pprint.pprint(device_config_transmon)
device_config_basic_transmon = basic.generate_device_config().dict()
pprint.pprint(device_config_basic_transmon)
```
## Instruction-generated pulses (Qblox only)
Instead of using the ``instruction_generated_pulses_enabled: True`` field in the port-clock configuration for generating long square and staircase pulses (see {ref}`Instruction generated pulses `), you can now create long square, staircase and ramp waveforms (that would otherwise not fit in memory), by creating these operations with the following helper functions.
```{code-cell} ipython3
from quantify_scheduler.operations.pulse_factories import (
long_ramp_pulse,
long_square_pulse,
staircase_pulse,
)
ramp_pulse = long_ramp_pulse(amp=0.5, duration=1e-3, port="q0:mw")
square_pulse = long_square_pulse(amp=0.5, duration=1e-3, port="q0:mw")
staircase_pulse = staircase_pulse(
start_amp=0.0, final_amp=1.0, num_steps=20, duration=1e-4, port="q0:mw"
)
```
More complex long waveforms can now also be created, see section {ref}`Long waveform support `.