Просмотр исходного кода

the bug from previous push was not yet solved for a special case, now it is

sampieters 1 год назад
Родитель
Сommit
c235061a04

+ 0 - 26
examples/Fail1/Python/runner.py

@@ -1,26 +0,0 @@
-import target as target
-from sccd.runtime.statecharts_core import Event
-import threading
-
-if __name__ == '__main__':
-    controller = target.Controller() 
-    
-    def raw_inputter():
-        while 1:
-            controller.addInput(Event(input(), "input", []))
-    input_thread = threading.Thread(target=raw_inputter)
-    input_thread.daemon = True
-    input_thread.start()
-    
-    output_listener = controller.addOutputListener(["output"])
-    def outputter():
-        while 1:
-            event = output_listener.fetch(-1)
-            print("SIMTIME: %.2fs" % (event.getParameters()[0] / 1000.0))
-            print("ACTTIME: %.2fs" % (event.getParameters()[1]))
-
-    output_thread = threading.Thread(target=outputter)
-    output_thread.daemon = True
-    output_thread.start()
-    
-    controller.start()

+ 0 - 7
examples/Fail1/expected_trace.txt

@@ -1,7 +0,0 @@
-0.00 MainApp: exit /state1/state11
-0.00 MainApp: transition (/state1/state11 -> /state1/state12)
-0.00 MainApp: enter /state1/state12
-0.00 MainApp: exit /state1/state12
-0.00 MainApp: exit /state1
-0.00 MainApp: transition (/state1/state12 -> /state2)
-0.00 MainApp: enter /state2

+ 0 - 23
examples/Fail1/sccd.xml

@@ -1,23 +0,0 @@
-<?xml version="1.1" ?>
-<diagram author="Sam Pieters" name="CompositeNoInitialStateTest">
-    <description>
-        Test 1.8: Test if composite states are handled correctly.
-        When no initial in composite defined, go into the first state that is defined.
-    </description>
-    <class name="MainApp" default="true">
-        <scxml initial="state1">
-            <state id="state1"> 
-                <state id="state10">
-                    <transition target="../state12" />
-                </state>
-                <state id="state11">
-                    <transition target="." />
-                </state>
-                <state id="state12">
-                    <transition target="../../state2" />
-                </state>
-            </state>
-            <state id="state2" />
-        </scxml>
-    </class>
-</diagram>

+ 6 - 0
requirements.txt

@@ -0,0 +1,6 @@
+matplotlib==3.9.1.post1
+numpy==2.0.0
+pillow==10.4.0
+pyparsing==3.1.2
+python-dateutil==2.9.0.post0
+tk==0.1.0

+ 1 - 1
sccd/compiler/DEVS_generator.py

@@ -69,7 +69,7 @@ class DEVSGenerator(Visitor):
                 # cannot instantiate abstract class
                 self.writer.add(GLC.ThrowExceptionStatement(GLC.String("Cannot instantiate abstract class \"" + c.name + "\" with unimplemented methods \"" + "\", \"".join(c.abstract_method_names) + "\".")))
             else:
-                self.writer.addAssignment(GLC.SelfProperty("narrow_cast_id"), GLC.SelfProperty(f"narrow_cast_id + {len(c.inports)}"))
+                self.writer.addAssignment(GLC.SelfProperty("narrow_cast_id"), GLC.SelfProperty(f"narrow_cast_id + {len(c.inports) + len(c.outports)}"))
                 self.writer.addAssignment(
                     "instance[\"associations\"]", GLC.MapExpression())
                 for a in c.associations:

+ 0 - 3
tests/0.0) PrivatePortInputTest/config.json

@@ -1,3 +0,0 @@
-{
-    "trace": "statechart"
-}

examples/Fail1/config.json → tests/5.0) PrivateInPortTest/config.json


tests/0.0) PrivatePortInputTest/expected_trace.txt → tests/5.0) PrivateInPortTest/expected_trace.txt


tests/0.0) PrivatePortInputTest/input.txt → tests/5.0) PrivateInPortTest/input.txt


+ 2 - 2
tests/0.0) PrivatePortInputTest/sccd.xml

@@ -1,7 +1,7 @@
 <?xml version="1.1" ?>
-<diagram author="Sam Pieters" name="InputPrivatePortTest">
+<diagram author="Sam Pieters" name="PrivateInPortTest">
     <description>
-        Classes could have a private port, check if this port can receive events.
+        Classes could have a private input port, check if this port can receive events.
     </description>
     <class name="MainApp" default="true">
         <inport name="priv_port"/>

tests/0.1) PrivatePortOutputTest/config.json → tests/5.1) PrivateOutPortTest/config.json


tests/0.1) PrivatePortOutputTest/expected_trace.txt → tests/5.1) PrivateOutPortTest/expected_trace.txt


+ 2 - 2
tests/0.1) PrivatePortOutputTest/sccd.xml

@@ -1,7 +1,7 @@
 <?xml version="1.1" ?>
-<diagram author="Sam Pieters" name="InputPrivatePortTest">
+<diagram author="Sam Pieters" name="PrivateOutPortTest">
     <description>
-        Classes could have a private port, check if this port can receive events.
+        Classes could have a private output port, check if this port can send events.
     </description>
     <class name="MainApp" default="true">
         <inport name="check" />

+ 3 - 0
tests/5.2) PrivatePortIdTest/config.json

@@ -0,0 +1,3 @@
+{
+    "trace": ["statechart", "external"]
+}

+ 2 - 0
tests/5.2) PrivatePortIdTest/expected_trace.txt

@@ -0,0 +1,2 @@
+0.00 (event name: priv_4_event; port: private_5_priv_4_port; parameters: ['private_1_priv_2_port', 'private_2_priv_3_port', 'private_3_priv_5_port'])
+0.00 (event name: priv_1_event; port: private_4_priv_1_port; parameters: ['private_3_priv_5_port', 'private_2_priv_3_port', 'private_1_priv_2_port'])

+ 30 - 0
tests/5.2) PrivatePortIdTest/sccd.xml

@@ -0,0 +1,30 @@
+<?xml version="1.1" ?>
+<diagram author="Sam Pieters" name="PrivatePortIdTest">
+    <description>
+        Classes could have multiple private ports for one SCCD class, check if the id's are as expected (ids in ascending order as the ports are defined).
+    </description>
+    <class name="MainApp" default="true">
+        <outport name="priv_1_port" />
+        <inport name="priv_2_port" />
+        <inport name="priv_3_port" />
+        <outport name="priv_4_port" />
+        <inport name="priv_5_port" />
+        <scxml initial="state1">
+            <state id="state1">
+                <onentry>
+                    <raise port="priv_4_port" event="priv_4_event">
+                        <parameter expr='self.inports["priv_2_port"]' />
+                        <parameter expr='self.inports["priv_3_port"]' />
+                        <parameter expr='self.inports["priv_5_port"]' />
+                    </raise>
+                    <raise port="priv_1_port" event="priv_1_event">
+                        <parameter expr='self.inports["priv_5_port"]' />
+                        <parameter expr='self.inports["priv_3_port"]' />
+                        <parameter expr='self.inports["priv_2_port"]' />
+                    </raise>
+                </onentry>
+            </state>
+            <state id="state2" />
+        </scxml>
+    </class>
+</diagram>

+ 3 - 0
tests/5.3) PrivatePortIdsTest/config.json

@@ -0,0 +1,3 @@
+{
+    "trace": ["statechart", "external"]
+}

+ 10 - 0
tests/5.3) PrivatePortIdsTest/expected_trace.txt

@@ -0,0 +1,10 @@
+0.00 (event name: priv_5_event; port: private_4_priv_5_port; parameters: ['private_1_priv_4_port', 'private_2_priv_3_port', 'private_3_priv_1_port'])
+0.00 (event name: priv_2_event; port: private_5_priv_2_port; parameters: ['private_3_priv_1_port', 'private_2_priv_3_port', 'private_1_priv_4_port'])
+0.00 MainApp: exit /state1
+0.00 MainApp: transition (/state1 -> /state2)
+0.00 MainApp: enter /state2
+0.00 (event name: priv_4_event; port: private_11_priv_4_port; parameters: ['private_7_priv_2_port', 'private_8_priv_3_port', 'private_9_priv_5_port'])
+0.00 (event name: priv_1_event; port: private_10_priv_1_port; parameters: ['private_9_priv_5_port', 'private_8_priv_3_port', 'private_7_priv_2_port'])
+0.00 MainApp: exit /state2
+0.00 MainApp: transition (/state2 -> /state2)
+0.00 MainApp: enter /state2

+ 72 - 0
tests/5.3) PrivatePortIdsTest/sccd.xml

@@ -0,0 +1,72 @@
+<?xml version="1.1" ?>
+<diagram author="Sam Pieters" name="PrivatePortIdsTest">
+    <description>
+        Check if instance (other than default class) handle private ports correctly. 
+    </description>
+    <class name="MainApp" default="true">
+        <outport name="priv_5_port" />
+        <inport name="priv_4_port" />
+        <inport name="priv_3_port" />
+        <outport name="priv_2_port" />
+        <inport name="priv_1_port" />
+        <relationships>
+            <association name="linkA" class="A" />
+        </relationships>
+        <scxml initial="state1">
+            <state id="state1">
+                <onentry>
+                    <raise port="priv_5_port" event="priv_5_event">
+                        <parameter expr='self.inports["priv_4_port"]' />
+                        <parameter expr='self.inports["priv_3_port"]' />
+                        <parameter expr='self.inports["priv_1_port"]' />
+                    </raise>
+                    <raise port="priv_2_port" event="priv_2_event">
+                        <parameter expr='self.inports["priv_1_port"]' />
+                        <parameter expr='self.inports["priv_3_port"]' />
+                        <parameter expr='self.inports["priv_4_port"]' />
+                    </raise>
+                    <raise scope="cd" event="create_instance">
+                        <parameter expr='"linkA"' />
+                        <parameter expr='"A"' />
+                    </raise>
+                </onentry>
+                <transition event='instance_created' target='../state2'>
+                    <parameter name="association_name" type="string"/>
+                    <raise scope="cd" event="start_instance">
+                        <parameter expr="association_name" />
+                    </raise>
+                </transition>
+            </state>
+            <state id="state2">
+                <transition event='instance_started' target='.'>
+                    <parameter name="association_name" type="string"/>
+                </transition>
+            </state>
+        </scxml>
+    </class>
+
+    <class name="A">
+        <outport name="priv_1_port" />
+        <inport name="priv_2_port" />
+        <inport name="priv_3_port" />
+        <outport name="priv_4_port" />
+        <inport name="priv_5_port" />
+        <scxml initial="state1">
+            <state id="state1">
+                <onentry>
+                    <raise port="priv_4_port" event="priv_4_event">
+                        <parameter expr='self.inports["priv_2_port"]' />
+                        <parameter expr='self.inports["priv_3_port"]' />
+                        <parameter expr='self.inports["priv_5_port"]' />
+                    </raise>
+                    <raise port="priv_1_port" event="priv_1_event">
+                        <parameter expr='self.inports["priv_5_port"]' />
+                        <parameter expr='self.inports["priv_3_port"]' />
+                        <parameter expr='self.inports["priv_2_port"]' />
+                    </raise>
+                </onentry>
+            </state>
+            <state id="state2" />
+        </scxml>
+    </class>
+</diagram>

+ 3 - 0
tests/5.4) PrivatePortMultipleIdsTest/config.json

@@ -0,0 +1,3 @@
+{
+    "trace": ["statechart", "external"]
+}

+ 12 - 0
tests/5.4) PrivatePortMultipleIdsTest/expected_trace.txt

@@ -0,0 +1,12 @@
+0.00 (event name: priv_5_event; port: private_4_priv_5_port; parameters: ['private_1_priv_4_port', 'private_2_priv_3_port', 'private_3_priv_1_port'])
+0.00 (event name: priv_2_event; port: private_5_priv_2_port; parameters: ['private_3_priv_1_port', 'private_2_priv_3_port', 'private_1_priv_4_port'])
+0.00 MainApp: exit /state1
+0.00 MainApp: transition (/state1 -> /state3)
+0.00 MainApp: enter /state3
+0.00 (event name: priv_4_event; port: private_11_priv_4_port; parameters: ['private_7_priv_2_port', 'private_8_priv_3_port', 'private_9_priv_5_port'])
+0.00 (event name: priv_1_event; port: private_10_priv_1_port; parameters: ['private_9_priv_5_port', 'private_8_priv_3_port', 'private_7_priv_2_port'])
+0.00 MainApp: exit /state3
+0.00 MainApp: transition (/state3 -> /state4)
+0.00 MainApp: enter /state4
+0.00 (event name: priv_4_event; port: private_17_priv_4_port; parameters: ['private_13_priv_2_port', 'private_14_priv_3_port', 'private_15_priv_5_port'])
+0.00 (event name: priv_1_event; port: private_16_priv_1_port; parameters: ['private_15_priv_5_port', 'private_14_priv_3_port', 'private_13_priv_2_port'])

+ 82 - 0
tests/5.4) PrivatePortMultipleIdsTest/sccd.xml

@@ -0,0 +1,82 @@
+<?xml version="1.1" ?>
+<diagram author="Sam Pieters" name="PrivatPortMultipleIdsTest">
+    <description>
+        Check if multiple instances (other than default class) of the same class handle private ports correctly. 
+    </description>
+    <class name="MainApp" default="true">
+        <outport name="priv_5_port" />
+        <inport name="priv_4_port" />
+        <inport name="priv_3_port" />
+        <outport name="priv_2_port" />
+        <inport name="priv_1_port" />
+        <relationships>
+            <association name="linkA" class="A" />
+        </relationships>
+        <scxml initial="state1">
+            <state id="state1">
+                <onentry>
+                    <raise port="priv_5_port" event="priv_5_event">
+                        <parameter expr='self.inports["priv_4_port"]' />
+                        <parameter expr='self.inports["priv_3_port"]' />
+                        <parameter expr='self.inports["priv_1_port"]' />
+                    </raise>
+                    <raise port="priv_2_port" event="priv_2_event">
+                        <parameter expr='self.inports["priv_1_port"]' />
+                        <parameter expr='self.inports["priv_3_port"]' />
+                        <parameter expr='self.inports["priv_4_port"]' />
+                    </raise>
+                    <raise scope="cd" event="create_instance">
+                        <parameter expr='"linkA"' />
+                        <parameter expr='"A"' />
+                    </raise>
+                </onentry>
+                <transition event='instance_created' target='../state3'>
+                    <parameter name="association_name" type="string"/>
+                    <raise scope="cd" event="start_instance">
+                        <parameter expr="association_name" />
+                    </raise>
+                </transition>
+            </state>
+            <state id="state3">
+                <onentry>
+                    <raise scope="cd" event="create_instance">
+                        <parameter expr='"linkA"' />
+                        <parameter expr='"A"' />
+                    </raise>
+                </onentry>
+                <transition event='instance_created' target='../state4'>
+                    <parameter name="association_name" type="string"/>
+                    <raise scope="cd" event="start_instance">
+                        <parameter expr="association_name" />
+                    </raise>
+                </transition>
+            </state>
+            <state id="state4" />
+        </scxml>
+    </class>
+
+    <class name="A">
+        <outport name="priv_1_port" />
+        <inport name="priv_2_port" />
+        <inport name="priv_3_port" />
+        <outport name="priv_4_port" />
+        <inport name="priv_5_port" />
+        <scxml initial="state1">
+            <state id="state1">
+                <onentry>
+                    <raise port="priv_4_port" event="priv_4_event">
+                        <parameter expr='self.inports["priv_2_port"]' />
+                        <parameter expr='self.inports["priv_3_port"]' />
+                        <parameter expr='self.inports["priv_5_port"]' />
+                    </raise>
+                    <raise port="priv_1_port" event="priv_1_event">
+                        <parameter expr='self.inports["priv_5_port"]' />
+                        <parameter expr='self.inports["priv_3_port"]' />
+                        <parameter expr='self.inports["priv_2_port"]' />
+                    </raise>
+                </onentry>
+            </state>
+            <state id="state2" />
+        </scxml>
+    </class>
+</diagram>