Changelog¶
All notable changes to this project will be documented in this file. The format is based on Keep a Changelog, and this project adheres to Semantic Versioning. See also our stability guarantees.
Version 2.16.0 – 2025-01-10¶
Added¶
New mode of operation! We introduce the
spectralmodule, used to perform FFT-based measurements on multiple channels. Supported measurements are Fourier spectrum, power spectral density (PSD) and cross PSD (CPSD).New method
LockinReceiver.get()keeps track of which lockin measurements were already returned to the user when continuously streaming measurements from Presto. Together withget_new()andget_last(), there are now three different ways of extracting streamed data depending on the required semantics.Helper functions
utils.newman_phases()andnewman_scale()to create frequency combs with low crest factor.
Changed¶
Increase minimum-supported version of some core dependencies:
numpy v1.23
matplotlib v3.6
paramiko v2.10
Fixed¶
Fix inconsistency in input and output phases in
SymmetricLockin.Improve error message in
Hardware.set_adc_attenuation()andset_dac_current()when values are out of range.Tweaks to type hints for compatibility with new versions of NumPy.
Under-the-hood performance improvements.
Version 2.15.1 – 2024-10-18¶
Fixed¶
Fix performance regression in
lockinmode with small values ofdf, introduced in v2.15.0Fix wrong output amplitude in
SymmetricLockin, introduced in v2.15.0
Version 2.15.0 – 2024-10-15¶
Added¶
Ability to continuosly stream
lockinmeasurements to the computer. See newstream_pixels()method.Ability to run arbitrary user code in the on-board real-time processor (RPU) in
lockinmode. Especially useful for implementing custom feedback schemes.Ability to decrease the sampling rate in the intermediate-frequency (IF) domain in
pulsedmode. This allows e.g. to store longer pulses in the output templates, and to acquire longer input waveforms. Seedownsamplingoptional argument to thePulsedclass.
Fixed¶
Optmize network usage in
lockinmode by changing internal data types.
Changed¶
Drop support for Python 3.8, the minimum-supported Python version is now 3.9
Version 2.14.1 – 2024-08-16¶
Fixed¶
Specify paramiko as optional dependency and set minimum version to solve authentication issues on some computers.
Fix internal command in
utils.ssh_restart().
Changed¶
For SSH-based tools such as
utils.ssh_reboot()andutils.ssh_restart(), use directly paramiko rather than fabric.paramikowas already a dependency offabric, so this change should not break anything.
Version 2.14.0 – 2024-08-12¶
Added¶
New method
Pulsed.setup_flat_matching_pair()creates reference templates for template matching that are flat (i.e. have a constant weight) and can be very long. Much like output templates created viasetup_long_drive(), these long flat reference templates will use only one reference-template memory slot.New method
Pulsed.setup_flat_pulse()replaces the now-deprecatedsetup_long_drive(). The new method usesenvelope=Falseby default, consistent with the behavior ofsetup_template(), and drives both I and Q quadratures by default on mixed mode. See deprecation note onsetup_long_drive()for a migration guide.New method
Hardware.configure_mixer_base_n()allows to specify strict rational requirements between different NCO frequencies on different ports. It works similarly toconfigure_mixer(), but you specify a base frequency common to all NCOs and then request that each NCO be exactly an integer multiple of this base frequency, even taking into account small rounding errors in the digital domain.
Changed¶
Method
Pulsed.setup_template_matching_pair()will now split reference templates longer thanMAX_TEMPLATE_LENinto smaller sub-templates. Previously, the method would raise an exception if a template was too long for a single memory slot. Now the exception is raised if the sub-templates require more memory slots than available.Update internal Linux distribution.
Improve error message when the API version installed on the computer is not compatible with the firmware version installed on the hardware.
Fixed¶
Fix output of digital markers/triggers in
pulsedmode.Fix bug where, in some cases, the autoconfiguration feature would warn about incompatible DAC configurations and choose a suboptimal configuration.
Fix bug in
Pulsed.setup_condition()that would cause an error whenthresholdwas negative.Workaround for a bug in upstream code that prevented
Hardware.configure_mixer()from using an NCO phase equal to ±π.
Version 2.13.0 – 2024-06-03¶
Added¶
All 128 reference templates for template matching in
pulsedmode can now be used on a single input port. Previously, each input port could access only 8 reference templates. Now the available reference templates are automatically distributed across the input ports based on the user program.New method
Pulsed.setup_store()combines the functionality of the now-deprecatedset_store_ports()andset_store_duration(): now you won’t have to remember which of the two you should call first.New method
Hardware.disable_coeff_override()to disable factory calibration of ADCs.Add support
pulsedsequences without any data acquisition (storeormatch).
Fixed¶
Fix checking of FIR coefficients in
Lockin.get_pixels().Improve checking of whether NCO frequencies are compatible with DAC settings.
When using Presto with an external reference clock, always check if the frequency lock is good before running the experiment.
Deprecated¶
Pulsed.set_store_ports()andset_store_duration()are deprecated, usesetup_store()instead.Hardware.set_cal_freeze()is deprecated, usesave_cal_coeff()andrestore_cal_coeff()instead.
Version 2.12.2 – 2024-03-26¶
Added¶
Improve functionality of the
plot_sequence()utility and iron out some bugs, see dedicated documentation.
Changed¶
Improved internal representation of very long, very sparse pulsed sequences.
Fixed¶
Fixed bug in
pulsedexperiments with frequency or amplitude sweeps that caused some of the sweep entries to be duplicated or corrupt. The bug was introduced in version 2.12.0.
Version 2.12.1 – 2024-03-14¶
Fixed¶
Fixed bug that caused
LockinandSymmetricLockinto download the wrong data at the end of a measurement when usingsummed=True. Measurements withsummed=Falsewere not affected by the bug.
Version 2.12.0 – 2024-02-28¶
Added¶
Autoconfiguration feature: ability to automatically choose DAC configuration (
DacModeandDacFSample) based on signal frequencies. See Direct and Mixed mode for more information and how to (optionally) migrate your old code to use the new feature.The
plot_sequence()utility now shows operations on IF generators.Ability to trigger signal generation and acquisition in
lockinmode on an external trigger, likely generated by Metronomo. Seeauto_syncoptional argument toapply_settings()andget_pixels().
Changed¶
Fixed¶
Fixed
ConnectionRefusedErrorwhen trying to reconnect to Presto too quickly after closing a previous connection.Fixed bug that cause some very-long sequences in pulsed mode to be rejected due to the repetition period being too short.
Version 2.11.0 – 2023-11-27¶
Added¶
Historical version information in the documentation of the
versionmodule.Option to download measurement data using the lz4 lossless compression. It can improve download times over slow networks. See
use_compressionkeyword argument inPulsed.get_store_data()andget_template_matching_data().Option to download template-matching results as they become available during an experiment, rather than at the end of the experiment. Can reduce communication overhead for sequences with lots of single-shot readouts. See
prefetch_matcheskeyword argument inPulsed.run().Ability to configure low-noise mode on an output port:
Hardware.set_dac_lownoise().It is now possible to compute real-time histograms on template-matching results on board. See methods
Pulsed.setup_histogram(),setup_histogram_2d()andget_histogram_data().Utility to plot the programmed experimental sequence in Pulsed mode. See
utils.plot_sequence().
Changed¶
Minimum supported versions: Python 3.8, NumPy 1.22.0.
Fixed¶
Optimize internal data transfers, yielding improved download speed over the network and processing of commands during pulsed sequences.
Version 2.10.0 – 2023-06-27¶
Note
presto v2.10.0 is the last version supporting Python 3.7, which reached [end of life][pyver] on
2023-06-27. Starting from next version, the presto package will require Python 3.8 or above.
Added¶
Methods to program a digital delay on output and input ports, useful for compensating delay mismatches in your experimental setup:
Hardware.set_output_delay()andset_input_delay().Helper function to select optimal DAC configuration for a given signal output frequency:
utils.recommended_dac_config()
Version 2.9.0 – 2023-03-30¶
Added¶
Method to ramp the DC bias to a new value with a controlled rate of change:
Hardware.ramp_dc_bias().Optional argument
get_rangetoHardware.get_dc_bias()to also get the current range.
Fixed¶
Improve handling of abrupt interruption of a measurement.
Fix error message when rebooting Presto/Vivace via
ssh_reboot().
Version 2.8.1 – 2023-02-14¶
Changed¶
Allow for a list of ports in
Pulsed.output_dc_bias()to change DC bias during a pulsed sequence simultaneously on many ports.
Version 2.8.0 – 2023-02-03¶
Added¶
Method to get the DC bias currently programmed:
Hardware.get_dc_bias().Methods to configure multiband mode on input/output:
Hardware.set_input_multiband()andHardware.set_output_multiband().
Changed¶
Enable positive-only DC-bias ranges in
Hardware.set_dc_bias()(range_isettings 0 and 1) for higher resolution on small positive voltages.
Version 2.7.1 – 2023-01-20¶
Fixed¶
Fixed Python 3.7 compatibility issue in pulsed module.
Version 2.7.0 – 2023-01-18¶
Added¶
Multi-dimensional parameter sweeps in
pulsedmode are now available experimentally. See newaxisoptional parameter inPulsed.setup_scale_lut()andPulsed.setup_freq_lut(), and new options of therepeat_countparameter inPulsed.run(). Experimentally means that the API might be fine tuned in a future release.
Changed¶
A DC bias set with
Hardware.set_dc_bias()is now persistent across a firmware reload, e.g. when switching betweenpulsedandlockinmode, unless the hardware is initialized withforce_reload=True.
Fixed¶
Documentation for
Lockin.set_phase_reset().Fix bug causing spurious
Pulsed.next_scale()events that could happen when the repetition period of an experiment was longer that half a millisecond.Fix erroneous error message that would warn of an error when using template matching even though everything was good.
Version 2.6.0 – 2022-12-07¶
Added¶
Abort a pulsed measurement early if data corruption is detected.
Changed¶
Improve handling of pulsed-mode commands at run time to enable longer two-qubit randomized benchmarking.
Update all internal libraries.
Speed up reconnecting to Presto if no settings are changed.
Removed¶
Remove experimental feature
enable_compressioninPulsed.run(): this feature is now covered by the improved handling of pulse-mode commands.
Fixed¶
Fix attenuation values in documentation for
Hardware.set_adc_attenuation().
Version 2.5.1 – 2022-11-05¶
Fixed¶
Bug in
LockinandSymmetricLockinwhen setting a negative phase on the output I quadrature.Fix bug on Vivace hardware when changing output range with
Hardware.set_dac_current().
Version 2.5.0 – 2022-09-20¶
Added¶
A pulsed measurement can now be triggered internally, by a SYSREF signal, or (new) by a signal on any of the digital inputs. See method
Pulsed.run().
Changed¶
Replace the sliding-window low-pass filter for Lockin introduced in 2.3.0 with a customizable 43-tap FIR filter. For the occasion, the new optional argument
fir_coeffsreplaces the previousnboxin methodsLockin.get_pixels()andSymmetricLockin.get_pixels().
Fixed¶
Fixed an issue that could result in a
DC biasnot being set reliably on some units.
Version 2.4.1 – 2022-07-08¶
Fixed¶
Fix documentation for DAC current settings in
Hardware.set_dac_current().Restore compatibility with Python 3.7+.
Version 2.4.0 – 2022-06-23¶
Added¶
You can now choose whether a long drive is an envelope or a template. See new optional parameter
envelopeinPulsed.setup_long_drive(). To maintain backwards compatibility, the default setting isenvelope=True. Note that this is different fromPulsed.setup_template()where the default isenvelope=False.New interface to asynchronous measurements:
Pulsed.run_async()returns aMeasurementHandlethat allows interaction with a running measurement.
Changed¶
Methods
Lockin.get_pixels()andSymmetricLockin.get_pixels()now return the standard deviation as a complex number, where the real and imaginary parts encode the standard deviation of the real and imaginary parts of the demodulated signals. Taking the absolute value of the complex number results in the total standard deviation that was previously returned.Many methods in
Pulsedraise aRuntimeErrorexception if called after a measurement has already beenrun(). The previous behavior was not supported, see the warning in the documentation for thePulsedclass.The
output_portargument toPulsed.setup_long_drive()now accepts a list to output the same pulse on multiple ports, much likePulsed.setup_template()already did.
Fixed¶
Fix inconsistencies in the documentation regarding maximum length of templates.
Improve error messages when running out of template slots.
Version 2.3.2 – 2022-06-06¶
Fixed¶
Improve resilience to rounding errors in
Hardware.configure_mixer()
Version 2.3.1 – 2022-04-25¶
Fixed¶
Restore compatibility with Python 3.7+
Version 2.3.0 – 2022-04-21¶
Added¶
New class
SymmetricLockin: a special-purpose version ofLockinwith same frequencies on input and output (symmetric). The new class inherits from the previous one, so most of theLockinfunctionality is available inSymmetricLockinas well.New features for the lock-in: Presto can now low-pass filter the measured lock-in packets in real time with a sliding-window average, and also compute mean and standard deviation of the measured lock-in packets in real time over chunks with configurable width. Check out the
summed,nboxandnsumoptional parameters toLockin.get_pixels().The lock-in can output a trigger signal at the start of each integration window:
Lockin.set_trigger_out().utils.sin2()can now create DRAG-corrected pulses.It is now possible to modify the DC bias output during a pulsed measurement sequence:
Pulsed.output_dc_bias().Print a warning if the signal on any of the input ports is out of range.
Changed¶
Change the way errors from the hardware are reported to the user. It should help when the API is used through third-party software, such as Labber.
Improve handling of NCO frequencies when the same frequency is set on multiple ports. This can avoid long-term drift, see documentation for the
tuneparameter inHardware.configure_mixer()Increase length of command buffers: you can now send more pulses closer together! Useful for randomized benchmarking.
Fixed¶
Fix bug in
Lockin.get_pixels()where the data in first lock-in packet would often be corrupt.The pulsed mode of operation is now more resilient to aborting measurements with
Ctrl+C.
Version 2.2.1 – 2022-02-10¶
Fixed¶
Fix bug in compression algorithm in
Pulsed.run().
Version 2.2.0 – 2022-02-09¶
Added¶
Method
Hardware.set_dc_bias()now handles the DC bias outputs on Presto hardware.Check that all programmed times in a pulsed sequence are nonnegative.
Method
Pulsed.run()will now check for more inconsistencies and report errors:if the programmed sequence contains overlapping calls to
store(). Overlapping stores are not supported and could cause the experimental sequence to terminate abnormally, or not terminate at all.if some
select_frequency()orselect_scale()event is trying to access indexes beyond what was programmed in the look-up tables withsetup_freq_lut()andsetup_scale_lut().
Method
Pulsed.run()can now compress some pulse sequences so that they consume fewer commands. Compression is useful when there’s a long list of small templates output in quick repetition, such as in randomized benchmarking with thousands of Cliffords. To opt in to compression, passenable_compression=True.
Changed¶
Refactor calibration of ADC and DAC alignment. A calibration routine will be run when a new combination of Converter modes and Converter rates is requested. This will delay the start of a measurement by a few seconds, but only the first time a configuration is requested: the calibration will be stored on Vivace/Presto and will be available for all subsequent measurements without delay!
Method
Pulsed.get_store_data()returns data in real form whenadc_mode=AdcMode.Directand in complex form whenadc_mode=AdcMode.Mixed(when using digital downconversion).Method
Pulsed.setup_template_matching_pair()now accept complex-valued arguments whenadc_mode=AdcMode.Mixed(when using digital downconversion).Methods
Pulsed.setup_long_drive()andPulsed.setup_template()now accept complex-valued arguments whendac_mode=DacMode.Mixedxx(when using digital upconversion).
Fixed¶
Fix error message in
OutputGroup.set_frequencies()andInputGroup.set_frequencies(): while it’s certainly good practice to set IF frequencies smaller than 1 EHz (1018 Hz), we meant to write just 1 GHz.Fix a bug in
Pulsed.setup_condition()when specifying templates to be output when the condition is False.Fix a bug that prevented
Pulsed.match()events from being scheduled at times smaller than 6 ns.
Version 2.1.0 – 2021-12-01¶
Ability to choose frequency of external reference clock: see the optional argument
ext_ref_clktoPulsedandLockinImprovement to calibration routine during update.
pulsed module¶
Fix a bug that caused the experiment to terminate too early or to never terminate when running long sequences with lots of averages.
A single sequence (without accounting for repetitions and averages) can now run for ≈6.5 days, up from ≈8.6 seconds.
Pulsed class¶
Fix printing of estimated time left in a measurement when running from within some Python IDEs, e.g. Spyder.
Set tolerance for event times to 1% of
get_clk_T(), rather than fixed at 1 ps.Method
run():Better handling of startup time for a sequence: fixes an inconsistency with requirements on the
periodargument.Raise an error if the user runs a sequence without setting up the scale look-up table on an output port and group used by some template, or if the frequency/phase look-up table was non set up when some templates are used as envelopes.
The parameter
output_porttosetup_template()can now be set to a list to more conveniently output the same pulse on multiple output ports.Improve error messages when using not supported combinations of
adc_mode,adc_fsample,dac_modeanddac_fsampleFix error when running with
dry_runset to True.
LongDrive class¶
New method
get_duration()for compatibility withTemplateclass.
lockin module¶
Lockin class¶
Fix bug in
tune_perfect()Improve error messages when using not supported combinations of
adc_mode,adc_fsample,dac_modeanddac_fsample
Version 2.0.0 – 2021-05-21¶
This is the first major-version change since the previous Vivace API. This new API is compatible with both Vivace and Presto microwave platforms, and follows the same overall programming interface. There are, however, many differences that break backwards compatibility. See below for a summary of such changes.
hardware module¶
New module to control configurations common to all modes of operation. Accessible as the hardware
attribute of any instance of Pulsed and Lockin.
pulsed module¶
Pulsed class¶
The class constructor takes 4 new optional arguments:
adc_mode,adc_fsample,dac_modeanddac_fsample. These configure the Converter modes and Converter rates for the input analog-to-digital (ADC) and output digital-to-analog (DAC) converters. With these options it is possible to enable digital up- and downconversion using the built-in digital IQ mixers.The methods
next_frequency(),next_scale(),select_frequency()andselect_scale()take a new optional argumentgroup. If not specified, both output groups onoutput_portsare affected.The method
run()(previouslyperform_measurement) does not return the result ofstore()events: useget_store_data()after running the experiment. To get the result ofmatch()events, useget_template_matching_data()(same as before).Method
setup_freq_lut():the old
carrierargument (1 or 2) is replaced by the newgroupargument (0 or 1)new argument
phases_qmust be specified when using the built-in digital IQ mixers for digital upconversionthe optional argument
repeat_countis removed
Method
setup_long_drive():the old
carrierargument (1 or 2) is replaced by the newgroupargument (0 or 1)the optional argument
use_scaleis removed: all output templates are subject to the output scaler for the appropriate port and group
Method
setup_scale_lut():new mandatory argument
group(0 or 1)the optional argument
repeat_countis removed
Method
setup_template():new mandatory argument
group(0 or 1)new argument
template_qmust be specified when using the built-in digital IQ mixers for digital upconversionthe optional argument
use_scaleis removed: all output templates are subject to the output scaler for the appropriate port and groupthe optional argument
envelopeis now a boolean. To specify which signal generator to use whenenvelope=True, use thegroupargument (0 or 1)
New methods:
Deprecated methods:
perform_measurement: userun()instead
Some methods are moved to the new
Hardwareclass, which is available as thehardwareattribute to any instance ofPulsed:blank_output: nowhardware.blank_output(function signature changed!)set_output_bias: nowhardware.set_dc_bias(function signature changed!)
LongDrive class¶
Renamed methods:
update_flat_duration: nowset_flat_duration()update_total_duration: nowset_total_duration()
New methods:
get_flat_duration()get_total_duration()
Other¶
utils module¶
New function
rotate_opt()The function
untwist_downconversion()now follows a different convention. The new convention is consistent with the built-in digital IQ mixers. It might or might not be consistent with the convention used by an external analog IQ mixer.
version module¶
New attributes:
version_api: the only one of interest to the user. It is also exported as the__version__attribute to theprestomoduleversion_conductorversion_fpgaversion_rpu
Removed functions:
get_variant_firmwareget_version_allget_version_apiget_version_clockget_version_firmwareget_version_server