statechart_fig1_redialer.xml 2.8 KB

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