from __future__ import annotations from dataclasses import dataclass from typing import Callable from cm_inst import ALUOp, MemOp from sm_mod import Presence from tokens import Token @dataclass(frozen=True) class TokenReceived: time: float component: str token: Token @dataclass(frozen=True) class Matched: time: float component: str left: int right: int act_id: int offset: int frame_id: int @dataclass(frozen=True) class Executed: time: float component: str op: ALUOp | MemOp result: int bool_out: bool @dataclass(frozen=True) class Emitted: time: float component: str token: Token @dataclass(frozen=True) class IRAMWritten: time: float component: str offset: int count: int @dataclass(frozen=True) class CellWritten: time: float component: str addr: int old_pres: Presence new_pres: Presence @dataclass(frozen=True) class DeferredRead: time: float component: str addr: int @dataclass(frozen=True) class DeferredSatisfied: time: float component: str addr: int data: int @dataclass(frozen=True) class ResultSent: time: float component: str token: Token @dataclass(frozen=True) class FrameAllocated: time: float component: str act_id: int frame_id: int lane: int @dataclass(frozen=True) class FrameFreed: time: float component: str act_id: int frame_id: int lane: int frame_freed: bool @dataclass(frozen=True) class FrameSlotWritten: time: float component: str frame_id: int slot: int value: int | None @dataclass(frozen=True) class TokenRejected: time: float component: str token: Token reason: str SimEvent = ( TokenReceived | Matched | Executed | Emitted | IRAMWritten | CellWritten | DeferredRead | DeferredSatisfied | ResultSent | FrameAllocated | FrameFreed | FrameSlotWritten | TokenRejected ) EventCallback = Callable[[SimEvent], None]