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 }