Source code for quchip.extensions.signals
"""Reference classical signal transform."""
from __future__ import annotations
from dataclasses import dataclass
from typing import Any
from quchip.control.signal import SignalMap, SignalTransform
from quchip.declarative import qnp
from quchip.utils.labeling import resolve_label
[docs]
@dataclass(frozen=True)
class CableLoss(SignalTransform):
"""Attenuate one control line by a power loss specified in dB."""
line: str
loss_db: Any
_parameter_names = ("loss_db",)
def __init__(self, line: str | Any, loss_db: Any) -> None:
object.__setattr__(self, "line", resolve_label(line))
object.__setattr__(self, "loss_db", loss_db)
[docs]
def apply(self, signals: SignalMap) -> SignalMap:
factor = qnp.power(10.0, -self.loss_db / 20.0)
return {
key: signal.scaled(factor) if key[0] == self.line else signal
for key, signal in signals.items()
}
[docs]
def referenced_lines(self) -> tuple[str, ...]:
return (self.line,)
[docs]
def to_dict(self) -> dict[str, Any]:
data = super().to_dict()
data.update(line=self.line, loss_db=float(self.loss_db))
return data
[docs]
@classmethod
def from_dict(cls, data: dict[str, Any]) -> "CableLoss":
return cls(line=str(data["line"]), loss_db=float(data["loss_db"]))