Browse Source

now with god events

Simon Van Mierlo 9 years ago
parent
commit
d38e5eb2cc

+ 13 - 22
debugging_fsa_cbd_composition/fsa_cbd_simulator/HierarchicalSimulator/fsa_sim_simulation.xml

@@ -22,6 +22,7 @@
             self.elapsed = 0
             self.time_next = self.delta
             self.state = self.model.initialState
+            self.selected_transition = None
         ]]>
         </body>
     </method>
@@ -47,14 +48,10 @@
         </body>
     </method>
     <method name="godEvent">
-        <parameter name="new_state" />
+        <parameter name="selected_transition" />
         <body>
         <![CDATA[
-            filtered_states = [s for s in self.model.states if s.name == new_state]
-            if not len(filtered_states) == 1:
-                return -1
-            self.state = filtered_states[0]
-            return 0
+            self.selected_transition = selected_transition
         ]]>
         </body>
     </method>
@@ -62,20 +59,8 @@
         <parallel id="Main">
             <state id="ModeSelector" initial="Paused">
                 <state id="Paused">
-                    <transition target="../Running/SmallStep" event="FSASmallStep.Execute">
-                        <!-- used for state event transitions (and is None if none is detected) -->
-                        <parameter name="selected_transition" />
-                        <script>
-                            self.selected_transition = selected_transition
-                        </script>
-                    </transition>
-                    <transition target="../Running/BigStep" event="FSABigStep.Execute">
-                        <!-- used for state event transitions (and is None if none is detected) -->
-                        <parameter name="selected_transition" />
-                        <script>
-                            self.selected_transition = selected_transition
-                        </script>
-                    </transition>
+                    <transition target="../Running/SmallStep" event="FSASmallStep.Execute" />
+                    <transition target="../Running/BigStep" event="FSABigStep.Execute" />
                     <!-- In case a small step finishes a big step... -->
                     <transition target="." event="FSABigStep.Finished">
                         <parameter name="clock" />
@@ -249,11 +234,17 @@
                         <raise event="FSABigStep.Execute" scope="narrow" target="'child_simulator'">
                             <parameter expr="self.selected_transition" />
                         </raise>
+                        <script>
+                            self.selected_transition = None
+                        </script>
                     </transition>
                     <transition target="../ExecutingSmallStep" cond="INSTATE('../../ModeSelector/Running/SmallStep') and INSTATE('../../ChildState/Initialized') and not self.endCondition()">
                         <raise event="FSASmallStep.Execute" scope="narrow" target="'child_simulator'">
                             <parameter expr="self.selected_transition" />
                         </raise>
+                        <script>
+                            self.selected_transition = None
+                        </script>
                     </transition>
                     <transition target="../Stopped" cond="self.endCondition()">
                         <script>
@@ -280,9 +271,9 @@
             <state id="GodEventManager" initial="Listening">
                 <state id="Listening">
                     <transition target="." event="FSASimulation.GodEvent" cond="INSTATE('../../ModeSelector/Paused')">
-                        <parameter name="new_state" />
+                        <parameter name="selected_transition" />
                         <script>
-                            result = self.godEvent(new_state)
+                            result = self.godEvent(selected_transition)
                         </script>
                         <raise event="FSASimulation.GodEventResult" scope="narrow" target="'parent'">
                             <parameter expr="result" />

+ 59 - 29
debugging_fsa_cbd_composition/fsa_cbd_simulator/HierarchicalSimulator/target.py

@@ -1,7 +1,7 @@
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
-Date:   Wed Nov 30 16:15:48 2016
+Date:   Wed Nov 30 17:39:12 2016
 
 Model author: Sadaf Mustafiz and Claudio Gomes and Simon Van Mierlo
 Model name:   FSASimulator_Coordinator
@@ -1037,26 +1037,32 @@ class WovenSimulator_Simulation(RuntimeClassBase):
         # state /Main/SimulationFlow/ExecutingCBD
         self.states["/Main/SimulationFlow/ExecutingCBD"] = State(52, "/Main/SimulationFlow/ExecutingCBD", self)
         
+        # state /Main/SimulationFlow/CheckingForStateEvent
+        self.states["/Main/SimulationFlow/CheckingForStateEvent"] = State(53, "/Main/SimulationFlow/CheckingForStateEvent", self)
+        
+        # state /Main/SimulationFlow/SendingGodEvent
+        self.states["/Main/SimulationFlow/SendingGodEvent"] = State(54, "/Main/SimulationFlow/SendingGodEvent", self)
+        
         # state /Main/SimulationFlow/Executing
-        self.states["/Main/SimulationFlow/Executing"] = State(53, "/Main/SimulationFlow/Executing", self)
+        self.states["/Main/SimulationFlow/Executing"] = State(55, "/Main/SimulationFlow/Executing", self)
         
         # state /Main/SimulationFlow/Stopped
-        self.states["/Main/SimulationFlow/Stopped"] = State(54, "/Main/SimulationFlow/Stopped", self)
+        self.states["/Main/SimulationFlow/Stopped"] = State(56, "/Main/SimulationFlow/Stopped", self)
         
         # state /Main/BreakpointManager
-        self.states["/Main/BreakpointManager"] = State(55, "/Main/BreakpointManager", self)
+        self.states["/Main/BreakpointManager"] = State(57, "/Main/BreakpointManager", self)
         
         # state /Main/BreakpointManager/Listening
-        self.states["/Main/BreakpointManager/Listening"] = State(56, "/Main/BreakpointManager/Listening", self)
+        self.states["/Main/BreakpointManager/Listening"] = State(58, "/Main/BreakpointManager/Listening", self)
         
         # state /Main/ParentCommunicator
-        self.states["/Main/ParentCommunicator"] = State(57, "/Main/ParentCommunicator", self)
+        self.states["/Main/ParentCommunicator"] = State(59, "/Main/ParentCommunicator", self)
         
         # state /Main/ParentCommunicator/Forwarding
-        self.states["/Main/ParentCommunicator/Forwarding"] = State(58, "/Main/ParentCommunicator/Forwarding", self)
+        self.states["/Main/ParentCommunicator/Forwarding"] = State(60, "/Main/ParentCommunicator/Forwarding", self)
         
         # state /Stopped
-        self.states["/Stopped"] = State(59, "/Stopped", self)
+        self.states["/Stopped"] = State(61, "/Stopped", self)
         
         # add children
         self.states[""].addChild(self.states["/Main"])
@@ -1111,6 +1117,8 @@ class WovenSimulator_Simulation(RuntimeClassBase):
         self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/WaitingRealtime"])
         self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/SteppedInto"])
         self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/ExecutingCBD"])
+        self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/CheckingForStateEvent"])
+        self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/SendingGodEvent"])
         self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/Executing"])
         self.states["/Main/SimulationFlow"].addChild(self.states["/Main/SimulationFlow/Stopped"])
         self.states["/Main/SimulationFlow/SteppedInto"].addChild(self.states["/Main/SimulationFlow/SteppedInto/Waiting"])
@@ -1465,11 +1473,29 @@ class WovenSimulator_Simulation(RuntimeClassBase):
         self.states["/Main/SimulationFlow/SteppedInto/SettleBeforeWaiting"].addTransition(_Main_SimulationFlow_SteppedInto_SettleBeforeWaiting_0)
         
         # transition /Main/SimulationFlow/ExecutingCBD
-        _Main_SimulationFlow_ExecutingCBD_0 = Transition(self, self.states["/Main/SimulationFlow/ExecutingCBD"], [self.states["/Main/SimulationFlow/Executing"]])
+        _Main_SimulationFlow_ExecutingCBD_0 = Transition(self, self.states["/Main/SimulationFlow/ExecutingCBD"], [self.states["/Main/SimulationFlow/CheckingForStateEvent"]])
         _Main_SimulationFlow_ExecutingCBD_0.setAction(self._Main_SimulationFlow_ExecutingCBD_0_exec)
         _Main_SimulationFlow_ExecutingCBD_0.setTrigger(Event("CBDBigStep.Finished", None))
         self.states["/Main/SimulationFlow/ExecutingCBD"].addTransition(_Main_SimulationFlow_ExecutingCBD_0)
         
+        # transition /Main/SimulationFlow/CheckingForStateEvent
+        _Main_SimulationFlow_CheckingForStateEvent_0 = Transition(self, self.states["/Main/SimulationFlow/CheckingForStateEvent"], [self.states["/Main/SimulationFlow/Executing"]])
+        _Main_SimulationFlow_CheckingForStateEvent_0.setAction(self._Main_SimulationFlow_CheckingForStateEvent_0_exec)
+        _Main_SimulationFlow_CheckingForStateEvent_0.setTrigger(None)
+        _Main_SimulationFlow_CheckingForStateEvent_0.setGuard(self._Main_SimulationFlow_CheckingForStateEvent_0_guard)
+        self.states["/Main/SimulationFlow/CheckingForStateEvent"].addTransition(_Main_SimulationFlow_CheckingForStateEvent_0)
+        _Main_SimulationFlow_CheckingForStateEvent_1 = Transition(self, self.states["/Main/SimulationFlow/CheckingForStateEvent"], [self.states["/Main/SimulationFlow/SendingGodEvent"]])
+        _Main_SimulationFlow_CheckingForStateEvent_1.setAction(self._Main_SimulationFlow_CheckingForStateEvent_1_exec)
+        _Main_SimulationFlow_CheckingForStateEvent_1.setTrigger(None)
+        _Main_SimulationFlow_CheckingForStateEvent_1.setGuard(self._Main_SimulationFlow_CheckingForStateEvent_1_guard)
+        self.states["/Main/SimulationFlow/CheckingForStateEvent"].addTransition(_Main_SimulationFlow_CheckingForStateEvent_1)
+        
+        # transition /Main/SimulationFlow/SendingGodEvent
+        _Main_SimulationFlow_SendingGodEvent_0 = Transition(self, self.states["/Main/SimulationFlow/SendingGodEvent"], [self.states["/Main/SimulationFlow/Executing"]])
+        _Main_SimulationFlow_SendingGodEvent_0.setAction(self._Main_SimulationFlow_SendingGodEvent_0_exec)
+        _Main_SimulationFlow_SendingGodEvent_0.setTrigger(Event("FSASimulation.GodEventResult", None))
+        self.states["/Main/SimulationFlow/SendingGodEvent"].addTransition(_Main_SimulationFlow_SendingGodEvent_0)
+        
         # transition /Main/SimulationFlow/Executing
         _Main_SimulationFlow_Executing_0 = Transition(self, self.states["/Main/SimulationFlow/Executing"], [self.states["/Main/SimulationFlow/SettleBeforeCheckTermination"]])
         _Main_SimulationFlow_Executing_0.setAction(self._Main_SimulationFlow_Executing_0_exec)
@@ -1885,9 +1911,24 @@ class WovenSimulator_Simulation(RuntimeClassBase):
         self.cbd_iteration = cbd_iteration
         self.cbd_time_next = cbd_time_next
         self.woven_triggered_when_transition = self.wovenGetTriggeredWhenTransition()
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'child_fsa_simulator', Event("FSASmallStep.Execute", None, [self.woven_triggered_when_transition])]))
+    
+    def _Main_SimulationFlow_CheckingForStateEvent_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'child_fsa_simulator', Event("FSASmallStep.Execute", None, [])]))
         # print 'Executing a FSA small step... (after CBD big step)'
     
+    def _Main_SimulationFlow_CheckingForStateEvent_0_guard(self, parameters):
+        return self.woven_triggered_when_transition == None
+    
+    def _Main_SimulationFlow_CheckingForStateEvent_1_exec(self, parameters):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'child_fsa_simulator', Event("FSASimulation.GodEvent", None, [self.woven_triggered_when_transition])]))
+    
+    def _Main_SimulationFlow_CheckingForStateEvent_1_guard(self, parameters):
+        return not (self.woven_triggered_when_transition == None)
+    
+    def _Main_SimulationFlow_SendingGodEvent_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'child_fsa_simulator', Event("FSASmallStep.Execute", None, [])]))
+        # print 'Executing a FSA small step... (after CBD big step -- state event detected)'
+    
     def _Main_SimulationFlow_Executing_0_exec(self, parameters):
         fsa_clock = parameters[0]
         fsa_state = parameters[1]
@@ -1959,6 +2000,7 @@ class FSASimulator_Simulation(RuntimeClassBase):
         self.elapsed = 0
         self.time_next = self.delta
         self.state = self.model.initialState
+        self.selected_transition = None
     
     
     # user defined method
@@ -1977,12 +2019,8 @@ class FSASimulator_Simulation(RuntimeClassBase):
     
     
     # user defined method
-    def godEvent(self, new_state):
-        filtered_states = [s for s in self.model.states if s.name == new_state]
-        if not len(filtered_states) == 1:
-            return -1
-        self.state = filtered_states[0]
-        return 0
+    def godEvent(self, selected_transition):
+        self.selected_transition = selected_transition
     
     
     # builds Statechart structure
@@ -2127,11 +2165,9 @@ class FSASimulator_Simulation(RuntimeClassBase):
         
         # transition /Main/ModeSelector/Paused
         _Main_ModeSelector_Paused_0 = Transition(self, self.states["/Main/ModeSelector/Paused"], [self.states["/Main/ModeSelector/Running/SmallStep"]])
-        _Main_ModeSelector_Paused_0.setAction(self._Main_ModeSelector_Paused_0_exec)
         _Main_ModeSelector_Paused_0.setTrigger(Event("FSASmallStep.Execute", None))
         self.states["/Main/ModeSelector/Paused"].addTransition(_Main_ModeSelector_Paused_0)
         _Main_ModeSelector_Paused_1 = Transition(self, self.states["/Main/ModeSelector/Paused"], [self.states["/Main/ModeSelector/Running/BigStep"]])
-        _Main_ModeSelector_Paused_1.setAction(self._Main_ModeSelector_Paused_1_exec)
         _Main_ModeSelector_Paused_1.setTrigger(Event("FSABigStep.Execute", None))
         self.states["/Main/ModeSelector/Paused"].addTransition(_Main_ModeSelector_Paused_1)
         _Main_ModeSelector_Paused_2 = Transition(self, self.states["/Main/ModeSelector/Paused"], [self.states["/Main/ModeSelector/Paused"]])
@@ -2280,14 +2316,6 @@ class FSASimulator_Simulation(RuntimeClassBase):
     def _Main_SimulationFlow_SettleBeforeCheckTermination_exit(self):
         self.removeTimer(1)
     
-    def _Main_ModeSelector_Paused_0_exec(self, parameters):
-        selected_transition = parameters[0]
-        self.selected_transition = selected_transition
-    
-    def _Main_ModeSelector_Paused_1_exec(self, parameters):
-        selected_transition = parameters[0]
-        self.selected_transition = selected_transition
-    
     def _Main_ModeSelector_Paused_2_exec(self, parameters):
         clock = parameters[0]
         state = parameters[1]
@@ -2359,12 +2387,14 @@ class FSASimulator_Simulation(RuntimeClassBase):
     
     def _Main_SimulationFlow_CheckTermination_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'child_simulator', Event("FSABigStep.Execute", None, [self.selected_transition])]))
+        self.selected_transition = None
     
     def _Main_SimulationFlow_CheckTermination_0_guard(self, parameters):
         return self.inState(["/Main/ModeSelector/Running/BigStep"]) and self.inState(["/Main/ChildState/Initialized"]) and not self.endCondition()
     
     def _Main_SimulationFlow_CheckTermination_1_exec(self, parameters):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'child_simulator', Event("FSASmallStep.Execute", None, [self.selected_transition])]))
+        self.selected_transition = None
     
     def _Main_SimulationFlow_CheckTermination_1_guard(self, parameters):
         return self.inState(["/Main/ModeSelector/Running/SmallStep"]) and self.inState(["/Main/ChildState/Initialized"]) and not self.endCondition()
@@ -2379,12 +2409,12 @@ class FSASimulator_Simulation(RuntimeClassBase):
         return self.endCondition()
     
     def _Main_GodEventManager_Listening_0_exec(self, parameters):
-        new_state = parameters[0]
-        result = self.godEvent(new_state)
+        selected_transition = parameters[0]
+        result = self.godEvent(selected_transition)
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("FSASimulation.GodEventResult", None, [result])]))
     
     def _Main_GodEventManager_Listening_0_guard(self, parameters):
-        new_state = parameters[0]
+        selected_transition = parameters[0]
         return self.inState(["/Main/ModeSelector/Paused"])
     
     def initializeStatechart(self):

+ 16 - 3
debugging_fsa_cbd_composition/fsa_cbd_simulator/HierarchicalSimulator/woven_sim_simulation.xml

@@ -704,7 +704,7 @@
                     </transition>
                 </state>
                 <state id="ExecutingCBD">
-                    <transition target="../Executing" event="CBDBigStep.Finished">
+                    <transition target="../CheckingForStateEvent" event="CBDBigStep.Finished">
                         <parameter name="cbd_clock" />
                         <parameter name="cbd_iteration" />
                         <parameter name="cbd_time_next" />
@@ -718,10 +718,23 @@
                             self.cbd_time_next = cbd_time_next
                             self.woven_triggered_when_transition = self.wovenGetTriggeredWhenTransition()
                         </script>
-                        <raise event="FSASmallStep.Execute" scope="narrow" target="'child_fsa_simulator'">
+                    </transition>
+                </state>
+                <state id="CheckingForStateEvent">
+                    <transition target="../Executing" cond="self.woven_triggered_when_transition == None">
+                        <raise event="FSASmallStep.Execute" scope="narrow" target="'child_fsa_simulator'" />
+                        <script># print 'Executing a FSA small step... (after CBD big step)'</script>
+                    </transition>
+                    <transition target="../SendingGodEvent" cond="not (self.woven_triggered_when_transition == None)">
+                        <raise event="FSASimulation.GodEvent" scope="narrow" target="'child_fsa_simulator'">
                             <parameter expr="self.woven_triggered_when_transition" />
                         </raise>
-                        <script># print 'Executing a FSA small step... (after CBD big step)'</script>
+                    </transition>
+                </state>
+                <state id="SendingGodEvent">
+                    <transition target="../Executing" event="FSASimulation.GodEventResult">
+                        <raise event="FSASmallStep.Execute" scope="narrow" target="'child_fsa_simulator'" />
+                        <script># print 'Executing a FSA small step... (after CBD big step -- state event detected)'</script>
                     </transition>
                 </state>
                 <state id="Executing">