Source code for squadds.components.component_registry

"""Resolve dataset component names to their Qiskit Metal implementations."""

from __future__ import annotations

from dataclasses import dataclass
from typing import Any

from qiskit_metal.qlibrary.core import QComponent


[docs] @dataclass(frozen=True) class CouplerSpec: """Construction and pin roles for a supported coupler.""" component_class: type[QComponent] route_pin: str exposed_pins: tuple[str, ...] instance_suffix: str
def _normalized_component_name(component_name: str) -> str: return component_name.replace("_", "").replace("-", "").lower()
[docs] def get_coupler_spec(component_name: str) -> CouplerSpec: """Return the implementation and pin roles for a coupler name.""" normalized = _normalized_component_name(component_name) if normalized == "generalizedcapninterdigital": from squadds.components.generalized_ncap_interdigital import GeneralizedCapNInterdigital return CouplerSpec( component_class=GeneralizedCapNInterdigital, route_pin="south_end", exposed_pins=("north_end",), instance_suffix="generalized_ncap_coupler", ) if normalized in {"capn", "ncap", "capninterdigitaltee"}: from qiskit_metal.qlibrary.couplers.cap_n_interdigital_tee import CapNInterdigitalTee return CouplerSpec( component_class=CapNInterdigitalTee, route_pin="second_end", exposed_pins=("prime_start", "prime_end"), instance_suffix="capn_coupler", ) if normalized in {"clt", "coupledlinetee"}: from qiskit_metal.qlibrary.couplers.coupled_line_tee import CoupledLineTee return CouplerSpec( component_class=CoupledLineTee, route_pin="second_end", exposed_pins=("prime_start", "prime_end"), instance_suffix="CLT_coupler", ) raise ValueError(f"Unsupported coupler component: {component_name}")
[docs] def create_coupler(component_name: str, design, name: str, options: dict[str, Any] | None = None) -> QComponent: """Instantiate a named coupler using its registered implementation.""" spec = get_coupler_spec(component_name) return spec.component_class(design, name, options=options or {})
[docs] def build_component_from_design(design, row: dict[str, Any], name: str = "cplr") -> QComponent: """Build the exact component declared by a SQuADDS dataset row. Both nested Hugging Face records and second-level flattened API records are accepted. GeneralizedCapNInterdigital is intentionally resolved only from ``squadds.components``. """ design_record = row.get("design", row) component_name = ( design_record.get("component_class") or design_record.get("component_name") or design_record.get("coupler_type") ) if not component_name: raise ValueError("Dataset row does not declare a component class or coupler type.") options = design_record.get("design_options", row.get("design_options", {})) return create_coupler(component_name, design, name, options)