Biases and Pulses¶
Qibosoq supports the execution of modulated fast pulses, called here just pulses, and continuous DC biases.
Biases¶
By bias we mean a DC current that gets turned on before the pulse sequence execution and gets turn off just at the end. Note that some care may be needed to fire continuous un-modulated pulses since the board itself may have baluns at the outputs.
Biases are controlled via the qibosoq.components.base.Qubit
object:
from qibosoq.components.base import Qubit
qubit = Qubit(
bias = 0.1,
dac = 3
)
The bias parameter is a value relative to the maximum output voltage of the used dac so it’s defined in the range [-1, 1].
Pulses¶
Differently from the biases, the pulses have a shape, a duration and are modulated.
In Qibosoq
there is a object qibosoq.components.pulses.Pulse
:
from qibosoq.components.pulses import Pulse
pulse = Pulse(
frequency = 4000, # float in MHz
amplitude = 0.5, # float in [-1, 1]
relative_phase = 0, # int in degrees
start_delay = 0, # float in us
duration = 1, # float in us
name = "id", # str
type = "drive", # str in {"readout", "drive"}
dac = 1, # int
adc = None, # optional int
)
The
start_delay
is the difference in start time between this pulse and the one before it. We can consider the execution of a pulse always divided in two moments:wait
start_delay
if it’s not zerofire the pulse
The
name
parameter can be chosen to be whatever, but should be a unique identifier of the pulse.The adc parameter is not needed for drive pulse, but it is for readout pulses. Every readout pulse is composed of a pulse fired through the dac and acquired by the adc, so both are required.
While the qibosoq.components.pulses.Pulse
object can be used in the client, it cannot be used in execution time.
In fact, the server expect a Pulse with a shape.
The shape objects inherits from qibosoq.components.pulses.Pulse
and share the same parameter + eventually others (… here are the qibosoq.components.pulses.Pulse
parameters):
from qibosoq.components.pulses import Rectangular, Gaussian, Drag, Arbitrary, FlatTop, Hann
pulse = Rectangular(...)
pulse = Gaussian(
...
rel_sigma = 5, # float, sigma values as a fraction of the duration
)
pulse = Drag(
...
rel_sigma = 5, # float, sigma values as a fraction of the duration
beta = 10, # float (drag beta parameter)
)
pulse = FlatTop(
...
rel_sigma = 5, # float, sigma values as a fraction of the duration
)
pulse = Arbitrary(
...
i_values = [...], # list of floats
q_values = [...], # list of floats
)
pulse = Hann(...)
Measurements¶
From version 0.1.1
, Qibosoq
supports the execution of measurements decoupled from pulses. This allows to perform acquisition from an ADC without the need of genereting a pulse from a DAC.
from qibosoq.components.pulses import Measurement
meas = Measurement(
type = "readout",
frequency = 6400, # float in MHz
start_delay = 0, # float in us
duration = 1, # float in us
dac = 1, # int
adc = 0, # int
)
The frequency parameter is the one of the signal we want to acquire. This is required by the downspampling scheme, to perform ADC acquisitions.
The DAC number, that could seem useless, can be used to ensure frequency matching between the ADC and a DAC. Namely, DACs and ADCs have different memory registers and we usually want to esure that have the same frequencies stored so that relative phases do not change during the experiment.