tickit#
An event-based multi-device simulation framework providing configuration and orchestration of complex multi-device simulations.
PyPI |
|
Source code |
|
Documentation |
|
Changelog |
An example device which emits a random value between 0 and 255 whenever
called and asks to be called again once the simulation has progressed by the
callback_period
. Additionally, extenal control of RandomTrampoline is
afforded by a RemoteControlledAdapter which is exposed extenally through
a TCPServer:
@dataclass
class RandomTrampoline(ComponentConfig):
def __call__(self) -> Component: # noqa: D102
return DeviceSimulation(
name=self.name,
device=RandomTrampolineDevice(),
adapters=[RemoteControlledAdapter(server=TcpServer(format="%b\r\n"))])
class RandomTrampolineDevice(Device):
Inputs: TypedDict = TypedDict("Inputs", {})
Outputs: TypedDict = TypedDict("Outputs", {"output": int})
def __init__(self, callback_period: int = int(1e9)) -> None:
self.callback_period = SimTime(callback_period)
def update(self, time: SimTime, inputs: Inputs) -> DeviceUpdate[Outputs]:
output = randint(0, 255)
LOGGER.debug(
"Boing! (delta: {}, inputs: {}, output: {})".format(time, inputs, output)
)
return DeviceUpdate(
RandomTrampoline.Outputs(output=output),
SimTime(time + self.callback_period),
)
An example simulation defines a RemoteControlled device named tcp_contr and a Sink device named contr_sink. The observed output of tcp_contr is wired to the input input of contr_sink:
- examples.devices.remote_controlled.RemoteControlled: {}
name: tcp_contr
inputs: {}
- tickit.devices.sink.Sink: {}
name: contr_sink
inputs:
input: tcp_contr:observed
How the documentation is structured#
The documentation is split into 2 sections: