# Release Notes

## Release 2.2.0

Release date 21.03.2023

### Notes & Important Changes

• LabOne Q release 2.2 requires version 23.02 of LabOne. Please download the latest release of LabOne from the Zurich Instruments Download center and make sure to update the firmware of all your instruments through the GUI before using them together with this release. Since also the core Python API has been updated with this release, we recommend to use a fresh Python environment when installing LabOne Q 2.2. For instructions, see the section on installation.

#### Functionality

• Enabled the new scheduler by default. If required, it is still possible to use the legacy scheduler, by using the compiler_settings={"USE_EXPERIMENTAL_SCHEDULER": False} argument at session.compile().

• Added a new Experiment.measure() method, unifying the readout pulse playback and acquire command for more streamlined experiment design.

• Enable the use of markers for signal lines of type iq_signal on SHFSG and HDAWG. Use the marker argument of the play command to enable specific marker channels during the playback of that pulse.

• Enable phase increments with the command table on HDAWG and SHFSG, significantly reducing the amount of waveforms required when changing pulse phases.

• Increased efficiency when accessing the internal data structures used in the compiler, see also https://github.com/zhinst/laboneq/issues/19. This will speed up compilation times especially for experiments using a large number of sections.

• Added methods to display pulse functionals directly in your notebook and analyze the expected response of a qubit as a function of its frequency. Have a look at this example notebook for how to use them.

### Deprecation notice

• Python 3.7 and 3.8 support is deprecated and will be removed in a future major release. It is recommended to upgrade to Python 3.9 or newer.

• The descriptor keyword "instrument_list" has been replaced by "instruments" for consistency.

### Known Issues

• When using LabOne 23.02 with a version below 23.02.41959, playback on SHFSG and SHFQA channels may be misaligned by 4 ns. Contact us to get the latest patch release, in case it is not yet available on the website.

• When running CW resonator spectroscopy with an SHFQA or SHFQC, it is necessary to set the port_delay calibration of the used acquire line to 250 ns. Have a look at the basic_experiments notebook for an example.

• When delaying logical signal lines of type rf_signal via the delay_signal calibration property, all rf_signals on the same AWG must be set to the same delay.

• When delaying logical signal lines on the SHFQA via the delay_signal calibration property, the delays for the measure and acquire line must be the same; the measure pulse delay is not added to the acquire pulse delay as on the UHFQA. We recommend to use port_delay for now.

• When creating a section with very short content (below the device’s minimum waveform length), the compiler may fail to map the experiment to valid SeqC, and will generate an error. As a workaround, manually add delays to the sequence.

## Release 2.1.0

Release date 02.03.2023

### Notes & Important Changes

#### Functionality

• Added a new scheduler for experiments. Currently this is not yet enabled by default, to enable use compiler_settings={"USE_EXPERIMENTAL_SCHEDULER": True} within session.compile().

• Added the option to fix a section to the signal grid of the used device setup. Use the parameter section(on_system_grid=True) to force the section to start and end on the system grid. This can be useful in special cases where sequencer commands need to align to section boundaries.

• When compiler setting <device>_MIN_PLAYWAVE_HINT is not multiple of device samples, it is now rounded up to the closest matching value instead of raising AssertionError.

• Introduced a check and meaningful error message to catch unsupported use of sweep parameters at an early stage. As an example trying to sweep an amplitude in a near-time loop will trigger the exception.

#### Bug Fixes

• Fixed a bug where putting a match / case statement within a sweep loop failed.

• Fixed a bug where using a SweepParameter as a pulse_parameter of a pulse functional led to a compiler exception when running the experiment more than once.

• Fixed a bug where unnecessary oscillator switching events where issued when multiple hardware oscillators on the same physical channel where used.

• Fixed a bug that did not allow to set an experimental calibration when the underlying logical signal calibration was not defined.

## Release 2.0.0

Release date 17.02.2023

### Notes & Important Changes

#### Functionality

• Added support for adding instruments to the setup descriptor without any signal lines specified. For such instruments, a data server connection will be established when calling session.connnect() such that they are available to use with toolkit from within LabOne Q.

• Added support for specifying one or multiple data servers in the setup descriptor.

• Added direct support for virtual z-gates without playing a pulse at the same time. Use Experiment.play(pulse=None, increment_oscillator_phase=z_gate_phase) to increment the phase by a given value or Experiment.play(pulse=None, set_oscillator_phase=new_phase) to set the absolute oscillator phase.

• Increased the number of sweep steps that are supported for a real-time frequency sweep on the HDAWG to 512.

• Changed the compiler settings for the SHFSG to use command table by default and shorten the minimal waveform length from 1024 to 64. This should allow more efficient use of the waveform and instruction memory of the instrument. Refer to Tips & Tricks for more information on how to modify these settings.

#### Bug Fixes

• Fixed a bug where real-time frequency sweeps failed when using a software oscillator.

• Fixed a bug where a trigger node address on the SHFQA was incorrect.

#### API changes

• Removed deprecated Session.run_all(), use Session.run() instead.

• Removed deprecated Session.set() and Session.get().

• Removed deprecated offset argument from laboneq.dsl.experiment.Experiment.section() method.

• Removed deprecated pass_v3_to_compiler argument from Session. The argument had no functionality.

• Renamed Experiment.set() to Experiment.set_node() & removed the key argument.

• Removed do_simulation argument from Session.run(). The functionality is replace with laboneq.simulator.output_simulator.OutputSimulator.

• Removed max_simulation_time instance variable from Session.

## Release 1.7.0 - Stable release

Release date 02.02.2023

### Notes & Important Changes

#### Functionality

• Enabled real-time frequency sweeps on HDAWG. Due to technical limitations on this instrument, the number of real-time sweep steps is currently limited to a maximum of 401.

• Introduced an error message if a duplicate section id is used in the experiment.

#### Bug Fixes

• Fixed a bug where waveform replacement with pulse functionals that use the same parameter names did not work as expected.

• Fixed a bug where waveforms were scaled incorrectly for playback in branching sections, leading to clipped output.

• Fixed a bug where using pass in one arm of a match-case statement could have triggered a mixed-signals compiler error.

### Documentation

• Added a demonstration of real-time feedback on SHFQC. This notebook emulates active qubit reset and uses two different readout pulses to simulate the different qubit states. In the example code, the state discrimination parameters are first calibrated using optimal integration weights and the result is then used to demonstrate real-time feedback based on an arbitrary pattern of simulated qubit states.

### Deprecation notice

• The next upcoming release will remove some API functionality:

• session.run_all(experiment) - use session.run(experiment) instead

• the offset argument of section - use either constant length for the section or RepetitionMode.CONSTANT in the outer acquisition loop

• session.set() and session.get() - in user functions, use the toolkit functionality to read out and set node values instead

• experiment.set() will be renamed to experiment.set_node() and its key parameter will be removed

• simulation of the output signals via the do_simulation parameter of session.run() as well as the output_signals property of the compiled experiment - use the new OutputSimulator class instead, as demonstrated in this example notebook

## Release 1.6.0

Release date 12.01.2023

### Notes & Important Changes

#### Functionality

• Added support for waveform replacement on single rf_lines on HDAWG, see Issue 12.

• Added a user-accessible compiler setting to change the resolution of phase setting when software modulation is used. Use compiler_settings={"PHASE_RESOLUTION_BITS": number_of_bits}, default is 12 bits of resolution.

#### Bug Fixes

• Fix for bug "SHFQC: Number of measurements executed do not match defined", where the number of measurements executed on a SHFQC was not as expected.

• Fixed a bug where the length setting in a play command was silently ignored if it was not a SweepParameter.

• Fixed a bug where delays at the end of loops were silently ignored.

• Fixed a bug where raw readout on the SHFQA did not give reproducible results.

## Release 1.5.0

Release date 15.12.2022

### Notes & Important Changes

• Introduced a voltage_offset calibration property for logical signals of type rf_signal - use this to apply offsets to your single channel signals on the HDAWG.

### Bug Fixes

• Fixed an issue when deserializing pulse functionals without a mixer_type argument specified. When not specified, the mixer_type now defaults to IQ.

• Fixed a bug where, when using software modulation, not all uploaded waveforms were properly modulated.

• Fixed a bug where the raw readout results on the SHFQA depended on previous signals and did not always reflect the current state of the measurements.

• Fixed a bug with phase increments of software modulated signals - the resolution of allowed increments was chosen too small, this will be a user accessible setting in the future.

• Fixed a problem with the new output simulation not working properly for signals on SHFSG and SHFQA.

## Release 1.4.0

Release date 01.12.2022

### Notes & Important Changes

#### Functionality

• Implemented a new, faster and more versatile output simulator. For examples on how to use it, see this example notebook.

• Added the possibility to change output and input range settings on all channels of HDAWG and UHFQA instruments. Use the range calibration property of any logical signal or physical channel to set these values.

• Implemented a new, more responsive pulse sheet viewer. As before use show_pulse_sheet("my_experiment", my_compiled_experiment) to generate an overview of events on all logical signals in a compiled experiment.

• Further improved the speed of saving and loading any LabOne Q data objects.

#### Bug fixes

• Fixed the issue that the SHFQC was only working with the six channel option.

## Release 1.3.0

Release date 17.11.2022

### Notes & Important Changes

#### Functionality

• Added initial support for using trigger outputs, through the trigger argument of section - feedback welcome!

• Replaced awg_module by the new LabOne standalone compiler, increasing the speed of session connection, sequencer code compilation and upload.

• Because of the switch to the standalone compiler, LabOne 22.08 or later is required to run LabOne Q 1.3.0

• Changed the way software modulation is applied to pulses on the UHFQA for consistency between UHFQA and SHFQA - this change may require recalibration of integration weights and thresholds on UHFQA setups after upgrading LabOne Q

#### Documentation

• Added example notebook demonstrating playback of consecutive signals with different hardware modulation frequencies on SHFSG channels with the command table

## Release 1.2.0

Release date 03.11.2022

### Notes & Important Changes

• Improved pulse library. Users can now easily extend the range of available pulse types by creating their own library. Our own standard library has been expanded as well, and will continue to grow in the future. A tutorial on our GitHub repository explains the most important features.

• Pre-compensation is now configured via signal calibration. Delays are adapted accordingly.

## Release 1.1.0

Release date 20.10.2022

### Notes & Important Changes

• Improved serialization and deserialization performance. Long arrays (e.g. waveforms) are now stored as binary blobs, reducing the size of generated JSON files.

• The gaussian_q pulse shape has been removed. For generating a Gaussian pulse on the Q channel, use gaussian(amplitude=1j) instead.

## Patch Release 1.0.3

Release date 10.10.2022

### Notes & Important Changes

• Pinned required retworkx version to 0.11 after breaking changes had been introduced with 0.12.

## Patch Release 1.0.2

Release date 03.10.2022

### Notes & Important Changes

• Fixed an issue with the assignment of center frequencies for the signal generator channels on an SHFQC

## Release 1.0.0

Release date 27.09.2022

### Notes & Important Changes

• QCCS Software has been renamed to LabOne Q

• LabOne Q now depends on LabOne release 22.08. We strongly recommend to perform a fresh install into a clean Python environment to ensure no clash of dependencies. Please also update the firmware of all devices to use to the newest version.

• It is no longer possible to specify a too short repetition length when using RepetitionMode.CONSTANT, an exception will be raised in this case.

• Hardware oscillator phase reset commands can now be issued for every iteration of sweep and averaging loops through the new parameter reset_oscillator_phase to make phases reproducible within each sweep step and averaging iteration. This new behavior is disabled by default.

• The pulse length can now be swept as parameter of the Experiment.play command.

• The parameters phase, set_oscillator_phase and increment_oscillator_phase of the Experiment.play command can now be swept.

## Release 0.68

Release date 08.09.2022

### Notes & Important Changes

• The device setup now offers a new physical_channel_groups attribute. This new API complements logical_signal_groups, and allows more straightforward access to parameters of physical ports on each device, including when they are shared across multiple logical signals.

• The CompiledExperiment class now has a publicly exposed API for serialization to JSON.

• Setting do_simulation=True in session.run() no longer leads to an error.

## Release 0.67

Release date 25.08.2022

### Notes & Important Changes

• The SHFQC can now be used as a standalone instrument, without the need for a PQSC.

• State discrimination can be used on the SHFQA. To use, set the new threshold property on the logical signal used for data acquisition and set AcquisitionType.DISCRIMINATION within the acquire loop.

• Using session.set(node_address, value) and session.get(node_address), it is now possible to set and read out the values of any instrument node from within a connected session directly.

• Using session.devices[device_id] in a connected session returns a toolkit device object that enables to address the device directly using the same functionality know from the toolkit python package. For details on how to use the device object, please refer to the toolkit documentation at https://docs.zhinst.com/zhinst-toolkit/en/latest/

• It is now possible to specify negative amplitudes in a sweep parameter

• There are now two different ways to access the results object generated when running an experiment. The property session.results delivers a reference to the results object within the session and can be used e.g. from within user functions when reading out partial results. Calling session.get_results() returns a deep copy of the results object from within the session, to be used for saving the results. session.run(experiment) by default returns the reference via session.results.

• In a near-time loop if any sweep steps exits with an error, it is now retried once and subsequently skipped at repeated error. The rest of the experiment may be executed normally.

• For experiments that generate a lot of waveforms on the HDAWG it was possible in rare cases that waveform playback was not possible seamlessly due to memory restrictions on the instrument. This behavior is now detected by QCCS SW and reported as an error to the user, so the experiment can be redesigned.

## Release 0.66

Release date 11.08.2022

### Notes & Important Changes

• When an error is encountered during a near-time loop, the affected step is repeated and the experiment does not fail.

• Unintended gaps in the playback of pulses on the HDAWG are now detected and signaled to the user.

## Release 0.65

Release date 28.07.2022

### Notes & Important Changes

• Waveform replacements of pulses works on all devices

• SW modulation and HW modulation yield the same output on all devices

• Mandatory first argument to the Experiment.call(…​) / Section.call(…​) was renamed from func to func_name - this need to be adjusted in user code, if passed as named and not positional argument

## Release 0.64

Release date 14.07.2022

### Notes & Important Changes

• Session.run() now accepts both compiled and raw experiments. Session.run_all() has been deprecated and will be removed in a future version.

• The output simulator does no longer run automatically when an experiment is executed. Trigger it manually by supplying do_simulation=True to Session.compile() or Session.run().

• The output simulation can also be started without a session, by calling the CompiledExperiment.simulate_outputs() method.

• The simulated output signals are now stored as part of the compiled experiment, and no longer directly as part of the results object. Find them in CompiledExperiment.output_signals with the same internal structure as previously.

• The built-in result plotter (qccs.simple.Plotter) has been removed. For examples of how to access and plot the simulated output signals, see the example notebooks.

• Mixer calibration on the HDAWG has been reworked and stabilized. This has not yet been extensively tested, feedback is welcome.

## Release 0.63

Release date: 01.07.2022

### Notes & Important Changes

• Improved reliability of real-time frequency sweeps on SHFQA

• Added support for real-time frequency sweeps on SHFSG

• Logging contains number of sequencer code lines and number of waveform samples that will be uploaded to instruments

• Logging levels are now adjustable

## Release 0.62

Release date: 17.06.2022

### Notes & Important Changes

• Real-time frequency sweeps for resonator spectroscopy are now possible on SHFQA. Limitations apply, see below.

• Small system support: A single HDAWG or SHFSG device can be used without a PQSC as a standalone device.

• Waveforms in real-time loops can be exchanged to another one with the same length via a user function.

• Integration kernels on SHFQA had inverted frequency compared to the readout pulse before, this has been corrected in this release - might require changes to user code

• It is no longer possible to mix UHFQA and SHF instruments in the same experiment

• Each near time execution step now has an automatic timeout implemented, based in the calculated real-time execution time of the step - this is to catch and prevent rare interrupts in execution

## Release 0.61

Release date: 03.06.2022

### Notes & Important Changes

• Support for standalone SHFSG operation

• In a setup with an SHF instrument (SHFSG, SHFQA,…​), the HDAWG sampling rate is switched to 2.0 GSa/s, allowing for a tighter combined section grid

• Consecutive Sections with signals on only one instrument can have arbitrary lengths now and are not bound to the common section grid