statechart_fig1_redialer.xml 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?xml version="1.0" ?>
  2. <statechart>
  3. <semantics
  4. big_step_maximality="syntactic"
  5. concurrency="many"
  6. orthogonal_priority="none"
  7. input_event_lifeline="whole"
  8. enabledness_memory_protocol="small_step"
  9. assignment_memory_protocol="small_step"/>
  10. <datamodel>
  11. import sccd.action_lang.lib.utils;
  12. c = 0;
  13. lp = 1234567890;
  14. p = 0;
  15. digit = func(i:int, pos:int) {
  16. result = i // 10**pos % 10;
  17. # print("digit " + int_to_str(pos) + " of " + int_to_str(i) + " is " + int_to_str(result));
  18. return result;
  19. };
  20. numdigits = func(i:int) {
  21. if (i == 0)
  22. return 0;
  23. return float_to_int(log10(i)) + 1;
  24. };
  25. </datamodel>
  26. <inport name="in">
  27. <event name="redial"/>
  28. </inport>
  29. <outport name="out">
  30. <event name="out">
  31. <param type="int"/>
  32. </event>
  33. </outport>
  34. <root>
  35. <parallel id="Dialing">
  36. <state id="Dialer" initial="WaitForDial">
  37. <state id="WaitForDial" stable="true">
  38. <!-- t1 -->
  39. <transition event="dial(d:int), not redial" cond="c &lt; 10" target=".">
  40. <code>
  41. c += 1;
  42. lp = lp * 10 + d;
  43. </code>
  44. <raise port="out" event="out">
  45. <param expr="d"/>
  46. </raise>
  47. </transition>
  48. <!-- t2 -->
  49. <transition event="dial(d:int), redial" cond="c == 0" target="../DialDigits">
  50. <code>
  51. # print("got dial("+int_to_str(d)+")");
  52. lp = d;
  53. c = 1;
  54. </code>
  55. <raise port="out" event="out">
  56. <param expr="d"/>
  57. </raise>
  58. </transition>
  59. </state>
  60. <state id="DialDigits">
  61. <!-- t3 -->
  62. <transition event="dial(d:int)" cond="c &lt; 10" target=".">
  63. <code>
  64. # print("got dial("+int_to_str(d)+")");
  65. lp = lp * 10 + d;
  66. c += 1;
  67. </code>
  68. <raise port="out" event="out">
  69. <param expr="d"/>
  70. </raise>
  71. </transition>
  72. <!-- t4 -->
  73. <transition cond="c == 10" target="../WaitForDial"/>
  74. </state>
  75. </state>
  76. <state id="Redialer" initial="WaitForRedial">
  77. <state id="WaitForRedial" stable="true">
  78. <!-- t5 -->
  79. <transition event="redial" cond="c == 0" target="../RedialDigits">
  80. <code>
  81. p = lp;
  82. </code>
  83. <raise event="dial">
  84. <param expr="digit(lp, 0)"/>
  85. </raise>
  86. </transition>
  87. </state>
  88. <state id="RedialDigits">
  89. <!-- t6 -->
  90. <transition cond="c &lt; numdigits(p)" target=".">
  91. <raise event="dial">
  92. <param expr="digit(p, c)"/>
  93. </raise>
  94. </transition>
  95. <!-- t7 -->
  96. <transition cond="c == numdigits(p)" target="../WaitForRedial"/>
  97. </state>
  98. </state>
  99. </parallel>
  100. </root>
  101. </statechart>