target.py 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713
  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 15:57:15 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. import sccd.runtime.accurate_time as accurate_time
  15. class Breakpoint:
  16. def __init__(self, name, function, enabled, disable_on_trigger):
  17. self.name = name
  18. self.function = function
  19. self.enabled = enabled
  20. self.disable_on_trigger = disable_on_trigger
  21. # package "CBDSimulator"
  22. class CBDSimulator(RuntimeClassBase):
  23. def __init__(self, controller, options, model):
  24. RuntimeClassBase.__init__(self, controller)
  25. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  26. self.semantics.internal_event_lifeline = StatechartSemantics.NextComboStep
  27. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  28. self.semantics.priority = StatechartSemantics.SourceParent
  29. self.semantics.concurrency = StatechartSemantics.Single
  30. # build Statechart structure
  31. self.build_statechart_structure()
  32. # user defined attributes
  33. self.iteration = None
  34. self.cbdController = None
  35. self.delta = None
  36. self.clock = None
  37. self.model = None
  38. self.depGraph = None
  39. self.strongComponentList = None
  40. self.currentCompIdx = None
  41. # call user defined constructor
  42. CBDSimulator.user_defined_constructor(self, options, model)
  43. def user_defined_constructor(self, options, model):
  44. self.options = options
  45. self.delta = self.options.getDeltaT() * 1000.0
  46. self.model = model
  47. def user_defined_destructor(self):
  48. pass
  49. # user defined method
  50. def initialize(self):
  51. self.iteration = 0
  52. self.clock = 0
  53. self.time_next = self.delta
  54. self.cbdController = CBDController(self.model, self.delta)
  55. self.cbdController.initSimulation()
  56. self.state = {b.getBlockName(): b.getSignal() for b in self.model.getBlocks()}
  57. self.breakpoints = []
  58. self.triggered_bp = None
  59. # user defined method
  60. def endCondition(self):
  61. return self.iteration >= self.options.getMaxIterations()
  62. # user defined method
  63. def advanceTime(self):
  64. self.iteration = self.iteration + 1
  65. self.clock = self.time_next
  66. self.cbdController.advanceTimeStep()
  67. self.time_next = self.clock + self.delta
  68. # user defined method
  69. def currentComponentIsCycle(self):
  70. return self.cbdController.componentIsCycle(self.strongComponentList[self.currentCompIdx], self.depGraph)
  71. # user defined method
  72. def hasNextStrongComponent(self):
  73. return (self.currentCompIdx + 1) < len(self.strongComponentList)
  74. # user defined method
  75. def finalize(self):
  76. from bokeh.plotting import figure, output_file, show
  77. times = []
  78. values = []
  79. for timeValuePair in self.model.getSignal("neg"):
  80. times.append(timeValuePair.time)
  81. values.append(timeValuePair.value)
  82. output_file("./plot.html", title="Plot")
  83. p = figure(title="Something vs Otherthing", x_axis_label="Time", y_axis_label="Values")
  84. p.line(times, values, legend="Something", line_width=1, line_color="red")
  85. show(p)
  86. # user defined method
  87. def waitTime(self):
  88. # First, we convert from wall-clock time to simulated time.
  89. # This means the elapsed time in wall-clock time needs to be scaled according to the realtime scale (for example, if the realtime scale is 2, an elapsed time of 1 second in wall-clock time is equal to an elapsed time of 2 seconds in simulated time).
  90. simulated_diff = (accurate_time.time() - self.realtime_start_time) * self.realtime_scale
  91. # time_next and simulated_diff are both in simulated time: so now scale back to wall-clock time by dividing.
  92. # This function returns an amount of miliseconds.
  93. return ((self.time_next - simulated_diff) / self.realtime_scale)
  94. # user defined method
  95. def addBreakpoint(self, name, function, enabled = None, disable_on_trigger = None):
  96. if enabled == None: enabled = true
  97. if disable_on_trigger == None: disable_on_trigger = true
  98. if len([bp for bp in self.breakpoints if bp.name == name]) > 0:
  99. return -1
  100. self.breakpoints.append(Breakpoint(name, function, enabled, disable_on_trigger))
  101. return 0
  102. # user defined method
  103. def delBreakpoint(self, name):
  104. if len([bp for bp in self.breakpoints if bp.name == name]) == 0:
  105. return -1
  106. self.breakpoints = [bp for bp in self.breakpoints if bp.name != name]
  107. return 0
  108. # user defined method
  109. def toggleBreakpoint(self, name):
  110. if len([bp for bp in self.breakpoints if bp.name == name]) == 0:
  111. return -1
  112. for bp in self.breakpoints:
  113. if bp.name == name:
  114. bp.enabled = enabled
  115. break
  116. return 0
  117. # user defined method
  118. def breakpointTriggers(self, is_realtime_simulation):
  119. self.triggered_bp = None
  120. for bp in self.breakpoints:
  121. if not bp.enabled:
  122. continue
  123. # include the function in the scope...
  124. exec(bp.function)
  125. # ... and execute it, note that the breakpoint thus has to start with "def breakpoint("
  126. # note that we pass self.time_next instead of self.simulated_time in the case of as-fast-as-possible simulation (or stepping)
  127. # this is to make sure that the simulation is stopped BEFORE the specified time is reached, and not AFTER (because we don't necessarily implement 'step back')
  128. # in case of realtime simulation, we do pass the current simulated time, since we can stop at (more or less) exactly the right time
  129. if breakpoint({'clock': (self.clock if is_realtime_simulation else self.time_next) / 1000.0, 'state': self.state}):
  130. # triggered!
  131. self.triggered_bp = bp.name
  132. if bp.disable_on_trigger:
  133. bp.enabled = False
  134. return True
  135. else:
  136. # not triggered, so continue
  137. continue
  138. return False
  139. # user defined method
  140. def godEvent(self, block_name, new_val):
  141. if block_name not in self.state:
  142. return -1
  143. for b in self.model.getBlocks():
  144. if b.getBlockName() == block_name:
  145. b.setSignal(new_val)
  146. self.state = {b.getBlockName(): b.getSignal() for b in self.model.getBlocks()}
  147. return 0
  148. # builds Statechart structure
  149. def build_statechart_structure(self):
  150. # state <root>
  151. self.states[""] = State(0, self)
  152. # state /Main
  153. self.states["/Main"] = ParallelState(1, self)
  154. # state /Main/SimulationState
  155. self.states["/Main/SimulationState"] = State(2, self)
  156. # state /Main/SimulationState/Paused
  157. self.states["/Main/SimulationState/Paused"] = State(3, self)
  158. self.states["/Main/SimulationState/Paused"].setEnter(self._Main_SimulationState_Paused_enter)
  159. self.states["/Main/SimulationState/Paused"].setExit(self._Main_SimulationState_Paused_exit)
  160. # state /Main/SimulationState/PrePaused
  161. self.states["/Main/SimulationState/PrePaused"] = State(4, self)
  162. self.states["/Main/SimulationState/PrePaused"].setEnter(self._Main_SimulationState_PrePaused_enter)
  163. self.states["/Main/SimulationState/PrePaused"].setExit(self._Main_SimulationState_PrePaused_exit)
  164. # state /Main/SimulationState/PreBreakpointTriggered
  165. self.states["/Main/SimulationState/PreBreakpointTriggered"] = State(5, self)
  166. self.states["/Main/SimulationState/PreBreakpointTriggered"].setEnter(self._Main_SimulationState_PreBreakpointTriggered_enter)
  167. self.states["/Main/SimulationState/PreBreakpointTriggered"].setExit(self._Main_SimulationState_PreBreakpointTriggered_exit)
  168. # state /Main/SimulationState/Running
  169. self.states["/Main/SimulationState/Running"] = State(6, self)
  170. self.states["/Main/SimulationState/Running"].setEnter(self._Main_SimulationState_Running_enter)
  171. self.states["/Main/SimulationState/Running"].setExit(self._Main_SimulationState_Running_exit)
  172. # state /Main/SimulationState/Running/Continuous
  173. self.states["/Main/SimulationState/Running/Continuous"] = State(7, self)
  174. # state /Main/SimulationState/Running/BigStep
  175. self.states["/Main/SimulationState/Running/BigStep"] = State(8, self)
  176. # state /Main/SimulationState/Running/BigStepDone
  177. self.states["/Main/SimulationState/Running/BigStepDone"] = State(9, self)
  178. self.states["/Main/SimulationState/Running/BigStepDone"].setEnter(self._Main_SimulationState_Running_BigStepDone_enter)
  179. self.states["/Main/SimulationState/Running/BigStepDone"].setExit(self._Main_SimulationState_Running_BigStepDone_exit)
  180. # state /Main/SimulationState/Running/Realtime
  181. self.states["/Main/SimulationState/Running/Realtime"] = State(10, self)
  182. self.states["/Main/SimulationState/Running/Realtime"].setEnter(self._Main_SimulationState_Running_Realtime_enter)
  183. # state /Main/SimulationState/Stopped
  184. self.states["/Main/SimulationState/Stopped"] = State(11, self)
  185. self.states["/Main/SimulationState/Stopped"].setEnter(self._Main_SimulationState_Stopped_enter)
  186. self.states["/Main/SimulationState/Stopped"].setExit(self._Main_SimulationState_Stopped_exit)
  187. # state /Main/SimulationFlow
  188. self.states["/Main/SimulationFlow"] = State(12, self)
  189. # state /Main/SimulationFlow/Initialize
  190. self.states["/Main/SimulationFlow/Initialize"] = State(13, self)
  191. self.states["/Main/SimulationFlow/Initialize"].setEnter(self._Main_SimulationFlow_Initialize_enter)
  192. # state /Main/SimulationFlow/CheckTerminationCondition
  193. self.states["/Main/SimulationFlow/CheckTerminationCondition"] = State(14, self)
  194. self.states["/Main/SimulationFlow/CheckTerminationCondition"].setEnter(self._Main_SimulationFlow_CheckTerminationCondition_enter)
  195. self.states["/Main/SimulationFlow/CheckTerminationCondition"].setExit(self._Main_SimulationFlow_CheckTerminationCondition_exit)
  196. # state /Main/SimulationFlow/Waiting
  197. self.states["/Main/SimulationFlow/Waiting"] = State(15, self)
  198. self.states["/Main/SimulationFlow/Waiting"].setEnter(self._Main_SimulationFlow_Waiting_enter)
  199. self.states["/Main/SimulationFlow/Waiting"].setExit(self._Main_SimulationFlow_Waiting_exit)
  200. # state /Main/SimulationFlow/CreateDependencyGraph
  201. self.states["/Main/SimulationFlow/CreateDependencyGraph"] = State(16, self)
  202. self.states["/Main/SimulationFlow/CreateDependencyGraph"].setEnter(self._Main_SimulationFlow_CreateDependencyGraph_enter)
  203. # state /Main/SimulationFlow/IsolateStrongComponents
  204. self.states["/Main/SimulationFlow/IsolateStrongComponents"] = State(17, self)
  205. self.states["/Main/SimulationFlow/IsolateStrongComponents"].setEnter(self._Main_SimulationFlow_IsolateStrongComponents_enter)
  206. # state /Main/SimulationFlow/ExecuteSimulationStep
  207. self.states["/Main/SimulationFlow/ExecuteSimulationStep"] = State(18, self)
  208. # state /Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent
  209. self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"] = State(19, self)
  210. self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"].setEnter(self._Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_enter)
  211. self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"].setExit(self._Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_exit)
  212. # state /Main/SimulationFlow/ExecuteSimulationStep/CheckCycle
  213. self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckCycle"] = State(20, self)
  214. # state /Main/SimulationFlow/Stopped
  215. self.states["/Main/SimulationFlow/Stopped"] = State(21, self)
  216. # state /Main/BreakpointManager
  217. self.states["/Main/BreakpointManager"] = State(22, self)
  218. # state /Main/BreakpointManager/Listening
  219. self.states["/Main/BreakpointManager/Listening"] = State(23, self)
  220. # state /Main/GodEventManager
  221. self.states["/Main/GodEventManager"] = State(24, self)
  222. # state /Main/GodEventManager/Listening
  223. self.states["/Main/GodEventManager/Listening"] = State(25, self)
  224. # state /Main/UserOutput
  225. self.states["/Main/UserOutput"] = State(26, self)
  226. # state /Main/UserOutput/Waiting
  227. self.states["/Main/UserOutput/Waiting"] = State(27, self)
  228. # state /SimulationComplete
  229. self.states["/SimulationComplete"] = State(28, self)
  230. # add children
  231. self.states[""].addChild(self.states["/Main"])
  232. self.states[""].addChild(self.states["/SimulationComplete"])
  233. self.states["/Main"].addChild(self.states["/Main/SimulationState"])
  234. self.states["/Main"].addChild(self.states["/Main/SimulationFlow"])
  235. self.states["/Main"].addChild(self.states["/Main/BreakpointManager"])
  236. self.states["/Main"].addChild(self.states["/Main/GodEventManager"])
  237. self.states["/Main"].addChild(self.states["/Main/UserOutput"])
  238. self.states["/Main/SimulationState"].addChild(self.states["/Main/SimulationState/Paused"])
  239. self.states["/Main/SimulationState"].addChild(self.states["/Main/SimulationState/PrePaused"])
  240. self.states["/Main/SimulationState"].addChild(self.states["/Main/SimulationState/PreBreakpointTriggered"])
  241. self.states["/Main/SimulationState"].addChild(self.states["/Main/SimulationState/Running"])
  242. self.states["/Main/SimulationState"].addChild(self.states["/Main/SimulationState/Stopped"])
  243. self.states["/Main/SimulationState/Running"].addChild(self.states["/Main/SimulationState/Running/Continuous"])
  244. self.states["/Main/SimulationState/Running"].addChild(self.states["/Main/SimulationState/Running/BigStep"])
  245. self.states["/Main/SimulationState/Running"].addChild(self.states["/Main/SimulationState/Running/BigStepDone"])
  246. self.states["/Main/SimulationState/Running"].addChild(self.states["/Main/SimulationState/Running/Realtime"])
  247. self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/Initialize"])
  248. self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/CheckTerminationCondition"])
  249. self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/Waiting"])
  250. self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/CreateDependencyGraph"])
  251. self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/IsolateStrongComponents"])
  252. self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/ExecuteSimulationStep"])
  253. self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/Stopped"])
  254. self.states["/Main/SimulationFlow/ExecuteSimulationStep"].addChild(self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"])
  255. self.states["/Main/SimulationFlow/ExecuteSimulationStep"].addChild(self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckCycle"])
  256. self.states["/Main/BreakpointManager"].addChild(self.states["/Main/BreakpointManager/Listening"])
  257. self.states["/Main/GodEventManager"].addChild(self.states["/Main/GodEventManager/Listening"])
  258. self.states["/Main/UserOutput"].addChild(self.states["/Main/UserOutput/Waiting"])
  259. self.states[""].fixTree()
  260. self.states[""].default_state = self.states["/Main"]
  261. self.states["/Main/SimulationState"].default_state = self.states["/Main/SimulationState/Paused"]
  262. self.states["/Main/SimulationState/Running"].default_state = self.states["/Main/SimulationState/Running/Continuous"]
  263. self.states["/Main/SimulationFlow"].default_state = self.states["/Main/SimulationFlow/Initialize"]
  264. self.states["/Main/SimulationFlow/ExecuteSimulationStep"].default_state = self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"]
  265. self.states["/Main/BreakpointManager"].default_state = self.states["/Main/BreakpointManager/Listening"]
  266. self.states["/Main/GodEventManager"].default_state = self.states["/Main/GodEventManager/Listening"]
  267. self.states["/Main/UserOutput"].default_state = self.states["/Main/UserOutput/Waiting"]
  268. # transition /Main/SimulationState/Paused
  269. _Main_SimulationState_Paused_0 = Transition(self, self.states["/Main/SimulationState/Paused"], [self.states["/Main/SimulationState/Running/Continuous"]])
  270. _Main_SimulationState_Paused_0.setTrigger(Event("continuous", "user_input"))
  271. self.states["/Main/SimulationState/Paused"].addTransition(_Main_SimulationState_Paused_0)
  272. _Main_SimulationState_Paused_1 = Transition(self, self.states["/Main/SimulationState/Paused"], [self.states["/Main/SimulationState/Running/Realtime"]])
  273. _Main_SimulationState_Paused_1.setAction(self._Main_SimulationState_Paused_1_exec)
  274. _Main_SimulationState_Paused_1.setTrigger(Event("realtime", "user_input"))
  275. self.states["/Main/SimulationState/Paused"].addTransition(_Main_SimulationState_Paused_1)
  276. _Main_SimulationState_Paused_2 = Transition(self, self.states["/Main/SimulationState/Paused"], [self.states["/Main/SimulationState/Running/BigStep"]])
  277. _Main_SimulationState_Paused_2.setTrigger(Event("big_step", "user_input"))
  278. self.states["/Main/SimulationState/Paused"].addTransition(_Main_SimulationState_Paused_2)
  279. # transition /Main/SimulationState/PrePaused
  280. _Main_SimulationState_PrePaused_0 = Transition(self, self.states["/Main/SimulationState/PrePaused"], [self.states["/Main/SimulationState/Paused"]])
  281. _Main_SimulationState_PrePaused_0.setAction(self._Main_SimulationState_PrePaused_0_exec)
  282. _Main_SimulationState_PrePaused_0.setTrigger(Event("_0after"))
  283. self.states["/Main/SimulationState/PrePaused"].addTransition(_Main_SimulationState_PrePaused_0)
  284. # transition /Main/SimulationState/PreBreakpointTriggered
  285. _Main_SimulationState_PreBreakpointTriggered_0 = Transition(self, self.states["/Main/SimulationState/PreBreakpointTriggered"], [self.states["/Main/SimulationState/Paused"]])
  286. _Main_SimulationState_PreBreakpointTriggered_0.setAction(self._Main_SimulationState_PreBreakpointTriggered_0_exec)
  287. _Main_SimulationState_PreBreakpointTriggered_0.setTrigger(Event("_1after"))
  288. self.states["/Main/SimulationState/PreBreakpointTriggered"].addTransition(_Main_SimulationState_PreBreakpointTriggered_0)
  289. # transition /Main/SimulationState/Running/BigStep
  290. _Main_SimulationState_Running_BigStep_0 = Transition(self, self.states["/Main/SimulationState/Running/BigStep"], [self.states["/Main/SimulationState/Running/BigStepDone"]])
  291. _Main_SimulationState_Running_BigStep_0.setTrigger(Event("big_step_done", None))
  292. self.states["/Main/SimulationState/Running/BigStep"].addTransition(_Main_SimulationState_Running_BigStep_0)
  293. # transition /Main/SimulationState/Running/BigStepDone
  294. _Main_SimulationState_Running_BigStepDone_0 = Transition(self, self.states["/Main/SimulationState/Running/BigStepDone"], [self.states["/Main/SimulationState/Paused"]])
  295. _Main_SimulationState_Running_BigStepDone_0.setTrigger(Event("_2after"))
  296. self.states["/Main/SimulationState/Running/BigStepDone"].addTransition(_Main_SimulationState_Running_BigStepDone_0)
  297. # transition /Main/SimulationFlow/Initialize
  298. _Main_SimulationFlow_Initialize_0 = Transition(self, self.states["/Main/SimulationFlow/Initialize"], [self.states["/Main/SimulationFlow/CheckTerminationCondition"]])
  299. _Main_SimulationFlow_Initialize_0.setTrigger(None)
  300. self.states["/Main/SimulationFlow/Initialize"].addTransition(_Main_SimulationFlow_Initialize_0)
  301. # transition /Main/SimulationFlow/CheckTerminationCondition
  302. _Main_SimulationFlow_CheckTerminationCondition_0 = Transition(self, self.states["/Main/SimulationFlow/CheckTerminationCondition"], [self.states["/Main/SimulationFlow/CreateDependencyGraph"]])
  303. _Main_SimulationFlow_CheckTerminationCondition_0.setTrigger(None)
  304. _Main_SimulationFlow_CheckTerminationCondition_0.setGuard(self._Main_SimulationFlow_CheckTerminationCondition_0_guard)
  305. self.states["/Main/SimulationFlow/CheckTerminationCondition"].addTransition(_Main_SimulationFlow_CheckTerminationCondition_0)
  306. _Main_SimulationFlow_CheckTerminationCondition_1 = Transition(self, self.states["/Main/SimulationFlow/CheckTerminationCondition"], [self.states["/Main/SimulationFlow/Waiting"]])
  307. _Main_SimulationFlow_CheckTerminationCondition_1.setTrigger(None)
  308. _Main_SimulationFlow_CheckTerminationCondition_1.setGuard(self._Main_SimulationFlow_CheckTerminationCondition_1_guard)
  309. self.states["/Main/SimulationFlow/CheckTerminationCondition"].addTransition(_Main_SimulationFlow_CheckTerminationCondition_1)
  310. _Main_SimulationFlow_CheckTerminationCondition_2 = Transition(self, self.states["/Main/SimulationFlow/CheckTerminationCondition"], [self.states["/Main/SimulationFlow/Stopped"]])
  311. _Main_SimulationFlow_CheckTerminationCondition_2.setTrigger(Event("_3after"))
  312. _Main_SimulationFlow_CheckTerminationCondition_2.setGuard(self._Main_SimulationFlow_CheckTerminationCondition_2_guard)
  313. self.states["/Main/SimulationFlow/CheckTerminationCondition"].addTransition(_Main_SimulationFlow_CheckTerminationCondition_2)
  314. # transition /Main/SimulationFlow/Waiting
  315. _Main_SimulationFlow_Waiting_0 = Transition(self, self.states["/Main/SimulationFlow/Waiting"], [self.states["/Main/SimulationFlow/CheckTerminationCondition"]])
  316. _Main_SimulationFlow_Waiting_0.setTrigger(Event("_4after"))
  317. self.states["/Main/SimulationFlow/Waiting"].addTransition(_Main_SimulationFlow_Waiting_0)
  318. _Main_SimulationFlow_Waiting_1 = Transition(self, self.states["/Main/SimulationFlow/Waiting"], [self.states["/Main/SimulationFlow/CreateDependencyGraph"]])
  319. _Main_SimulationFlow_Waiting_1.setTrigger(None)
  320. _Main_SimulationFlow_Waiting_1.setGuard(self._Main_SimulationFlow_Waiting_1_guard)
  321. self.states["/Main/SimulationFlow/Waiting"].addTransition(_Main_SimulationFlow_Waiting_1)
  322. # transition /Main/SimulationFlow/CreateDependencyGraph
  323. _Main_SimulationFlow_CreateDependencyGraph_0 = Transition(self, self.states["/Main/SimulationFlow/CreateDependencyGraph"], [self.states["/Main/SimulationFlow/IsolateStrongComponents"]])
  324. _Main_SimulationFlow_CreateDependencyGraph_0.setTrigger(None)
  325. self.states["/Main/SimulationFlow/CreateDependencyGraph"].addTransition(_Main_SimulationFlow_CreateDependencyGraph_0)
  326. # transition /Main/SimulationFlow/IsolateStrongComponents
  327. _Main_SimulationFlow_IsolateStrongComponents_0 = Transition(self, self.states["/Main/SimulationFlow/IsolateStrongComponents"], [self.states["/Main/SimulationFlow/ExecuteSimulationStep"]])
  328. _Main_SimulationFlow_IsolateStrongComponents_0.setAction(self._Main_SimulationFlow_IsolateStrongComponents_0_exec)
  329. _Main_SimulationFlow_IsolateStrongComponents_0.setTrigger(None)
  330. self.states["/Main/SimulationFlow/IsolateStrongComponents"].addTransition(_Main_SimulationFlow_IsolateStrongComponents_0)
  331. # transition /Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent
  332. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0 = Transition(self, self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"], [self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckCycle"]])
  333. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0.setAction(self._Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0_exec)
  334. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0.setTrigger(None)
  335. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0.setGuard(self._Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0_guard)
  336. self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"].addTransition(_Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0)
  337. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1 = Transition(self, self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"], [self.states["/Main/SimulationFlow/CheckTerminationCondition"]])
  338. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1.setAction(self._Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1_exec)
  339. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1.setTrigger(Event("_5after"))
  340. _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1.setGuard(self._Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1_guard)
  341. self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"].addTransition(_Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1)
  342. # transition /Main/SimulationFlow/ExecuteSimulationStep/CheckCycle
  343. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0 = Transition(self, self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckCycle"], [self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"]])
  344. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0.setAction(self._Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0_exec)
  345. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0.setTrigger(None)
  346. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0.setGuard(self._Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0_guard)
  347. self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckCycle"].addTransition(_Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0)
  348. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1 = Transition(self, self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckCycle"], [self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckNextComponent"]])
  349. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1.setAction(self._Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1_exec)
  350. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1.setTrigger(None)
  351. _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1.setGuard(self._Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1_guard)
  352. self.states["/Main/SimulationFlow/ExecuteSimulationStep/CheckCycle"].addTransition(_Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1)
  353. # transition /Main/BreakpointManager/Listening
  354. _Main_BreakpointManager_Listening_0 = Transition(self, self.states["/Main/BreakpointManager/Listening"], [self.states["/Main/BreakpointManager/Listening"]])
  355. _Main_BreakpointManager_Listening_0.setAction(self._Main_BreakpointManager_Listening_0_exec)
  356. _Main_BreakpointManager_Listening_0.setTrigger(Event("add_breakpoint", "user_input"))
  357. self.states["/Main/BreakpointManager/Listening"].addTransition(_Main_BreakpointManager_Listening_0)
  358. _Main_BreakpointManager_Listening_1 = Transition(self, self.states["/Main/BreakpointManager/Listening"], [self.states["/Main/BreakpointManager/Listening"]])
  359. _Main_BreakpointManager_Listening_1.setAction(self._Main_BreakpointManager_Listening_1_exec)
  360. _Main_BreakpointManager_Listening_1.setTrigger(Event("del_breakpoint", "user_input"))
  361. self.states["/Main/BreakpointManager/Listening"].addTransition(_Main_BreakpointManager_Listening_1)
  362. _Main_BreakpointManager_Listening_2 = Transition(self, self.states["/Main/BreakpointManager/Listening"], [self.states["/Main/BreakpointManager/Listening"]])
  363. _Main_BreakpointManager_Listening_2.setAction(self._Main_BreakpointManager_Listening_2_exec)
  364. _Main_BreakpointManager_Listening_2.setTrigger(Event("toggle_breakpoint", "user_input"))
  365. self.states["/Main/BreakpointManager/Listening"].addTransition(_Main_BreakpointManager_Listening_2)
  366. _Main_BreakpointManager_Listening_3 = Transition(self, self.states["/Main/BreakpointManager/Listening"], [self.states["/Main/BreakpointManager/Listening"]])
  367. _Main_BreakpointManager_Listening_3.setAction(self._Main_BreakpointManager_Listening_3_exec)
  368. _Main_BreakpointManager_Listening_3.setTrigger(Event("list_breakpoints", "user_input"))
  369. self.states["/Main/BreakpointManager/Listening"].addTransition(_Main_BreakpointManager_Listening_3)
  370. # transition /Main/GodEventManager/Listening
  371. _Main_GodEventManager_Listening_0 = Transition(self, self.states["/Main/GodEventManager/Listening"], [self.states["/Main/GodEventManager/Listening"]])
  372. _Main_GodEventManager_Listening_0.setAction(self._Main_GodEventManager_Listening_0_exec)
  373. _Main_GodEventManager_Listening_0.setTrigger(Event("god_event", "user_input"))
  374. _Main_GodEventManager_Listening_0.setGuard(self._Main_GodEventManager_Listening_0_guard)
  375. self.states["/Main/GodEventManager/Listening"].addTransition(_Main_GodEventManager_Listening_0)
  376. # transition /Main/UserOutput/Waiting
  377. _Main_UserOutput_Waiting_0 = Transition(self, self.states["/Main/UserOutput/Waiting"], [self.states["/Main/UserOutput/Waiting"]])
  378. _Main_UserOutput_Waiting_0.setAction(self._Main_UserOutput_Waiting_0_exec)
  379. _Main_UserOutput_Waiting_0.setTrigger(Event("termination_condition", None))
  380. self.states["/Main/UserOutput/Waiting"].addTransition(_Main_UserOutput_Waiting_0)
  381. _Main_UserOutput_Waiting_1 = Transition(self, self.states["/Main/UserOutput/Waiting"], [self.states["/Main/UserOutput/Waiting"]])
  382. _Main_UserOutput_Waiting_1.setAction(self._Main_UserOutput_Waiting_1_exec)
  383. _Main_UserOutput_Waiting_1.setTrigger(Event("paused", None))
  384. self.states["/Main/UserOutput/Waiting"].addTransition(_Main_UserOutput_Waiting_1)
  385. _Main_UserOutput_Waiting_2 = Transition(self, self.states["/Main/UserOutput/Waiting"], [self.states["/Main/UserOutput/Waiting"]])
  386. _Main_UserOutput_Waiting_2.setAction(self._Main_UserOutput_Waiting_2_exec)
  387. _Main_UserOutput_Waiting_2.setTrigger(Event("big_step_done", None))
  388. _Main_UserOutput_Waiting_2.setGuard(self._Main_UserOutput_Waiting_2_guard)
  389. self.states["/Main/UserOutput/Waiting"].addTransition(_Main_UserOutput_Waiting_2)
  390. _Main_UserOutput_Waiting_3 = Transition(self, self.states["/Main/UserOutput/Waiting"], [self.states["/Main/UserOutput/Waiting"]])
  391. _Main_UserOutput_Waiting_3.setAction(self._Main_UserOutput_Waiting_3_exec)
  392. _Main_UserOutput_Waiting_3.setTrigger(Event("breakpoint_triggered", None))
  393. self.states["/Main/UserOutput/Waiting"].addTransition(_Main_UserOutput_Waiting_3)
  394. # transition /Main
  395. _Main_0 = Transition(self, self.states["/Main"], [self.states["/SimulationComplete"]])
  396. _Main_0.setAction(self._Main_0_exec)
  397. _Main_0.setTrigger(None)
  398. _Main_0.setGuard(self._Main_0_guard)
  399. self.states["/Main"].addTransition(_Main_0)
  400. # transition /Main/SimulationState/Running
  401. _Main_SimulationState_Running_0 = Transition(self, self.states["/Main/SimulationState/Running"], [self.states["/Main/SimulationState/Stopped"]])
  402. _Main_SimulationState_Running_0.setAction(self._Main_SimulationState_Running_0_exec)
  403. _Main_SimulationState_Running_0.setTrigger(None)
  404. _Main_SimulationState_Running_0.setGuard(self._Main_SimulationState_Running_0_guard)
  405. self.states["/Main/SimulationState/Running"].addTransition(_Main_SimulationState_Running_0)
  406. _Main_SimulationState_Running_1 = Transition(self, self.states["/Main/SimulationState/Running"], [self.states["/Main/SimulationState/PrePaused"]])
  407. _Main_SimulationState_Running_1.setTrigger(Event("pause", "user_input"))
  408. self.states["/Main/SimulationState/Running"].addTransition(_Main_SimulationState_Running_1)
  409. _Main_SimulationState_Running_2 = Transition(self, self.states["/Main/SimulationState/Running"], [self.states["/Main/SimulationState/PreBreakpointTriggered"]])
  410. _Main_SimulationState_Running_2.setTrigger(None)
  411. _Main_SimulationState_Running_2.setGuard(self._Main_SimulationState_Running_2_guard)
  412. self.states["/Main/SimulationState/Running"].addTransition(_Main_SimulationState_Running_2)
  413. def _Main_SimulationState_Running_enter(self):
  414. print 'entering SimulationState/Running'
  415. def _Main_SimulationState_Running_exit(self):
  416. print 'exiting SimulationState/Running'
  417. def _Main_SimulationState_Paused_enter(self):
  418. print 'entering SimulationState/Paused'
  419. def _Main_SimulationState_Paused_exit(self):
  420. print 'exiting SimulationState/Paused'
  421. def _Main_SimulationState_PrePaused_enter(self):
  422. self.addTimer(0, self.sccd_yield())
  423. def _Main_SimulationState_PrePaused_exit(self):
  424. self.removeTimer(0)
  425. def _Main_SimulationState_PreBreakpointTriggered_enter(self):
  426. self.addTimer(1, self.sccd_yield())
  427. def _Main_SimulationState_PreBreakpointTriggered_exit(self):
  428. self.removeTimer(1)
  429. def _Main_SimulationState_Running_BigStepDone_enter(self):
  430. self.addTimer(2, self.sccd_yield())
  431. def _Main_SimulationState_Running_BigStepDone_exit(self):
  432. self.removeTimer(2)
  433. def _Main_SimulationState_Running_Realtime_enter(self):
  434. # If the simulation was paused, we need to reset the start time of the simulation.
  435. # The start time of the simulation is equal to the point in wall-clock time where simulated time is 0.
  436. # If the simulation was paused, we have to recompute this point in time: it is the difference of the wall-clock time and the simulated time.
  437. # If the scale was changed after the pause, this point of course moves backwards (for scales smaller than 1) or forwards (for scales larger than 1)
  438. self.realtime_start_time = accurate_time.time() - (self.clock / self.realtime_scale)
  439. def _Main_SimulationState_Stopped_enter(self):
  440. print 'entering SimulationState/Stopped'
  441. def _Main_SimulationState_Stopped_exit(self):
  442. print 'exiting SimulationState/Stopped'
  443. def _Main_SimulationFlow_Initialize_enter(self):
  444. self.initialize()
  445. def _Main_SimulationFlow_CheckTerminationCondition_enter(self):
  446. self.addTimer(3, self.sccd_yield())
  447. def _Main_SimulationFlow_CheckTerminationCondition_exit(self):
  448. self.removeTimer(3)
  449. def _Main_SimulationFlow_Waiting_enter(self):
  450. self.addTimer(4, self.sccd_yield())
  451. def _Main_SimulationFlow_Waiting_exit(self):
  452. self.removeTimer(4)
  453. diff = accurate_time.time() - self.realtime_start_time
  454. self.clock = diff * self.realtime_scale
  455. def _Main_SimulationFlow_CreateDependencyGraph_enter(self):
  456. self.depGraph = self.cbdController.createDepGraph(self.iteration)
  457. def _Main_SimulationFlow_IsolateStrongComponents_enter(self):
  458. self.strongComponentList = self.cbdController.createStrongComponents(self.depGraph, self.iteration)
  459. def _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_enter(self):
  460. self.addTimer(5, self.sccd_yield())
  461. def _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_exit(self):
  462. self.removeTimer(5)
  463. def _Main_0_exec(self, parameters):
  464. self.finalize()
  465. def _Main_0_guard(self, parameters):
  466. return self.inState(["/Main/SimulationState/Stopped"]) and self.inState(["/Main/SimulationFlow/Stopped"])
  467. def _Main_SimulationState_Running_0_exec(self, parameters):
  468. self.raiseInternalEvent(Event("termination_condition", None, []))
  469. def _Main_SimulationState_Running_0_guard(self, parameters):
  470. return self.endCondition()
  471. def _Main_SimulationState_Running_2_guard(self, parameters):
  472. return self.breakpointTriggers(self.inState(["/Main/SimulationState/Running/Realtime"]))
  473. def _Main_SimulationState_Paused_1_exec(self, parameters):
  474. realtime_scale = parameters[0]
  475. self.realtime_scale = float(realtime_scale)
  476. def _Main_SimulationState_PrePaused_0_exec(self, parameters):
  477. self.raiseInternalEvent(Event("paused", None, []))
  478. def _Main_SimulationState_PreBreakpointTriggered_0_exec(self, parameters):
  479. self.raiseInternalEvent(Event("breakpoint_triggered", None, []))
  480. def _Main_SimulationFlow_CheckTerminationCondition_0_guard(self, parameters):
  481. return self.inState(["/Main/SimulationState/Running/Continuous"]) or self.inState(["/Main/SimulationState/Running/BigStep"])
  482. def _Main_SimulationFlow_CheckTerminationCondition_1_guard(self, parameters):
  483. return self.inState(["/Main/SimulationState/Running/Realtime"])
  484. def _Main_SimulationFlow_CheckTerminationCondition_2_guard(self, parameters):
  485. return self.inState(["/Main/SimulationState/Stopped"])
  486. def _Main_SimulationFlow_Waiting_1_guard(self, parameters):
  487. return self.waitTime() / 1000.0 <= self.sccd_yield()
  488. def _Main_SimulationFlow_IsolateStrongComponents_0_exec(self, parameters):
  489. self.currentCompIdx = -1
  490. def _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0_exec(self, parameters):
  491. self.currentCompIdx = self.currentCompIdx + 1
  492. def _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_0_guard(self, parameters):
  493. return self.hasNextStrongComponent()
  494. def _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1_exec(self, parameters):
  495. self.advanceTime()
  496. self.state = {b.getBlockName(): b.getSignal() for b in self.model.getBlocks()}
  497. self.raiseInternalEvent(Event("big_step_done", None, []))
  498. def _Main_SimulationFlow_ExecuteSimulationStep_CheckNextComponent_1_guard(self, parameters):
  499. return not self.hasNextStrongComponent()
  500. def _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0_exec(self, parameters):
  501. self.cbdController.computeNextBlock(self.strongComponentList[self.currentCompIdx], self.iteration)
  502. def _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_0_guard(self, parameters):
  503. return not self.currentComponentIsCycle()
  504. def _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1_exec(self, parameters):
  505. self.cbdController.computeNextAlgebraicLoop(self.strongComponentList[self.currentCompIdx], self.iteration)
  506. def _Main_SimulationFlow_ExecuteSimulationStep_CheckCycle_1_guard(self, parameters):
  507. return self.currentComponentIsCycle()
  508. def _Main_BreakpointManager_Listening_0_exec(self, parameters):
  509. name = parameters[0]
  510. function = parameters[1]
  511. enabled = parameters[2]
  512. disable_on_trigger = parameters[3]
  513. result = self.addBreakpoint(name, function, bool(enabled), bool(disable_on_trigger))
  514. self.big_step.outputEvent(Event("add_breakpoint_result", "user_output", [result]))
  515. def _Main_BreakpointManager_Listening_1_exec(self, parameters):
  516. name = parameters[0]
  517. result = self.delBreakpoint(name)
  518. self.big_step.outputEvent(Event("del_breakpoint_result", "user_output", [result]))
  519. def _Main_BreakpointManager_Listening_2_exec(self, parameters):
  520. name = parameters[0]
  521. result = self.toggleBreakpoint(name)
  522. self.big_step.outputEvent(Event("toggle_breakpoint_result", "user_output", [result]))
  523. def _Main_BreakpointManager_Listening_3_exec(self, parameters):
  524. self.big_step.outputEvent(Event("list_breakpoints_result", "user_output", [[bp.name for bp in self.breakpoints]]))
  525. def _Main_GodEventManager_Listening_0_exec(self, parameters):
  526. block_name = parameters[0]
  527. new_val = parameters[1]
  528. result = self.godEvent(block_name, new_val)
  529. self.big_step.outputEvent(Event("god_event_result", "user_output", [result]))
  530. def _Main_GodEventManager_Listening_0_guard(self, parameters):
  531. block_name = parameters[0]
  532. new_val = parameters[1]
  533. return self.inState(["/Main/SimulationState/Paused"])
  534. def _Main_UserOutput_Waiting_0_exec(self, parameters):
  535. self.big_step.outputEvent(Event("terminated", "user_output", []))
  536. self.big_step.outputEvent(Event("current_state", "user_output", [self.clock / 1000.0, self.state]))
  537. def _Main_UserOutput_Waiting_1_exec(self, parameters):
  538. self.big_step.outputEvent(Event("paused", "user_output", []))
  539. self.big_step.outputEvent(Event("current_state", "user_output", [self.clock / 1000.0, self.state]))
  540. def _Main_UserOutput_Waiting_2_exec(self, parameters):
  541. self.big_step.outputEvent(Event("stepped", "user_output", []))
  542. self.big_step.outputEvent(Event("current_state", "user_output", [self.clock / 1000.0, self.state]))
  543. def _Main_UserOutput_Waiting_2_guard(self, parameters):
  544. return self.inState(["/Main/SimulationState/Running/Realtime"]) or self.inState(["/Main/SimulationState/Running/BigStep"]) or self.inState(["/Main/SimulationState/Running/BigStepDone"])
  545. def _Main_UserOutput_Waiting_3_exec(self, parameters):
  546. self.big_step.outputEvent(Event("breakpoint_triggered", "user_output", [self.triggered_bp]))
  547. self.big_step.outputEvent(Event("current_state", "user_output", [self.clock / 1000.0, self.state]))
  548. def initializeStatechart(self):
  549. # enter default state
  550. self.default_targets = self.states["/Main"].getEffectiveTargetStates()
  551. RuntimeClassBase.initializeStatechart(self)
  552. class ObjectManager(ObjectManagerBase):
  553. def __init__(self, controller):
  554. ObjectManagerBase.__init__(self, controller)
  555. def instantiate(self, class_name, construct_params):
  556. if class_name == "CBDSimulator":
  557. instance = CBDSimulator(self.controller, construct_params[0], construct_params[1])
  558. instance.associations = {}
  559. else:
  560. raise Exception("Cannot instantiate class " + class_name)
  561. return instance
  562. class Controller(ThreadsControllerBase):
  563. def __init__(self, options, model, keep_running = None, behind_schedule_callback = None):
  564. if keep_running == None: keep_running = True
  565. if behind_schedule_callback == None: behind_schedule_callback = None
  566. ThreadsControllerBase.__init__(self, ObjectManager(self), keep_running, behind_schedule_callback)
  567. self.addInputPort("user_input")
  568. self.addInputPort("user_output")
  569. self.object_manager.createInstance("CBDSimulator", [options, model])