simulator.py 67 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
  3. Date: Mon Oct 02 17:36:19 2017
  4. Model author: Yentl Van Tendeloo
  5. Model name: DEVS simulator
  6. Model description:
  7. A restricted PythonPDEVS simulator modelled in SCCD
  8. """
  9. from sccd.runtime.statecharts_core import *
  10. import cPickle as pickle
  11. import time
  12. # We basically just interface with the basesimulator
  13. from scheduler import Scheduler
  14. from DEVS import directConnect, CoupledDEVS, AtomicDEVS, RootDEVS
  15. class Breakpoint(object):
  16. def __init__(self, breakpoint_id, function, enabled, disable_on_trigger):
  17. self.id = breakpoint_id
  18. self.function = function
  19. self.enabled = enabled
  20. self.disable_on_trigger = disable_on_trigger
  21. # package "DEVS simulator"
  22. class SCCDSimulator(RuntimeClassBase):
  23. def __init__(self, controller, model):
  24. RuntimeClassBase.__init__(self, controller)
  25. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  26. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  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. # call user defined constructor
  33. SCCDSimulator.user_defined_constructor(self, model)
  34. def user_defined_constructor(self, model):
  35. # Simulation variables
  36. self.termination_time = None
  37. self.termination_condition = None
  38. self.simulation_time = (0.0, 0)
  39. self.model = model
  40. self.root_model = model
  41. self.realtime_scale = 1.0
  42. # Values to be set during simulation
  43. self.realtime_starttime = None
  44. self.inject_queue = []
  45. # Model initialization
  46. self.model_ids = []
  47. self.model.finalize(name="", model_counter=0, model_ids=self.model_ids, locations={None: []}, selectHierarchy=[])
  48. # Direct connection
  49. if isinstance(self.model, CoupledDEVS):
  50. self.model.componentSet = directConnect(self.model.componentSet, True)
  51. self.model = RootDEVS(self.model.componentSet, self.model.componentSet, None)
  52. for m in self.model.componentSet:
  53. m.timeLast = (-m.elapsed, 1)
  54. ta = m.timeAdvance()
  55. m.timeNext = (m.timeLast[0] + ta, 1)
  56. m.old_states = [(m.timeLast, pickle.dumps(m.state))]
  57. elif isinstance(self.model, AtomicDEVS):
  58. for p in self.model.IPorts:
  59. p.routingInLine = []
  60. p.routingOutLine = []
  61. for p in self.model.OPorts:
  62. p.routingInLine = []
  63. p.routingOutLine = []
  64. self.model = RootDEVS([self.model], [self.model], None)
  65. self.model.timeLast = (-self.model.elapsed, 1)
  66. ta = self.model.timeAdvance()
  67. self.model.timeNext = (self.model.timeLast[0] + ta, 1)
  68. # Fixed configuration options
  69. self.model.scheduler = Scheduler(self.model.componentSet, 1e-6, len(self.model.models))
  70. self.timeNext = self.model.scheduler.readFirst()
  71. # Cached values
  72. self.imminents = None
  73. self.outbags = None
  74. self.inbags = None
  75. self.transitioning = None
  76. self.new_states = None
  77. self.new_tn = None
  78. # Verbose trace file
  79. self.trace_file = None
  80. # Breakpoint management
  81. self.breakpoints = []
  82. # For a reset
  83. self.save_model = {model: (model.elapsed, pickle.dumps(model.state, pickle.HIGHEST_PROTOCOL)) for model in self.model.componentSet}
  84. self.transition_times = []
  85. def user_defined_destructor(self):
  86. pass
  87. # user defined method
  88. def serialize(self, type, object):
  89. if type == "imminents":
  90. return [m.getModelFullName() for m in object]
  91. elif type == "inbags" or type == "outbags":
  92. return {m.getPortFullName(): object[m] for m in object}
  93. elif type == "new_tn" or type == "new_states":
  94. return {m.getModelFullName(): object[m] for m in object}
  95. elif type == "transitioning":
  96. return {m.getModelFullName(): {1: "INTERNAL", 2: "EXTERNAL", 3: "CONFLUENT"}[object[m]] for m in object}
  97. # user defined method
  98. def find_port_with_name(self, name):
  99. for model in self.model.componentSet:
  100. if name.startswith(model.getModelFullName()):
  101. # Found a potential model
  102. # We can't simply check for equality, as portnames might contain dots too
  103. for port in model.IPorts:
  104. if port.getPortFullName() == name:
  105. # Now everything matches
  106. return port
  107. # Nothing found
  108. return None
  109. # user defined method
  110. def find_model_with_name(self, name):
  111. for model in self.model.componentSet:
  112. if name == model.getModelFullName():
  113. # Found exact match
  114. return model
  115. return None
  116. # user defined method
  117. def calculate_after(self):
  118. try:
  119. # Process in parts of 100 milliseconds to repeatedly check the termination condition
  120. nexttime = (self.timeNext[0] - (time.time() - self.realtime_starttime) / self.realtime_scale) * self.realtime_scale
  121. x = min(0.1, nexttime)
  122. return x
  123. except TypeError, AttributeError:
  124. # We are probably not simulating in realtime...
  125. return float('inf')
  126. # user defined method
  127. def parse_options(self, configuration):
  128. self.termination_condition = None if "termination_condition" not in configuration else configuration["termination_condition"]
  129. self.termination_time = None if "termination_time" not in configuration else configuration["termination_time"]
  130. self.realtime_scale = 1.0 if "realtime_scale" not in configuration else 1.0/configuration["realtime_scale"]
  131. # Subtract the current simulation time to allow for pausing
  132. self.realtime_starttime = (time.time() - self.simulation_time[0]*self.realtime_scale)
  133. # Reset the time used in the waiting, as it might not get recomputed
  134. self.the_time = 0.00001
  135. # user defined method
  136. def should_terminate(self, realtime):
  137. # Now that it includes breakpoints, results are to be interpretted as follows:
  138. # -2 --> continue simulation
  139. # -1 --> termination condition
  140. # else --> breakpoint
  141. if realtime:
  142. check_time = self.simulation_time
  143. else:
  144. self.compute_timeNext()
  145. check_time = self.timeNext
  146. # Just access the 'transitioned' dictionary
  147. # Kind of dirty though...
  148. if self.transitioning is None:
  149. transitioned = set()
  150. else:
  151. transitioned = set(self.transitioning.keys())
  152. if check_time[0] == float('inf'):
  153. # Always terminate if we have reached infinity
  154. terminate = True
  155. elif self.termination_condition is not None:
  156. terminate = self.termination_condition(check_time, self.root_model, transitioned)
  157. else:
  158. terminate = self.termination_time < check_time[0]
  159. if terminate:
  160. # Always terminate, so don't check breakpoints
  161. return -1
  162. else:
  163. # Have to check breakpoints for termination
  164. for bp in self.breakpoints:
  165. if not bp.enabled:
  166. continue
  167. # Include the function in the scope
  168. exec(bp.function)
  169. # And execute it, note that the breakpoint thus has to start with "def breakpoint("
  170. if breakpoint(check_time, self.root_model, transitioned):
  171. # Triggered!
  172. return bp.id
  173. else:
  174. # Not triggered, so continue
  175. continue
  176. return -2
  177. # user defined method
  178. def find_internal_imminents(self):
  179. self.imminents = self.model.scheduler.getImminent(self.simulation_time)
  180. self.transition_times.append(self.simulation_time)
  181. # user defined method
  182. def compute_outputfunction(self):
  183. self.outbags = {}
  184. for model in self.imminents:
  185. self.outbags.update(model.outputFnc())
  186. # user defined method
  187. def route_messages(self):
  188. self.inbags = {}
  189. for outport in self.outbags:
  190. payload = self.outbags[outport]
  191. for inport, z in outport.routingOutLine:
  192. if z is not None:
  193. payload = [z(pickle.loads(pickle.dumps(m))) for m in payload]
  194. self.inbags.setdefault(inport, []).extend(payload)
  195. # user defined method
  196. def process_injects(self):
  197. while self.inject_queue:
  198. if self.inject_queue[0]["time"] > self.simulation_time:
  199. break
  200. config = self.inject_queue.pop(0)
  201. portname = config["port"]
  202. event = config["event"]
  203. port = self.find_port_with_name(portname)
  204. self.inbags.setdefault(port, []).append(event)
  205. # user defined method
  206. def find_all_imminents(self):
  207. # Internal codes:
  208. # 1 --> internal transition
  209. # 2 --> external transition
  210. # 3 --> confluent transition
  211. # These codes are a legacy of efficient PyPDEVS, but is kept here for consistency
  212. self.transitioning = {model: 1 for model in self.imminents}
  213. for inport in self.inbags:
  214. aDEVS = inport.hostDEVS
  215. aDEVS.myInput[inport] = self.inbags[inport]
  216. if aDEVS in self.transitioning:
  217. self.transitioning[aDEVS] = 3
  218. else:
  219. self.transitioning[aDEVS] = 2
  220. # user defined method
  221. def compute_transitions(self):
  222. self.new_states = {}
  223. for aDEVS in self.transitioning:
  224. aDEVS.myInput = {key: pickle.loads(pickle.dumps(aDEVS.myInput[key], pickle.HIGHEST_PROTOCOL)) for key in aDEVS.myInput}
  225. if self.transitioning[aDEVS] == 1:
  226. aDEVS.state = aDEVS.intTransition()
  227. elif self.transitioning[aDEVS] == 2:
  228. aDEVS.elapsed = self.simulation_time[0] - aDEVS.timeLast[0]
  229. aDEVS.state = aDEVS.extTransition(aDEVS.myInput)
  230. elif self.transitioning[aDEVS] == 3:
  231. aDEVS.elapsed = 0.
  232. aDEVS.state = aDEVS.confTransition(aDEVS.myInput)
  233. aDEVS.old_states.append((self.simulation_time, pickle.dumps(aDEVS.state)))
  234. aDEVS.myInput = {}
  235. self.new_states[aDEVS] = aDEVS.state
  236. # user defined method
  237. def compute_ta(self):
  238. self.new_tn = {}
  239. t, age = self.simulation_time
  240. for aDEVS in self.transitioning:
  241. ta = aDEVS.timeAdvance()
  242. aDEVS.timeLast = self.simulation_time
  243. aDEVS.timeNext = (t + ta, 1 if ta else (age + 1))
  244. self.new_tn[aDEVS] = aDEVS.timeNext
  245. self.trace(self.transitioning[aDEVS], aDEVS)
  246. self.model.scheduler.massReschedule(self.transitioning)
  247. self.timeNext = self.model.scheduler.readFirst()
  248. # user defined method
  249. def trace(self, type, model):
  250. type_map = {1: "INTERNAL", 2: "EXTERNAL", 3: "CONFLUENT"}
  251. type = type_map[type]
  252. if self.trace_file is not None:
  253. self.trace_file.write("%s TRANSITION in <%s> @ %s\n" % (type, model.getModelFullName(), model.timeLast[0]))
  254. self.trace_file.write(" NEW STATE <%s>\n" % (model.state))
  255. if type != "EXTERNAL":
  256. self.trace_file.write(" OUTPUTFNC returned %s\n" % model.myOutput)
  257. elif type != "INTERNAL":
  258. self.trace_file.write(" inputs were %s\n" % model.myInput)
  259. self.trace_file.write(" timeNext: %s (ta: %s)\n" % (model.timeNext[0], model.timeNext[0] - model.timeLast[0]))
  260. # user defined method
  261. def flush_file(self):
  262. if self.trace_file is not None:
  263. self.trace_file.flush()
  264. # user defined method
  265. def process_breakpoints(self, realtime):
  266. breakpoint_id = self.should_terminate(realtime)
  267. for breakpoint in self.breakpoints:
  268. if breakpoint.id == breakpoint_id:
  269. if breakpoint.disable_on_trigger:
  270. breakpoint.enabled = False
  271. return breakpoint_id
  272. # user defined method
  273. def compute_timeNext(self):
  274. model_timeNext = self.model.scheduler.readFirst()
  275. if len(self.inject_queue) > 0:
  276. self.timeNext = min(model_timeNext, self.inject_queue[0]["time"])
  277. else:
  278. self.timeNext = model_timeNext
  279. # user defined method
  280. def rollback_step(self):
  281. if len(self.transition_times) == 0:
  282. return
  283. new_time = self.transition_times.pop()
  284. for model in self.model.componentSet:
  285. if model.old_states[-1][0] == new_time:
  286. # Remove the current state
  287. del model.old_states[-1]
  288. # Set the new (old...) state
  289. new_state = model.old_states[-1]
  290. model.state = pickle.loads(new_state[1])
  291. model.timeLast = new_state[0]
  292. ta = model.timeAdvance()
  293. model.timeNext = (model.timeLast[0] + ta, model.timeLast[1] + 1 if ta == 0 else 0)
  294. self.model.scheduler.massReschedule([model])
  295. self.simulation_time = self.transition_times[-1] if len(self.transition_times) > 0 else (0.0, 0)
  296. # builds Statechart structure
  297. def build_statechart_structure(self):
  298. # state <root>
  299. self.states[""] = State(0, "", self)
  300. # state /main
  301. self.states["/main"] = ParallelState(1, "/main", self)
  302. # state /main/injection_monitor
  303. self.states["/main/injection_monitor"] = State(2, "/main/injection_monitor", self)
  304. # state /main/injection_monitor/inject
  305. self.states["/main/injection_monitor/inject"] = State(3, "/main/injection_monitor/inject", self)
  306. # state /main/tracer_monitor
  307. self.states["/main/tracer_monitor"] = State(4, "/main/tracer_monitor", self)
  308. # state /main/tracer_monitor/trace
  309. self.states["/main/tracer_monitor/trace"] = State(5, "/main/tracer_monitor/trace", self)
  310. # state /main/simulation_flow
  311. self.states["/main/simulation_flow"] = State(6, "/main/simulation_flow", self)
  312. # state /main/simulation_flow/initialize
  313. self.states["/main/simulation_flow/initialize"] = State(7, "/main/simulation_flow/initialize", self)
  314. # state /main/simulation_flow/check_termination
  315. self.states["/main/simulation_flow/check_termination"] = State(8, "/main/simulation_flow/check_termination", self)
  316. self.states["/main/simulation_flow/check_termination"].setExit(self._main_simulation_flow_check_termination_exit)
  317. # state /main/simulation_flow/check_termination/workaround
  318. self.states["/main/simulation_flow/check_termination/workaround"] = State(9, "/main/simulation_flow/check_termination/workaround", self)
  319. self.states["/main/simulation_flow/check_termination/workaround"].setEnter(self._main_simulation_flow_check_termination_workaround_enter)
  320. self.states["/main/simulation_flow/check_termination/workaround"].setExit(self._main_simulation_flow_check_termination_workaround_exit)
  321. # state /main/simulation_flow/check_termination/wait
  322. self.states["/main/simulation_flow/check_termination/wait"] = State(10, "/main/simulation_flow/check_termination/wait", self)
  323. self.states["/main/simulation_flow/check_termination/wait"].setEnter(self._main_simulation_flow_check_termination_wait_enter)
  324. self.states["/main/simulation_flow/check_termination/wait"].setExit(self._main_simulation_flow_check_termination_wait_exit)
  325. # state /main/simulation_flow/check_termination/small_step_check
  326. self.states["/main/simulation_flow/check_termination/small_step_check"] = State(11, "/main/simulation_flow/check_termination/small_step_check", self)
  327. # state /main/simulation_flow/check_termination/check_termination
  328. self.states["/main/simulation_flow/check_termination/check_termination"] = State(12, "/main/simulation_flow/check_termination/check_termination", self)
  329. self.states["/main/simulation_flow/check_termination/check_termination"].setEnter(self._main_simulation_flow_check_termination_check_termination_enter)
  330. # state /main/simulation_flow/do_simulation
  331. self.states["/main/simulation_flow/do_simulation"] = State(13, "/main/simulation_flow/do_simulation", self)
  332. # state /main/simulation_flow/do_simulation/init
  333. self.states["/main/simulation_flow/do_simulation/init"] = State(14, "/main/simulation_flow/do_simulation/init", self)
  334. self.states["/main/simulation_flow/do_simulation/init"].setExit(self._main_simulation_flow_do_simulation_init_exit)
  335. # state /main/simulation_flow/do_simulation/found_internal_imminents
  336. self.states["/main/simulation_flow/do_simulation/found_internal_imminents"] = State(15, "/main/simulation_flow/do_simulation/found_internal_imminents", self)
  337. self.states["/main/simulation_flow/do_simulation/found_internal_imminents"].setExit(self._main_simulation_flow_do_simulation_found_internal_imminents_exit)
  338. # state /main/simulation_flow/do_simulation/computed_outputfunction
  339. self.states["/main/simulation_flow/do_simulation/computed_outputfunction"] = State(16, "/main/simulation_flow/do_simulation/computed_outputfunction", self)
  340. self.states["/main/simulation_flow/do_simulation/computed_outputfunction"].setExit(self._main_simulation_flow_do_simulation_computed_outputfunction_exit)
  341. # state /main/simulation_flow/do_simulation/routed_messages
  342. self.states["/main/simulation_flow/do_simulation/routed_messages"] = State(17, "/main/simulation_flow/do_simulation/routed_messages", self)
  343. self.states["/main/simulation_flow/do_simulation/routed_messages"].setExit(self._main_simulation_flow_do_simulation_routed_messages_exit)
  344. # state /main/simulation_flow/do_simulation/found_all_imminents
  345. self.states["/main/simulation_flow/do_simulation/found_all_imminents"] = State(18, "/main/simulation_flow/do_simulation/found_all_imminents", self)
  346. self.states["/main/simulation_flow/do_simulation/found_all_imminents"].setExit(self._main_simulation_flow_do_simulation_found_all_imminents_exit)
  347. # state /main/simulation_flow/do_simulation/computed_transitions
  348. self.states["/main/simulation_flow/do_simulation/computed_transitions"] = State(19, "/main/simulation_flow/do_simulation/computed_transitions", self)
  349. self.states["/main/simulation_flow/do_simulation/computed_transitions"].setExit(self._main_simulation_flow_do_simulation_computed_transitions_exit)
  350. # state /main/simulation_state
  351. self.states["/main/simulation_state"] = State(20, "/main/simulation_state", self)
  352. # state /main/simulation_state/paused
  353. self.states["/main/simulation_state/paused"] = State(21, "/main/simulation_state/paused", self)
  354. # state /main/simulation_state/continuous
  355. self.states["/main/simulation_state/continuous"] = State(22, "/main/simulation_state/continuous", self)
  356. # state /main/simulation_state/realtime
  357. self.states["/main/simulation_state/realtime"] = State(23, "/main/simulation_state/realtime", self)
  358. # state /main/simulation_state/big_step
  359. self.states["/main/simulation_state/big_step"] = State(24, "/main/simulation_state/big_step", self)
  360. # state /main/breakpoint_manager
  361. self.states["/main/breakpoint_manager"] = State(25, "/main/breakpoint_manager", self)
  362. # state /main/breakpoint_manager/breakpoint_manage
  363. self.states["/main/breakpoint_manager/breakpoint_manage"] = State(26, "/main/breakpoint_manager/breakpoint_manage", self)
  364. # state /main/reset
  365. self.states["/main/reset"] = State(27, "/main/reset", self)
  366. # state /main/reset/reset
  367. self.states["/main/reset/reset"] = State(28, "/main/reset/reset", self)
  368. # add children
  369. self.states[""].addChild(self.states["/main"])
  370. self.states["/main"].addChild(self.states["/main/injection_monitor"])
  371. self.states["/main"].addChild(self.states["/main/tracer_monitor"])
  372. self.states["/main"].addChild(self.states["/main/simulation_flow"])
  373. self.states["/main"].addChild(self.states["/main/simulation_state"])
  374. self.states["/main"].addChild(self.states["/main/breakpoint_manager"])
  375. self.states["/main"].addChild(self.states["/main/reset"])
  376. self.states["/main/injection_monitor"].addChild(self.states["/main/injection_monitor/inject"])
  377. self.states["/main/tracer_monitor"].addChild(self.states["/main/tracer_monitor/trace"])
  378. self.states["/main/simulation_flow"].addChild(self.states["/main/simulation_flow/initialize"])
  379. self.states["/main/simulation_flow"].addChild(self.states["/main/simulation_flow/check_termination"])
  380. self.states["/main/simulation_flow"].addChild(self.states["/main/simulation_flow/do_simulation"])
  381. self.states["/main/simulation_flow/check_termination"].addChild(self.states["/main/simulation_flow/check_termination/workaround"])
  382. self.states["/main/simulation_flow/check_termination"].addChild(self.states["/main/simulation_flow/check_termination/wait"])
  383. self.states["/main/simulation_flow/check_termination"].addChild(self.states["/main/simulation_flow/check_termination/small_step_check"])
  384. self.states["/main/simulation_flow/check_termination"].addChild(self.states["/main/simulation_flow/check_termination/check_termination"])
  385. self.states["/main/simulation_flow/do_simulation"].addChild(self.states["/main/simulation_flow/do_simulation/init"])
  386. self.states["/main/simulation_flow/do_simulation"].addChild(self.states["/main/simulation_flow/do_simulation/found_internal_imminents"])
  387. self.states["/main/simulation_flow/do_simulation"].addChild(self.states["/main/simulation_flow/do_simulation/computed_outputfunction"])
  388. self.states["/main/simulation_flow/do_simulation"].addChild(self.states["/main/simulation_flow/do_simulation/routed_messages"])
  389. self.states["/main/simulation_flow/do_simulation"].addChild(self.states["/main/simulation_flow/do_simulation/found_all_imminents"])
  390. self.states["/main/simulation_flow/do_simulation"].addChild(self.states["/main/simulation_flow/do_simulation/computed_transitions"])
  391. self.states["/main/simulation_state"].addChild(self.states["/main/simulation_state/paused"])
  392. self.states["/main/simulation_state"].addChild(self.states["/main/simulation_state/continuous"])
  393. self.states["/main/simulation_state"].addChild(self.states["/main/simulation_state/realtime"])
  394. self.states["/main/simulation_state"].addChild(self.states["/main/simulation_state/big_step"])
  395. self.states["/main/breakpoint_manager"].addChild(self.states["/main/breakpoint_manager/breakpoint_manage"])
  396. self.states["/main/reset"].addChild(self.states["/main/reset/reset"])
  397. self.states[""].fixTree()
  398. self.states[""].default_state = self.states["/main"]
  399. self.states["/main/injection_monitor"].default_state = self.states["/main/injection_monitor/inject"]
  400. self.states["/main/tracer_monitor"].default_state = self.states["/main/tracer_monitor/trace"]
  401. self.states["/main/simulation_flow"].default_state = self.states["/main/simulation_flow/initialize"]
  402. self.states["/main/simulation_flow/check_termination"].default_state = self.states["/main/simulation_flow/check_termination/workaround"]
  403. self.states["/main/simulation_flow/do_simulation"].default_state = self.states["/main/simulation_flow/do_simulation/init"]
  404. self.states["/main/simulation_state"].default_state = self.states["/main/simulation_state/paused"]
  405. self.states["/main/breakpoint_manager"].default_state = self.states["/main/breakpoint_manager/breakpoint_manage"]
  406. self.states["/main/reset"].default_state = self.states["/main/reset/reset"]
  407. # transition /main/injection_monitor/inject
  408. _main_injection_monitor_inject_0 = Transition(self, self.states["/main/injection_monitor/inject"], [self.states["/main/injection_monitor/inject"]])
  409. _main_injection_monitor_inject_0.setAction(self._main_injection_monitor_inject_0_exec)
  410. _main_injection_monitor_inject_0.setTrigger(Event("inject", "request"))
  411. self.states["/main/injection_monitor/inject"].addTransition(_main_injection_monitor_inject_0)
  412. # transition /main/tracer_monitor/trace
  413. _main_tracer_monitor_trace_0 = Transition(self, self.states["/main/tracer_monitor/trace"], [self.states["/main/tracer_monitor/trace"]])
  414. _main_tracer_monitor_trace_0.setAction(self._main_tracer_monitor_trace_0_exec)
  415. _main_tracer_monitor_trace_0.setTrigger(Event("trace", "request"))
  416. self.states["/main/tracer_monitor/trace"].addTransition(_main_tracer_monitor_trace_0)
  417. # transition /main/simulation_flow/initialize
  418. _main_simulation_flow_initialize_0 = Transition(self, self.states["/main/simulation_flow/initialize"], [self.states["/main/simulation_flow/check_termination"]])
  419. _main_simulation_flow_initialize_0.setAction(self._main_simulation_flow_initialize_0_exec)
  420. _main_simulation_flow_initialize_0.setTrigger(None)
  421. self.states["/main/simulation_flow/initialize"].addTransition(_main_simulation_flow_initialize_0)
  422. # transition /main/simulation_flow/check_termination/workaround
  423. _main_simulation_flow_check_termination_workaround_0 = Transition(self, self.states["/main/simulation_flow/check_termination/workaround"], [self.states["/main/simulation_flow/check_termination/check_termination"]])
  424. _main_simulation_flow_check_termination_workaround_0.setTrigger(Event("_0after"))
  425. self.states["/main/simulation_flow/check_termination/workaround"].addTransition(_main_simulation_flow_check_termination_workaround_0)
  426. # transition /main/simulation_flow/check_termination/wait
  427. _main_simulation_flow_check_termination_wait_0 = Transition(self, self.states["/main/simulation_flow/check_termination/wait"], [self.states["/main/simulation_flow/check_termination/check_termination"]])
  428. _main_simulation_flow_check_termination_wait_0.setTrigger(Event("_1after"))
  429. self.states["/main/simulation_flow/check_termination/wait"].addTransition(_main_simulation_flow_check_termination_wait_0)
  430. _main_simulation_flow_check_termination_wait_1 = Transition(self, self.states["/main/simulation_flow/check_termination/wait"], [self.states["/main/simulation_flow/check_termination/check_termination"]])
  431. _main_simulation_flow_check_termination_wait_1.setTrigger(None)
  432. _main_simulation_flow_check_termination_wait_1.setGuard(self._main_simulation_flow_check_termination_wait_1_guard)
  433. self.states["/main/simulation_flow/check_termination/wait"].addTransition(_main_simulation_flow_check_termination_wait_1)
  434. # transition /main/simulation_flow/check_termination/small_step_check
  435. _main_simulation_flow_check_termination_small_step_check_0 = Transition(self, self.states["/main/simulation_flow/check_termination/small_step_check"], [self.states["/main/simulation_flow/do_simulation"]])
  436. _main_simulation_flow_check_termination_small_step_check_0.setTrigger(None)
  437. _main_simulation_flow_check_termination_small_step_check_0.setGuard(self._main_simulation_flow_check_termination_small_step_check_0_guard)
  438. self.states["/main/simulation_flow/check_termination/small_step_check"].addTransition(_main_simulation_flow_check_termination_small_step_check_0)
  439. _main_simulation_flow_check_termination_small_step_check_1 = Transition(self, self.states["/main/simulation_flow/check_termination/small_step_check"], [self.states["/main/simulation_flow/check_termination/check_termination"]])
  440. _main_simulation_flow_check_termination_small_step_check_1.setAction(self._main_simulation_flow_check_termination_small_step_check_1_exec)
  441. _main_simulation_flow_check_termination_small_step_check_1.setTrigger(None)
  442. _main_simulation_flow_check_termination_small_step_check_1.setGuard(self._main_simulation_flow_check_termination_small_step_check_1_guard)
  443. self.states["/main/simulation_flow/check_termination/small_step_check"].addTransition(_main_simulation_flow_check_termination_small_step_check_1)
  444. _main_simulation_flow_check_termination_small_step_check_2 = Transition(self, self.states["/main/simulation_flow/check_termination/small_step_check"], [self.states["/main/simulation_flow/check_termination/check_termination"]])
  445. _main_simulation_flow_check_termination_small_step_check_2.setAction(self._main_simulation_flow_check_termination_small_step_check_2_exec)
  446. _main_simulation_flow_check_termination_small_step_check_2.setTrigger(None)
  447. _main_simulation_flow_check_termination_small_step_check_2.setGuard(self._main_simulation_flow_check_termination_small_step_check_2_guard)
  448. self.states["/main/simulation_flow/check_termination/small_step_check"].addTransition(_main_simulation_flow_check_termination_small_step_check_2)
  449. # transition /main/simulation_flow/check_termination/check_termination
  450. _main_simulation_flow_check_termination_check_termination_0 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/do_simulation"]])
  451. _main_simulation_flow_check_termination_check_termination_0.setTrigger(None)
  452. _main_simulation_flow_check_termination_check_termination_0.setGuard(self._main_simulation_flow_check_termination_check_termination_0_guard)
  453. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_0)
  454. _main_simulation_flow_check_termination_check_termination_1 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/do_simulation"]])
  455. _main_simulation_flow_check_termination_check_termination_1.setTrigger(None)
  456. _main_simulation_flow_check_termination_check_termination_1.setGuard(self._main_simulation_flow_check_termination_check_termination_1_guard)
  457. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_1)
  458. _main_simulation_flow_check_termination_check_termination_2 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/check_termination/wait"]])
  459. _main_simulation_flow_check_termination_check_termination_2.setTrigger(None)
  460. _main_simulation_flow_check_termination_check_termination_2.setGuard(self._main_simulation_flow_check_termination_check_termination_2_guard)
  461. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_2)
  462. _main_simulation_flow_check_termination_check_termination_3 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/do_simulation"]])
  463. _main_simulation_flow_check_termination_check_termination_3.setTrigger(None)
  464. _main_simulation_flow_check_termination_check_termination_3.setGuard(self._main_simulation_flow_check_termination_check_termination_3_guard)
  465. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_3)
  466. _main_simulation_flow_check_termination_check_termination_4 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/check_termination/small_step_check"]])
  467. _main_simulation_flow_check_termination_check_termination_4.setAction(self._main_simulation_flow_check_termination_check_termination_4_exec)
  468. _main_simulation_flow_check_termination_check_termination_4.setTrigger(Event("small_step", "request"))
  469. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_4)
  470. _main_simulation_flow_check_termination_check_termination_5 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/check_termination/workaround"]])
  471. _main_simulation_flow_check_termination_check_termination_5.setAction(self._main_simulation_flow_check_termination_check_termination_5_exec)
  472. _main_simulation_flow_check_termination_check_termination_5.setTrigger(None)
  473. _main_simulation_flow_check_termination_check_termination_5.setGuard(self._main_simulation_flow_check_termination_check_termination_5_guard)
  474. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_5)
  475. _main_simulation_flow_check_termination_check_termination_6 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/check_termination/workaround"]])
  476. _main_simulation_flow_check_termination_check_termination_6.setAction(self._main_simulation_flow_check_termination_check_termination_6_exec)
  477. _main_simulation_flow_check_termination_check_termination_6.setTrigger(None)
  478. _main_simulation_flow_check_termination_check_termination_6.setGuard(self._main_simulation_flow_check_termination_check_termination_6_guard)
  479. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_6)
  480. _main_simulation_flow_check_termination_check_termination_7 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/check_termination/workaround"]])
  481. _main_simulation_flow_check_termination_check_termination_7.setAction(self._main_simulation_flow_check_termination_check_termination_7_exec)
  482. _main_simulation_flow_check_termination_check_termination_7.setTrigger(None)
  483. _main_simulation_flow_check_termination_check_termination_7.setGuard(self._main_simulation_flow_check_termination_check_termination_7_guard)
  484. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_7)
  485. _main_simulation_flow_check_termination_check_termination_8 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/check_termination/workaround"]])
  486. _main_simulation_flow_check_termination_check_termination_8.setAction(self._main_simulation_flow_check_termination_check_termination_8_exec)
  487. _main_simulation_flow_check_termination_check_termination_8.setTrigger(None)
  488. _main_simulation_flow_check_termination_check_termination_8.setGuard(self._main_simulation_flow_check_termination_check_termination_8_guard)
  489. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_8)
  490. _main_simulation_flow_check_termination_check_termination_9 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/check_termination/workaround"]])
  491. _main_simulation_flow_check_termination_check_termination_9.setAction(self._main_simulation_flow_check_termination_check_termination_9_exec)
  492. _main_simulation_flow_check_termination_check_termination_9.setTrigger(Event("god_event", "request"))
  493. _main_simulation_flow_check_termination_check_termination_9.setGuard(self._main_simulation_flow_check_termination_check_termination_9_guard)
  494. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_9)
  495. _main_simulation_flow_check_termination_check_termination_10 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/check_termination/workaround"]])
  496. _main_simulation_flow_check_termination_check_termination_10.setAction(self._main_simulation_flow_check_termination_check_termination_10_exec)
  497. _main_simulation_flow_check_termination_check_termination_10.setTrigger(Event("backwards_step", "request"))
  498. _main_simulation_flow_check_termination_check_termination_10.setGuard(self._main_simulation_flow_check_termination_check_termination_10_guard)
  499. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_10)
  500. # transition /main/simulation_flow/do_simulation/init
  501. _main_simulation_flow_do_simulation_init_0 = Transition(self, self.states["/main/simulation_flow/do_simulation/init"], [self.states["/main/simulation_flow/do_simulation/found_internal_imminents"]])
  502. _main_simulation_flow_do_simulation_init_0.setTrigger(None)
  503. _main_simulation_flow_do_simulation_init_0.setGuard(self._main_simulation_flow_do_simulation_init_0_guard)
  504. self.states["/main/simulation_flow/do_simulation/init"].addTransition(_main_simulation_flow_do_simulation_init_0)
  505. _main_simulation_flow_do_simulation_init_1 = Transition(self, self.states["/main/simulation_flow/do_simulation/init"], [self.states["/main/simulation_flow/do_simulation/found_internal_imminents"]])
  506. _main_simulation_flow_do_simulation_init_1.setAction(self._main_simulation_flow_do_simulation_init_1_exec)
  507. _main_simulation_flow_do_simulation_init_1.setTrigger(None)
  508. _main_simulation_flow_do_simulation_init_1.setGuard(self._main_simulation_flow_do_simulation_init_1_guard)
  509. self.states["/main/simulation_flow/do_simulation/init"].addTransition(_main_simulation_flow_do_simulation_init_1)
  510. # transition /main/simulation_flow/do_simulation/found_internal_imminents
  511. _main_simulation_flow_do_simulation_found_internal_imminents_0 = Transition(self, self.states["/main/simulation_flow/do_simulation/found_internal_imminents"], [self.states["/main/simulation_flow/do_simulation/computed_outputfunction"]])
  512. _main_simulation_flow_do_simulation_found_internal_imminents_0.setTrigger(None)
  513. _main_simulation_flow_do_simulation_found_internal_imminents_0.setGuard(self._main_simulation_flow_do_simulation_found_internal_imminents_0_guard)
  514. self.states["/main/simulation_flow/do_simulation/found_internal_imminents"].addTransition(_main_simulation_flow_do_simulation_found_internal_imminents_0)
  515. _main_simulation_flow_do_simulation_found_internal_imminents_1 = Transition(self, self.states["/main/simulation_flow/do_simulation/found_internal_imminents"], [self.states["/main/simulation_flow/do_simulation/computed_outputfunction"]])
  516. _main_simulation_flow_do_simulation_found_internal_imminents_1.setAction(self._main_simulation_flow_do_simulation_found_internal_imminents_1_exec)
  517. _main_simulation_flow_do_simulation_found_internal_imminents_1.setTrigger(Event("small_step", "request"))
  518. self.states["/main/simulation_flow/do_simulation/found_internal_imminents"].addTransition(_main_simulation_flow_do_simulation_found_internal_imminents_1)
  519. # transition /main/simulation_flow/do_simulation/computed_outputfunction
  520. _main_simulation_flow_do_simulation_computed_outputfunction_0 = Transition(self, self.states["/main/simulation_flow/do_simulation/computed_outputfunction"], [self.states["/main/simulation_flow/do_simulation/routed_messages"]])
  521. _main_simulation_flow_do_simulation_computed_outputfunction_0.setTrigger(None)
  522. _main_simulation_flow_do_simulation_computed_outputfunction_0.setGuard(self._main_simulation_flow_do_simulation_computed_outputfunction_0_guard)
  523. self.states["/main/simulation_flow/do_simulation/computed_outputfunction"].addTransition(_main_simulation_flow_do_simulation_computed_outputfunction_0)
  524. _main_simulation_flow_do_simulation_computed_outputfunction_1 = Transition(self, self.states["/main/simulation_flow/do_simulation/computed_outputfunction"], [self.states["/main/simulation_flow/do_simulation/routed_messages"]])
  525. _main_simulation_flow_do_simulation_computed_outputfunction_1.setAction(self._main_simulation_flow_do_simulation_computed_outputfunction_1_exec)
  526. _main_simulation_flow_do_simulation_computed_outputfunction_1.setTrigger(Event("small_step", "request"))
  527. self.states["/main/simulation_flow/do_simulation/computed_outputfunction"].addTransition(_main_simulation_flow_do_simulation_computed_outputfunction_1)
  528. # transition /main/simulation_flow/do_simulation/routed_messages
  529. _main_simulation_flow_do_simulation_routed_messages_0 = Transition(self, self.states["/main/simulation_flow/do_simulation/routed_messages"], [self.states["/main/simulation_flow/do_simulation/found_all_imminents"]])
  530. _main_simulation_flow_do_simulation_routed_messages_0.setTrigger(None)
  531. _main_simulation_flow_do_simulation_routed_messages_0.setGuard(self._main_simulation_flow_do_simulation_routed_messages_0_guard)
  532. self.states["/main/simulation_flow/do_simulation/routed_messages"].addTransition(_main_simulation_flow_do_simulation_routed_messages_0)
  533. _main_simulation_flow_do_simulation_routed_messages_1 = Transition(self, self.states["/main/simulation_flow/do_simulation/routed_messages"], [self.states["/main/simulation_flow/do_simulation/found_all_imminents"]])
  534. _main_simulation_flow_do_simulation_routed_messages_1.setAction(self._main_simulation_flow_do_simulation_routed_messages_1_exec)
  535. _main_simulation_flow_do_simulation_routed_messages_1.setTrigger(Event("small_step", "request"))
  536. self.states["/main/simulation_flow/do_simulation/routed_messages"].addTransition(_main_simulation_flow_do_simulation_routed_messages_1)
  537. # transition /main/simulation_flow/do_simulation/found_all_imminents
  538. _main_simulation_flow_do_simulation_found_all_imminents_0 = Transition(self, self.states["/main/simulation_flow/do_simulation/found_all_imminents"], [self.states["/main/simulation_flow/do_simulation/computed_transitions"]])
  539. _main_simulation_flow_do_simulation_found_all_imminents_0.setTrigger(None)
  540. _main_simulation_flow_do_simulation_found_all_imminents_0.setGuard(self._main_simulation_flow_do_simulation_found_all_imminents_0_guard)
  541. self.states["/main/simulation_flow/do_simulation/found_all_imminents"].addTransition(_main_simulation_flow_do_simulation_found_all_imminents_0)
  542. _main_simulation_flow_do_simulation_found_all_imminents_1 = Transition(self, self.states["/main/simulation_flow/do_simulation/found_all_imminents"], [self.states["/main/simulation_flow/do_simulation/computed_transitions"]])
  543. _main_simulation_flow_do_simulation_found_all_imminents_1.setAction(self._main_simulation_flow_do_simulation_found_all_imminents_1_exec)
  544. _main_simulation_flow_do_simulation_found_all_imminents_1.setTrigger(Event("small_step", "request"))
  545. self.states["/main/simulation_flow/do_simulation/found_all_imminents"].addTransition(_main_simulation_flow_do_simulation_found_all_imminents_1)
  546. # transition /main/simulation_flow/do_simulation/computed_transitions
  547. _main_simulation_flow_do_simulation_computed_transitions_0 = Transition(self, self.states["/main/simulation_flow/do_simulation/computed_transitions"], [self.states["/main/simulation_flow/check_termination"]])
  548. _main_simulation_flow_do_simulation_computed_transitions_0.setTrigger(None)
  549. _main_simulation_flow_do_simulation_computed_transitions_0.setGuard(self._main_simulation_flow_do_simulation_computed_transitions_0_guard)
  550. self.states["/main/simulation_flow/do_simulation/computed_transitions"].addTransition(_main_simulation_flow_do_simulation_computed_transitions_0)
  551. _main_simulation_flow_do_simulation_computed_transitions_1 = Transition(self, self.states["/main/simulation_flow/do_simulation/computed_transitions"], [self.states["/main/simulation_flow/check_termination"]])
  552. _main_simulation_flow_do_simulation_computed_transitions_1.setAction(self._main_simulation_flow_do_simulation_computed_transitions_1_exec)
  553. _main_simulation_flow_do_simulation_computed_transitions_1.setTrigger(Event("small_step", "request"))
  554. self.states["/main/simulation_flow/do_simulation/computed_transitions"].addTransition(_main_simulation_flow_do_simulation_computed_transitions_1)
  555. _main_simulation_flow_do_simulation_computed_transitions_2 = Transition(self, self.states["/main/simulation_flow/do_simulation/computed_transitions"], [self.states["/main/simulation_flow/check_termination"]])
  556. _main_simulation_flow_do_simulation_computed_transitions_2.setAction(self._main_simulation_flow_do_simulation_computed_transitions_2_exec)
  557. _main_simulation_flow_do_simulation_computed_transitions_2.setTrigger(None)
  558. _main_simulation_flow_do_simulation_computed_transitions_2.setGuard(self._main_simulation_flow_do_simulation_computed_transitions_2_guard)
  559. self.states["/main/simulation_flow/do_simulation/computed_transitions"].addTransition(_main_simulation_flow_do_simulation_computed_transitions_2)
  560. # transition /main/simulation_state/paused
  561. _main_simulation_state_paused_0 = Transition(self, self.states["/main/simulation_state/paused"], [self.states["/main/simulation_state/continuous"]])
  562. _main_simulation_state_paused_0.setAction(self._main_simulation_state_paused_0_exec)
  563. _main_simulation_state_paused_0.setTrigger(Event("simulate", "request"))
  564. self.states["/main/simulation_state/paused"].addTransition(_main_simulation_state_paused_0)
  565. _main_simulation_state_paused_1 = Transition(self, self.states["/main/simulation_state/paused"], [self.states["/main/simulation_state/realtime"]])
  566. _main_simulation_state_paused_1.setAction(self._main_simulation_state_paused_1_exec)
  567. _main_simulation_state_paused_1.setTrigger(Event("realtime", "request"))
  568. self.states["/main/simulation_state/paused"].addTransition(_main_simulation_state_paused_1)
  569. _main_simulation_state_paused_2 = Transition(self, self.states["/main/simulation_state/paused"], [self.states["/main/simulation_state/big_step"]])
  570. _main_simulation_state_paused_2.setAction(self._main_simulation_state_paused_2_exec)
  571. _main_simulation_state_paused_2.setTrigger(Event("big_step", "request"))
  572. self.states["/main/simulation_state/paused"].addTransition(_main_simulation_state_paused_2)
  573. # transition /main/simulation_state/continuous
  574. _main_simulation_state_continuous_0 = Transition(self, self.states["/main/simulation_state/continuous"], [self.states["/main/simulation_state/continuous"]])
  575. _main_simulation_state_continuous_0.setAction(self._main_simulation_state_continuous_0_exec)
  576. _main_simulation_state_continuous_0.setTrigger(Event("pause", "request"))
  577. self.states["/main/simulation_state/continuous"].addTransition(_main_simulation_state_continuous_0)
  578. _main_simulation_state_continuous_1 = Transition(self, self.states["/main/simulation_state/continuous"], [self.states["/main/simulation_state/paused"]])
  579. _main_simulation_state_continuous_1.setAction(self._main_simulation_state_continuous_1_exec)
  580. _main_simulation_state_continuous_1.setTrigger(Event("termination_condition", None))
  581. self.states["/main/simulation_state/continuous"].addTransition(_main_simulation_state_continuous_1)
  582. # transition /main/simulation_state/realtime
  583. _main_simulation_state_realtime_0 = Transition(self, self.states["/main/simulation_state/realtime"], [self.states["/main/simulation_state/realtime"]])
  584. _main_simulation_state_realtime_0.setAction(self._main_simulation_state_realtime_0_exec)
  585. _main_simulation_state_realtime_0.setTrigger(Event("pause", "request"))
  586. self.states["/main/simulation_state/realtime"].addTransition(_main_simulation_state_realtime_0)
  587. _main_simulation_state_realtime_1 = Transition(self, self.states["/main/simulation_state/realtime"], [self.states["/main/simulation_state/paused"]])
  588. _main_simulation_state_realtime_1.setAction(self._main_simulation_state_realtime_1_exec)
  589. _main_simulation_state_realtime_1.setTrigger(Event("termination_condition", None))
  590. self.states["/main/simulation_state/realtime"].addTransition(_main_simulation_state_realtime_1)
  591. # transition /main/simulation_state/big_step
  592. _main_simulation_state_big_step_0 = Transition(self, self.states["/main/simulation_state/big_step"], [self.states["/main/simulation_state/paused"]])
  593. _main_simulation_state_big_step_0.setTrigger(Event("big_step_done", None))
  594. self.states["/main/simulation_state/big_step"].addTransition(_main_simulation_state_big_step_0)
  595. _main_simulation_state_big_step_1 = Transition(self, self.states["/main/simulation_state/big_step"], [self.states["/main/simulation_state/paused"]])
  596. _main_simulation_state_big_step_1.setAction(self._main_simulation_state_big_step_1_exec)
  597. _main_simulation_state_big_step_1.setTrigger(Event("termination_condition", None))
  598. self.states["/main/simulation_state/big_step"].addTransition(_main_simulation_state_big_step_1)
  599. # transition /main/breakpoint_manager/breakpoint_manage
  600. _main_breakpoint_manager_breakpoint_manage_0 = Transition(self, self.states["/main/breakpoint_manager/breakpoint_manage"], [self.states["/main/breakpoint_manager/breakpoint_manage"]])
  601. _main_breakpoint_manager_breakpoint_manage_0.setAction(self._main_breakpoint_manager_breakpoint_manage_0_exec)
  602. _main_breakpoint_manager_breakpoint_manage_0.setTrigger(Event("add_breakpoint", "request"))
  603. self.states["/main/breakpoint_manager/breakpoint_manage"].addTransition(_main_breakpoint_manager_breakpoint_manage_0)
  604. _main_breakpoint_manager_breakpoint_manage_1 = Transition(self, self.states["/main/breakpoint_manager/breakpoint_manage"], [self.states["/main/breakpoint_manager/breakpoint_manage"]])
  605. _main_breakpoint_manager_breakpoint_manage_1.setAction(self._main_breakpoint_manager_breakpoint_manage_1_exec)
  606. _main_breakpoint_manager_breakpoint_manage_1.setTrigger(Event("del_breakpoint", "request"))
  607. self.states["/main/breakpoint_manager/breakpoint_manage"].addTransition(_main_breakpoint_manager_breakpoint_manage_1)
  608. _main_breakpoint_manager_breakpoint_manage_2 = Transition(self, self.states["/main/breakpoint_manager/breakpoint_manage"], [self.states["/main/breakpoint_manager/breakpoint_manage"]])
  609. _main_breakpoint_manager_breakpoint_manage_2.setAction(self._main_breakpoint_manager_breakpoint_manage_2_exec)
  610. _main_breakpoint_manager_breakpoint_manage_2.setTrigger(Event("toggle_breakpoint", "request"))
  611. self.states["/main/breakpoint_manager/breakpoint_manage"].addTransition(_main_breakpoint_manager_breakpoint_manage_2)
  612. # transition /main/reset/reset
  613. _main_reset_reset_0 = Transition(self, self.states["/main/reset/reset"], [self.states["/main/reset/reset"]])
  614. _main_reset_reset_0.setAction(self._main_reset_reset_0_exec)
  615. _main_reset_reset_0.setTrigger(Event("reset", "request"))
  616. self.states["/main/reset/reset"].addTransition(_main_reset_reset_0)
  617. def _main_simulation_flow_check_termination_exit(self):
  618. self.simulation_time = self.timeNext
  619. def _main_simulation_flow_check_termination_workaround_enter(self):
  620. self.addTimer(0, 0)
  621. def _main_simulation_flow_check_termination_workaround_exit(self):
  622. self.removeTimer(0)
  623. def _main_simulation_flow_check_termination_wait_enter(self):
  624. self.addTimer(1, self.calculate_after())
  625. def _main_simulation_flow_check_termination_wait_exit(self):
  626. self.removeTimer(1)
  627. diff = time.time() - self.realtime_starttime
  628. self.simulation_time = (diff / self.realtime_scale, 1)
  629. def _main_simulation_flow_check_termination_check_termination_enter(self):
  630. self.compute_timeNext()
  631. self.the_time = self.calculate_after()
  632. def _main_simulation_flow_do_simulation_init_exit(self):
  633. self.find_internal_imminents()
  634. def _main_simulation_flow_do_simulation_found_internal_imminents_exit(self):
  635. self.compute_outputfunction()
  636. def _main_simulation_flow_do_simulation_computed_outputfunction_exit(self):
  637. self.route_messages()
  638. self.process_injects()
  639. def _main_simulation_flow_do_simulation_routed_messages_exit(self):
  640. self.find_all_imminents()
  641. def _main_simulation_flow_do_simulation_found_all_imminents_exit(self):
  642. self.compute_transitions()
  643. def _main_simulation_flow_do_simulation_computed_transitions_exit(self):
  644. self.compute_ta()
  645. def _main_injection_monitor_inject_0_exec(self, parameters):
  646. configuration = parameters[0]
  647. configuration["time"] = (configuration["time"], 1)
  648. self.inject_queue.append(configuration)
  649. self.inject_queue.sort(key=lambda i: i["time"])
  650. self.big_step.outputEvent(Event("inject_ok", "reply", []))
  651. def _main_tracer_monitor_trace_0_exec(self, parameters):
  652. filename = parameters[0]
  653. if filename is not None:
  654. self.trace_file = open(filename, 'w')
  655. else:
  656. self.trace_file = None
  657. self.big_step.outputEvent(Event("trace_config_ok", "reply", []))
  658. def _main_simulation_flow_initialize_0_exec(self, parameters):
  659. self.big_step.outputEvent(Event("all_states", "reply", [self.simulation_time, {m.getModelFullName(): (m.timeNext, m.state) for m in self.model.componentSet}]))
  660. def _main_simulation_flow_check_termination_wait_1_guard(self, parameters):
  661. return self.inState(["/main/simulation_state/paused"])
  662. def _main_simulation_flow_check_termination_small_step_check_0_guard(self, parameters):
  663. return self.should_terminate(False) == -2
  664. def _main_simulation_flow_check_termination_small_step_check_1_exec(self, parameters):
  665. self.raiseInternalEvent(Event("termination_condition", None, []))
  666. def _main_simulation_flow_check_termination_small_step_check_1_guard(self, parameters):
  667. return self.should_terminate(False) == -1
  668. def _main_simulation_flow_check_termination_small_step_check_2_exec(self, parameters):
  669. breakpoint_id = self.process_breakpoints(False)
  670. self.big_step.outputEvent(Event("breakpoint_triggered", "reply", [breakpoint_id]))
  671. self.raiseInternalEvent(Event("termination_condition", None, []))
  672. def _main_simulation_flow_check_termination_small_step_check_2_guard(self, parameters):
  673. return self.should_terminate(False) > -1
  674. def _main_simulation_flow_check_termination_check_termination_0_guard(self, parameters):
  675. return self.inState(["/main/simulation_state/continuous"]) and (self.should_terminate(False) == -2)
  676. def _main_simulation_flow_check_termination_check_termination_1_guard(self, parameters):
  677. return self.inState(["/main/simulation_state/big_step"]) and (self.should_terminate(False) == -2)
  678. def _main_simulation_flow_check_termination_check_termination_2_guard(self, parameters):
  679. return self.inState(["/main/simulation_state/realtime"]) and (self.should_terminate(True) == -2) and (self.the_time > 0.0)
  680. def _main_simulation_flow_check_termination_check_termination_3_guard(self, parameters):
  681. return self.inState(["/main/simulation_state/realtime"]) and (self.should_terminate(True) == -2) and (self.the_time <= 0.0)
  682. def _main_simulation_flow_check_termination_check_termination_4_exec(self, parameters):
  683. configuration = parameters[0]
  684. self.parse_options(configuration)
  685. def _main_simulation_flow_check_termination_check_termination_5_exec(self, parameters):
  686. self.raiseInternalEvent(Event("termination_condition", None, []))
  687. def _main_simulation_flow_check_termination_check_termination_5_guard(self, parameters):
  688. return (not self.inState(["/main/simulation_state/paused"]) and self.inState(["/main/simulation_state/realtime"]) and (self.should_terminate(True) == -1))
  689. def _main_simulation_flow_check_termination_check_termination_6_exec(self, parameters):
  690. self.raiseInternalEvent(Event("termination_condition", None, []))
  691. def _main_simulation_flow_check_termination_check_termination_6_guard(self, parameters):
  692. return (not self.inState(["/main/simulation_state/paused"]) and not self.inState(["/main/simulation_state/realtime"]) and (self.should_terminate(False) == -1))
  693. def _main_simulation_flow_check_termination_check_termination_7_exec(self, parameters):
  694. breakpoint_id = self.process_breakpoints(True)
  695. self.big_step.outputEvent(Event("breakpoint_triggered", "reply", [breakpoint_id]))
  696. self.raiseInternalEvent(Event("termination_condition", None, []))
  697. def _main_simulation_flow_check_termination_check_termination_7_guard(self, parameters):
  698. return (not self.inState(["/main/simulation_state/paused"])) and self.inState(["/main/simulation_state/realtime"]) and (self.should_terminate(True) > -1)
  699. def _main_simulation_flow_check_termination_check_termination_8_exec(self, parameters):
  700. breakpoint_id = self.process_breakpoints(False)
  701. self.big_step.outputEvent(Event("breakpoint_triggered", "reply", [breakpoint_id]))
  702. self.raiseInternalEvent(Event("termination_condition", None, []))
  703. def _main_simulation_flow_check_termination_check_termination_8_guard(self, parameters):
  704. return (not self.inState(["/main/simulation_state/paused"])) and not self.inState(["/main/simulation_state/realtime"]) and (self.should_terminate(False) > -1)
  705. def _main_simulation_flow_check_termination_check_termination_9_exec(self, parameters):
  706. configuration = parameters[0]
  707. modelname = configuration["model"]
  708. state_attribute = configuration["attribute"]
  709. new_value = configuration["value"]
  710. model = self.find_model_with_name(modelname)
  711. setattr(model.state, state_attribute, new_value)
  712. # Call the timeadvance method again and compute new ta
  713. ta = model.timeAdvance()
  714. model.timeNext = (model.timeLast[0] + ta, 1 if ta else (model.timeLast[1] + 1))
  715. self.model.scheduler.massReschedule([model])
  716. # self.simulation_time = self.model.scheduler.readFirst()
  717. self.big_step.outputEvent(Event("god_event_ok", "reply", [{model.getModelFullName(): str(model.state)}]))
  718. self.big_step.outputEvent(Event("new_tn", "reply", [self.simulation_time, {model.getModelFullName(): model.timeNext}]))
  719. def _main_simulation_flow_check_termination_check_termination_9_guard(self, parameters):
  720. configuration = parameters[0]
  721. return self.inState(["/main/simulation_state/paused"])
  722. def _main_simulation_flow_check_termination_check_termination_10_exec(self, parameters):
  723. self.rollback_step()
  724. self.big_step.outputEvent(Event("all_states", "reply", [self.simulation_time, {m.getModelFullName(): (m.timeNext, m.state) for m in self.model.componentSet}]))
  725. def _main_simulation_flow_check_termination_check_termination_10_guard(self, parameters):
  726. return self.inState(["/main/simulation_state/paused"])
  727. def _main_simulation_flow_do_simulation_init_0_guard(self, parameters):
  728. return not self.inState(["/main/simulation_state/paused"])
  729. def _main_simulation_flow_do_simulation_init_1_exec(self, parameters):
  730. self.big_step.outputEvent(Event("imminents", "reply", [self.simulation_time, self.serialize('imminents', self.imminents)]))
  731. def _main_simulation_flow_do_simulation_init_1_guard(self, parameters):
  732. return self.inState(["/main/simulation_state/paused"])
  733. def _main_simulation_flow_do_simulation_found_internal_imminents_0_guard(self, parameters):
  734. return not self.inState(["/main/simulation_state/paused"])
  735. def _main_simulation_flow_do_simulation_found_internal_imminents_1_exec(self, parameters):
  736. self.big_step.outputEvent(Event("outbags", "reply", [self.simulation_time, self.serialize('outbags', self.outbags)]))
  737. def _main_simulation_flow_do_simulation_computed_outputfunction_0_guard(self, parameters):
  738. return not self.inState(["/main/simulation_state/paused"])
  739. def _main_simulation_flow_do_simulation_computed_outputfunction_1_exec(self, parameters):
  740. self.big_step.outputEvent(Event("inbags", "reply", [self.simulation_time, self.serialize('inbags', self.inbags)]))
  741. def _main_simulation_flow_do_simulation_routed_messages_0_guard(self, parameters):
  742. return not self.inState(["/main/simulation_state/paused"])
  743. def _main_simulation_flow_do_simulation_routed_messages_1_exec(self, parameters):
  744. self.big_step.outputEvent(Event("transitioning", "reply", [self.simulation_time, self.serialize('transitioning', self.transitioning)]))
  745. def _main_simulation_flow_do_simulation_found_all_imminents_0_guard(self, parameters):
  746. return not self.inState(["/main/simulation_state/paused"])
  747. def _main_simulation_flow_do_simulation_found_all_imminents_1_exec(self, parameters):
  748. self.big_step.outputEvent(Event("new_states", "reply", [self.simulation_time, self.serialize('new_states', self.new_states)]))
  749. def _main_simulation_flow_do_simulation_computed_transitions_0_guard(self, parameters):
  750. return self.inState(["/main/simulation_state/continuous"])
  751. def _main_simulation_flow_do_simulation_computed_transitions_1_exec(self, parameters):
  752. self.big_step.outputEvent(Event("new_tn", "reply", [self.simulation_time, self.serialize('new_tn', self.new_tn)]))
  753. def _main_simulation_flow_do_simulation_computed_transitions_2_exec(self, parameters):
  754. self.raiseInternalEvent(Event("big_step_done", None, []))
  755. self.big_step.outputEvent(Event("new_states", "reply", [self.simulation_time, self.serialize('new_states', self.new_states)]))
  756. self.big_step.outputEvent(Event("new_tn", "reply", [self.simulation_time, self.serialize('new_tn', self.new_tn)]))
  757. def _main_simulation_flow_do_simulation_computed_transitions_2_guard(self, parameters):
  758. return self.inState(["/main/simulation_state/realtime"]) or self.inState(["/main/simulation_state/big_step"])
  759. def _main_simulation_state_paused_0_exec(self, parameters):
  760. configuration = parameters[0]
  761. self.parse_options(configuration)
  762. def _main_simulation_state_paused_1_exec(self, parameters):
  763. configuration = parameters[0]
  764. self.parse_options(configuration)
  765. def _main_simulation_state_paused_2_exec(self, parameters):
  766. configuration = parameters[0]
  767. self.parse_options(configuration)
  768. def _main_simulation_state_continuous_0_exec(self, parameters):
  769. # Just override termination condition
  770. self.termination_condition = lambda i, j, k : True
  771. self.termination_time = None
  772. def _main_simulation_state_continuous_1_exec(self, parameters):
  773. self.big_step.outputEvent(Event("terminate", "reply", [self.simulation_time]))
  774. self.flush_file()
  775. self.big_step.outputEvent(Event("all_states", "reply", [self.simulation_time, {m.getModelFullName(): (m.timeNext, m.state) for m in self.model.componentSet}]))
  776. def _main_simulation_state_realtime_0_exec(self, parameters):
  777. # Just override termination condition
  778. self.termination_condition = lambda i, j, k : True
  779. self.termination_time = None
  780. # Don't forget to correctly set the simulation time
  781. diff = time.time() - self.realtime_starttime
  782. self.simulation_time = (diff / self.realtime_scale, 1)
  783. def _main_simulation_state_realtime_1_exec(self, parameters):
  784. self.big_step.outputEvent(Event("terminate", "reply", [self.simulation_time]))
  785. self.flush_file()
  786. def _main_simulation_state_big_step_1_exec(self, parameters):
  787. self.big_step.outputEvent(Event("terminate", "reply", [self.simulation_time]))
  788. self.flush_file()
  789. def _main_breakpoint_manager_breakpoint_manage_0_exec(self, parameters):
  790. breakpoint_id = parameters[0]
  791. function = parameters[1]
  792. enabled = parameters[2]
  793. disable_on_trigger = parameters[3]
  794. self.breakpoints.append(Breakpoint(breakpoint_id, function, enabled, disable_on_trigger))
  795. def _main_breakpoint_manager_breakpoint_manage_1_exec(self, parameters):
  796. del_breakpoint_id = parameters[0]
  797. self.breakpoints = [breakpoint for breakpoint in self.breakpoints if breakpoint.id != del_breakpoint_id]
  798. def _main_breakpoint_manager_breakpoint_manage_2_exec(self, parameters):
  799. breakpoint_id = parameters[0]
  800. enabled = parameters[1]
  801. for breakpoint in self.breakpoints:
  802. if breakpoint.id == breakpoint_id:
  803. breakpoint.enabled = enabled
  804. break
  805. def _main_reset_reset_0_exec(self, parameters):
  806. for model in self.model.componentSet:
  807. model.state = pickle.loads(self.save_model[model][1])
  808. model.elapsed = self.save_model[model][0]
  809. model.timeLast = (-model.elapsed, 1)
  810. ta = model.timeAdvance()
  811. model.timeNext = (model.timeLast[0] + ta, 1)
  812. self.simulation_time = (0.0, 0)
  813. self.model.scheduler.massReschedule(self.model.componentSet)
  814. # Reset trace file
  815. if self.trace_file is not None:
  816. self.trace_file = open(self.trace_file.name, 'w')
  817. self.big_step.outputEvent(Event("all_states", "reply", [(0.0, 0), {m.getModelFullName(): (m.timeNext, m.state) for m in self.model.componentSet}]))
  818. def initializeStatechart(self):
  819. # enter default state
  820. self.default_targets = self.states["/main"].getEffectiveTargetStates()
  821. RuntimeClassBase.initializeStatechart(self)
  822. class ObjectManager(ObjectManagerBase):
  823. def __init__(self, controller):
  824. ObjectManagerBase.__init__(self, controller)
  825. def instantiate(self, class_name, construct_params):
  826. if class_name == "SCCDSimulator":
  827. instance = SCCDSimulator(self.controller, construct_params[0])
  828. instance.associations = {}
  829. else:
  830. raise Exception("Cannot instantiate class " + class_name)
  831. return instance
  832. class Controller(ThreadsControllerBase):
  833. def __init__(self, model, keep_running = None, behind_schedule_callback = None):
  834. if keep_running == None: keep_running = True
  835. if behind_schedule_callback == None: behind_schedule_callback = None
  836. ThreadsControllerBase.__init__(self, ObjectManager(self), keep_running, behind_schedule_callback)
  837. self.addInputPort("request")
  838. self.addOutputPort("reply")
  839. self.object_manager.createInstance("SCCDSimulator", [model])