model.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from abc import *
  2. from dataclasses import *
  3. from typing import *
  4. from sccd.runtime.statechart_syntax import *
  5. from sccd.runtime.semantic_options import *
  6. @dataclass
  7. class ModelNamespace:
  8. def __init__(self):
  9. self.events: Dict[str, int] = {}
  10. self.inports: List[str] = []
  11. self.outports: List[str] = []
  12. def assign_event_id(self, name: str) -> int:
  13. return self.events.setdefault(name, len(self.events))
  14. def get_event_id(self, name: str) -> int:
  15. return self.events[name]
  16. def add_inport(self, port: str):
  17. if port not in self.inports:
  18. self.inports.append(port)
  19. def add_outport(self, port: str):
  20. if port not in self.outports:
  21. self.outports.append(port)
  22. @dataclass
  23. class StateTree:
  24. root: State
  25. states: Dict[str, State] # mapping from state "full name" (e.g. "/parallel/ortho1/a") to state
  26. state_list: List[State] # depth-first order
  27. transition_list: List[Transition] # source state depth-first order, then document order
  28. @dataclass
  29. class Statechart:
  30. tree: StateTree
  31. semantics: SemanticConfiguration = SemanticConfiguration()
  32. @dataclass
  33. class AbstractModel(ABC):
  34. namespace: ModelNamespace
  35. @abstractmethod
  36. def get_default_class(self) -> Statechart:
  37. pass
  38. @dataclass
  39. class MultiInstanceModel(AbstractModel):
  40. classes: Dict[str, Statechart]
  41. default_class: Optional[str]
  42. def get_default_class(self) -> Statechart:
  43. return self.classes[self.default_class]
  44. @dataclass
  45. class SingleInstanceModel(AbstractModel):
  46. statechart: Statechart
  47. def get_default_class(self) -> Statechart:
  48. return self.statechart