Source code for semi_cr.core.lab.instrument.chip
from __future__ import annotations
import importlib
from typing import Any
from qcodes.instrument import Instrument
from qcodes.instrument.channel import ChannelList
from semi_cr.core.lab.devices.base import BaseDevice
[docs]
class Chip(Instrument):
def __init__(
self,
name: str,
devices: dict[str, dict[str, Any]],
**kwargs: Any,
):
super().__init__(name, **kwargs)
self.add_submodule("devices",
ChannelList(self, "devices", BaseDevice, snapshotable=True),
)
for device_id, arguments in devices.items():
self.add_device(device_id, **arguments)
[docs]
def add_device(self, device_id: str, **kwargs: Any) -> None:
device_class_string = kwargs.pop("type")
module_name, class_name = device_class_string.rsplit(".", 1)
module = importlib.import_module(module_name)
assert hasattr(module, class_name), f"class {class_name} is not in {module_name}"
device_class = getattr(module, class_name)
qcodes_name = f"{self.name}{device_id}".replace("_", "")
device = device_class(self, qcodes_name, **kwargs)
setattr(self, device_id, device) # keep YAML-style access: chip.D1
setattr(self, qcodes_name, device) # optional: chip.X002001C1D1
self.devices.append(device)
[docs]
def get_idn(self) -> dict[str, str | None]:
"""
Override Instrument.get_idn so QCoDeS never calls self.ask('*IDN?').
"""
return {
"vendor": None,
"model": self.name,
"serial": None,
"firmware": None
}