helpers#
Helper functions for Qblox backend.
Module Contents#
Classes#
Functions#
|
Generates an array using the parameters specified in |
|
Generates names for the I and Q parts of the complex waveform based on a unique |
|
Creates a unique identifier from the waveform data, using a hash. Identical arrays |
|
Adds a waveform to the waveform dictionary if it is not yet in there and returns the |
Return the output indices associated with the output name specified in the hardware config. |
|
|
Return the input indices associated with the input name specified in the |
|
Return a "sequencer mode" based on the paths used by the sequencer, as well as the |
|
Takes a dictionary with complex waveforms and generates a new dictionary with |
|
Convert time value in s to time in ns, and verify that it is aligned with grid time. |
|
Determine whether a time value in seconds is a multiple of the grid time. |
|
Determine whether two time values in seconds are within half grid time of each other. |
|
Converts a phase in degrees to the int arguments the NCO phase instructions expect. |
Converts a frequency in Hz to the int argument the NCO set_freq instruction expects. |
|
|
From known frequency for the local oscillator or known intermodulation frequency, |
|
Generates a mapping that specifies which port-clock combinations belong to which |
|
Traverses the schedule and generates OpInfo objects for every pulse and |
Converts possibly old hardware configs to the new format introduced by |
|
|
Helper method to calculate the offset from mV or V. |
Variant of |
|
|
Raises an error stating that only one scope mode acquisition can be used per module. |
|
Extract the old-style Qblox hardware config from the CompilationConfig. |
- generate_waveform_data(data_dict: dict, sampling_rate: float, duration: Optional[float] = None) numpy.ndarray [source]#
Generates an array using the parameters specified in
data_dict
.- Parameters
data_dict (dict) – The dictionary that contains the values needed to parameterize the waveform.
data_dict['wf_func']
is then called to calculate the values.sampling_rate (float) – The sampling rate used to generate the time axis values.
duration (float or None, optional) – The duration of the waveform in seconds. This parameter can be used if
data_dict
does not contain a'duration'
key. By default None.
- Returns
wf_data – The (possibly complex) values of the generated waveform. The number of values is determined by rounding to the nearest integer.
- Return type
np.ndarray
- Raises
TypeError – If
data_dict
does not contain a'duration'
entry andduration is None
.
- generate_waveform_names_from_uuid(uuid: Any) Tuple[str, str] [source]#
Generates names for the I and Q parts of the complex waveform based on a unique identifier for the pulse/acquisition.
- Parameters
uuid – A unique identifier for a pulse/acquisition.
- Returns
uuid_I – Name for the I waveform.
uuid_Q – Name for the Q waveform.
- generate_uuid_from_wf_data(wf_data: numpy.ndarray, decimals: int = 12) str [source]#
Creates a unique identifier from the waveform data, using a hash. Identical arrays yield identical strings within the same process.
- Parameters
wf_data – The data to generate the unique id for.
decimals – The number of decimal places to consider.
- Returns
A unique identifier.
- add_to_wf_dict_if_unique(wf_dict: Dict[str, Any], waveform: numpy.ndarray) Tuple[Dict[str, Any], str, int] [source]#
Adds a waveform to the waveform dictionary if it is not yet in there and returns the uuid and index. If it is already present it simply returns the uuid and index.
- Parameters
wf_dict – The waveform dict in the format expected by the sequencer.
waveform – The waveform to add.
- Returns
Dict[str, Any] – The (updated) wf_dict.
str – The uuid of the waveform.
int – The index.
- output_name_to_output_indices(output_name: str) Optional[Union[Tuple[int], Tuple[int, int]]] [source]#
Return the output indices associated with the output name specified in the hardware config.
For the baseband modules, output index ‘n’ corresponds to physical module output ‘n+1’.
For RF modules, output indices ‘0’ and ‘1’ (or: ‘2’ and ‘3’) correspond to ‘path0’ and ‘path1’ of some sequencer, and both these paths are routed to the same physical module output ‘1’ (or: ‘2’).
- Parameters
output_name – Hardware config output name (e.g. ‘complex_output_0’).
- Returns
A tuple containing output indices corresponding to certain physical module outputs.
- input_name_to_input_indices(input_name: str) Union[Tuple[int], Tuple[int, int]] [source]#
Return the input indices associated with the input name specified in the hardware config.
For the baseband modules, input index ‘n’ corresponds to physical module input ‘n+1’.
For RF modules, input indices ‘0’ and ‘1’ correspond to ‘path0’ and ‘path1’ of some sequencer, and both paths are connected to physical module input ‘1’.
- Parameters
input_name – Hardware config input name (e.g. ‘complex_input_0’).
- Returns
A tuple containing input indices corresponding to certain physical module inputs.
- get_io_info(io_name: str) Tuple[quantify_scheduler.backends.qblox.enums.IoMode, Union[Tuple[int], Tuple[int, int]], Union[Tuple[int], Tuple[int, int]]] [source]#
Return a “sequencer mode” based on the paths used by the sequencer, as well as the input or output indices associated to the io name the sequencer is supposed to use.
Sequencer modes:
IoMode.REAL
: only path0 is used.IoMode.IMAG
: only path1 is used.IoMode.COMPLEX
: both path0 and path1 paths are used.IoMode.DIGITAL
: the digital outputs are used.
- Parameters
io_name – The io name from the hardware config that the sequencer is supposed to use.
- Returns
The sequencer mode
The output indices
The input indices
- generate_waveform_dict(waveforms_complex: Dict[str, numpy.ndarray]) Dict[str, dict] [source]#
Takes a dictionary with complex waveforms and generates a new dictionary with real valued waveforms with a unique index, as required by the hardware.
- Parameters
waveforms_complex – Dictionary containing the complex waveforms. Keys correspond to a unique identifier, value is the complex waveform.
- Returns
A dictionary with as key the unique name for that waveform, as value another dictionary containing the real-valued data (list) as well as a unique index. Note that the index of the Q waveform is always the index of the I waveform +1.
- Return type
Examples
import numpy as np from quantify_scheduler.backends.qblox.helpers import generate_waveform_dict complex_waveforms = {12345: np.array([1, 2])} generate_waveform_dict(complex_waveforms) # {'12345_I': {'data': [1, 2], 'index': 0}, # '12345_Q': {'data': [0, 0], 'index': 1}}
{'12345_I': {'data': [1, 2], 'index': 0}, '12345_Q': {'data': [0, 0], 'index': 1}}
- to_grid_time(time: float, grid_time_ns: int = constants.GRID_TIME) int [source]#
Convert time value in s to time in ns, and verify that it is aligned with grid time.
Takes a float value representing a time in seconds as used by the schedule, and returns the integer valued time in nanoseconds that the sequencer uses.
The time value needs to be aligned with grid time, i.e., needs to be a multiple of
GRID_TIME
, within a tolerance of 1 picosecond.- Parameters
time – A time value in seconds.
grid_time_ns – The grid time to use in nanoseconds.
- Returns
The integer valued nanosecond time.
- Raises
ValueError – If time is not a multiple of
GRID_TIME
within the tolerance.
- is_multiple_of_grid_time(time: float, grid_time_ns: int = constants.GRID_TIME) bool [source]#
Determine whether a time value in seconds is a multiple of the grid time.
Within a tolerance as defined by
to_grid_time()
.- Parameters
time – A time value in seconds.
grid_time_ns – The grid time to use in nanoseconds.
- Returns
True if time is a multiple of the grid time, False otherwise.
- is_within_half_grid_time(a, b, grid_time_ns: int = constants.GRID_TIME)[source]#
Determine whether two time values in seconds are within half grid time of each other.
- Parameters
a – A time value in seconds.
b – A time value in seconds.
grid_time_ns – The grid time to use in nanoseconds.
- Returns
True if a and b are less than half grid time apart, False otherwise.
- get_nco_phase_arguments(phase_deg: float) int [source]#
Converts a phase in degrees to the int arguments the NCO phase instructions expect. We take phase_deg modulo 360 to account for negative phase and phase larger than 360.
- Parameters
phase_deg – The phase in degrees
- Returns
The int corresponding to the phase argument.
- get_nco_set_frequency_arguments(frequency_hz: float) int [source]#
Converts a frequency in Hz to the int argument the NCO set_freq instruction expects.
- Parameters
frequency_hz – The frequency in Hz.
- Returns
The frequency expressed in steps for the NCO set_freq instruction.
- Raises
ValueError – If the frequency_hz is out of range.
- determine_clock_lo_interm_freqs(freqs: Frequencies, downconverter_freq: Optional[float] = None, mix_lo: bool = True) Frequencies [source]#
From known frequency for the local oscillator or known intermodulation frequency, determine any missing frequency, after optionally applying downconverter_freq to the clock frequency.
If mix_lo is
True
, the following relation is obeyed: \(f_{RF} = f_{LO} + f_{IF}\).If mix_lo is
False
, \(f_{RF} = f_{LO}\) is upheld.Warning
Using downconverter_freq requires custom Qblox hardware, do not use otherwise.
- Parameters
freqs (Frequencies) – Frequencies object containing clock, local oscillator (LO) and Intermodulation frequency (IF), the frequency of the numerically controlled oscillator (NCO).
downconverter_freq (Optional[float]) – Frequency for downconverting the clock frequency, using: \(f_\mathrm{out} = f_\mathrm{downconverter} - f_\mathrm{in}\).
mix_lo (bool) – Flag indicating whether IQ mixing is enabled with the LO.
- Returns
Frequencies
object containing the determined LO and IF frequencies and the optionally downconverted clock frequency.- Warns
RuntimeWarning – In case downconverter_freq is set equal to 0, warns to unset via
null
/None
instead.RuntimeWarning – In case LO is overridden to clock due to mix_lo being False
- Raises
ValueError – In case downconverter_freq is less than 0.
ValueError – In case downconverter_freq is less than clock_freq.
ValueError – In case mix_lo is True and neither LO frequency nor IF has been supplied.
ValueError – In case mix_lo is True and both LO frequency and IF have been supplied and do not adhere to \(f_{RF} = f_{LO} + f_{IF}\).
- generate_port_clock_to_device_map(hardware_cfg: Dict[str, Any]) Dict[Tuple[str, str], str] [source]#
Generates a mapping that specifies which port-clock combinations belong to which device.
Note
The same device may contain multiple port-clock combinations, but each port-clock combination may only occur once.
- Parameters
hardware_cfg – The hardware config dictionary.
- Returns
A dictionary with as key a tuple representing a port-clock combination, and as value the name of the device. Note that multiple port-clocks may point to the same device.
- assign_pulse_and_acq_info_to_devices(schedule: quantify_scheduler.Schedule, device_compilers: Dict[str, Any], hardware_cfg: Dict[str, Any])[source]#
Traverses the schedule and generates OpInfo objects for every pulse and acquisition, and assigns it to the correct InstrumentCompiler.
- Parameters
schedule – The schedule to extract the pulse and acquisition info from.
device_compilers – Dictionary containing InstrumentCompilers as values and their names as keys.
hardware_cfg – The hardware config dictionary.
- Raises
RuntimeError – This exception is raised then the function encountered an operation that has no pulse or acquisition info assigned to it.
KeyError – This exception is raised when attempting to assign a pulse with a port-clock combination that is not defined in the hardware configuration.
KeyError – This exception is raised when attempting to assign an acquisition with a port-clock combination that is not defined in the hardware configuration.
- convert_hw_config_to_portclock_configs_spec(hw_config: Dict[str, Any]) Dict[str, Any] [source]#
Converts possibly old hardware configs to the new format introduced by the new dynamic sequencer allocation feature.
Manual assignment between sequencers and port-clock combinations under each output is removed, and instead only a list of port-clock configurations is specified, under the new
"portclock_configs"
key.Furthermore, we scan for
"latency_correction"
defined at sequencer or portclock_configs level and store under"port:clock"
under toplevel"latency_corrections"
key.- Parameters
hw_config – The hardware config to be upgraded to the new specification.
- Returns
A hardware config compatible with the specification required by the new dynamic sequencer allocation feature.
- calc_from_units_volt(voltage_range, name: str, param_name: str, cfg: Dict[str, Any]) Optional[float] [source]#
Helper method to calculate the offset from mV or V. Then compares to given voltage range, and throws a ValueError if out of bounds.
- Parameters
voltage_range – The range of the voltage levels of the device used.
name – The name of the device used.
param_name – The name of the current parameter the method is used for.
cfg – The hardware config of the device used.
- Returns
The normalized offsets.
- Raises
RuntimeError – When a unit range is given that is not supported, or a value is given that falls outside the allowed range.
- extract_acquisition_metadata_from_acquisitions(acquisitions: List[quantify_scheduler.backends.types.qblox.OpInfo], repetitions: int) quantify_scheduler.schedules.schedule.AcquisitionMetadata [source]#
Variant of
extract_acquisition_metadata_from_acquisition_protocols()
for use with the Qblox backend.
- single_scope_mode_acquisition_raise(sequencer_0, sequencer_1, module_name)[source]#
Raises an error stating that only one scope mode acquisition can be used per module.
- Parameters
sequencer_0 – First sequencer which attempts to use the scope mode acquisition.
sequencer_1 – Second sequencer which attempts to use the scope mode acquisition.
module_name – Name of the module.
- Raises
ValueError – Always raises the error message.
- generate_hardware_config(compilation_config: quantify_scheduler.backends.graph_compilation.CompilationConfig)[source]#
Extract the old-style Qblox hardware config from the CompilationConfig.
- Parameters
config (CompilationConfig) – CompilationConfig from which hardware config is extracted.
- Returns
hardware_config – Qblox hardware configuration.
- Return type
- Raises
KeyError – If the CompilationConfig.connectivity does not contain a hardware config.
ValueError – If a value is specified in both the hardware options and the hardware config.
RuntimeError – If no external local oscillator is found in the generated Qblox hardware configuration.