fsasimulator.sccd 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. Diagram(name = 'FSASimulator',
  2. author = 'Sadaf Mustafiz and Bruno Barroca',
  3. description = 'An FSA simulator written in SCCD. It supports variables, after, events and guards'):
  4. Top {
  5. import fsaclasses
  6. }
  7. Class(name = 'FSASimulator', default = True):
  8. Attribute(name = 'timestep')
  9. Attribute(name = 'elapsed')
  10. Attribute(name = 'currentState')
  11. Attribute(name = 'logicalTime')
  12. Attribute(name = 'currentEvent')
  13. Attribute(name = 'eventList')
  14. Attribute(name = 'initialState')
  15. Attribute(name = 'model')
  16. Constructor(amodel, events) {
  17. self.elapsed = 0
  18. self.timestep = 0.5
  19. self.model = amodel
  20. self.initialState = self.model.initialState
  21. self.eventList = events
  22. }
  23. Method resetElapsed() {
  24. self->setElapsed(0)
  25. }
  26. Method setElapsed(elapsed) {
  27. self.elapsed = elapsed
  28. }
  29. Method getInitialState() {
  30. return self.initialState
  31. }
  32. Method getTransitionFrom(State,RunTimeEvent) {
  33. return self.model->getTransitionFrom(State,RunTimeEvent)
  34. }
  35. Method getTransitionAfterAt(State,time) {
  36. return self.model->getTransitionAfter(State,time)
  37. }
  38. Method setLogicalTime(time) {
  39. self.logicalTime = time
  40. }
  41. Method setCurrentState(state) {
  42. self.currentState = state
  43. }
  44. Method getCurrentState() {
  45. return self.currentState
  46. }
  47. Method getCurrentEvent() {
  48. return self.currentEvent
  49. }
  50. Method setCurrentEvent(e) {
  51. self.currentEvent = e
  52. }
  53. Method popEventList() {
  54. return self.eventList->pop()
  55. }
  56. Method getInputEventAt(time) {
  57. return self.eventList->getInputAt(time)
  58. }
  59. StateMachine:
  60. initial = 'Start'
  61. final = 'End'
  62. State('Start'):
  63. Transition(target='../Check'):
  64. Actions {
  65. self->setLogicalTime(0)
  66. self->setCurrentState(self->getInitialState())
  67. }
  68. State('Check'):
  69. Transition(target='../Processing'):
  70. guard = { self.currentState.final == False }
  71. Actions {
  72. self->setCurrentEvent(self->getInputEventAt(self.logicalTime))
  73. }
  74. Transition(target='../End'):
  75. guard = { self.currentState.final == True }
  76. Actions {
  77. print('going to end... ')
  78. }
  79. State('Processing'):
  80. Transition(target='../Check'):
  81. guard = {not self->getTransitionFrom(self->getCurrentState(), self->getCurrentEvent()) == None}
  82. Actions {
  83. t = self->getTransitionFrom(self->getCurrentState(), self->getCurrentEvent())
  84. self->setCurrentState(t.target)
  85. self->setLogicalTime(self.logicalTime + self.timestep)
  86. self->resetElapsed()
  87. print("changing to state: ")
  88. print(self->getCurrentState()->getName())
  89. print(self.logicalTime)
  90. print(self.elapsed)
  91. }
  92. Transition(target='../Check'):
  93. guard = {not (self->getTransitionAfterAt(self->getCurrentState(), self.elapsed) == None) and self->getTransitionFrom(self->getCurrentState(), self->getCurrentEvent()) == None}
  94. Actions {
  95. t = self->getTransitionAfterAt(self->getCurrentState(), self.elapsed)
  96. self->setCurrentState(t.target)
  97. self->setLogicalTime(self.logicalTime + self.timestep)
  98. self->resetElapsed()
  99. print("changing to state: ")
  100. print(self->getCurrentState()->getName())
  101. print(self.logicalTime)
  102. print(self.elapsed)
  103. }
  104. Transition(target='../Check'):
  105. guard = {self->getTransitionFrom(self->getCurrentState(), self->getCurrentEvent()) == self->getTransitionAfterAt(self->getCurrentState(), self.elapsed) == None}
  106. Actions {
  107. self->setLogicalTime(self.logicalTime + self.timestep)
  108. self->setElapsed(self.elapsed + self.timestep)
  109. print(self.logicalTime)
  110. print(self.elapsed)
  111. }
  112. State('End')