Source code for quantify_scheduler.operations.measurement_factories

# Repository: https://gitlab.com/quantify-os/quantify-scheduler
# Licensed according to the LICENCE file on the main branch
"""
A module containing factory functions for measurements on the quantum-device layer.

These factories are used to take a parametrized representation of on a operation
and use that to create an instance of the operation itself.
"""
from typing import Literal, Union

from quantify_scheduler import Operation
from quantify_scheduler.enums import BinMode
from quantify_scheduler.operations.acquisition_library import (
    SSBIntegrationComplex,
    Trace,
)
from quantify_scheduler.operations.pulse_library import SquarePulse


# pylint: disable=too-many-arguments
[docs]def dispersive_measurement( pulse_amp: float, pulse_duration: float, port: str, clock: str, acq_duration: float, acq_delay: float, acq_channel: int, acq_index: int, acq_protocol: Literal["SSBIntegrationComplex", "Trace", None], pulse_type: Literal["SquarePulse"] = "SquarePulse", bin_mode: Union[BinMode, None] = BinMode.AVERAGE, acq_protocol_default: Literal[ "SSBIntegrationComplex", "Trace" ] = "SSBIntegrationComplex", ) -> Operation: """ Generator function for a standard dispersive measurement. A dispersive measurement (typically) exists of a pulse being applied to the device followed by an acquisition protocol to interpret the signal coming back from the device. """ # ensures default argument is used if not specified at gate level. # ideally, this input would not be accepted, but this is a workaround for #267 if bin_mode is None: bin_mode = BinMode.AVERAGE # Note that the funny structure here comes from the fact that the measurement # is a composite operation. We need to either introduce some level of nesting # in the structure of arguments (to re-use our custom structure), or just keep # this as a simple piece of code and accept that different protocols (e.g., # using different measurement pulses) would require a different generator function. if pulse_type == "SquarePulse": device_op = SquarePulse( amp=pulse_amp, duration=pulse_duration, port=port, clock=clock, ) else: # here we need to add support for SoftSquarePulse raise NotImplementedError( f'Invalid pulse_type "{pulse_type}" specified as argument to ' + "dispersive_measurement. Currently dispersive_measurement only" + ' allows "SquarePulse". Please correct your device config.' ) if acq_protocol is None: acq_protocol = acq_protocol_default if acq_protocol == "SSBIntegrationComplex": # readout pulse device_op.add_acquisition( SSBIntegrationComplex( duration=acq_duration, t0=acq_delay, acq_channel=acq_channel, acq_index=acq_index, port=port, clock=clock, bin_mode=bin_mode, ) ) elif acq_protocol == "Trace": device_op.add_acquisition( Trace( clock=clock, duration=acq_duration, t0=acq_delay, acq_channel=acq_channel, acq_index=acq_index, port=port, ) ) else: raise ValueError(f'Acquisition protocol "{acq_protocol}" is not supported.') return device_op