Functional description

Here we describe the functionality of the Presto microwave platform, with a special focus on the relation between the different methods of the Presto API and the specific function. For a more detailed description of the digital Presto platform, you might be interested in the Presto paper.

Pulsed output

The image below shows a schematic, functional representation of one output channel of Vivace/Presto during pulsed operation. The same configuration is then repeated independently on each of the 8/16 output channels. This section provides a summary of how the methods of the Pulsed class interact with the hardware.

_images/pulsed_output_mixed.svg

When instantiating the Pulsed class, outputs can be configured in two modes: mixed mode (dac_mode is one of DacMode.Mixedxx) or direct mode (dac_mode is DacMode.Direct). In mixed mode, signals generated in the intermediate-frequency (IF) domain are then upconverted to the radio-frequency domain (RF) using a built-in digital IQ mixer and numerically-controlled oscillator (NCO). In direct mode, the digital up-conversion stage is bypassed and IF signals are output directly.

Each output has 16 slots to store output templates, divided in two groups of 8 templates each. Each template can be programmed with up to 1022 ns of data at get_fs('dac') sampling rate. When using digital up-conversion (mixed mode), that is 1022 complex-valued data points (real part stored in “pulses I” and imaginary in “pulses Q”) at 1 GS/s. In direct mode, that is 2044 real-valued data points at 2 GS/s. The vertical resolution is 16 bits and spans values from -1 to 1.

Templates can be output directly, or can be used as envelopes to modulate the two IF carrier generators. The first 8 templates can modulate the first IF generator (group 0), the last 8 templates can modulate the second IF generator (group 1). The method setup_template() is used to program the templates into one of the groups and to choose whether they should be used as envelopes. The method also takes care of splitting templates that are too long into shorter, concatenated templates.

In the case of long but “flat-top” signals, the convenience method setup_long_drive() can be used to create arbitrarily long pulses using as little as one template. Another advantage of a LongDrive is that it can be resized with its set_total_duration() method.

Templates can be output all together, or at different times, with get_clk_T() resolution (typically 2 ns) using the output_pulse() method.

Each IF generator has 40 bits frequency and phase resolution, equivalent to 2 mHz and 6 prad, respectively. They can each be programmed with up to 512 frequencies and phases (and phases_q in mixed mode) with the method setup_freq_lut(). During the experiment, the generators can quickly step through the programmed frequencies and phases with the methods select_frequency() and next_frequency(). The change can be made with get_clk_T() resolution (typically 2 ns).

The output of all active pulses in each group is then summed, and there is a dedicated scale stage. The output scaler has 17 bit resolution and can be programmed with up to 512 values (in the range -1 to 1) with the method setup_scale_lut(). The scale can be changed during the experiment with get_clk_T() resolution (typically 2 ns) with select_scale() and next_scale().

The output of each group scaler is finally combined and sent to the either I or Q port of the digital mixer when using digital up-conversion (in mixed mode) or it is directly sent to the digital-to-analog converter (DAC) when in direct mode.

The frequency of the numerically-controlled oscillator (NCO) fed to the LO port of the digital mixer is set using hardware.configure_mixer.

Pulsed input

The image below shows a schematic, functional representation of the input channels of Vivace/Presto during pulsed operation. This section provides a summary of how the methods of the Pulsed class interact with the hardware.

Alternative text

When instantiating the Pulsed class, inputs can be configured in two modes: mixed mode (adc_mode is AdcMode.Mixed) or direct mode (adc_mode is AdcMode.Direct). In mixed mode, the signal sampled in the radio-frequency domain (RF) is down-converted to the intermediate-frequency (IF) domain using a built-in digital IQ mixer and numerically-controlled oscillator (NCO). In direct mode, the digital down-conversion stage is bypassed and the sampled signal is analyzed directly.

The ports from which to store data are selected by set_store_ports() and the length of each store window by set_store_duration(). The timing of the sampling windows is decided by calling store(). The sampled data is then averaged interleaved and when the sequence is done the averaged traces are transferred to the computer by calling get_store_data(). When using direct mode the returned data is real valued (dtype=np.float64); when using digital down-conversion (mixed mode), the returned data is complex valued (dtype=np.complex128).

It is also possible to match each sampled trace with a pair of reference templates (128 templates available in total). The template pairs and the threshold (\(T\)) are defined in setup_template_matching_pair(). Reference templates are real valued in direct mode and complex valued in mixed mode, while the threshold is always a real number. The timing of each matching event is decided in match(). The result of a template matching event is the scalar product of the sampled trace with a reference template and is therefore a real number \(M\). When matching with a pair of templates, we get two results, \(M_1\) and \(M_2\). After the sequence is done the values of all the template-matching events can be retrieved with get_template_matching_data().

Template-matching results can be used to conditionally output pulses, thus implementing low-latency feedback. The “success” of a match event is determined by \(M_1 + M_2 - T > 0\). It is then possible to output conditional pulses based on the outcome (success or failure) of one or more matching events by using setup_condition().