OPD - Operator Digital¶
The OPD is a separate box that enhances the OPX input with 10 more digital signals. These 10 inputs have programmable thresholds and are sampled at 1 ns resolution. They are \(50 \Omega\) matched and accept up to 3.3 V (LVTTL).
Usage¶
The OPD is directly connected to the OPX. When it is present, the input channels can be defined in the configuration file similarly to other channels. For example:
'controllers': {
'con1'': {
'type': 'opx1',
"analog_outputs": {
...
},
'digital_inputs': {
1: {'polarity': 'RISING', 'deadtime': 4, "threshold": 0.1},
2: {'polarity': 'RISING', 'deadtime': 15, "threshold": 3.2},
},
'analog_inputs': {
...
},
},
},
When defining a digital input, several parameters needs to be defined:
polarity
- Whether it is triggered whenRISING
(rising edge) orFALLING
(falling edge)deadtime
- Minimal time between pulses in ns. e.g., If it is set to 16 ns, then only the 1st pulse out of two pulses 10 ns apart will be detected. 'deadtime' should be between 4 and 16 ns.threshold
- Voltage threshold
Once defined in the controller, it can be used in a quantum element as follows:
Time Tagging¶
Time Tagging with the OPD is done similarly to a normal time tagging measurement:
times = declare(int, size=10)
counts = declare(int)
measure([pulse], [element], [stream], time_tagging.digital([times], [max_time], [counts], [element_output])
times
is a vector of integers that is populated by the measurement.max_time
gives the maximum time window, in ns, during which the statement waits for tag arrival.counts
is a variable that is populated with the number of tags which arrived during the measurement.element_output
must be defined if theelement
has more than one digital output. In this case, it is a string indicating the output to be measured. It can be left empty when the element has only one input (default is empty string).
The time-tagging operation ends either at the set duration or when the times
is fully populated (first one of the two).
Note that the information in times
is only valid up to counts
.
In addition, with the OPD you can directly count pulses:
counts = declare(int)
measure([pulse], [element], [stream], counting.digital([counts], [max_time], [element_outputs]))
counts
is a variable that is populated with the number of pulses which arrived during the measurement.max_time
gives the maximum time window, in ns, during which the statement waits for incoming pulses.element_outputs
must be defined if theelement
has more than one digital input. In this case, it is either a string indicating the output to be measured or a tuple with list of strings corresponding to the outputs to be measured. It can be left empty when the element has only one input (default is empty string).
Wait for trigger¶
It is possible for any element to wait until a pulse arrives at one of the OPD inputs. This is done with the wait_for_trigger()
function.
element_waiting
is the element waiting.pulse_to_play
is the name of the pulse to play on the element while waiting for the external trigger. Must be a constant pulse. Can be None to play nothing while waiting.trigger_element
is an element with digital inputs, when one of his digital inputs is triggered, theelement_waiting
will continue. Iftrigger_element
has multiple digital inputs, a specific one must be chosen:trigger_element
can be a tuple, with the 1st item being the element name and the 2nd item being the trigger input. Iftrigger_element
is left empty, then it waits for the trigger input in the back panel of the OPX.
Tip
See also the following guide on external triggering