Source code for qupulse.hardware.feature_awg.base
from abc import ABC, abstractmethod
from typing import Optional, Collection
import weakref
from qupulse.hardware.awgs.base import AWG
from qupulse.hardware.feature_awg.base_features import Feature, FeatureAble
__all__ = ["AWGDevice", "AWGChannelTuple", "AWGChannel", "AWGMarkerChannel", "AWGDeviceFeature", "AWGChannelFeature",
"AWGChannelTupleFeature"]
[docs]class AWGDeviceFeature(Feature):
"""Base class for features that are used for :class:`.AWGDevice`"""
def __init__(self):
super().__init__(AWGDevice)
[docs]class AWGChannelFeature(Feature):
"""Base class for features that are used for :class:`.AWGChannel`"""
def __init__(self):
super().__init__(_BaseAWGChannel)
[docs]class AWGChannelTupleFeature(Feature):
"""Base class for features that are used for :class:`.AWGChannelTuple`"""
def __init__(self, channel_tuple: 'AWGChannelTuple'):
super().__init__(AWGChannelTuple)
self._channel_tuple = weakref.proxy(channel_tuple)
[docs]class AWGDevice(FeatureAble[AWGDeviceFeature], ABC):
"""Base class for all drivers of all arbitrary waveform generators"""
[docs] def __init__(self, name: str):
"""
Args:
name: The name of the device as a String
"""
super().__init__()
self._name = name
@property
def name(self) -> str:
"""Returns the name of a Device as a String"""
return self._name
[docs] @abstractmethod
def cleanup(self) -> None:
"""Function for cleaning up the dependencies of the device"""
raise NotImplementedError()
@property
@abstractmethod
def channels(self) -> Collection["AWGChannel"]:
"""Returns a list of all channels of a Device"""
raise NotImplementedError()
@property
@abstractmethod
def marker_channels(self) -> Collection["AWGMarkerChannel"]:
"""Returns a list of all marker channels of a device. The collection may be empty"""
raise NotImplementedError()
@property
@abstractmethod
def channel_tuples(self) -> Collection["AWGChannelTuple"]:
"""Returns a list of all channel tuples of a list"""
raise NotImplementedError()
[docs]class AWGChannelTuple(FeatureAble[AWGChannelTupleFeature], ABC):
"""Base class for all groups of synchronized channels of an AWG"""
[docs] def __init__(self, idn: int):
"""
Args:
idn: The identification number of a channel tuple
"""
super().__init__()
self._idn = idn
@property
@abstractmethod
def channel_tuple_adapter(self) -> AWG:
"""Return old interface adapter object. See channel_tuple_wrapper for details."""
@property
def idn(self) -> int:
"""Returns the identification number of a channel tuple"""
return self._idn
@property
def name(self) -> str:
"""Returns the name of a channel tuple"""
return "{dev}_CT{idn}".format(dev=self.device.name, idn=self.idn)
@property
@abstractmethod
def sample_rate(self) -> float:
"""Returns the sample rate of a channel tuple as a float"""
raise NotImplementedError()
@property
@abstractmethod
def device(self) -> AWGDevice:
"""Returns the device which the channel tuple belong to"""
raise NotImplementedError()
@property
@abstractmethod
def channels(self) -> Collection["AWGChannel"]:
"""Returns a list of all channels of the channel tuple"""
raise NotImplementedError()
@property
@abstractmethod
def marker_channels(self) -> Collection["AWGMarkerChannel"]:
"""Returns a list of all marker channels of the channel tuple. The collection may be empty"""
raise NotImplementedError()
class _BaseAWGChannel(FeatureAble[AWGChannelFeature], ABC):
"""Base class for a single channel of an AWG"""
def __init__(self, idn: int):
"""
Args:
idn: The identification number of a channel
"""
super().__init__()
self._idn = idn
@property
def idn(self) -> int:
"""Returns the identification number of a channel"""
return self._idn
@property
@abstractmethod
def device(self) -> AWGDevice:
"""Returns the device which the channel belongs to"""
raise NotImplementedError()
@property
@abstractmethod
def channel_tuple(self) -> Optional[AWGChannelTuple]:
"""Returns the channel tuple which a channel belongs to"""
raise NotImplementedError()
@abstractmethod
def _set_channel_tuple(self, channel_tuple) -> None:
"""
Sets the channel tuple which a channel belongs to
Args:
channel_tuple: reference to the channel tuple
"""
raise NotImplementedError()
[docs]class AWGChannel(_BaseAWGChannel, ABC):
"""Base class for a single channel of an AWG"""
@property
def name(self) -> str:
"""Returns the name of a channel"""
return "{dev}_C{idn}".format(dev=self.device.name, idn=self.idn)
[docs]class AWGMarkerChannel(_BaseAWGChannel, ABC):
"""Base class for a single marker channel of an AWG"""
@property
def name(self) -> str:
"""Returns the name of a marker channel"""
return "{dev}_M{idn}".format(dev=self.device.name, idn=self.idn)
class ProgramOverwriteException(RuntimeError):
def __init__(self, name) -> None:
super().__init__()
self.name = name
def __str__(self) -> str:
return "A program with the given name '{}' is already present on the device." \
" Use force to overwrite.".format(self.name)