浏览代码

Add files

Joeri Exelmans 1 年之前
当前提交
da43c0c9b9
共有 17 个文件被更改,包括 1896 次插入0 次删除
  1. 2 0
      .gitignore
  2. 23 0
      .project
  3. 2 0
      .settings/org.eclipse.core.resources.prefs
  4. 54 0
      PythonGenerator.sgen
  5. 160 0
      Statechart.ysc
  6. 63 0
      examples_test.py
  7. 111 0
      exercises/A.ysc
  8. 169 0
      exercises/B.ysc
  9. 173 0
      exercises/C.ysc
  10. 316 0
      exercises/D.ysc
  11. 227 0
      exercises/E.ysc
  12. 88 0
      lib/common.py
  13. 153 0
      lib/test.py
  14. 5 0
      src/yakindu/__init__.py
  15. 48 0
      src/yakindu/rx.py
  16. 195 0
      trafficlight_gui.py
  17. 107 0
      trafficlight_test.py

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+__pycache__/
+srcgen/

+ 23 - 0
.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>StartingPoint</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.yakindu.sct.builder.SCTBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>com.yakindu.sct.builder.SCTNature</nature>
+	</natures>
+</projectDescription>

+ 2 - 0
.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8

+ 54 - 0
PythonGenerator.sgen

@@ -0,0 +1,54 @@
+GeneratorModel for create::python {
+
+	const PROJECT : string = "StartingPoint"
+
+	const FOLDER : string = "srcgen"
+
+	statechart Statechart {
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+
+	statechart A {
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+
+	statechart B {
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+
+	statechart C {
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+
+	statechart D {
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+
+	statechart E {
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+}

文件差异内容过多而无法显示
+ 160 - 0
Statechart.ysc


+ 63 - 0
examples_test.py

@@ -0,0 +1,63 @@
+from srcgen import a, b, c, d, e
+from lib.test import run_scenarios
+
+SCENARIOS_A = [
+    {
+        "name": "A",
+        "input_trace": [],
+        "output_trace": [
+            (1000000000, "x", None),
+            (2000000000, "x", None),
+            (3000000000, "x", None),
+        ],
+    },
+]
+SCENARIOS_B = [
+    {
+        "name": "B",
+        "input_trace": [],
+        "output_trace": [
+            (2000000000, "inner", None),
+            (3000000000, "outer", None),
+            (5000000000, "inner", None),
+            (6000000000, "outer", None),
+            (8000000000, "inner", None),
+            (9000000000, "outer", None),
+        ],
+    },
+]
+SCENARIOS_C = [
+    {
+        "name": "C",
+        "input_trace": [],
+        "output_trace": [],
+    },
+]
+SCENARIOS_D = [
+    {
+        "name": "D",
+        "input_trace": [],
+        "output_trace": [],
+    },
+]
+SCENARIOS_E = [
+    {
+        "name": "E",
+        "input_trace": [],
+        "output_trace": [
+            (1000000000, "x", None),
+            (1000000000, "y", None),
+            (2000000000, "x", None),
+            (2000000000, "y", None),
+            (3000000000, "x", None),
+            (3000000000, "y", None),
+        ],
+    },
+]
+
+if __name__ == "__main__":
+    run_scenarios(a.A, SCENARIOS_A, [], [])
+    run_scenarios(b.B, SCENARIOS_B, [], [])
+    run_scenarios(c.C, SCENARIOS_C, [], [])
+    run_scenarios(d.D, SCENARIOS_D, [], [])
+    run_scenarios(e.E, SCENARIOS_E, [], [])

+ 111 - 0
exercises/A.ysc

@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:sgraph="http://www.yakindu.org/sct/sgraph/2.0.0">
+  <sgraph:Statechart xmi:id="_Zj_B0I-JEe6T3aFB4BWOHg" specification="@EventDriven&#xA;@SuperSteps(no)&#xA;&#xA;interface:&#xA;&#x9;out event x&#xA;&#x9;out event y" name="A">
+    <regions xmi:id="_ZkFIc4-JEe6T3aFB4BWOHg" name="main region">
+      <vertices xsi:type="sgraph:Entry" xmi:id="_ZkFIdI-JEe6T3aFB4BWOHg">
+        <outgoingTransitions xmi:id="_ZkFIdY-JEe6T3aFB4BWOHg" target="_ZkFvgI-JEe6T3aFB4BWOHg"/>
+      </vertices>
+      <vertices xsi:type="sgraph:State" xmi:id="_ZkFvgI-JEe6T3aFB4BWOHg" name="StateA" incomingTransitions="_ZkFIdY-JEe6T3aFB4BWOHg _3l5WQI-JEe6T3aFB4BWOHg _5ooqEI-JEe6T3aFB4BWOHg">
+        <outgoingTransitions xmi:id="_3l5WQI-JEe6T3aFB4BWOHg" specification="after 1s / raise x" target="_ZkFvgI-JEe6T3aFB4BWOHg"/>
+        <outgoingTransitions xmi:id="_5ooqEI-JEe6T3aFB4BWOHg" specification="after 2s / raise y" target="_ZkFvgI-JEe6T3aFB4BWOHg"/>
+      </vertices>
+    </regions>
+  </sgraph:Statechart>
+  <notation:Diagram xmi:id="_ZkIy0I-JEe6T3aFB4BWOHg" type="org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor" element="_Zj_B0I-JEe6T3aFB4BWOHg" measurementUnit="Pixel">
+    <children xmi:id="_ZkIy0Y-JEe6T3aFB4BWOHg" type="Region" element="_ZkFIc4-JEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_ZkIy0o-JEe6T3aFB4BWOHg" type="RegionName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy04-JEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIy1I-JEe6T3aFB4BWOHg"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_ZkIy1Y-JEe6T3aFB4BWOHg" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+        <children xmi:id="_ZkIy1o-JEe6T3aFB4BWOHg" type="Entry" element="_ZkFIdI-JEe6T3aFB4BWOHg">
+          <children xmi:id="_ZkIy14-JEe6T3aFB4BWOHg" type="BorderItemLabelContainer">
+            <children xsi:type="notation:DecorationNode" xmi:id="_ZkIy2I-JEe6T3aFB4BWOHg" type="BorderItemLabel">
+              <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy2Y-JEe6T3aFB4BWOHg"/>
+              <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIy2o-JEe6T3aFB4BWOHg"/>
+            </children>
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy24-JEe6T3aFB4BWOHg" fontName="Verdana" lineColor="4210752"/>
+            <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy3I-JEe6T3aFB4BWOHg"/>
+          </children>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy3Y-JEe6T3aFB4BWOHg" fontName="Verdana" fillColor="0" lineColor="16777215"/>
+          <styles xsi:type="notation:NamedStyle" xmi:id="_ZkIy3o-JEe6T3aFB4BWOHg" name="allowColors"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy34-JEe6T3aFB4BWOHg" x="89" y="84" width="15" height="15"/>
+        </children>
+        <children xmi:id="_ZkIy4I-JEe6T3aFB4BWOHg" type="State" element="_ZkFvgI-JEe6T3aFB4BWOHg">
+          <children xsi:type="notation:DecorationNode" xmi:id="_ZkIy4Y-JEe6T3aFB4BWOHg" type="StateName">
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy4o-JEe6T3aFB4BWOHg"/>
+            <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIy44-JEe6T3aFB4BWOHg"/>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_ZkIy5I-JEe6T3aFB4BWOHg" type="StateTextCompartment">
+            <children xsi:type="notation:Shape" xmi:id="_ZkIy5Y-JEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy5o-JEe6T3aFB4BWOHg"/>
+            </children>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_ZkIy54-JEe6T3aFB4BWOHg" type="StateFigureCompartment"/>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy6I-JEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+          <styles xsi:type="notation:FontStyle" xmi:id="_ZkIy6Y-JEe6T3aFB4BWOHg"/>
+          <styles xsi:type="notation:BooleanValueStyle" xmi:id="_ZkIy6o-JEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy64-JEe6T3aFB4BWOHg" x="84" y="146" width="99" height="53"/>
+        </children>
+        <children xsi:type="notation:Shape" xmi:id="_-jdlUI-JEe6T3aFB4BWOHg" type="Note" fontName="Verdana" description="Explain: why is event 'y' never raised?" fillColor="13369343" transparency="0" lineColor="6737151" lineWidth="1">
+          <children xsi:type="notation:BasicDecorationNode" xmi:id="_-jezcI-JEe6T3aFB4BWOHg" type="DiagramName">
+            <element xsi:nil="true"/>
+          </children>
+          <children xsi:type="notation:BasicDecorationNode" xmi:id="_-jezcY-JEe6T3aFB4BWOHg" type="Description">
+            <element xsi:nil="true"/>
+          </children>
+          <styles xsi:type="notation:TextStyle" xmi:id="_-jdlUY-JEe6T3aFB4BWOHg"/>
+          <styles xsi:type="notation:LineTypeStyle" xmi:id="_-jdlUo-JEe6T3aFB4BWOHg"/>
+          <element xsi:nil="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_-jdlU4-JEe6T3aFB4BWOHg" x="55" y="323" width="285" height="56"/>
+        </children>
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy-I-JEe6T3aFB4BWOHg"/>
+      </children>
+      <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy-Y-JEe6T3aFB4BWOHg" fontName="Verdana" fillColor="16448250" lineColor="12632256"/>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy-o-JEe6T3aFB4BWOHg" x="25" y="15" width="400" height="446"/>
+    </children>
+    <children xsi:type="notation:Shape" xmi:id="_ZkIy-4-JEe6T3aFB4BWOHg" type="StatechartText" fontName="Verdana" lineColor="4210752">
+      <children xsi:type="notation:DecorationNode" xmi:id="_ZkIy_I-JEe6T3aFB4BWOHg" type="StatechartName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy_Y-JEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIy_o-JEe6T3aFB4BWOHg"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_ZkIy_4-JEe6T3aFB4BWOHg" type="StatechartTextExpression" fontName="Verdana" lineColor="4210752">
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIzAI-JEe6T3aFB4BWOHg"/>
+      </children>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIzAY-JEe6T3aFB4BWOHg" x="10" y="10" width="200" height="400"/>
+    </children>
+    <styles xsi:type="notation:BooleanValueStyle" xmi:id="_ZkIzAo-JEe6T3aFB4BWOHg" name="inlineDefinitionSection"/>
+    <styles xsi:type="notation:DiagramStyle" xmi:id="_ZkIzA4-JEe6T3aFB4BWOHg"/>
+    <edges xmi:id="_ZkIzBI-JEe6T3aFB4BWOHg" type="Transition" element="_ZkFIdY-JEe6T3aFB4BWOHg" source="_ZkIy1o-JEe6T3aFB4BWOHg" target="_ZkIy4I-JEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_ZkIzBY-JEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIzBo-JEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIzB4-JEe6T3aFB4BWOHg" x="5" y="2"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_ZkIzCI-JEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_ZkIzCY-JEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_ZkIzCo-JEe6T3aFB4BWOHg" points="[-2, 6, -39, -75]$[-2, 55, -39, -26]"/>
+    </edges>
+    <edges xmi:id="_3l7ygI-JEe6T3aFB4BWOHg" type="Transition" element="_3l5WQI-JEe6T3aFB4BWOHg" source="_ZkIy4I-JEe6T3aFB4BWOHg" target="_ZkIy4I-JEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_3l7yhI-JEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_3l7yhY-JEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_3l7yho-JEe6T3aFB4BWOHg" x="-1" y="-16"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_3l7ygY-JEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_3l7yg4-JEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_3l7ygo-JEe6T3aFB4BWOHg" points="[4, -3, 5, -3]$[4, -3, 5, -3]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_3l9AoI-JEe6T3aFB4BWOHg" id="(0.9393939393939394,0.05660377358490566)"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_3l9AoY-JEe6T3aFB4BWOHg" id="(0.9292929292929293,0.05660377358490566)"/>
+    </edges>
+    <edges xmi:id="_5op4MI-JEe6T3aFB4BWOHg" type="Transition" element="_5ooqEI-JEe6T3aFB4BWOHg" source="_ZkIy4I-JEe6T3aFB4BWOHg" target="_ZkIy4I-JEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_5oqfQY-JEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_5oqfQo-JEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_5oqfQ4-JEe6T3aFB4BWOHg" x="-3" y="17"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_5op4MY-JEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_5oqfQI-JEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_5op4Mo-JEe6T3aFB4BWOHg" points="[97, -34, 78, -33]$[159, -34, 140, -33]$[159, -109, 140, -108]$[73, -109, 54, -108]$[73, -47, 54, -46]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_5ortYI-JEe6T3aFB4BWOHg" id="(0.020202020202020204,0.8867924528301887)"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_5ortYY-JEe6T3aFB4BWOHg" id="(0.21212121212121213,0.8679245283018868)"/>
+    </edges>
+  </notation:Diagram>
+</xmi:XMI>

+ 169 - 0
exercises/B.ysc

@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:sgraph="http://www.yakindu.org/sct/sgraph/2.0.0">
+  <sgraph:Statechart xmi:id="_Zj_B0I-JEe6T3aFB4BWOHg" specification="@EventDriven&#xA;@SuperSteps(no)&#xA;&#xA;interface:&#xA;&#x9;out event outer&#xA;&#x9;out event inner" name="B">
+    <regions xmi:id="_ZkFIc4-JEe6T3aFB4BWOHg" name="main region">
+      <vertices xsi:type="sgraph:State" xmi:id="_Hn1_0I-eEe6T3aFB4BWOHg" name="Outer" incomingTransitions="_LFvDAI-eEe6T3aFB4BWOHg _N5BC8I-eEe6T3aFB4BWOHg">
+        <outgoingTransitions xmi:id="_N5BC8I-eEe6T3aFB4BWOHg" specification="after 3s / raise outer" target="_Hn1_0I-eEe6T3aFB4BWOHg"/>
+        <regions xmi:id="_JRh6cI-eEe6T3aFB4BWOHg" name="r1">
+          <vertices xsi:type="sgraph:State" xmi:id="_ZkFvgI-JEe6T3aFB4BWOHg" name="Inner" incomingTransitions="_ZkFIdY-JEe6T3aFB4BWOHg _3l5WQI-JEe6T3aFB4BWOHg">
+            <outgoingTransitions xmi:id="_3l5WQI-JEe6T3aFB4BWOHg" specification="after 2s / raise inner" target="_ZkFvgI-JEe6T3aFB4BWOHg"/>
+          </vertices>
+          <vertices xsi:type="sgraph:Entry" xmi:id="_ZkFIdI-JEe6T3aFB4BWOHg">
+            <outgoingTransitions xmi:id="_ZkFIdY-JEe6T3aFB4BWOHg" target="_ZkFvgI-JEe6T3aFB4BWOHg"/>
+          </vertices>
+        </regions>
+      </vertices>
+      <vertices xsi:type="sgraph:Entry" xmi:id="_KstfAI-eEe6T3aFB4BWOHg">
+        <outgoingTransitions xmi:id="_LFvDAI-eEe6T3aFB4BWOHg" specification="" target="_Hn1_0I-eEe6T3aFB4BWOHg"/>
+      </vertices>
+    </regions>
+  </sgraph:Statechart>
+  <notation:Diagram xmi:id="_ZkIy0I-JEe6T3aFB4BWOHg" type="org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor" element="_Zj_B0I-JEe6T3aFB4BWOHg" measurementUnit="Pixel">
+    <children xmi:id="_ZkIy0Y-JEe6T3aFB4BWOHg" type="Region" element="_ZkFIc4-JEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_ZkIy0o-JEe6T3aFB4BWOHg" type="RegionName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy04-JEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIy1I-JEe6T3aFB4BWOHg"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_ZkIy1Y-JEe6T3aFB4BWOHg" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+        <children xsi:type="notation:Shape" xmi:id="_-jdlUI-JEe6T3aFB4BWOHg" type="Note" fontName="Verdana" description="Explain: why does the output event trace look like this:&#xA;  2s: inner&#xA;  3s: outer&#xA;  5s: inner&#xA;  6s: outer&#xA;  ...&#xA;&#xA;Specifically, why do both 'inner' and 'outer' occur at 3-second intervals?" fillColor="13369343" transparency="0" lineColor="6737151" lineWidth="1">
+          <children xsi:type="notation:BasicDecorationNode" xmi:id="_-jezcI-JEe6T3aFB4BWOHg" type="DiagramName">
+            <element xsi:nil="true"/>
+          </children>
+          <children xsi:type="notation:BasicDecorationNode" xmi:id="_-jezcY-JEe6T3aFB4BWOHg" type="Description">
+            <element xsi:nil="true"/>
+          </children>
+          <styles xsi:type="notation:TextStyle" xmi:id="_-jdlUY-JEe6T3aFB4BWOHg"/>
+          <styles xsi:type="notation:LineTypeStyle" xmi:id="_-jdlUo-JEe6T3aFB4BWOHg"/>
+          <element xsi:nil="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_-jdlU4-JEe6T3aFB4BWOHg" x="133" y="478" width="489" height="154"/>
+        </children>
+        <children xmi:id="_Hn31AI-eEe6T3aFB4BWOHg" type="State" element="_Hn1_0I-eEe6T3aFB4BWOHg">
+          <children xsi:type="notation:DecorationNode" xmi:id="_Hn31BI-eEe6T3aFB4BWOHg" type="StateName">
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_Hn31BY-eEe6T3aFB4BWOHg"/>
+            <layoutConstraint xsi:type="notation:Location" xmi:id="_Hn4cEI-eEe6T3aFB4BWOHg"/>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_Hn4cEY-eEe6T3aFB4BWOHg" type="StateTextCompartment">
+            <children xsi:type="notation:Shape" xmi:id="_Hn4cEo-eEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_Hn4cE4-eEe6T3aFB4BWOHg"/>
+            </children>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_Hn4cFI-eEe6T3aFB4BWOHg" type="StateFigureCompartment">
+            <children xmi:id="_JRjIkI-eEe6T3aFB4BWOHg" type="Region" element="_JRh6cI-eEe6T3aFB4BWOHg">
+              <children xsi:type="notation:DecorationNode" xmi:id="_JRjIk4-eEe6T3aFB4BWOHg" type="RegionName">
+                <styles xsi:type="notation:ShapeStyle" xmi:id="_JRjIlI-eEe6T3aFB4BWOHg"/>
+                <layoutConstraint xsi:type="notation:Location" xmi:id="_JRjIlY-eEe6T3aFB4BWOHg"/>
+              </children>
+              <children xsi:type="notation:Shape" xmi:id="_JRjIlo-eEe6T3aFB4BWOHg" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+                <children xmi:id="_ZkIy4I-JEe6T3aFB4BWOHg" type="State" element="_ZkFvgI-JEe6T3aFB4BWOHg">
+                  <children xsi:type="notation:DecorationNode" xmi:id="_ZkIy4Y-JEe6T3aFB4BWOHg" type="StateName">
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy4o-JEe6T3aFB4BWOHg"/>
+                    <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIy44-JEe6T3aFB4BWOHg"/>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_ZkIy5I-JEe6T3aFB4BWOHg" type="StateTextCompartment">
+                    <children xsi:type="notation:Shape" xmi:id="_ZkIy5Y-JEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+                      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy5o-JEe6T3aFB4BWOHg"/>
+                    </children>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_ZkIy54-JEe6T3aFB4BWOHg" type="StateFigureCompartment"/>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy6I-JEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+                  <styles xsi:type="notation:FontStyle" xmi:id="_ZkIy6Y-JEe6T3aFB4BWOHg"/>
+                  <styles xsi:type="notation:BooleanValueStyle" xmi:id="_ZkIy6o-JEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy64-JEe6T3aFB4BWOHg" x="45" y="61" width="99" height="53"/>
+                </children>
+                <children xmi:id="_ZkIy1o-JEe6T3aFB4BWOHg" type="Entry" element="_ZkFIdI-JEe6T3aFB4BWOHg">
+                  <children xmi:id="_ZkIy14-JEe6T3aFB4BWOHg" type="BorderItemLabelContainer">
+                    <children xsi:type="notation:DecorationNode" xmi:id="_ZkIy2I-JEe6T3aFB4BWOHg" type="BorderItemLabel">
+                      <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy2Y-JEe6T3aFB4BWOHg"/>
+                      <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIy2o-JEe6T3aFB4BWOHg"/>
+                    </children>
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy24-JEe6T3aFB4BWOHg" fontName="Verdana" lineColor="4210752"/>
+                    <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy3I-JEe6T3aFB4BWOHg"/>
+                  </children>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy3Y-JEe6T3aFB4BWOHg" fontName="Verdana" fillColor="0" lineColor="16777215"/>
+                  <styles xsi:type="notation:NamedStyle" xmi:id="_ZkIy3o-JEe6T3aFB4BWOHg" name="allowColors"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy34-JEe6T3aFB4BWOHg" x="50" y="-1" width="15" height="15"/>
+                </children>
+                <layoutConstraint xsi:type="notation:Bounds" xmi:id="_JRjIl4-eEe6T3aFB4BWOHg"/>
+              </children>
+              <styles xsi:type="notation:ShapeStyle" xmi:id="_JRjIkY-eEe6T3aFB4BWOHg" fontName="Verdana" fillColor="16448250" lineColor="12632256"/>
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_JRjIko-eEe6T3aFB4BWOHg"/>
+            </children>
+          </children>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_Hn31AY-eEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+          <styles xsi:type="notation:FontStyle" xmi:id="_Hn31Ao-eEe6T3aFB4BWOHg"/>
+          <styles xsi:type="notation:BooleanValueStyle" xmi:id="_Hn4cFY-eEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_Hn31A4-eEe6T3aFB4BWOHg" x="74" y="28" width="373" height="327"/>
+        </children>
+        <children xmi:id="_KsuGEI-eEe6T3aFB4BWOHg" type="Entry" element="_KstfAI-eEe6T3aFB4BWOHg">
+          <children xmi:id="_KsuGFI-eEe6T3aFB4BWOHg" type="BorderItemLabelContainer">
+            <children xsi:type="notation:DecorationNode" xmi:id="_KsuGF4-eEe6T3aFB4BWOHg" type="BorderItemLabel">
+              <styles xsi:type="notation:ShapeStyle" xmi:id="_KsuGGI-eEe6T3aFB4BWOHg"/>
+              <layoutConstraint xsi:type="notation:Location" xmi:id="_KsuGGY-eEe6T3aFB4BWOHg"/>
+            </children>
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_KsuGFY-eEe6T3aFB4BWOHg" fontName="Verdana" lineColor="4210752"/>
+            <layoutConstraint xsi:type="notation:Bounds" xmi:id="_KsuGFo-eEe6T3aFB4BWOHg"/>
+          </children>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_KsuGEY-eEe6T3aFB4BWOHg" fontName="Verdana" fillColor="0" lineColor="16777215"/>
+          <styles xsi:type="notation:NamedStyle" xmi:id="_KsuGEo-eEe6T3aFB4BWOHg" name="allowColors"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_KsuGE4-eEe6T3aFB4BWOHg" x="23" y="75"/>
+        </children>
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy-I-JEe6T3aFB4BWOHg"/>
+      </children>
+      <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy-Y-JEe6T3aFB4BWOHg" fontName="Verdana" fillColor="16448250" lineColor="12632256"/>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy-o-JEe6T3aFB4BWOHg" x="205" y="10" width="762" height="707"/>
+    </children>
+    <children xsi:type="notation:Shape" xmi:id="_ZkIy-4-JEe6T3aFB4BWOHg" type="StatechartText" fontName="Verdana" lineColor="4210752">
+      <children xsi:type="notation:DecorationNode" xmi:id="_ZkIy_I-JEe6T3aFB4BWOHg" type="StatechartName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy_Y-JEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIy_o-JEe6T3aFB4BWOHg"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_ZkIy_4-JEe6T3aFB4BWOHg" type="StatechartTextExpression" fontName="Verdana" lineColor="4210752">
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIzAI-JEe6T3aFB4BWOHg"/>
+      </children>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIzAY-JEe6T3aFB4BWOHg" x="10" y="10" width="200" height="400"/>
+    </children>
+    <styles xsi:type="notation:BooleanValueStyle" xmi:id="_ZkIzAo-JEe6T3aFB4BWOHg" name="inlineDefinitionSection"/>
+    <styles xsi:type="notation:DiagramStyle" xmi:id="_ZkIzA4-JEe6T3aFB4BWOHg"/>
+    <edges xmi:id="_ZkIzBI-JEe6T3aFB4BWOHg" type="Transition" element="_ZkFIdY-JEe6T3aFB4BWOHg" source="_ZkIy1o-JEe6T3aFB4BWOHg" target="_ZkIy4I-JEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_ZkIzBY-JEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIzBo-JEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIzB4-JEe6T3aFB4BWOHg" x="5" y="2"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_ZkIzCI-JEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_ZkIzCY-JEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_ZkIzCo-JEe6T3aFB4BWOHg" points="[-2, 6, -39, -75]$[-2, 55, -39, -26]"/>
+    </edges>
+    <edges xmi:id="_3l7ygI-JEe6T3aFB4BWOHg" type="Transition" element="_3l5WQI-JEe6T3aFB4BWOHg" source="_ZkIy4I-JEe6T3aFB4BWOHg" target="_ZkIy4I-JEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_3l7yhI-JEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_3l7yhY-JEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_3l7yho-JEe6T3aFB4BWOHg" x="-1" y="-16"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_3l7ygY-JEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_3l7yg4-JEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_3l7ygo-JEe6T3aFB4BWOHg" points="[4, -3, 5, -3]$[4, -3, 5, -3]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_3l9AoI-JEe6T3aFB4BWOHg" id="(0.9393939393939394,0.05660377358490566)"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_3l9AoY-JEe6T3aFB4BWOHg" id="(0.9292929292929293,0.05660377358490566)"/>
+    </edges>
+    <edges xmi:id="_LFwRII-eEe6T3aFB4BWOHg" type="Transition" element="_LFvDAI-eEe6T3aFB4BWOHg" source="_KsuGEI-eEe6T3aFB4BWOHg" target="_Hn31AI-eEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_LFwRJI-eEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_LFwRJY-eEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_LFwRJo-eEe6T3aFB4BWOHg" x="-4" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_LFwRIY-eEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_LFwRI4-eEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_LFwRIo-eEe6T3aFB4BWOHg" points="[4, -6, -56, 1]$[44, -6, -16, 1]"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_LFyGUI-eEe6T3aFB4BWOHg" id="(0.04507042253521127,0.14473684210526316)"/>
+    </edges>
+    <edges xmi:id="_N5BqAI-eEe6T3aFB4BWOHg" type="Transition" element="_N5BC8I-eEe6T3aFB4BWOHg" source="_Hn31AI-eEe6T3aFB4BWOHg" target="_Hn31AI-eEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_N5BqBI-eEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_N5BqBY-eEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_N5BqBo-eEe6T3aFB4BWOHg" x="12" y="-19"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_N5BqAY-eEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_N5BqA4-eEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_N5BqAo-eEe6T3aFB4BWOHg" points="[24, -20, 24, -20]$[24, -20, 24, -20]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_N5C4II-eEe6T3aFB4BWOHg" id="(0.935656836461126,0.10091743119266056)"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_N5C4IY-eEe6T3aFB4BWOHg" id="(0.935656836461126,0.10091743119266056)"/>
+    </edges>
+  </notation:Diagram>
+</xmi:XMI>

+ 173 - 0
exercises/C.ysc

@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:sgraph="http://www.yakindu.org/sct/sgraph/2.0.0">
+  <sgraph:Statechart xmi:id="_Zj_B0I-JEe6T3aFB4BWOHg" specification="@EventDriven&#xA;@SuperSteps(no)&#xA;&#xA;interface:&#xA;&#x9;var x: integer = 0" name="C">
+    <regions xmi:id="_EAlFCI_LEe6T3aFB4BWOHg" name="main region">
+      <vertices xsi:type="sgraph:State" xmi:id="_EAlFCY_LEe6T3aFB4BWOHg" name="Temp" incomingTransitions="_EAlr1I_LEe6T3aFB4BWOHg">
+        <outgoingTransitions xmi:id="_EAlFC4_LEe6T3aFB4BWOHg" specification="[x==0]" target="_EAlFGY_LEe6T3aFB4BWOHg"/>
+        <outgoingTransitions xmi:id="_EAlFEo_LEe6T3aFB4BWOHg" specification="[x==1]" target="_EAlFG4_LEe6T3aFB4BWOHg"/>
+      </vertices>
+      <vertices xsi:type="sgraph:State" xmi:id="_EAlFGY_LEe6T3aFB4BWOHg" name="Zero" incomingTransitions="_EAlFC4_LEe6T3aFB4BWOHg"/>
+      <vertices xsi:type="sgraph:State" xmi:id="_EAlFG4_LEe6T3aFB4BWOHg" name="One" incomingTransitions="_EAlFEo_LEe6T3aFB4BWOHg"/>
+      <vertices xsi:type="sgraph:Entry" xmi:id="_EAlr0I_LEe6T3aFB4BWOHg">
+        <outgoingTransitions xmi:id="_EAlr0Y_LEe6T3aFB4BWOHg" specification="" target="_EAlr0o_LEe6T3aFB4BWOHg"/>
+      </vertices>
+      <vertices xsi:type="sgraph:State" xmi:id="_EAlr0o_LEe6T3aFB4BWOHg" name="Initial" incomingTransitions="_EAlr0Y_LEe6T3aFB4BWOHg">
+        <outgoingTransitions xmi:id="_EAlr1I_LEe6T3aFB4BWOHg" specification="after 1s / x += 1" target="_EAlFCY_LEe6T3aFB4BWOHg"/>
+      </vertices>
+    </regions>
+  </sgraph:Statechart>
+  <notation:Diagram xmi:id="_ZkIy0I-JEe6T3aFB4BWOHg" type="org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor" element="_Zj_B0I-JEe6T3aFB4BWOHg" measurementUnit="Pixel">
+    <children xsi:type="notation:Shape" xmi:id="_ZkIy-4-JEe6T3aFB4BWOHg" type="StatechartText" fontName="Verdana" lineColor="4210752">
+      <children xsi:type="notation:DecorationNode" xmi:id="_ZkIy_I-JEe6T3aFB4BWOHg" type="StatechartName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy_Y-JEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIy_o-JEe6T3aFB4BWOHg"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_ZkIy_4-JEe6T3aFB4BWOHg" type="StatechartTextExpression" fontName="Verdana" lineColor="4210752">
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIzAI-JEe6T3aFB4BWOHg"/>
+      </children>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIzAY-JEe6T3aFB4BWOHg" x="10" y="10" width="200" height="400"/>
+    </children>
+    <children xmi:id="_EAlEwI_LEe6T3aFB4BWOHg" type="Region" element="_EAlFCI_LEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_EAlEwY_LEe6T3aFB4BWOHg" type="RegionName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlEwo_LEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_EAlEw4_LEe6T3aFB4BWOHg"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_EAlExI_LEe6T3aFB4BWOHg" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+        <children xmi:id="_EAlExY_LEe6T3aFB4BWOHg" type="State" element="_EAlFCY_LEe6T3aFB4BWOHg">
+          <children xsi:type="notation:DecorationNode" xmi:id="_EAlExo_LEe6T3aFB4BWOHg" type="StateName">
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlEx4_LEe6T3aFB4BWOHg"/>
+            <layoutConstraint xsi:type="notation:Location" xmi:id="_EAlEyI_LEe6T3aFB4BWOHg"/>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_EAlEyY_LEe6T3aFB4BWOHg" type="StateTextCompartment">
+            <children xsi:type="notation:Shape" xmi:id="_EAlEyo_LEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_EAlEy4_LEe6T3aFB4BWOHg"/>
+            </children>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_EAlEzI_LEe6T3aFB4BWOHg" type="StateFigureCompartment"/>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlEzY_LEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+          <styles xsi:type="notation:FontStyle" xmi:id="_EAlEzo_LEe6T3aFB4BWOHg"/>
+          <styles xsi:type="notation:BooleanValueStyle" xmi:id="_EAlEz4_LEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_EAlE0I_LEe6T3aFB4BWOHg" x="275" y="86" width="68" height="53"/>
+        </children>
+        <children xmi:id="_EAlE0Y_LEe6T3aFB4BWOHg" type="State" element="_EAlFGY_LEe6T3aFB4BWOHg">
+          <children xsi:type="notation:DecorationNode" xmi:id="_EAlE0o_LEe6T3aFB4BWOHg" type="StateName">
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlE04_LEe6T3aFB4BWOHg"/>
+            <layoutConstraint xsi:type="notation:Location" xmi:id="_EAlE1I_LEe6T3aFB4BWOHg"/>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_EAlE1Y_LEe6T3aFB4BWOHg" type="StateTextCompartment">
+            <children xsi:type="notation:Shape" xmi:id="_EAlE1o_LEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_EAlE14_LEe6T3aFB4BWOHg"/>
+            </children>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_EAlE2I_LEe6T3aFB4BWOHg" type="StateFigureCompartment"/>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlE2Y_LEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+          <styles xsi:type="notation:FontStyle" xmi:id="_EAlE2o_LEe6T3aFB4BWOHg"/>
+          <styles xsi:type="notation:BooleanValueStyle" xmi:id="_EAlE24_LEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_EAlE3I_LEe6T3aFB4BWOHg" x="491" y="47" width="40" height="53"/>
+        </children>
+        <children xmi:id="_EAlE3Y_LEe6T3aFB4BWOHg" type="State" element="_EAlFG4_LEe6T3aFB4BWOHg">
+          <children xsi:type="notation:DecorationNode" xmi:id="_EAlE3o_LEe6T3aFB4BWOHg" type="StateName">
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlE34_LEe6T3aFB4BWOHg"/>
+            <layoutConstraint xsi:type="notation:Location" xmi:id="_EAlE4I_LEe6T3aFB4BWOHg"/>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_EAlE4Y_LEe6T3aFB4BWOHg" type="StateTextCompartment">
+            <children xsi:type="notation:Shape" xmi:id="_EAlE4o_LEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_EAlE44_LEe6T3aFB4BWOHg"/>
+            </children>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_EAlE5I_LEe6T3aFB4BWOHg" type="StateFigureCompartment"/>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlE5Y_LEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+          <styles xsi:type="notation:FontStyle" xmi:id="_EAlE5o_LEe6T3aFB4BWOHg"/>
+          <styles xsi:type="notation:BooleanValueStyle" xmi:id="_EAlE54_LEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_EAlE6I_LEe6T3aFB4BWOHg" x="496" y="159" width="40" height="53"/>
+        </children>
+        <children xmi:id="_EAlE6Y_LEe6T3aFB4BWOHg" type="Entry" element="_EAlr0I_LEe6T3aFB4BWOHg">
+          <children xmi:id="_EAlE6o_LEe6T3aFB4BWOHg" type="BorderItemLabelContainer">
+            <children xsi:type="notation:DecorationNode" xmi:id="_EAlE64_LEe6T3aFB4BWOHg" type="BorderItemLabel">
+              <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlE7I_LEe6T3aFB4BWOHg"/>
+              <layoutConstraint xsi:type="notation:Location" xmi:id="_EAlE7Y_LEe6T3aFB4BWOHg"/>
+            </children>
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlE7o_LEe6T3aFB4BWOHg" fontName="Verdana" lineColor="4210752"/>
+            <layoutConstraint xsi:type="notation:Bounds" xmi:id="_EAlE74_LEe6T3aFB4BWOHg"/>
+          </children>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlE8I_LEe6T3aFB4BWOHg" fontName="Verdana" fillColor="0" lineColor="16777215"/>
+          <styles xsi:type="notation:NamedStyle" xmi:id="_EAlE8Y_LEe6T3aFB4BWOHg" name="allowColors"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_EAlE8o_LEe6T3aFB4BWOHg" x="66" y="27" width="15" height="15"/>
+        </children>
+        <children xmi:id="_EAlE84_LEe6T3aFB4BWOHg" type="State" element="_EAlr0o_LEe6T3aFB4BWOHg">
+          <children xsi:type="notation:DecorationNode" xmi:id="_EAlE9I_LEe6T3aFB4BWOHg" type="StateName">
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlE9Y_LEe6T3aFB4BWOHg"/>
+            <layoutConstraint xsi:type="notation:Location" xmi:id="_EAlE9o_LEe6T3aFB4BWOHg"/>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_EAlE94_LEe6T3aFB4BWOHg" type="StateTextCompartment">
+            <children xsi:type="notation:Shape" xmi:id="_EAlE-I_LEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_EAlE-Y_LEe6T3aFB4BWOHg"/>
+            </children>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_EAlE-o_LEe6T3aFB4BWOHg" type="StateFigureCompartment"/>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlE-4_LEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+          <styles xsi:type="notation:FontStyle" xmi:id="_EAlE_I_LEe6T3aFB4BWOHg"/>
+          <styles xsi:type="notation:BooleanValueStyle" xmi:id="_EAlE_Y_LEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_EAlE_o_LEe6T3aFB4BWOHg" x="61" y="79" width="50" height="53"/>
+        </children>
+        <children xsi:type="notation:Shape" xmi:id="_EAlE_4_LEe6T3aFB4BWOHg" type="Note" fontName="Verdana" description="1) What behavior would you intuitively expect?&#xA;2) Run the simulation. What actually happens?&#xA;3) Replace the 'Temp' state by a 'Choice'-element (see Palette on the right). Does that fix it?" fillColor="13369343" transparency="0" lineColor="6737151" lineWidth="1">
+          <children xsi:type="notation:BasicDecorationNode" xmi:id="_EAlFAI_LEe6T3aFB4BWOHg" type="DiagramName">
+            <element xsi:nil="true"/>
+          </children>
+          <children xsi:type="notation:BasicDecorationNode" xmi:id="_EAlFAY_LEe6T3aFB4BWOHg" type="Description">
+            <element xsi:nil="true"/>
+          </children>
+          <styles xsi:type="notation:TextStyle" xmi:id="_EAlFAo_LEe6T3aFB4BWOHg"/>
+          <styles xsi:type="notation:LineTypeStyle" xmi:id="_EAlFA4_LEe6T3aFB4BWOHg"/>
+          <element xsi:nil="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_EAlFBI_LEe6T3aFB4BWOHg" x="36" y="246" width="536" height="88"/>
+        </children>
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_EAlFBY_LEe6T3aFB4BWOHg"/>
+      </children>
+      <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlFBo_LEe6T3aFB4BWOHg" fontName="Verdana" fillColor="16448250" lineColor="12632256"/>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_EAlFB4_LEe6T3aFB4BWOHg" x="150" y="57" width="626" height="390"/>
+    </children>
+    <styles xsi:type="notation:BooleanValueStyle" xmi:id="_ZkIzAo-JEe6T3aFB4BWOHg" name="inlineDefinitionSection"/>
+    <styles xsi:type="notation:DiagramStyle" xmi:id="_ZkIzA4-JEe6T3aFB4BWOHg"/>
+    <edges xmi:id="_EAlr3o_LEe6T3aFB4BWOHg" type="Transition" element="_EAlr0Y_LEe6T3aFB4BWOHg" source="_EAlE6Y_LEe6T3aFB4BWOHg" target="_EAlE84_LEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_EAlr34_LEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlr4I_LEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_EAlr4Y_LEe6T3aFB4BWOHg" x="6"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_EAlr4o_LEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_EAlr44_LEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_EAlr5I_LEe6T3aFB4BWOHg" points="[1, 6, -12, -65]$[1, 45, -12, -26]"/>
+    </edges>
+    <edges xmi:id="_EAlr5Y_LEe6T3aFB4BWOHg" type="Transition" element="_EAlFC4_LEe6T3aFB4BWOHg" source="_EAlExY_LEe6T3aFB4BWOHg" target="_EAlE0Y_LEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_EAlr5o_LEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlr54_LEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_EAlr6I_LEe6T3aFB4BWOHg" x="13" y="-35"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_EAlr6Y_LEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_EAlr6o_LEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_EAlr64_LEe6T3aFB4BWOHg" points="[5, -5, -164, 45]$[78, -5, -91, 45]$[78, -54, -91, -4]$[153, -54, -16, -4]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_EAlr7I_LEe6T3aFB4BWOHg" id="(0.94,0.39622641509433965)"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_EAlr7Y_LEe6T3aFB4BWOHg" id="(0.4,0.18867924528301888)"/>
+    </edges>
+    <edges xmi:id="_EAlr7o_LEe6T3aFB4BWOHg" type="Transition" element="_EAlFEo_LEe6T3aFB4BWOHg" source="_EAlExY_LEe6T3aFB4BWOHg" target="_EAlE3Y_LEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_EAlr74_LEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlr8I_LEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_EAlr8Y_LEe6T3aFB4BWOHg" x="12" y="30"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_EAlr8o_LEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_EAlr84_LEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_EAlr9I_LEe6T3aFB4BWOHg" points="[10, -2, -173, -63]$[85, -2, -98, -63]$[85, 46, -98, -15]$[163, 46, -20, -15]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_EAlr9Y_LEe6T3aFB4BWOHg" id="(0.86,0.7169811320754716)"/>
+    </edges>
+    <edges xmi:id="_EAlr9o_LEe6T3aFB4BWOHg" type="Transition" element="_EAlr1I_LEe6T3aFB4BWOHg" source="_EAlE84_LEe6T3aFB4BWOHg" target="_EAlExY_LEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_EAlr94_LEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_EAlr-I_LEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_EAlr-Y_LEe6T3aFB4BWOHg" x="10" y="-17"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_EAlr-o_LEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_EAlr-4_LEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_EAlr_I_LEe6T3aFB4BWOHg" points="[4, -2, -198, -7]$[168, -2, -34, -7]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_EAlr_Y_LEe6T3aFB4BWOHg" id="(0.92,0.5283018867924528)"/>
+    </edges>
+  </notation:Diagram>
+</xmi:XMI>

+ 316 - 0
exercises/D.ysc

@@ -0,0 +1,316 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:sgraph="http://www.yakindu.org/sct/sgraph/2.0.0">
+  <sgraph:Statechart xmi:id="_Zj_B0I-JEe6T3aFB4BWOHg" specification="@EventDriven&#xA;@SuperSteps(no)&#xA;&#xA;interface:&#xA;&#x9;var x: integer = 0" name="D">
+    <regions xmi:id="_N9tACY_MEe6T3aFB4BWOHg" name="main region">
+      <vertices xsi:type="sgraph:State" xmi:id="_QsHt0I_MEe6T3aFB4BWOHg" name="Orthogonal" incomingTransitions="_k403sI_MEe6T3aFB4BWOHg">
+        <regions xmi:id="_QsIU4o_MEe6T3aFB4BWOHg" name="r1">
+          <vertices xsi:type="sgraph:State" xmi:id="_N9tACo_MEe6T3aFB4BWOHg" name="Temp" incomingTransitions="_N9tm54_MEe6T3aFB4BWOHg">
+            <outgoingTransitions xmi:id="_N9tm0Y_MEe6T3aFB4BWOHg" specification="[x==0]" target="_N9tm34_MEe6T3aFB4BWOHg"/>
+            <outgoingTransitions xmi:id="_N9tm2I_MEe6T3aFB4BWOHg" specification="[x==1]" target="_N9tm4Y_MEe6T3aFB4BWOHg"/>
+          </vertices>
+          <vertices xsi:type="sgraph:Entry" xmi:id="_N9tm44_MEe6T3aFB4BWOHg">
+            <outgoingTransitions xmi:id="_N9tm5I_MEe6T3aFB4BWOHg" specification="" target="_N9tm5Y_MEe6T3aFB4BWOHg"/>
+          </vertices>
+          <vertices xsi:type="sgraph:State" xmi:id="_N9tm4Y_MEe6T3aFB4BWOHg" name="One" incomingTransitions="_N9tm2I_MEe6T3aFB4BWOHg"/>
+          <vertices xsi:type="sgraph:State" xmi:id="_N9tm5Y_MEe6T3aFB4BWOHg" name="Initial" incomingTransitions="_N9tm5I_MEe6T3aFB4BWOHg">
+            <outgoingTransitions xmi:id="_N9tm54_MEe6T3aFB4BWOHg" specification="after 1s / x += 1" target="_N9tACo_MEe6T3aFB4BWOHg"/>
+          </vertices>
+          <vertices xsi:type="sgraph:State" xmi:id="_N9tm34_MEe6T3aFB4BWOHg" name="Zero" incomingTransitions="_N9tm0Y_MEe6T3aFB4BWOHg"/>
+        </regions>
+        <regions xmi:id="_QsIU44_MEe6T3aFB4BWOHg" name="r2">
+          <vertices xsi:type="sgraph:State" xmi:id="_TQfIAI_MEe6T3aFB4BWOHg" name="S" incomingTransitions="_TwoAoI_MEe6T3aFB4BWOHg">
+            <outgoingTransitions xmi:id="_U0c1II_MEe6T3aFB4BWOHg" specification="after 5s" target="_WFfmQI_MEe6T3aFB4BWOHg"/>
+          </vertices>
+          <vertices xsi:type="sgraph:Entry" xmi:id="_TdK5II_MEe6T3aFB4BWOHg">
+            <outgoingTransitions xmi:id="_TwoAoI_MEe6T3aFB4BWOHg" specification="" target="_TQfIAI_MEe6T3aFB4BWOHg"/>
+          </vertices>
+          <vertices xsi:type="sgraph:State" xmi:id="_WFfmQI_MEe6T3aFB4BWOHg" name="T" incomingTransitions="_U0c1II_MEe6T3aFB4BWOHg"/>
+        </regions>
+      </vertices>
+      <vertices xsi:type="sgraph:Entry" xmi:id="_kkXqoI_MEe6T3aFB4BWOHg">
+        <outgoingTransitions xmi:id="_k403sI_MEe6T3aFB4BWOHg" specification="" target="_QsHt0I_MEe6T3aFB4BWOHg"/>
+      </vertices>
+    </regions>
+  </sgraph:Statechart>
+  <notation:Diagram xmi:id="_ZkIy0I-JEe6T3aFB4BWOHg" type="org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor" element="_Zj_B0I-JEe6T3aFB4BWOHg" measurementUnit="Pixel">
+    <children xsi:type="notation:Shape" xmi:id="_ZkIy-4-JEe6T3aFB4BWOHg" type="StatechartText" fontName="Verdana" lineColor="4210752">
+      <children xsi:type="notation:DecorationNode" xmi:id="_ZkIy_I-JEe6T3aFB4BWOHg" type="StatechartName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy_Y-JEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIy_o-JEe6T3aFB4BWOHg"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_ZkIy_4-JEe6T3aFB4BWOHg" type="StatechartTextExpression" fontName="Verdana" lineColor="4210752">
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIzAI-JEe6T3aFB4BWOHg"/>
+      </children>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIzAY-JEe6T3aFB4BWOHg" x="10" y="10" width="200" height="400"/>
+    </children>
+    <children xmi:id="_N9s_wY_MEe6T3aFB4BWOHg" type="Region" element="_N9tACY_MEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_N9s_wo_MEe6T3aFB4BWOHg" type="RegionName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_N9s_w4_MEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_N9s_xI_MEe6T3aFB4BWOHg"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_N9s_xY_MEe6T3aFB4BWOHg" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+        <children xsi:type="notation:Shape" xmi:id="_N9tAAI_MEe6T3aFB4BWOHg" type="Note" fontName="Verdana" description="1) Run the simulation. What happens at time == 5s ?&#xA;2) Explain." fillColor="13369343" transparency="0" lineColor="6737151" lineWidth="1">
+          <children xsi:type="notation:BasicDecorationNode" xmi:id="_N9tAAY_MEe6T3aFB4BWOHg" type="DiagramName">
+            <element xsi:nil="true"/>
+          </children>
+          <children xsi:type="notation:BasicDecorationNode" xmi:id="_N9tAAo_MEe6T3aFB4BWOHg" type="Description">
+            <element xsi:nil="true"/>
+          </children>
+          <styles xsi:type="notation:TextStyle" xmi:id="_N9tAA4_MEe6T3aFB4BWOHg"/>
+          <styles xsi:type="notation:LineTypeStyle" xmi:id="_N9tABI_MEe6T3aFB4BWOHg"/>
+          <element xsi:nil="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_N9tABY_MEe6T3aFB4BWOHg" x="424" y="411" width="337" height="88"/>
+        </children>
+        <children xmi:id="_QsI78I_MEe6T3aFB4BWOHg" type="State" element="_QsHt0I_MEe6T3aFB4BWOHg">
+          <children xsi:type="notation:DecorationNode" xmi:id="_QsJjAI_MEe6T3aFB4BWOHg" type="StateName">
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_QsJjAY_MEe6T3aFB4BWOHg"/>
+            <layoutConstraint xsi:type="notation:Location" xmi:id="_QsJjAo_MEe6T3aFB4BWOHg"/>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_QsJjA4_MEe6T3aFB4BWOHg" type="StateTextCompartment">
+            <children xsi:type="notation:Shape" xmi:id="_QsJjBI_MEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_QsJjBY_MEe6T3aFB4BWOHg"/>
+            </children>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_QsJjBo_MEe6T3aFB4BWOHg" type="StateFigureCompartment">
+            <children xmi:id="_QsKxII_MEe6T3aFB4BWOHg" type="Region" element="_QsIU4o_MEe6T3aFB4BWOHg">
+              <children xsi:type="notation:DecorationNode" xmi:id="_QsKxI4_MEe6T3aFB4BWOHg" type="RegionName">
+                <styles xsi:type="notation:ShapeStyle" xmi:id="_QsLYMI_MEe6T3aFB4BWOHg"/>
+                <layoutConstraint xsi:type="notation:Location" xmi:id="_QsLYMY_MEe6T3aFB4BWOHg"/>
+              </children>
+              <children xsi:type="notation:Shape" xmi:id="_QsLYMo_MEe6T3aFB4BWOHg" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+                <children xmi:id="_N9s_xo_MEe6T3aFB4BWOHg" type="State" element="_N9tACo_MEe6T3aFB4BWOHg">
+                  <children xsi:type="notation:DecorationNode" xmi:id="_N9s_x4_MEe6T3aFB4BWOHg" type="StateName">
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_N9s_yI_MEe6T3aFB4BWOHg"/>
+                    <layoutConstraint xsi:type="notation:Location" xmi:id="_N9s_yY_MEe6T3aFB4BWOHg"/>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_N9s_yo_MEe6T3aFB4BWOHg" type="StateTextCompartment">
+                    <children xsi:type="notation:Shape" xmi:id="_N9s_y4_MEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+                      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_N9s_zI_MEe6T3aFB4BWOHg"/>
+                    </children>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_N9s_zY_MEe6T3aFB4BWOHg" type="StateFigureCompartment"/>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_N9s_zo_MEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+                  <styles xsi:type="notation:FontStyle" xmi:id="_N9s_z4_MEe6T3aFB4BWOHg"/>
+                  <styles xsi:type="notation:BooleanValueStyle" xmi:id="_N9s_0I_MEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_N9s_0Y_MEe6T3aFB4BWOHg" x="236" y="88" width="68" height="53"/>
+                </children>
+                <children xmi:id="_N9s_6o_MEe6T3aFB4BWOHg" type="Entry" element="_N9tm44_MEe6T3aFB4BWOHg">
+                  <children xmi:id="_N9s_64_MEe6T3aFB4BWOHg" type="BorderItemLabelContainer">
+                    <children xsi:type="notation:DecorationNode" xmi:id="_N9s_7I_MEe6T3aFB4BWOHg" type="BorderItemLabel">
+                      <styles xsi:type="notation:ShapeStyle" xmi:id="_N9s_7Y_MEe6T3aFB4BWOHg"/>
+                      <layoutConstraint xsi:type="notation:Location" xmi:id="_N9s_7o_MEe6T3aFB4BWOHg"/>
+                    </children>
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_N9s_74_MEe6T3aFB4BWOHg" fontName="Verdana" lineColor="4210752"/>
+                    <layoutConstraint xsi:type="notation:Bounds" xmi:id="_N9s_8I_MEe6T3aFB4BWOHg"/>
+                  </children>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_N9s_8Y_MEe6T3aFB4BWOHg" fontName="Verdana" fillColor="0" lineColor="16777215"/>
+                  <styles xsi:type="notation:NamedStyle" xmi:id="_N9s_8o_MEe6T3aFB4BWOHg" name="allowColors"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_N9s_84_MEe6T3aFB4BWOHg" x="27" y="29" width="15" height="15"/>
+                </children>
+                <children xmi:id="_N9s_3o_MEe6T3aFB4BWOHg" type="State" element="_N9tm4Y_MEe6T3aFB4BWOHg">
+                  <children xsi:type="notation:DecorationNode" xmi:id="_N9s_34_MEe6T3aFB4BWOHg" type="StateName">
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_N9s_4I_MEe6T3aFB4BWOHg"/>
+                    <layoutConstraint xsi:type="notation:Location" xmi:id="_N9s_4Y_MEe6T3aFB4BWOHg"/>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_N9s_4o_MEe6T3aFB4BWOHg" type="StateTextCompartment">
+                    <children xsi:type="notation:Shape" xmi:id="_N9s_44_MEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+                      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_N9s_5I_MEe6T3aFB4BWOHg"/>
+                    </children>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_N9s_5Y_MEe6T3aFB4BWOHg" type="StateFigureCompartment"/>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_N9s_5o_MEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+                  <styles xsi:type="notation:FontStyle" xmi:id="_N9s_54_MEe6T3aFB4BWOHg"/>
+                  <styles xsi:type="notation:BooleanValueStyle" xmi:id="_N9s_6I_MEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_N9s_6Y_MEe6T3aFB4BWOHg" x="457" y="161" width="40" height="53"/>
+                </children>
+                <children xmi:id="_N9s_9I_MEe6T3aFB4BWOHg" type="State" element="_N9tm5Y_MEe6T3aFB4BWOHg">
+                  <children xsi:type="notation:DecorationNode" xmi:id="_N9s_9Y_MEe6T3aFB4BWOHg" type="StateName">
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_N9s_9o_MEe6T3aFB4BWOHg"/>
+                    <layoutConstraint xsi:type="notation:Location" xmi:id="_N9s_94_MEe6T3aFB4BWOHg"/>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_N9s_-I_MEe6T3aFB4BWOHg" type="StateTextCompartment">
+                    <children xsi:type="notation:Shape" xmi:id="_N9s_-Y_MEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+                      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_N9s_-o_MEe6T3aFB4BWOHg"/>
+                    </children>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_N9s_-4_MEe6T3aFB4BWOHg" type="StateFigureCompartment"/>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_N9s__I_MEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+                  <styles xsi:type="notation:FontStyle" xmi:id="_N9s__Y_MEe6T3aFB4BWOHg"/>
+                  <styles xsi:type="notation:BooleanValueStyle" xmi:id="_N9s__o_MEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_N9s__4_MEe6T3aFB4BWOHg" x="22" y="81" width="50" height="53"/>
+                </children>
+                <children xmi:id="_N9s_0o_MEe6T3aFB4BWOHg" type="State" element="_N9tm34_MEe6T3aFB4BWOHg">
+                  <children xsi:type="notation:DecorationNode" xmi:id="_N9s_04_MEe6T3aFB4BWOHg" type="StateName">
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_N9s_1I_MEe6T3aFB4BWOHg"/>
+                    <layoutConstraint xsi:type="notation:Location" xmi:id="_N9s_1Y_MEe6T3aFB4BWOHg"/>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_N9s_1o_MEe6T3aFB4BWOHg" type="StateTextCompartment">
+                    <children xsi:type="notation:Shape" xmi:id="_N9s_14_MEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+                      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_N9s_2I_MEe6T3aFB4BWOHg"/>
+                    </children>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_N9s_2Y_MEe6T3aFB4BWOHg" type="StateFigureCompartment"/>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_N9s_2o_MEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+                  <styles xsi:type="notation:FontStyle" xmi:id="_N9s_24_MEe6T3aFB4BWOHg"/>
+                  <styles xsi:type="notation:BooleanValueStyle" xmi:id="_N9s_3I_MEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_N9s_3Y_MEe6T3aFB4BWOHg" x="452" y="49" width="40" height="53"/>
+                </children>
+                <layoutConstraint xsi:type="notation:Bounds" xmi:id="_QsLYM4_MEe6T3aFB4BWOHg"/>
+              </children>
+              <styles xsi:type="notation:ShapeStyle" xmi:id="_QsKxIY_MEe6T3aFB4BWOHg" fontName="Verdana" fillColor="16448250" lineColor="12632256"/>
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_QsKxIo_MEe6T3aFB4BWOHg"/>
+            </children>
+            <children xmi:id="_QsLYNI_MEe6T3aFB4BWOHg" type="Region" element="_QsIU44_MEe6T3aFB4BWOHg">
+              <children xsi:type="notation:DecorationNode" xmi:id="_QsLYN4_MEe6T3aFB4BWOHg" type="RegionName">
+                <styles xsi:type="notation:ShapeStyle" xmi:id="_QsLYOI_MEe6T3aFB4BWOHg"/>
+                <layoutConstraint xsi:type="notation:Location" xmi:id="_QsLYOY_MEe6T3aFB4BWOHg"/>
+              </children>
+              <children xsi:type="notation:Shape" xmi:id="_QsLYOo_MEe6T3aFB4BWOHg" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+                <children xmi:id="_TQfvEI_MEe6T3aFB4BWOHg" type="State" element="_TQfIAI_MEe6T3aFB4BWOHg">
+                  <children xsi:type="notation:DecorationNode" xmi:id="_TQfvFI_MEe6T3aFB4BWOHg" type="StateName">
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_TQfvFY_MEe6T3aFB4BWOHg"/>
+                    <layoutConstraint xsi:type="notation:Location" xmi:id="_TQfvFo_MEe6T3aFB4BWOHg"/>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_TQfvF4_MEe6T3aFB4BWOHg" type="StateTextCompartment">
+                    <children xsi:type="notation:Shape" xmi:id="_TQfvGI_MEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+                      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_TQfvGY_MEe6T3aFB4BWOHg"/>
+                    </children>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_TQfvGo_MEe6T3aFB4BWOHg" type="StateFigureCompartment"/>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_TQfvEY_MEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+                  <styles xsi:type="notation:FontStyle" xmi:id="_TQfvEo_MEe6T3aFB4BWOHg"/>
+                  <styles xsi:type="notation:BooleanValueStyle" xmi:id="_TQfvG4_MEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_TQfvE4_MEe6T3aFB4BWOHg" x="110" y="84" width="40" height="53"/>
+                </children>
+                <children xmi:id="_TdMHQI_MEe6T3aFB4BWOHg" type="Entry" element="_TdK5II_MEe6T3aFB4BWOHg">
+                  <children xmi:id="_TdMHRI_MEe6T3aFB4BWOHg" type="BorderItemLabelContainer">
+                    <children xsi:type="notation:DecorationNode" xmi:id="_TdMHR4_MEe6T3aFB4BWOHg" type="BorderItemLabel">
+                      <styles xsi:type="notation:ShapeStyle" xmi:id="_TdMHSI_MEe6T3aFB4BWOHg"/>
+                      <layoutConstraint xsi:type="notation:Location" xmi:id="_TdMHSY_MEe6T3aFB4BWOHg"/>
+                    </children>
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_TdMHRY_MEe6T3aFB4BWOHg" fontName="Verdana" lineColor="4210752"/>
+                    <layoutConstraint xsi:type="notation:Bounds" xmi:id="_TdMHRo_MEe6T3aFB4BWOHg"/>
+                  </children>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_TdMHQY_MEe6T3aFB4BWOHg" fontName="Verdana" fillColor="0" lineColor="16777215"/>
+                  <styles xsi:type="notation:NamedStyle" xmi:id="_TdMHQo_MEe6T3aFB4BWOHg" name="allowColors"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_TdMHQ4_MEe6T3aFB4BWOHg" x="122" y="48" width="15" height="15"/>
+                </children>
+                <children xmi:id="_WFgNUI_MEe6T3aFB4BWOHg" type="State" element="_WFfmQI_MEe6T3aFB4BWOHg">
+                  <children xsi:type="notation:DecorationNode" xmi:id="_WFg0YI_MEe6T3aFB4BWOHg" type="StateName">
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_WFg0YY_MEe6T3aFB4BWOHg"/>
+                    <layoutConstraint xsi:type="notation:Location" xmi:id="_WFg0Yo_MEe6T3aFB4BWOHg"/>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_WFg0Y4_MEe6T3aFB4BWOHg" type="StateTextCompartment">
+                    <children xsi:type="notation:Shape" xmi:id="_WFg0ZI_MEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+                      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_WFg0ZY_MEe6T3aFB4BWOHg"/>
+                    </children>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_WFg0Zo_MEe6T3aFB4BWOHg" type="StateFigureCompartment"/>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_WFgNUY_MEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+                  <styles xsi:type="notation:FontStyle" xmi:id="_WFgNUo_MEe6T3aFB4BWOHg"/>
+                  <styles xsi:type="notation:BooleanValueStyle" xmi:id="_WFg0Z4_MEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_WFgNU4_MEe6T3aFB4BWOHg" x="110" y="196" width="40" height="53"/>
+                </children>
+                <layoutConstraint xsi:type="notation:Bounds" xmi:id="_QsLYO4_MEe6T3aFB4BWOHg"/>
+              </children>
+              <styles xsi:type="notation:ShapeStyle" xmi:id="_QsLYNY_MEe6T3aFB4BWOHg" fontName="Verdana" fillColor="16448250" lineColor="12632256"/>
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_QsLYNo_MEe6T3aFB4BWOHg"/>
+            </children>
+          </children>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_QsI78Y_MEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+          <styles xsi:type="notation:FontStyle" xmi:id="_QsI78o_MEe6T3aFB4BWOHg"/>
+          <styles xsi:type="notation:BooleanValueStyle" xmi:id="_QsJjB4_MEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_QsI784_MEe6T3aFB4BWOHg" x="80" y="9" width="1046" height="365"/>
+        </children>
+        <children xmi:id="_kkY4wI_MEe6T3aFB4BWOHg" type="Entry" element="_kkXqoI_MEe6T3aFB4BWOHg">
+          <children xmi:id="_kkY4xI_MEe6T3aFB4BWOHg" type="BorderItemLabelContainer">
+            <children xsi:type="notation:DecorationNode" xmi:id="_kkY4x4_MEe6T3aFB4BWOHg" type="BorderItemLabel">
+              <styles xsi:type="notation:ShapeStyle" xmi:id="_kkY4yI_MEe6T3aFB4BWOHg"/>
+              <layoutConstraint xsi:type="notation:Location" xmi:id="_kkZf0I_MEe6T3aFB4BWOHg"/>
+            </children>
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_kkY4xY_MEe6T3aFB4BWOHg" fontName="Verdana" lineColor="4210752"/>
+            <layoutConstraint xsi:type="notation:Bounds" xmi:id="_kkY4xo_MEe6T3aFB4BWOHg"/>
+          </children>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_kkY4wY_MEe6T3aFB4BWOHg" fontName="Verdana" fillColor="0" lineColor="16777215"/>
+          <styles xsi:type="notation:NamedStyle" xmi:id="_kkY4wo_MEe6T3aFB4BWOHg" name="allowColors"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_kkY4w4_MEe6T3aFB4BWOHg" x="34" y="42"/>
+        </children>
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_N9tABo_MEe6T3aFB4BWOHg"/>
+      </children>
+      <styles xsi:type="notation:ShapeStyle" xmi:id="_N9tAB4_MEe6T3aFB4BWOHg" fontName="Verdana" fillColor="16448250" lineColor="12632256"/>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_N9tACI_MEe6T3aFB4BWOHg" x="66" y="24" width="1228" height="586"/>
+    </children>
+    <styles xsi:type="notation:BooleanValueStyle" xmi:id="_ZkIzAo-JEe6T3aFB4BWOHg" name="inlineDefinitionSection"/>
+    <styles xsi:type="notation:DiagramStyle" xmi:id="_ZkIzA4-JEe6T3aFB4BWOHg"/>
+    <edges xmi:id="_N9uN4I_MEe6T3aFB4BWOHg" type="Transition" element="_N9tm5I_MEe6T3aFB4BWOHg" source="_N9s_6o_MEe6T3aFB4BWOHg" target="_N9s_9I_MEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_N9uN4Y_MEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_N9uN4o_MEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_N9uN44_MEe6T3aFB4BWOHg" x="6"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_N9uN5I_MEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_N9uN5Y_MEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_N9uN5o_MEe6T3aFB4BWOHg" points="[1, 6, -12, -65]$[1, 45, -12, -26]"/>
+    </edges>
+    <edges xmi:id="_N9uN54_MEe6T3aFB4BWOHg" type="Transition" element="_N9tm0Y_MEe6T3aFB4BWOHg" source="_N9s_xo_MEe6T3aFB4BWOHg" target="_N9s_0o_MEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_N9uN6I_MEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_N9uN6Y_MEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_N9uN6o_MEe6T3aFB4BWOHg" x="13" y="-35"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_N9uN64_MEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_N9uN7I_MEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_N9uN7Y_MEe6T3aFB4BWOHg" points="[5, -5, -164, 45]$[78, -5, -91, 45]$[78, -54, -91, -4]$[153, -54, -16, -4]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_N9uN7o_MEe6T3aFB4BWOHg" id="(0.94,0.39622641509433965)"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_N9uN74_MEe6T3aFB4BWOHg" id="(0.4,0.18867924528301888)"/>
+    </edges>
+    <edges xmi:id="_N9uN8I_MEe6T3aFB4BWOHg" type="Transition" element="_N9tm2I_MEe6T3aFB4BWOHg" source="_N9s_xo_MEe6T3aFB4BWOHg" target="_N9s_3o_MEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_N9uN8Y_MEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_N9uN8o_MEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_N9uN84_MEe6T3aFB4BWOHg" x="12" y="30"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_N9uN9I_MEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_N9uN9Y_MEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_N9uN9o_MEe6T3aFB4BWOHg" points="[10, -2, -173, -63]$[85, -2, -98, -63]$[85, 46, -98, -15]$[163, 46, -20, -15]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_N9uN94_MEe6T3aFB4BWOHg" id="(0.86,0.7169811320754716)"/>
+    </edges>
+    <edges xmi:id="_N9uN-I_MEe6T3aFB4BWOHg" type="Transition" element="_N9tm54_MEe6T3aFB4BWOHg" source="_N9s_9I_MEe6T3aFB4BWOHg" target="_N9s_xo_MEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_N9uN-Y_MEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_N9uN-o_MEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_N9uN-4_MEe6T3aFB4BWOHg" x="10" y="-17"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_N9uN_I_MEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_N9uN_Y_MEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_N9uN_o_MEe6T3aFB4BWOHg" points="[4, -2, -198, -7]$[168, -2, -34, -7]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_N9uN_4_MEe6T3aFB4BWOHg" id="(0.92,0.5283018867924528)"/>
+    </edges>
+    <edges xmi:id="_TwpOwI_MEe6T3aFB4BWOHg" type="Transition" element="_TwoAoI_MEe6T3aFB4BWOHg" source="_TdMHQI_MEe6T3aFB4BWOHg" target="_TQfvEI_MEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_Twp10I_MEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_Twp10Y_MEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_Twp10o_MEe6T3aFB4BWOHg" x="-10" y="6"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_TwpOwY_MEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_TwpOw4_MEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_TwpOwo_MEe6T3aFB4BWOHg" points="[1, 6, -9, -33]$[1, 29, -9, -10]"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_TwrD8I_MEe6T3aFB4BWOHg" id="(0.7377049180327869,0.18867924528301888)"/>
+    </edges>
+    <edges xmi:id="_U0eDQI_MEe6T3aFB4BWOHg" type="Transition" element="_U0c1II_MEe6T3aFB4BWOHg" source="_TQfvEI_MEe6T3aFB4BWOHg" target="_WFgNUI_MEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_U0eDRI_MEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_U0eDRY_MEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_U0eDRo_MEe6T3aFB4BWOHg" x="-1" y="42"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_U0eDQY_MEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_U0eDQ4_MEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_U0eDQo_MEe6T3aFB4BWOHg" points="[-12, 9, -1, -85]$[-12, 68, -1, -26]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_U0fRYI_MEe6T3aFB4BWOHg" id="(0.775,0.8301886792452831)"/>
+    </edges>
+    <edges xmi:id="_k403sY_MEe6T3aFB4BWOHg" type="Transition" element="_k403sI_MEe6T3aFB4BWOHg" source="_kkY4wI_MEe6T3aFB4BWOHg" target="_QsI78I_MEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_k41ewI_MEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_k41ewY_MEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_k41ewo_MEe6T3aFB4BWOHg" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_k403so_MEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_k403tI_MEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_k403s4_MEe6T3aFB4BWOHg" points="[5, -5, -57, 0]$[39, -12, -23, -7]"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_k42F0I_MEe6T3aFB4BWOHg" id="(0.02198852772466539,0.0958904109589041)"/>
+    </edges>
+  </notation:Diagram>
+</xmi:XMI>

+ 227 - 0
exercises/E.ysc

@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:sgraph="http://www.yakindu.org/sct/sgraph/2.0.0">
+  <sgraph:Statechart xmi:id="_Zj_B0I-JEe6T3aFB4BWOHg" specification="@EventDriven&#xA;@SuperSteps(no)&#xA;&#xA;interface:&#xA;&#x9;out event x&#xA;&#x9;out event y&#xA;&#x9;var v: integer = 0" name="E">
+    <regions xmi:id="_ZkFIc4-JEe6T3aFB4BWOHg" name="main region">
+      <vertices xsi:type="sgraph:State" xmi:id="__L4BcI-PEe6T3aFB4BWOHg" name="OrthogonalState" incomingTransitions="_ezrVoI-QEe6T3aFB4BWOHg">
+        <regions xmi:id="__L5Pko-PEe6T3aFB4BWOHg" name="r1">
+          <vertices xsi:type="sgraph:State" xmi:id="_ZkFvgI-JEe6T3aFB4BWOHg" name="StateA" incomingTransitions="_ZkFIdY-JEe6T3aFB4BWOHg _3l5WQI-JEe6T3aFB4BWOHg">
+            <outgoingTransitions xmi:id="_3l5WQI-JEe6T3aFB4BWOHg" specification="[v==0] / raise x" target="_ZkFvgI-JEe6T3aFB4BWOHg"/>
+          </vertices>
+          <vertices xsi:type="sgraph:Entry" xmi:id="_ZkFIdI-JEe6T3aFB4BWOHg">
+            <outgoingTransitions xmi:id="_ZkFIdY-JEe6T3aFB4BWOHg" target="_ZkFvgI-JEe6T3aFB4BWOHg"/>
+          </vertices>
+        </regions>
+        <regions xmi:id="__L5Pk4-PEe6T3aFB4BWOHg" name="r2">
+          <vertices xsi:type="sgraph:State" xmi:id="_JbfQEI-QEe6T3aFB4BWOHg" name="StateB" incomingTransitions="_KR1pQI-QEe6T3aFB4BWOHg _MhLOoI-QEe6T3aFB4BWOHg">
+            <outgoingTransitions xmi:id="_MhLOoI-QEe6T3aFB4BWOHg" specification="after 1s / raise y" target="_JbfQEI-QEe6T3aFB4BWOHg"/>
+          </vertices>
+          <vertices xsi:type="sgraph:Entry" xmi:id="_Jzb2AI-QEe6T3aFB4BWOHg">
+            <outgoingTransitions xmi:id="_KR1pQI-QEe6T3aFB4BWOHg" specification="" target="_JbfQEI-QEe6T3aFB4BWOHg"/>
+          </vertices>
+        </regions>
+      </vertices>
+      <vertices xsi:type="sgraph:Entry" xmi:id="_ePcnMI-QEe6T3aFB4BWOHg">
+        <outgoingTransitions xmi:id="_ezrVoI-QEe6T3aFB4BWOHg" specification="" target="__L4BcI-PEe6T3aFB4BWOHg"/>
+      </vertices>
+    </regions>
+  </sgraph:Statechart>
+  <notation:Diagram xmi:id="_ZkIy0I-JEe6T3aFB4BWOHg" type="org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor" element="_Zj_B0I-JEe6T3aFB4BWOHg" measurementUnit="Pixel">
+    <children xmi:id="_ZkIy0Y-JEe6T3aFB4BWOHg" type="Region" element="_ZkFIc4-JEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_ZkIy0o-JEe6T3aFB4BWOHg" type="RegionName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy04-JEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIy1I-JEe6T3aFB4BWOHg"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_ZkIy1Y-JEe6T3aFB4BWOHg" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+        <children xsi:type="notation:Shape" xmi:id="_-jdlUI-JEe6T3aFB4BWOHg" type="Note" fontName="Verdana" description="When running this model, the output trace will be as follows:&#xA;  1s : x&#xA;  1s : y&#xA;  2s: x&#xA;  2s: y&#xA;  ...&#xA;&#xA;1) Why does 'x' only fire when 'y' fires?&#xA;2) Why does 'x' always occur before 'y'?" fillColor="13369343" transparency="0" lineColor="6737151" lineWidth="1">
+          <children xsi:type="notation:BasicDecorationNode" xmi:id="_-jezcI-JEe6T3aFB4BWOHg" type="DiagramName">
+            <element xsi:nil="true"/>
+          </children>
+          <children xsi:type="notation:BasicDecorationNode" xmi:id="_-jezcY-JEe6T3aFB4BWOHg" type="Description">
+            <element xsi:nil="true"/>
+          </children>
+          <styles xsi:type="notation:TextStyle" xmi:id="_-jdlUY-JEe6T3aFB4BWOHg"/>
+          <styles xsi:type="notation:LineTypeStyle" xmi:id="_-jdlUo-JEe6T3aFB4BWOHg"/>
+          <element xsi:nil="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_-jdlU4-JEe6T3aFB4BWOHg" x="310" y="363" width="356" height="222"/>
+        </children>
+        <children xmi:id="__L52oI-PEe6T3aFB4BWOHg" type="State" element="__L4BcI-PEe6T3aFB4BWOHg">
+          <children xsi:type="notation:DecorationNode" xmi:id="__L6dsI-PEe6T3aFB4BWOHg" type="StateName">
+            <styles xsi:type="notation:ShapeStyle" xmi:id="__L6dsY-PEe6T3aFB4BWOHg"/>
+            <layoutConstraint xsi:type="notation:Location" xmi:id="__L6dso-PEe6T3aFB4BWOHg"/>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="__L6ds4-PEe6T3aFB4BWOHg" type="StateTextCompartment">
+            <children xsi:type="notation:Shape" xmi:id="__L6dtI-PEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="__L6dtY-PEe6T3aFB4BWOHg"/>
+            </children>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="__L6dto-PEe6T3aFB4BWOHg" type="StateFigureCompartment">
+            <children xmi:id="__L7r0I-PEe6T3aFB4BWOHg" type="Region" element="__L5Pko-PEe6T3aFB4BWOHg">
+              <children xsi:type="notation:DecorationNode" xmi:id="__L7r04-PEe6T3aFB4BWOHg" type="RegionName">
+                <styles xsi:type="notation:ShapeStyle" xmi:id="__L7r1I-PEe6T3aFB4BWOHg"/>
+                <layoutConstraint xsi:type="notation:Location" xmi:id="__L7r1Y-PEe6T3aFB4BWOHg"/>
+              </children>
+              <children xsi:type="notation:Shape" xmi:id="__L7r1o-PEe6T3aFB4BWOHg" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+                <children xmi:id="_ZkIy4I-JEe6T3aFB4BWOHg" type="State" element="_ZkFvgI-JEe6T3aFB4BWOHg">
+                  <children xsi:type="notation:DecorationNode" xmi:id="_ZkIy4Y-JEe6T3aFB4BWOHg" type="StateName">
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy4o-JEe6T3aFB4BWOHg"/>
+                    <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIy44-JEe6T3aFB4BWOHg"/>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_ZkIy5I-JEe6T3aFB4BWOHg" type="StateTextCompartment">
+                    <children xsi:type="notation:Shape" xmi:id="_ZkIy5Y-JEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+                      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy5o-JEe6T3aFB4BWOHg"/>
+                    </children>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_ZkIy54-JEe6T3aFB4BWOHg" type="StateFigureCompartment"/>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy6I-JEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+                  <styles xsi:type="notation:FontStyle" xmi:id="_ZkIy6Y-JEe6T3aFB4BWOHg"/>
+                  <styles xsi:type="notation:BooleanValueStyle" xmi:id="_ZkIy6o-JEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy64-JEe6T3aFB4BWOHg" x="40" y="63" width="99" height="53"/>
+                </children>
+                <children xmi:id="_ZkIy1o-JEe6T3aFB4BWOHg" type="Entry" element="_ZkFIdI-JEe6T3aFB4BWOHg">
+                  <children xmi:id="_ZkIy14-JEe6T3aFB4BWOHg" type="BorderItemLabelContainer">
+                    <children xsi:type="notation:DecorationNode" xmi:id="_ZkIy2I-JEe6T3aFB4BWOHg" type="BorderItemLabel">
+                      <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy2Y-JEe6T3aFB4BWOHg"/>
+                      <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIy2o-JEe6T3aFB4BWOHg"/>
+                    </children>
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy24-JEe6T3aFB4BWOHg" fontName="Verdana" lineColor="4210752"/>
+                    <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy3I-JEe6T3aFB4BWOHg"/>
+                  </children>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy3Y-JEe6T3aFB4BWOHg" fontName="Verdana" fillColor="0" lineColor="16777215"/>
+                  <styles xsi:type="notation:NamedStyle" xmi:id="_ZkIy3o-JEe6T3aFB4BWOHg" name="allowColors"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy34-JEe6T3aFB4BWOHg" x="45" y="1" width="15" height="15"/>
+                </children>
+                <layoutConstraint xsi:type="notation:Bounds" xmi:id="__L7r14-PEe6T3aFB4BWOHg"/>
+              </children>
+              <styles xsi:type="notation:ShapeStyle" xmi:id="__L7r0Y-PEe6T3aFB4BWOHg" fontName="Verdana" fillColor="16448250" lineColor="12632256"/>
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="__L7r0o-PEe6T3aFB4BWOHg"/>
+            </children>
+            <children xmi:id="__L7r2I-PEe6T3aFB4BWOHg" type="Region" element="__L5Pk4-PEe6T3aFB4BWOHg">
+              <children xsi:type="notation:DecorationNode" xmi:id="__L7r24-PEe6T3aFB4BWOHg" type="RegionName">
+                <styles xsi:type="notation:ShapeStyle" xmi:id="__L7r3I-PEe6T3aFB4BWOHg"/>
+                <layoutConstraint xsi:type="notation:Location" xmi:id="__L7r3Y-PEe6T3aFB4BWOHg"/>
+              </children>
+              <children xsi:type="notation:Shape" xmi:id="__L7r3o-PEe6T3aFB4BWOHg" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+                <children xmi:id="_Jbf3II-QEe6T3aFB4BWOHg" type="State" element="_JbfQEI-QEe6T3aFB4BWOHg">
+                  <children xsi:type="notation:DecorationNode" xmi:id="_JbgeMI-QEe6T3aFB4BWOHg" type="StateName">
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_JbgeMY-QEe6T3aFB4BWOHg"/>
+                    <layoutConstraint xsi:type="notation:Location" xmi:id="_JbgeMo-QEe6T3aFB4BWOHg"/>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_JbgeM4-QEe6T3aFB4BWOHg" type="StateTextCompartment">
+                    <children xsi:type="notation:Shape" xmi:id="_JbgeNI-QEe6T3aFB4BWOHg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+                      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_JbgeNY-QEe6T3aFB4BWOHg"/>
+                    </children>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_JbgeNo-QEe6T3aFB4BWOHg" type="StateFigureCompartment"/>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_Jbf3IY-QEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+                  <styles xsi:type="notation:FontStyle" xmi:id="_Jbf3Io-QEe6T3aFB4BWOHg"/>
+                  <styles xsi:type="notation:BooleanValueStyle" xmi:id="_JbgeN4-QEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_Jbf3I4-QEe6T3aFB4BWOHg" x="95" y="63" width="58" height="53"/>
+                </children>
+                <children xmi:id="_JzcdEI-QEe6T3aFB4BWOHg" type="Entry" element="_Jzb2AI-QEe6T3aFB4BWOHg">
+                  <children xmi:id="_JzcdFI-QEe6T3aFB4BWOHg" type="BorderItemLabelContainer">
+                    <children xsi:type="notation:DecorationNode" xmi:id="_JzdEII-QEe6T3aFB4BWOHg" type="BorderItemLabel">
+                      <styles xsi:type="notation:ShapeStyle" xmi:id="_JzdEIY-QEe6T3aFB4BWOHg"/>
+                      <layoutConstraint xsi:type="notation:Location" xmi:id="_JzdEIo-QEe6T3aFB4BWOHg"/>
+                    </children>
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_JzcdFY-QEe6T3aFB4BWOHg" fontName="Verdana" lineColor="4210752"/>
+                    <layoutConstraint xsi:type="notation:Bounds" xmi:id="_JzcdFo-QEe6T3aFB4BWOHg"/>
+                  </children>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_JzcdEY-QEe6T3aFB4BWOHg" fontName="Verdana" fillColor="0" lineColor="16777215"/>
+                  <styles xsi:type="notation:NamedStyle" xmi:id="_JzcdEo-QEe6T3aFB4BWOHg" name="allowColors"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_JzcdE4-QEe6T3aFB4BWOHg" x="116" y="17"/>
+                </children>
+                <layoutConstraint xsi:type="notation:Bounds" xmi:id="__L7r34-PEe6T3aFB4BWOHg"/>
+              </children>
+              <styles xsi:type="notation:ShapeStyle" xmi:id="__L7r2Y-PEe6T3aFB4BWOHg" fontName="Verdana" fillColor="16448250" lineColor="12632256"/>
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="__L7r2o-PEe6T3aFB4BWOHg"/>
+            </children>
+          </children>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="__L52oY-PEe6T3aFB4BWOHg" fontName="Verdana" fillColor="15720400" lineColor="12632256"/>
+          <styles xsi:type="notation:FontStyle" xmi:id="__L52oo-PEe6T3aFB4BWOHg"/>
+          <styles xsi:type="notation:BooleanValueStyle" xmi:id="__L6dt4-PEe6T3aFB4BWOHg" name="isHorizontal" booleanValue="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="__L52o4-PEe6T3aFB4BWOHg" x="55" y="26" width="828" height="289"/>
+        </children>
+        <children xmi:id="_ePd1UI-QEe6T3aFB4BWOHg" type="Entry" element="_ePcnMI-QEe6T3aFB4BWOHg">
+          <children xmi:id="_ePecYI-QEe6T3aFB4BWOHg" type="BorderItemLabelContainer">
+            <children xsi:type="notation:DecorationNode" xmi:id="_ePecY4-QEe6T3aFB4BWOHg" type="BorderItemLabel">
+              <styles xsi:type="notation:ShapeStyle" xmi:id="_ePecZI-QEe6T3aFB4BWOHg"/>
+              <layoutConstraint xsi:type="notation:Location" xmi:id="_ePecZY-QEe6T3aFB4BWOHg"/>
+            </children>
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_ePecYY-QEe6T3aFB4BWOHg" fontName="Verdana" lineColor="4210752"/>
+            <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ePecYo-QEe6T3aFB4BWOHg"/>
+          </children>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_ePd1UY-QEe6T3aFB4BWOHg" fontName="Verdana" fillColor="0" lineColor="16777215"/>
+          <styles xsi:type="notation:NamedStyle" xmi:id="_ePd1Uo-QEe6T3aFB4BWOHg" name="allowColors"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ePd1U4-QEe6T3aFB4BWOHg" x="22" y="116"/>
+        </children>
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy-I-JEe6T3aFB4BWOHg"/>
+      </children>
+      <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy-Y-JEe6T3aFB4BWOHg" fontName="Verdana" fillColor="16448250" lineColor="12632256"/>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIy-o-JEe6T3aFB4BWOHg" x="205" y="10" width="1040" height="667"/>
+    </children>
+    <children xsi:type="notation:Shape" xmi:id="_ZkIy-4-JEe6T3aFB4BWOHg" type="StatechartText" fontName="Verdana" lineColor="4210752">
+      <children xsi:type="notation:DecorationNode" xmi:id="_ZkIy_I-JEe6T3aFB4BWOHg" type="StatechartName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIy_Y-JEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIy_o-JEe6T3aFB4BWOHg"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_ZkIy_4-JEe6T3aFB4BWOHg" type="StatechartTextExpression" fontName="Verdana" lineColor="4210752">
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIzAI-JEe6T3aFB4BWOHg"/>
+      </children>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ZkIzAY-JEe6T3aFB4BWOHg" x="10" y="10" width="200" height="400"/>
+    </children>
+    <styles xsi:type="notation:BooleanValueStyle" xmi:id="_ZkIzAo-JEe6T3aFB4BWOHg" name="inlineDefinitionSection"/>
+    <styles xsi:type="notation:DiagramStyle" xmi:id="_ZkIzA4-JEe6T3aFB4BWOHg"/>
+    <edges xmi:id="_ZkIzBI-JEe6T3aFB4BWOHg" type="Transition" element="_ZkFIdY-JEe6T3aFB4BWOHg" source="_ZkIy1o-JEe6T3aFB4BWOHg" target="_ZkIy4I-JEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_ZkIzBY-JEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_ZkIzBo-JEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_ZkIzB4-JEe6T3aFB4BWOHg" x="5" y="2"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_ZkIzCI-JEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_ZkIzCY-JEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_ZkIzCo-JEe6T3aFB4BWOHg" points="[-2, 6, -39, -75]$[-2, 55, -39, -26]"/>
+    </edges>
+    <edges xmi:id="_3l7ygI-JEe6T3aFB4BWOHg" type="Transition" element="_3l5WQI-JEe6T3aFB4BWOHg" source="_ZkIy4I-JEe6T3aFB4BWOHg" target="_ZkIy4I-JEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_3l7yhI-JEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_3l7yhY-JEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_3l7yho-JEe6T3aFB4BWOHg" x="16" y="-16"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_3l7ygY-JEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_3l7yg4-JEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_3l7ygo-JEe6T3aFB4BWOHg" points="[4, -3, 5, -3]$[4, -3, 5, -3]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_3l9AoI-JEe6T3aFB4BWOHg" id="(0.9393939393939394,0.05660377358490566)"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_3l9AoY-JEe6T3aFB4BWOHg" id="(0.9292929292929293,0.05660377358490566)"/>
+    </edges>
+    <edges xmi:id="_KR2QUI-QEe6T3aFB4BWOHg" type="Transition" element="_KR1pQI-QEe6T3aFB4BWOHg" source="_JzcdEI-QEe6T3aFB4BWOHg" target="_Jbf3II-QEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_KR2QVI-QEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_KR2QVY-QEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_KR23YI-QEe6T3aFB4BWOHg" x="-14" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_KR2QUY-QEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_KR2QU4-QEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_KR2QUo-QEe6T3aFB4BWOHg" points="[3, 6, 16, -50]$[3, 39, 16, -17]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_KR4FgI-QEe6T3aFB4BWOHg" id="(0.13333333333333333,0.4666666666666667)"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_KR4skI-QEe6T3aFB4BWOHg" id="(0.18032786885245902,0.32075471698113206)"/>
+    </edges>
+    <edges xmi:id="_MhLOoY-QEe6T3aFB4BWOHg" type="Transition" element="_MhLOoI-QEe6T3aFB4BWOHg" source="_Jbf3II-QEe6T3aFB4BWOHg" target="_Jbf3II-QEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_MhLOpY-QEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_MhLOpo-QEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_MhLOp4-QEe6T3aFB4BWOHg" x="12" y="11"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_MhLOoo-QEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_MhLOpI-QEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_MhLOo4-QEe6T3aFB4BWOHg" points="[4, 2, 4, 2]$[4, 2, 4, 2]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_MhL1sI-QEe6T3aFB4BWOHg" id="(0.9310344827586207,0.7924528301886793)"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_MhL1sY-QEe6T3aFB4BWOHg" id="(0.9310344827586207,0.7924528301886793)"/>
+    </edges>
+    <edges xmi:id="_ezrVoY-QEe6T3aFB4BWOHg" type="Transition" element="_ezrVoI-QEe6T3aFB4BWOHg" source="_ePd1UI-QEe6T3aFB4BWOHg" target="__L52oI-PEe6T3aFB4BWOHg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_ezr8sI-QEe6T3aFB4BWOHg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_ezr8sY-QEe6T3aFB4BWOHg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_ezr8so-QEe6T3aFB4BWOHg" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_ezrVoo-QEe6T3aFB4BWOHg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_ezrVpI-QEe6T3aFB4BWOHg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_ezrVo4-QEe6T3aFB4BWOHg" points="[6, 2, -20, 0]$[26, 2, 0, 0]"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_ezsjwI-QEe6T3aFB4BWOHg" id="(0.0,0.34256055363321797)"/>
+    </edges>
+  </notation:Diagram>
+</xmi:XMI>

+ 88 - 0
lib/common.py

@@ -0,0 +1,88 @@
+# Author: Joeri Exelmans
+ 
+class QueueEntry:
+    __slots__ = ('timestamp', 'callback', 'canceled', 'debug') # For MAXIMUM performance :)
+
+    def __init__(self, timestamp, callback, debug):
+        self.timestamp = timestamp
+        self.callback = callback
+        self.debug = debug
+        self.canceled = False
+
+# Simulation primitive.
+# Uses virtualized (simulated) time, instead of looking at the wall clock.
+class Controller:
+    def __init__(self):
+        self.event_queue = []
+        self.simulated_time = 0
+
+    def start(self, timestamp):
+        self.simulated_time = timestamp
+        self.start_time = timestamp
+
+    def add_input(self, timestamp, sc, event, value=None):
+        raise_method = getattr(sc, 'raise_' + event)
+        if value is not None:
+            callback = lambda: raise_method(value)
+        else:
+            callback = raise_method
+        # print("input event: ", event)
+        self.add_input_lowlevel(timestamp, callback, event)
+
+    def add_input_lowlevel(self, timestamp, callback, debug):
+        e = QueueEntry(timestamp, callback, debug)
+        self.event_queue.append(e)
+        self.event_queue.sort(key = lambda entry: entry.timestamp, reverse=True)
+        return e
+
+    def run_until(self, until):
+        while self.have_event() and self.get_earliest() <= until:
+            e = self.event_queue.pop();
+            if not e.canceled:
+                # print("handling", e.debug)
+                self.simulated_time = e.timestamp
+                e.callback()
+
+    def have_event(self):
+        return len(self.event_queue) > 0
+
+    def get_earliest(self):
+        return self.event_queue[-1].timestamp
+
+# Our own timer service, used by the statechart.
+# Much better than YAKINDU's pathetic timer service.
+class TimerService:
+    def __init__(self, controller):
+        self.controller = controller;
+        self.timers = {}
+
+    # Duration: milliseconds
+    def set_timer(self, sc, event_id, duration, periodic):
+        def callback():
+            sc.time_elapsed(event_id)
+
+        self.unset_timer(callback, event_id)
+
+        controller_duration = duration * 1000000 # ms to ns
+
+        # print("set timer"+str(event_id), "duration", duration)
+        e = self.controller.add_input_lowlevel(
+            self.controller.simulated_time + controller_duration, # timestamp relative to simulated time
+            callback,
+            "timer"+str(event_id))
+
+        self.timers[event_id] = e
+
+    def unset_timer(self, callback, event_id):
+        try:
+            e = self.timers[event_id]
+            e.canceled = True
+        except KeyError:
+            pass
+
+
+def print_trace(trace, indent=0):
+    print("[")
+    for (timestamp, event_name, value) in trace:
+        print((" "*indent)+"    (%i, \"%s\", %s)," % (timestamp, event_name, value))
+    print((" "*indent)+"]", end='')

+ 153 - 0
lib/test.py

@@ -0,0 +1,153 @@
+from lib.common import Controller, TimerService, print_trace
+from yakindu.rx import Observable, Observer
+from difflib import ndiff
+
+# Can we ignore event in 'trace' at position 'idx' with respect to idempotency?
+def can_ignore(trace, idx, IDEMPOTENT):
+    (timestamp, event_name, value) = trace[idx]
+    if event_name in IDEMPOTENT:
+        # If the same event occurred earlier, with the same parameter value, then this event can be ignored:
+        for (earlier_timestamp, earlier_event_name, earlier_value) in reversed(trace[0:idx]):
+            if (earlier_event_name, earlier_value) == (event_name, value):
+                # same event name and same parameter value (timestamps allowed to differ)
+                return True
+            elif event_name == earlier_event_name:
+                # same event name, but different parameter value:
+                # stop looking into the past:
+                break
+        # If the same event occurs later event, but with the same timestamp, this event is overwritten and can be ignored:
+        for (later_timestamp, later_event_name, later_value) in trace[idx+1:]:
+            if (later_timestamp, later_event_name) == (timestamp, event_name):
+                # if a later event with same name and timestamp occurs, ours will be overwritten:
+                return True
+            if later_timestamp != timestamp:
+                # no need to look further into the future:
+                break
+    return False
+
+def preprocess_trace(trace, INITIAL, IDEMPOTENT):
+    # Prepend trace with events that set assumed initial state:
+    result = [(0, event_name, value) for (event_name, value) in INITIAL] + trace
+    # Remove events that have no effect:
+    while True:
+        filtered = [tup for (idx, tup) in enumerate(result) if not can_ignore(result, idx, IDEMPOTENT)]
+        # Keep on filtering until no more events could be removed:
+        if len(filtered) == len(result):
+            return filtered
+        result = filtered
+
+def compare_traces(expected, actual):
+    i = 0
+    while i < len(expected) and i < len(actual):
+        # Compare tuples:
+        if expected[i] != actual[i]:
+            print("Traces differ!")
+            # print("expected: (%i, \"%s\", %s)" % expected[i])
+            # print("actual: (%i, \"%s\", %s)" % actual[i])
+            return False
+        i += 1
+    if len(expected) != len(actual):
+        print("Traces have different length:")
+        print("expected length: %i" % len(expected))
+        print("actual length: %i" % len(actual))
+        return False
+    print("Traces match.")
+    return True
+
+
+def run_test(input_trace, expected_output_trace, statechart_class, INITIAL, IDEMPOTENT, verbose=False):
+    # simulation will be run until timestamp of last event in expected output trace:
+    if len(expected_output_trace) > 0:
+        last_output_event_timestamp = expected_output_trace[-1][0]
+    else:
+        last_output_event_timestamp = 0
+    actual_output_trace = []
+
+    controller = Controller()
+    sc = statechart_class()
+    sc.timer_service = TimerService(controller)
+
+    class LoggingObserver(Observer):
+        def __init__(self, event_name):
+            self.event_name = event_name
+
+        def next(self, value=None):
+            tup = (controller.simulated_time-controller.start_time, self.event_name, value)
+            actual_output_trace.append(tup)
+
+    for attr in sc.__dict__:
+        if type(sc.__dict__[attr]) is Observable:
+            sc.__dict__[attr].subscribe(LoggingObserver(attr[:-11])) # strip '_observable' suffix from attr
+
+    # Put all input events into event queue:
+    for tup in input_trace:
+        (timestamp, event_name, value) = tup
+        controller.add_input(timestamp, sc, event_name)
+
+    controller.start(0) # this only sets the 'start_time' attribute
+    sc.enter() # enter default state(s)
+    controller.run_until(last_output_event_timestamp) # this actually runs the simulation
+
+    clean_expected = preprocess_trace(expected_output_trace, INITIAL, IDEMPOTENT)
+    clean_actual   = preprocess_trace(actual_output_trace, INITIAL, IDEMPOTENT)
+
+    def print_diff():
+        # The diff printed will be a diff of the 'raw' traces, not of the cleaned up traces
+        # A diff of the cleaned up traces would be confusing to the user.
+        have_plus = False
+        have_minus = False
+        have_useless = False
+        for diffline in ndiff(
+                [str(tup)+'\n' for tup in expected_output_trace],
+                [str(tup)+'\n' for tup in actual_output_trace],
+                charjunk=None,
+            ):
+            symbol = diffline[0]
+            if symbol == '+':
+                have_plus = True
+            if symbol == '-':
+                have_minus = True
+            if symbol == '?':
+                continue
+            rest = diffline[2:-1] # drop last character (=newline)
+            useless_line = (
+                   symbol == '-' and rest not in [str(tup) for tup in clean_expected]
+                or symbol == '+' and rest not in [str(tup) for tup in clean_actual]
+                # or symbol == ' ' and rest not in [str(tup) for tup in clean_actual]
+            )
+            if useless_line:
+                print(" (%s) %s" % (symbol, rest))
+                have_useless = True
+            else:
+                print("  %s  %s" % (symbol, rest))
+
+        if have_minus or have_plus or have_useless:
+            print("Legend:")
+        if have_minus:
+            print("  -: expected, but did not happen")
+        if have_plus:
+            print("  +: happened, but was not expected")
+        if have_useless:
+            print("  (-) or (+): indicates a \"useless event\" (because it has no effect), either in expected output (-) or in actual output (+).")
+            print("\n\"Useless events\" are ignored by the comparison algorithm, and will never cause your test to fail. In this assignment, your solution is allowed to contain useless events.")
+
+    if not compare_traces(clean_expected, clean_actual):
+        print("Raw diff between expected and actual output event trace:")
+        print_diff()
+        return False
+    elif verbose:
+        print_diff()
+    return True
+
+# verbose: even print a trace if the test succeeded.
+def run_scenarios(statechart_class, SCENARIOS, INITIAL, IDEMPOTENT, verbose=False):
+    passed = True
+    for scenario in SCENARIOS:
+        print("\nRunning scenario:", scenario['name'])
+        if not run_test(scenario['input_trace'], scenario['output_trace'], statechart_class, INITIAL, IDEMPOTENT, verbose):
+            passed = False
+
+    if passed:
+        print("\nAll tests passed.")
+    else:
+        print("\nSome tests failed.")

+ 5 - 0
src/yakindu/__init__.py

@@ -0,0 +1,5 @@
+"""
+
+Empty file that initializes the package it is contained in.
+
+"""

+ 48 - 0
src/yakindu/rx.py

@@ -0,0 +1,48 @@
+"""Implementation for Observer and Observables used for out events.
+Generated by itemis CREATE code generator.
+"""
+
+
+class Observer():
+	"""Observer implementation.
+	"""
+
+	def next(self, value=None):
+		"""Abstract next method, which must be implemented."""
+		raise NotImplementedError('user must define next() to use this base class')
+
+
+class Observable():
+	"""Observable implementation.
+	"""
+
+	def __init__(self):
+		self.observers = []
+
+	def next(self, value=None):
+		"""Calls next function from every observer.
+		"""
+		for observer in self.observers:
+			if observer is not None:
+				if value is None:
+					observer.next()
+				else:
+					observer.next(value)
+
+	def subscribe(self, observer):
+		"""Subscribe on specified observer.
+		"""
+		if observer is not None:
+			self.observers.append(observer)
+			return True
+		return False
+
+	def unsubscribe(self, observer):
+		"""Unsubscribe from specified observer.
+		"""
+		if observer is None:
+			return False
+		if observer in self.observers:
+			self.observers.remove(observer)
+			return True
+		return False

+ 195 - 0
trafficlight_gui.py

@@ -0,0 +1,195 @@
+# Author: Joeri Exelmans
+
+import tkinter
+from srcgen import statechart
+from lib.common import Controller, TimerService, print_trace
+
+import sys, os
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))
+from yakindu.rx import Observer
+
+import time
+
+TIME_SCALE = 1
+
+def scaled_now():
+    return time.perf_counter_ns() * TIME_SCALE
+
+OFF_COLOR = '#333333'
+
+# Runs the Controller as close as possible to the wall-clock.
+# Depending on how fast your computer is, simulated time will always run a tiny bit behind wall-clock time, but this error will NOT grow over time.
+class RealTimeSimulation:
+    def __init__(self, controller, tk, update_callback, scale=1.0):
+        self.controller = controller
+        self.tk = tk
+        self.update_callback = update_callback
+        self.scale = scale
+
+        self.scheduled_id = None
+        self.purposefully_behind = 0
+
+    def add_input(self, sc, event, value=None):
+        now = scaled_now() + self.purposefully_behind
+        self.controller.add_input(now, sc, event, value)
+        self.interrupt()
+        return now - self.controller.start_time
+
+    def interrupt(self):
+        if self.scheduled_id is not None:
+            self.tk.after_cancel(self.scheduled_id)
+
+        if self.controller.have_event():
+            now = scaled_now()
+            earliest = self.controller.get_earliest()
+            sleep_time = (earliest - now) // TIME_SCALE
+
+            if sleep_time < 0:
+                self.purposefully_behind = sleep_time
+            else:
+                self.purposefully_behind = 0
+
+            def callback():
+                # print("run_until...")
+                self.controller.run_until(now + self.purposefully_behind)
+                self.update_callback()
+                self.interrupt()
+
+            # print("sleeping for", int(sleep_time / 1000000), "ms")
+
+            self.scheduled_id = self.tk.after(int(sleep_time / 1000000), callback)
+        else:
+            print("sleeping until woken up")
+
+
+if __name__ == "__main__":
+    # In these arrays, we will keep tuples (timestamp, event_name) of all input and output events, only to print them out at the end.
+    input_trace = []
+    output_trace = []
+
+    toplevel = tkinter.Tk()
+    toplevel.resizable(0,0)
+    string_simtime = tkinter.StringVar(toplevel, '0.000')
+
+    # For some reason, we have to initialize all 3 statecharts in code (instead of just the 'system' statechart)
+    sc = statechart.Statechart()
+    controller = Controller()
+    sc.timer_service = TimerService(controller)
+
+    # Callback function to display the simulated time:
+    def update_callback():
+        string_simtime.set('{:.3f}'.format((controller.simulated_time - controller.start_time) / 1000000000))
+
+    sim = RealTimeSimulation(controller, toplevel, update_callback, scale=10.0)
+
+    # Callback function for generating input events
+    def generateInput(event_name):
+        print("input event:", event_name)
+        timestamp = sim.add_input(sc, event_name)
+        tup = (timestamp, event_name, None) # our input events don't have a parameter
+        input_trace.append(tup)
+
+    # Create widgets....
+
+    toplevel.title("Traffic Light")
+    sim_frame = tkinter.Frame(toplevel)
+    tkinter.Label(sim_frame, text="Simulated time is now:").pack(side=tkinter.LEFT)
+    tkinter.Entry(sim_frame, state='readonly', width=8, textvariable=string_simtime, justify=tkinter.RIGHT).pack(side=tkinter.LEFT)
+    tkinter.Label(sim_frame, text="s").pack(side=tkinter.LEFT)
+    sim_frame.pack(side=tkinter.TOP)
+    canvas = tkinter.Canvas(toplevel, bd=0, bg='#000000', width=100, height=300)
+    red = canvas.create_oval(10,10,90,90, fill=OFF_COLOR)
+    yellow = canvas.create_oval(10,110,90,190, fill=OFF_COLOR)
+    green = canvas.create_oval(10,210,90,290, fill=OFF_COLOR)
+    canvas.pack()
+    # Buttons and LED display
+    button_frame = tkinter.Frame(toplevel)
+    button = tkinter.Button(button_frame, text="TOGGLE MODE")
+    # Send event to our SC when button pressed or released:
+    button.bind("<ButtonPress>", lambda _: generateInput("button_pressed"))
+    button.bind("<ButtonRelease>", lambda _: generateInput("button_released"))
+    button.pack(side=tkinter.LEFT)
+    button_car = tkinter.Button(button_frame, text="PRETEND CAR DETECTED", command=lambda: generateInput("car_detected"))
+    button_car.pack(side=tkinter.RIGHT)
+    led_frame = tkinter.Frame(button_frame)
+    string_led = tkinter.StringVar()
+    led_entry = tkinter.Entry(led_frame, state='readonly', width=8, textvariable=string_led, justify=tkinter.RIGHT)
+    led_entry.grid(row=0, column=1)
+    led_frame.pack(side=tkinter.RIGHT)
+    button_frame.pack()
+
+
+
+
+    # Handle output events...
+
+    # Bunch of callback functions
+    def setRed(value):
+        if value:
+            canvas.itemconfigure(red, fill='#ff2222')
+        else:
+            canvas.itemconfigure(red, fill=OFF_COLOR)
+
+    def setYellow(value):
+        if value:
+            canvas.itemconfigure(yellow, fill='#ffff22')
+        else:
+            canvas.itemconfigure(yellow, fill=OFF_COLOR)
+
+    def setGreen(value):
+        if value:
+            canvas.itemconfigure(green, fill='#22ff22')
+        else:
+            canvas.itemconfigure(green, fill=OFF_COLOR)
+
+    def setLed(value):
+        if value:
+            string_led.set("LED ON")
+            led_entry.config(fg='red')
+        else:
+            string_led.set("LED OFF")
+            led_entry.config(fg='grey')
+
+    setLed(False)
+
+    # Little helper class that turns a callback function into an YAKINDU-'Observer'.
+    class CallbackObserver(Observer):
+        def __init__(self, callback, event_name):
+            self.callback = callback
+            self.event_name = event_name
+
+        def next(self, value=None):
+            print("output event: %s(%s)" % (self.event_name, value))
+            tup = (controller.simulated_time - controller.start_time, self.event_name, value)
+            output_trace.append(tup)
+            if value is None:
+                self.callback()
+            else:
+                self.callback(value)
+
+    # Bind output events to callbacks
+    sc.set_red_observable.subscribe(CallbackObserver(setRed, "set_red"))
+    sc.set_yellow_observable.subscribe(CallbackObserver(setYellow, "set_yellow"))
+    sc.set_green_observable.subscribe(CallbackObserver(setGreen, "set_green"))
+    sc.set_led_observable.subscribe(CallbackObserver(setLed, "set_led"))
+
+    # Enter default states, start main loop...
+
+    controller.start(scaled_now())
+    sc.enter()
+    sim.interrupt() # schedule first wakeup
+    toplevel.mainloop()
+
+    # Exiting...
+
+    print("Exiting...")
+    print("Full trace (you can add this to the SCENARIOS in test.py)...")
+    print("{")
+    print("    \"name\": \"interactive\",")
+    print("    \"input_trace\": ", end='')
+    print_trace(input_trace, 4)
+    print(",")
+    print("    \"output_trace\": ", end='')
+    print_trace(output_trace, 4)
+    print(",")
+    print("}")

+ 107 - 0
trafficlight_test.py

@@ -0,0 +1,107 @@
+# Author: Joeri Exelmans
+from srcgen import statechart
+from lib.test import run_scenarios
+
+# For each test scenario, sends a sequence of timed input events to the statechart, and checks if the expected sequence of timed output events occurs.
+
+# Each timed event is a tuple (timestamp, event_name, parameter_value)
+# For events that don't have a parameter, the parameter value is always 'None'.
+# Timestamps are in nanoseconds!
+
+SCENARIOS = [
+    {
+        "name": "normal, 2 cycles",
+        "input_trace": [
+            # no input events - we just run 2 cycles in normal mode
+        ],
+        "output_trace": [
+            (0, "set_red", True),
+            (2000000000, "set_red", False),
+            (2000000000, "set_green", True),
+            (4000000000, "set_green", False),
+            (4000000000, "set_yellow", True),
+            (5000000000, "set_yellow", False),
+            (5000000000, "set_red", True),
+            (7000000000, "set_red", False),
+            (7000000000, "set_green", True),
+            (9000000000, "set_green", False),
+            (9000000000, "set_yellow", True),
+            (10000000000, "set_yellow", False),
+            (10000000000, "set_red", True),
+        ],
+    },
+    {
+        "name": "reactive",
+        "input_trace": [
+            # a short press on the button - switches mode to 'reactive'
+            (1833042679, "button_pressed", None),
+            (1896566197, "button_released", None),
+            # cars are driving by while light is green:
+            (3240632732, "car_detected", None),
+            (4144836187, "car_detected", None),
+            (5032585363, "car_detected", None),
+            (5976821597, "car_detected", None),
+            (6888497796, "car_detected", None),
+        ],
+        "output_trace": [
+            (0, "set_red", True),
+            # LED flips on immediately after releasing the button:
+            (1896566197, "set_led", True),
+            (2000000000, "set_red", False),
+            (2000000000, "set_green", True),
+            # light stays green for longer than 2s:
+            # however, after 5s, even though cars are still driving by, the light still goes to yellow:
+            (7000000000, "set_green", False),
+            (7000000000, "set_yellow", True),
+            (8000000000, "set_yellow", False),
+            (8000000000, "set_red", True),
+            (10000000000, "set_red", False),
+            (10000000000, "set_green", True),
+            # light is green again, but this time, no cars are driving by.
+            # therefore, light goes to yellow after 2s:
+            (12000000000, "set_green", False),
+            (12000000000, "set_yellow", True),
+            (13000000000, "set_yellow", False),
+            (13000000000, "set_red", True),
+        ],
+    },
+    {
+        "name": "police interrupt",
+        "input_trace": [
+            (0, "button_pressed", None),
+            (2000000000, "button_released", None),
+        ],
+        "output_trace": [
+            (0, "set_red", True),
+            (2000000000, "set_red", False),
+            (2000000000, "set_yellow", True),
+            (2500000000, "set_yellow", False),
+            (3000000000, "set_yellow", True),
+            (3500000000, "set_yellow", False),
+        ],
+    }
+
+    # You MUST add one extra scenario HERE!
+]
+
+# The following events are safe to repeat: (with same value)
+# Do not change this:
+IDEMPOTENT = [
+    "set_red",
+    "set_yellow",
+    "set_green",
+    "set_led",
+]
+
+# We pretend that initially, these events occur:
+# Do not change this:
+INITIAL = [
+    ("set_red", False),
+    ("set_yellow", False),
+    ("set_green", False),
+    ("set_led", False),
+]
+
+
+if __name__ == "__main__":
+    run_scenarios(statechart.Statechart, SCENARIOS, INITIAL, IDEMPOTENT)