Source code for qibolab.couplers

from dataclasses import dataclass, field
from typing import Dict, Optional, Union

from qibolab.channels import Channel
from qibolab.native import CouplerNatives

QubitId = Union[str, int]
"""Type for Coupler names."""


[docs]@dataclass class Coupler: """Representation of a physical coupler. Coupler objects are instantiated by :class: `qibolab.platforms.platform.Platform` and are passed to instruments to play pulses on them. """ name: QubitId "Coupler number or name." sweetspot: float = 0 "Coupler sweetspot to center it's flux dependence if needed." native_pulse: CouplerNatives = field(default_factory=CouplerNatives) "For now this only contains the calibrated pulse to activate the coupler." _flux: Optional[Channel] = None "flux (:class:`qibolab.platforms.utils.Channel`): Channel used to send flux pulses to the qubit." # TODO: With topology or conectivity # qubits: Optional[Dict[QubitId, Qubit]] = field(default_factory=dict) qubits: Dict = field(default_factory=dict) "Qubits the coupler acts on" def __post_init__(self): if self.flux is not None and self.sweetspot != 0: self.flux.offset = self.sweetspot @property def flux(self): return self._flux @flux.setter def flux(self, channel): if self.sweetspot != 0: channel.offset = self.sweetspot self._flux = channel @property def channels(self): if self.flux is not None: yield self.flux