statechart_fig1_redialer.xml 2.7 KB

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