Source code for qblox_instruments.types
# ----------------------------------------------------------------------------
# Description : Qblox instruments instrument and module types
# Git repository : https://gitlab.com/qblox/packages/software/qblox_instruments.git
# Copyright (C) Qblox BV (2020)
# ----------------------------------------------------------------------------
# -- include -----------------------------------------------------------------
import re
from enum import Enum, IntEnum
from typing import Any, Union
from qcodes import DelegateParameter
# -- definitions -------------------------------------------------------------
[docs]
class DebugLevel(IntEnum):
"""Debug level for communication with the instrument."""
MINIMAL_CHECK = 0
"""
Check for version mismatch between qblox-instruments and the firmware.
Perform a system error check only when starting or stopping sequencers.
"""
ERROR_CHECK = 1
"""Do not check for a version mismatch. Perform an error check on every SCPI call."""
NO_CHECK = 2
"""Do not check for a version mismatch or system errors."""
VERSION_AND_ERROR_CHECK = 3
"""
Check for version mismatch between qblox-instruments and the firmware. Perform an
error check on every SCPI call.
"""
[docs]
class TypeEnum(Enum):
"""
Type base class that arranges child enum string representations.
"""
def __repr__(self) -> str:
return "<{}.{}>".format(str(type(self)).split("'")[1], self.name)
def __str__(self) -> str:
return str(self.value)
def __eq__(self, other: Any) -> bool:
if type(self) is type(other):
return str(self) == str(other)
elif other in [str(val) for val in type(self)]:
return str(self) == other
else:
raise KeyError(f"{other} is not of type {type(self)}")
def __key__(self) -> str:
return str(self)
def __hash__(self) -> int:
return hash(self.__key__())
[docs]
class InstrumentClass(TypeEnum):
"""
Instrument class enum.
"""
CLUSTER = "Cluster"
[docs]
class InstrumentType(TypeEnum):
"""
Instrument/module type enum.
"""
MM = "MM"
QCM = "QCM"
QRM = "QRM"
QTM = "QTM"
QDM = "QDM"
LINQ = "LINQ"
QRC = "QRC"
QSM = "QSM"
_RF = "RF"
_EOM = "EOM"
[docs]
class ClusterType(TypeEnum):
"""
Cluster module type enum.
"""
_CLUSTER_MM = "Cluster MM"
CLUSTER_QCM = "Cluster QCM"
CLUSTER_QCM_RF = "Cluster QCM-RF"
CLUSTER_QRM = "Cluster QRM"
CLUSTER_QRM_RF = "Cluster QRM-RF"
CLUSTER_QTM = "Cluster QTM"
CLUSTER_QTM_EOM = "Cluster QTM-Pulse"
CLUSTER_QDM = "Cluster QDM"
CLUSTER_LINQ = "Cluster LINQ"
CLUSTER_QRC = "Cluster QRC"
CLUSTER_QSM = "Cluster QSM"
# -- class -------------------------------------------------------------------
[docs]
class TypeHandle:
"""
Instrument type handler class.
"""
# ------------------------------------------------------------------------
[docs]
def __init__(self, instrument: Union[ClusterType, str]) -> None:
"""
Create instrument type handler object.
Parameters
----------
instrument : Union[ClusterType, str]
Instrument/module type specification.
"""
# Set instrument type specification
try:
instrument = (
instrument.name.removeprefix("_")
if isinstance(instrument, Enum)
else instrument.upper()
)
instrument = re.split(" |_|-", instrument)
self._instrument_class = InstrumentClass[instrument[0]]
self._instrument_type = InstrumentType[instrument[1]]
self._is_mm_type = self._instrument_type == InstrumentType.MM
self._is_qrm_type = self._instrument_type == InstrumentType.QRM
self._is_qcm_type = self._instrument_type == InstrumentType.QCM
self._is_qtm_type = self._instrument_type == InstrumentType.QTM
self._is_qdm_type = self._instrument_type == InstrumentType.QDM
self._is_linq_type = self._instrument_type == InstrumentType.LINQ
self._is_qrc_type = self._instrument_type == InstrumentType.QRC
self._is_qsm_type = self._instrument_type == InstrumentType.QSM
except Exception:
raise RuntimeError("Invalid instrument type.")
# Do a first RF assignment.
# It is necessary for dummy modules but will get overwritten for real ones.
self._is_rf_type = False
self._is_eom_type = False
if len(instrument) > 2:
self._is_rf_type = instrument[2] == str(InstrumentType._RF)
self._is_eom_type = instrument[2] == str(InstrumentType._EOM)
if not (self._is_rf_type or self._is_eom_type):
raise RuntimeError("Invalid instrument type.")
# Add QRC to RF types
self._is_rf_type |= self._is_qrc_type
# ------------------------------------------------------------------------
@property
def instrument_class(self) -> InstrumentClass:
"""
Get instrument class (e.g. Cluster).
Returns
----------
InstrumentClass
Instrument class
"""
return self._instrument_class
# ------------------------------------------------------------------------
@property
def instrument_type(self) -> InstrumentType:
"""
Get instrument type (e.g. MM, QRM, QCM, QTM).
Returns
----------
InstrumentType
Instrument type
"""
return self._instrument_type
# ------------------------------------------------------------------------
@property
def is_mm_type(self) -> bool:
"""
Return if module is of type MM.
Returns
----------
bool
True if module is of type MM.
"""
return self._is_mm_type
# ------------------------------------------------------------------------
@property
def is_qcm_type(self) -> bool:
"""
Return if module is of type QCM.
Returns
----------
bool
True if module is of type QCM.
"""
return self._is_qcm_type
# ------------------------------------------------------------------------
@property
def is_qrm_type(self) -> bool:
"""
Return if module is of type QRM.
Returns
----------
bool
True if module is of type QRM.
"""
return self._is_qrm_type
# ------------------------------------------------------------------------
@property
def is_qtm_type(self) -> bool:
"""
Return if module is of type QTM.
Returns
----------
bool
True if module is of type QTM.
"""
return self._is_qtm_type
# ------------------------------------------------------------------------
@property
def is_qdm_type(self) -> bool:
"""
Return if module is of type QDM.
Returns
----------
bool
True if module is of type QDM.
"""
return self._is_qdm_type
# ------------------------------------------------------------------------
@property
def is_eom_type(self) -> bool:
"""
Return if module is of type EOM.
Returns
----------
bool
True if module is of type EOM.
"""
return self._is_eom_type
# ------------------------------------------------------------------------
@property
def is_linq_type(self) -> bool:
"""
Return if module is of type LINQ.
Returns
----------
bool
True if module is of type LINQ.
"""
return self._is_linq_type
# ------------------------------------------------------------------------
@property
def is_qrc_type(self) -> bool:
"""
Return if module is of type QRC.
Returns
----------
bool
True if module is of type QRC.
"""
return self._is_qrc_type
# ------------------------------------------------------------------------
@property
def is_qsm_type(self) -> bool:
"""
Return if module is of type QSM.
Returns
----------
bool
True if module is of type QSM.
"""
return self._is_qsm_type
# ------------------------------------------------------------------------
@property
def is_rf_type(self) -> bool:
"""
Return if has RF functionality.
Returns
----------
bool
True if module has RF functionality.
"""
return self._is_rf_type
[docs]
class FrequencyParameter(DelegateParameter):
[docs]
def __init__(self, *args, calibration_function, **kwargs) -> None:
self._calibration_function = calibration_function
super().__init__(*args, **kwargs)
[docs]
def set_raw(self, val, cal_type=None) -> None:
self.source.set(val)
self._calibration_function(cal_type=cal_type)