statechart_fig1_redialer.xml 2.7 KB

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