simulator.py 67 KB

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