cbdsim.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
  3. Date: Tue Oct 11 11:56:10 2016
  4. Model author: Sadaf Mustafiz and Claudio Gomes and Simon Van Mierlo
  5. Model name: CBDSimulator
  6. Model description:
  7. SCCD HUTN model of a CBD simulator
  8. """
  9. from sccd.runtime.statecharts_core import *
  10. from sccd.runtime.libs.ui import *
  11. from sccd.runtime.libs.utils import *
  12. from CBD_Controller import CBDController
  13. import Options
  14. # package "CBDSimulator"
  15. class CBDSimulator(RuntimeClassBase):
  16. def __init__(self, controller, options, model):
  17. RuntimeClassBase.__init__(self, controller)
  18. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  19. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  20. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  21. self.semantics.priority = StatechartSemantics.SourceParent
  22. self.semantics.concurrency = StatechartSemantics.Single
  23. # build Statechart structure
  24. self.build_statechart_structure()
  25. # user defined attributes
  26. self.iteration = None
  27. self.cbdController = None
  28. self.delta = None
  29. self.clock = None
  30. self.model = None
  31. self.depGraph = None
  32. self.strongComponentList = None
  33. self.currentCompIdx = None
  34. # call user defined constructor
  35. CBDSimulator.user_defined_constructor(self, options, model)
  36. def user_defined_constructor(self, options, model):
  37. self.options = options
  38. self.delta = self.options.getDeltaT()
  39. self.model = model
  40. def user_defined_destructor(self):
  41. pass
  42. # user defined method
  43. def endCondition(self):
  44. return self.iteration >= self.options.getMaxIterations()
  45. # user defined method
  46. def advanceTime(self):
  47. self.iteration = self.iteration + 1
  48. self.clock = self.clock + self.delta
  49. self.cbdController.advanceTimeStep()
  50. # user defined method
  51. def currentComponentIsCycle(self):
  52. return self.cbdController.componentIsCycle(self.strongComponentList[self.currentCompIdx], self.depGraph)
  53. # user defined method
  54. def hasNextStrongComponent(self):
  55. return (self.currentCompIdx + 1) < len(self.strongComponentList)
  56. # builds Statechart structure
  57. def build_statechart_structure(self):
  58. # state <root>
  59. self.states[""] = State(0, self)
  60. # state /Main
  61. self.states["/Main"] = ParallelState(1, self)
  62. self.states["/Main"].setEnter(self._Main_enter)
  63. self.states["/Main"].setExit(self._Main_exit)
  64. # state /Main/SimulationState
  65. self.states["/Main/SimulationState"] = State(2, self)
  66. # state /Main/SimulationState/Waiting
  67. self.states["/Main/SimulationState/Waiting"] = State(3, self)
  68. self.states["/Main/SimulationState/Waiting"].setEnter(self._Main_SimulationState_Waiting_enter)
  69. self.states["/Main/SimulationState/Waiting"].setExit(self._Main_SimulationState_Waiting_exit)
  70. # state /Main/SimulationState/Running
  71. self.states["/Main/SimulationState/Running"] = State(4, self)
  72. self.states["/Main/SimulationState/Running"].setEnter(self._Main_SimulationState_Running_enter)
  73. self.states["/Main/SimulationState/Running"].setExit(self._Main_SimulationState_Running_exit)
  74. # state /Main/SimulationState/Running/Continuous
  75. self.states["/Main/SimulationState/Running/Continuous"] = State(5, self)
  76. # state /Main/SimulationState/Stopped
  77. self.states["/Main/SimulationState/Stopped"] = State(6, self)
  78. self.states["/Main/SimulationState/Stopped"].setEnter(self._Main_SimulationState_Stopped_enter)
  79. self.states["/Main/SimulationState/Stopped"].setExit(self._Main_SimulationState_Stopped_exit)
  80. # state /Main/SimulationFlow
  81. self.states["/Main/SimulationFlow"] = State(7, self)
  82. # state /Main/SimulationFlow/Initialize
  83. self.states["/Main/SimulationFlow/Initialize"] = State(8, self)
  84. self.states["/Main/SimulationFlow/Initialize"].setEnter(self._Main_SimulationFlow_Initialize_enter)
  85. # state /Main/SimulationFlow/CheckTerminationCondition
  86. self.states["/Main/SimulationFlow/CheckTerminationCondition"] = State(9, self)
  87. # state /Main/SimulationFlow/CreateDependencyGraph
  88. self.states["/Main/SimulationFlow/CreateDependencyGraph"] = State(10, self)
  89. self.states["/Main/SimulationFlow/CreateDependencyGraph"].setEnter(self._Main_SimulationFlow_CreateDependencyGraph_enter)
  90. # state /Main/SimulationFlow/IsolateStrongComponents
  91. self.states["/Main/SimulationFlow/IsolateStrongComponents"] = State(11, self)
  92. self.states["/Main/SimulationFlow/IsolateStrongComponents"].setEnter(self._Main_SimulationFlow_IsolateStrongComponents_enter)
  93. # state /Main/SimulationFlow/ExecuteSimulationStep
  94. self.states["/Main/SimulationFlow/ExecuteSimulationStep"] = State(12, self)
  95. # state /Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent
  96. self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"] = State(13, self)
  97. # state /Main/SimulationFlow/ExecuteSimulationStep/CheckCycle
  98. self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckCycle"] = State(14, self)
  99. # state /SimulationComplete
  100. self.states["/SimulationComplete"] = State(15, self)
  101. # add children
  102. self.states[""].addChild(self.states["/Main"])
  103. self.states[""].addChild(self.states["/SimulationComplete"])
  104. self.states["/Main"].addChild(self.states["/Main/SimulationState"])
  105. self.states["/Main"].addChild(self.states["/Main/SimulationFlow"])
  106. self.states["/Main/SimulationState"].addChild(self.states["/Main/SimulationState/Waiting"])
  107. self.states["/Main/SimulationState"].addChild(self.states["/Main/SimulationState/Running"])
  108. self.states["/Main/SimulationState"].addChild(self.states["/Main/SimulationState/Stopped"])
  109. self.states["/Main/SimulationState/Running"].addChild(self.states["/Main/SimulationState/Running/Continuous"])
  110. self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/Initialize"])
  111. self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/CheckTerminationCondition"])
  112. self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/CreateDependencyGraph"])
  113. self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/IsolateStrongComponents"])
  114. self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/ExecuteSimulationStep"])
  115. self.states["/Main/SimulationFlow/ExecuteSimulationStep"].addChild(self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"])
  116. self.states["/Main/SimulationFlow/ExecuteSimulationStep"].addChild(self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckCycle"])
  117. self.states[""].fixTree()
  118. self.states[""].default_state = self.states["/Main"]
  119. self.states["/Main/SimulationState"].default_state = self.states["/Main/SimulationState/Waiting"]
  120. self.states["/Main/SimulationState/Running"].default_state = self.states["/Main/SimulationState/Running/Continuous"]
  121. self.states["/Main/SimulationFlow"].default_state = self.states["/Main/SimulationFlow/Initialize"]
  122. self.states["/Main/SimulationFlow/ExecuteSimulationStep"].default_state = self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"]
  123. # transition /Main/SimulationState/Waiting
  124. _Main_SimulationState_Waiting_0 = Transition(self, self.states["/Main/SimulationState/Waiting"], [self.states["/Main/SimulationState/Running/Continuous"]])
  125. _Main_SimulationState_Waiting_0.setTrigger(Event("continuous", "user_input"))
  126. self.states["/Main/SimulationState/Waiting"].addTransition(_Main_SimulationState_Waiting_0)
  127. # transition /Main/SimulationFlow/Initialize
  128. _Main_SimulationFlow_Initialize_0 = Transition(self, self.states["/Main/SimulationFlow/Initialize"], [self.states["/Main/SimulationFlow/CheckTerminationCondition"]])
  129. _Main_SimulationFlow_Initialize_0.setTrigger(None)
  130. self.states["/Main/SimulationFlow/Initialize"].addTransition(_Main_SimulationFlow_Initialize_0)
  131. # transition /Main/SimulationFlow/CheckTerminationCondition
  132. _Main_SimulationFlow_CheckTerminationCondition_0 = Transition(self, self.states["/Main/SimulationFlow/CheckTerminationCondition"], [self.states["/Main/SimulationFlow/CreateDependencyGraph"]])
  133. _Main_SimulationFlow_CheckTerminationCondition_0.setTrigger(None)
  134. _Main_SimulationFlow_CheckTerminationCondition_0.setGuard(self._Main_SimulationFlow_CheckTerminationCondition_0_guard)
  135. self.states["/Main/SimulationFlow/CheckTerminationCondition"].addTransition(_Main_SimulationFlow_CheckTerminationCondition_0)
  136. # transition /Main/SimulationFlow/CreateDependencyGraph
  137. _Main_SimulationFlow_CreateDependencyGraph_0 = Transition(self, self.states["/Main/SimulationFlow/CreateDependencyGraph"], [self.states["/Main/SimulationFlow/IsolateStrongComponents"]])
  138. _Main_SimulationFlow_CreateDependencyGraph_0.setTrigger(None)
  139. self.states["/Main/SimulationFlow/CreateDependencyGraph"].addTransition(_Main_SimulationFlow_CreateDependencyGraph_0)
  140. # transition /Main/SimulationFlow/IsolateStrongComponents
  141. _Main_SimulationFlow_IsolateStrongComponents_0 = Transition(self, self.states["/Main/SimulationFlow/IsolateStrongComponents"], [self.states["/Main/SimulationFlow/ExecuteSimulationStep"]])
  142. _Main_SimulationFlow_IsolateStrongComponents_0.setAction(self._Main_SimulationFlow_IsolateStrongComponents_0_exec)
  143. _Main_SimulationFlow_IsolateStrongComponents_0.setTrigger(None)
  144. self.states["/Main/SimulationFlow/IsolateStrongComponents"].addTransition(_Main_SimulationFlow_IsolateStrongComponents_0)
  145. # transition /Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent
  146. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0 = Transition(self, self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"], [self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckCycle"]])
  147. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0.setAction(self._Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0_exec)
  148. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0.setTrigger(None)
  149. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0.setGuard(self._Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0_guard)
  150. self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"].addTransition(_Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0)
  151. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1 = Transition(self, self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"], [self.states["/Main/SimulationFlow/CheckTerminationCondition"]])
  152. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1.setAction(self._Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1_exec)
  153. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1.setTrigger(None)
  154. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1.setGuard(self._Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1_guard)
  155. self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"].addTransition(_Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1)
  156. # transition /Main/SimulationFlow/ExecuteSimulationStep/CheckCycle
  157. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0 = Transition(self, self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckCycle"], [self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"]])
  158. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0.setAction(self._Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0_exec)
  159. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0.setTrigger(None)
  160. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0.setGuard(self._Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0_guard)
  161. self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckCycle"].addTransition(_Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0)
  162. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1 = Transition(self, self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckCycle"], [self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"]])
  163. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1.setAction(self._Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1_exec)
  164. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1.setTrigger(None)
  165. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1.setGuard(self._Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1_guard)
  166. self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckCycle"].addTransition(_Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1)
  167. # transition /Main
  168. _Main_0 = Transition(self, self.states["/Main"], [self.states["/SimulationComplete"]])
  169. _Main_0.setTrigger(Event("_0after"))
  170. _Main_0.setGuard(self._Main_0_guard)
  171. self.states["/Main"].addTransition(_Main_0)
  172. # transition /Main/SimulationState/Running
  173. _Main_SimulationState_Running_0 = Transition(self, self.states["/Main/SimulationState/Running"], [self.states["/Main/SimulationState/Stopped"]])
  174. _Main_SimulationState_Running_0.setAction(self._Main_SimulationState_Running_0_exec)
  175. _Main_SimulationState_Running_0.setTrigger(None)
  176. _Main_SimulationState_Running_0.setGuard(self._Main_SimulationState_Running_0_guard)
  177. self.states["/Main/SimulationState/Running"].addTransition(_Main_SimulationState_Running_0)
  178. def _Main_enter(self):
  179. self.addTimer(0, self.sccd_yield())
  180. def _Main_exit(self):
  181. self.removeTimer(0)
  182. def _Main_SimulationState_Running_enter(self):
  183. print 'entering SimulationState/Running'
  184. def _Main_SimulationState_Running_exit(self):
  185. print 'exiting SimulationState/Running'
  186. def _Main_SimulationState_Waiting_enter(self):
  187. print 'entering SimulationState/Waiting'
  188. def _Main_SimulationState_Waiting_exit(self):
  189. print 'exiting SimulationState/Waiting'
  190. def _Main_SimulationState_Stopped_enter(self):
  191. print 'entering SimulationState/Stopped'
  192. def _Main_SimulationState_Stopped_exit(self):
  193. print 'exiting SimulationState/Stopped'
  194. def _Main_SimulationFlow_Initialize_enter(self):
  195. self.iteration = 0
  196. self.clock = 0
  197. self.cbdController = CBDController(self.model, self.delta)
  198. self.cbdController.initSimulation()
  199. def _Main_SimulationFlow_CreateDependencyGraph_enter(self):
  200. self.depGraph = self.cbdController.createDepGraph(self.iteration)
  201. def _Main_SimulationFlow_IsolateStrongComponents_enter(self):
  202. self.strongComponentList = self.cbdController.createStrongComponents(self.depGraph, self.iteration)
  203. def _Main_0_guard(self, parameters):
  204. return self.inState(["/Main/SimulationState/Stopped"])
  205. def _Main_SimulationState_Running_0_exec(self, parameters):
  206. self.raiseInternalEvent(Event("termination_condition", None, []))
  207. def _Main_SimulationState_Running_0_guard(self, parameters):
  208. return self.endCondition()
  209. def _Main_SimulationFlow_CheckTerminationCondition_0_guard(self, parameters):
  210. return self.inState(["/Main/SimulationState/Running"])
  211. def _Main_SimulationFlow_IsolateStrongComponents_0_exec(self, parameters):
  212. self.currentCompIdx = -1
  213. def _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0_exec(self, parameters):
  214. self.currentCompIdx = self.currentCompIdx + 1
  215. def _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0_guard(self, parameters):
  216. return self.hasNextStrongComponent()
  217. def _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1_exec(self, parameters):
  218. self.advanceTime()
  219. def _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1_guard(self, parameters):
  220. return not self.hasNextStrongComponent()
  221. def _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0_exec(self, parameters):
  222. self.cbdController.computeNextBlock(self.strongComponentList[self.currentCompIdx], self.iteration)
  223. def _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0_guard(self, parameters):
  224. return not self.currentComponentIsCycle()
  225. def _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1_exec(self, parameters):
  226. self.cbdController.computeNextAlgebraicLoop(self.strongComponentList[self.currentCompIdx], self.iteration)
  227. def _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1_guard(self, parameters):
  228. return self.currentComponentIsCycle()
  229. def initializeStatechart(self):
  230. # enter default state
  231. self.default_targets = self.states["/Main"].getEffectiveTargetStates()
  232. RuntimeClassBase.initializeStatechart(self)
  233. class ObjectManager(ObjectManagerBase):
  234. def __init__(self, controller):
  235. ObjectManagerBase.__init__(self, controller)
  236. def instantiate(self, class_name, construct_params):
  237. if class_name == "CBDSimulator":
  238. instance = CBDSimulator(self.controller, construct_params[0], construct_params[1])
  239. instance.associations = {}
  240. else:
  241. raise Exception("Cannot instantiate class " + class_name)
  242. return instance
  243. class Controller(ThreadsControllerBase):
  244. def __init__(self, options, model, keep_running = None, behind_schedule_callback = None):
  245. if keep_running == None: keep_running = True
  246. if behind_schedule_callback == None: behind_schedule_callback = None
  247. ThreadsControllerBase.__init__(self, ObjectManager(self), keep_running, behind_schedule_callback)
  248. self.addInputPort("user_input")
  249. self.addInputPort("user_output")
  250. self.object_manager.createInstance("CBDSimulator", [options, model])