Source code for tickit.core.device
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import Generic, Hashable, Mapping, Optional, TypeVar
from tickit.core.typedefs import SimTime
from tickit.utils.configuration.configurable import as_tagged_union
#: A bound typevar for mappings of device inputs
InMap = TypeVar("InMap", bound=Mapping[str, Hashable])
#: A bound typevar for mappings of device outputs
OutMap = TypeVar("OutMap", bound=Mapping[str, Hashable])
[docs]@dataclass
class DeviceUpdate(Generic[OutMap]):
"""An immutable data container for Device outputs and callback request time.
Args:
outputs: A mapping of device output keys and current values.
call_at: The simulation time at which the component requests to be awoken.
"""
outputs: OutMap
call_at: Optional[SimTime]
[docs]@as_tagged_union
class Device(ABC, Generic[InMap, OutMap]):
"""An interface for types which implement simulated devices."""
[docs] @abstractmethod
def update(self, time: SimTime, inputs: InMap) -> DeviceUpdate[OutMap]:
"""A method which implements device behaviour according to the time and its
inputs.
A method which implements the (typically physics based) changes which occur
within the device in response to either the progression of time or the
alteration of inputs to the device. The method returns the new observable state
of the device and may optionally include a time in which the method should be
called again.
Args:
time: The current simulation time (in nanoseconds).
inputs: A mapping of device inputs and their values.
"""