Source code for semi_cr.core.lab.utils.quam
from __future__ import annotations
from qm import qua
from qualang_tools.units import unit
from semi_cr.core.quam_components.helpers import get_mux_components
from numbers import Real
from typing import Any
u = unit(coerce_to_integer=True)
[docs]
def serialize_quam(obj):
if obj is None or isinstance(obj, (str, int, float, bool)):
return obj
if isinstance(obj, dict):
data = {k: serialize_quam(v) for k, v in obj.items()}
elif isinstance(obj, (list, tuple)):
return [serialize_quam(v) for v in obj]
elif hasattr(obj, "to_dict"):
data = obj.to_dict()
elif hasattr(obj, "__dict__"):
data = {
k: serialize_quam(v)
for k, v in obj.__dict__.items()
if not k.startswith("_")
}
else:
return obj
# Recurse after to_dict(), because to_dict() may return nested QUAM objects
data = {k: serialize_quam(v) for k, v in data.items()}
# Put __class__ first, then id, then the rest
cls = data.pop("__class__", f"{obj.__class__.__module__}.{obj.__class__.__name__}")
id_value = data.pop("id", None)
ordered = {"__class__": cls}
if "id" in data or id_value is not None:
ordered["id"] = id_value
ordered.update(data)
return ordered
[docs]
def update_rf_device_frequency(freq, rf_in):
from semi_cr.core.lab.devices.tankinductor import TankInductor
from semi_cr.core.lab.devices.multiplexer import Multiplexer
device = rf_in.parent
if isinstance(device, TankInductor):
rf_in.update_frequency(freq)
qua.wait(
1000 * u.ns,
rf_in.quam.id,
)
elif isinstance(device, Multiplexer):
mux_components = get_mux_components(device)
if not mux_components:
raise ValueError("Expected at least one mux component.")
# rf_in.update_frequency(freq)
for mux_component in mux_components:
mux_component.update_frequency(freq)
qua.wait(
1000 * u.ns,
*(mux_component.id for mux_component in mux_components),
)
[docs]
def update_rf_device_amplitude(
amplitude: Any,
rf_in,
) -> None:
"""
Set the dimensionless amplitude scale used by the next RF play/measure operation.
`amplitude` may be:
- a Python float, or
- a QUA fixed variable/expression.
The value is a multiplier of the amplitude configured in the
readout pulse.
"""
if isinstance(amplitude, Real):
amplitude = float(amplitude)
if not 0.0 <= amplitude <= 1.0:
raise ValueError(
"The QUA amplitude scale must satisfy "
"0.0 <= amplitude <= 1.0."
)
rf_in._amplitude_scale = amplitude