HistoryWithExitPoint.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. #include "HistoryWithExitPoint.h"
  2. #include <string.h>
  3. /*! \file Implementation of the state machine 'HistoryWithExitPoint'
  4. */
  5. HistoryWithExitPoint::HistoryWithExitPoint()
  6. {
  7. for (int i = 0; i < maxHistoryStates; ++i)
  8. historyVector[i] = HistoryWithExitPoint_last_state;
  9. stateConfVectorPosition = 0;
  10. }
  11. HistoryWithExitPoint::~HistoryWithExitPoint()
  12. {
  13. }
  14. void HistoryWithExitPoint::init()
  15. {
  16. for (int i = 0; i < maxOrthogonalStates; ++i)
  17. stateConfVector[i] = HistoryWithExitPoint_last_state;
  18. for (int i = 0; i < maxHistoryStates; ++i)
  19. historyVector[i] = HistoryWithExitPoint_last_state;
  20. stateConfVectorPosition = 0;
  21. clearInEvents();
  22. clearOutEvents();
  23. }
  24. void HistoryWithExitPoint::enter()
  25. {
  26. /* Default enter sequence for statechart HistoryWithExitPoint */
  27. enseq_mr_default();
  28. }
  29. void HistoryWithExitPoint::exit()
  30. {
  31. /* Default exit sequence for statechart HistoryWithExitPoint */
  32. exseq_mr();
  33. }
  34. sc_boolean HistoryWithExitPoint::isActive() const
  35. {
  36. return stateConfVector[0] != HistoryWithExitPoint_last_state;
  37. }
  38. /*
  39. * Always returns 'false' since this state machine can never become final.
  40. */
  41. sc_boolean HistoryWithExitPoint::isFinal() const
  42. {
  43. return false;}
  44. void HistoryWithExitPoint::runCycle()
  45. {
  46. clearOutEvents();
  47. for (stateConfVectorPosition = 0;
  48. stateConfVectorPosition < maxOrthogonalStates;
  49. stateConfVectorPosition++)
  50. {
  51. switch (stateConfVector[stateConfVectorPosition])
  52. {
  53. case mr_A_r_X1 :
  54. {
  55. react_mr_A_r_X1();
  56. break;
  57. }
  58. case mr_A_r_X2 :
  59. {
  60. react_mr_A_r_X2();
  61. break;
  62. }
  63. case mr_B :
  64. {
  65. react_mr_B();
  66. break;
  67. }
  68. default:
  69. break;
  70. }
  71. }
  72. clearInEvents();
  73. }
  74. void HistoryWithExitPoint::clearInEvents()
  75. {
  76. iface.push_raised = false;
  77. iface.back_raised = false;
  78. iface.next_raised = false;
  79. }
  80. void HistoryWithExitPoint::clearOutEvents()
  81. {
  82. }
  83. sc_boolean HistoryWithExitPoint::isStateActive(HistoryWithExitPointStates state) const
  84. {
  85. switch (state)
  86. {
  87. case mr_A :
  88. return (sc_boolean) (stateConfVector[0] >= mr_A
  89. && stateConfVector[0] <= mr_A_r_X2);
  90. case mr_A_r_X1 :
  91. return (sc_boolean) (stateConfVector[0] == mr_A_r_X1
  92. );
  93. case mr_A_r_X2 :
  94. return (sc_boolean) (stateConfVector[0] == mr_A_r_X2
  95. );
  96. case mr_B :
  97. return (sc_boolean) (stateConfVector[0] == mr_B
  98. );
  99. default: return false;
  100. }
  101. }
  102. HistoryWithExitPoint::DefaultSCI* HistoryWithExitPoint::getDefaultSCI()
  103. {
  104. return &iface;
  105. }
  106. void HistoryWithExitPoint::DefaultSCI::raise_push()
  107. {
  108. push_raised = true;
  109. }
  110. void HistoryWithExitPoint::raise_push()
  111. {
  112. iface.raise_push();
  113. }
  114. void HistoryWithExitPoint::DefaultSCI::raise_back()
  115. {
  116. back_raised = true;
  117. }
  118. void HistoryWithExitPoint::raise_back()
  119. {
  120. iface.raise_back();
  121. }
  122. void HistoryWithExitPoint::DefaultSCI::raise_next()
  123. {
  124. next_raised = true;
  125. }
  126. void HistoryWithExitPoint::raise_next()
  127. {
  128. iface.raise_next();
  129. }
  130. // implementations of all internal functions
  131. sc_boolean HistoryWithExitPoint::check_mr_A_r_X1_tr0_tr0()
  132. {
  133. return iface.next_raised;
  134. }
  135. sc_boolean HistoryWithExitPoint::check_mr_A_r_X1_tr1_tr1()
  136. {
  137. return iface.push_raised;
  138. }
  139. sc_boolean HistoryWithExitPoint::check_mr_A_r_X2_tr0_tr0()
  140. {
  141. return iface.next_raised;
  142. }
  143. sc_boolean HistoryWithExitPoint::check_mr_A_r_X2_tr1_tr1()
  144. {
  145. return iface.push_raised;
  146. }
  147. sc_boolean HistoryWithExitPoint::check_mr_B_tr0_tr0()
  148. {
  149. return iface.back_raised;
  150. }
  151. void HistoryWithExitPoint::effect_mr_A_tr0()
  152. {
  153. exseq_mr_A();
  154. enseq_mr_B_default();
  155. }
  156. void HistoryWithExitPoint::effect_mr_A_r_X1_tr0()
  157. {
  158. exseq_mr_A_r_X1();
  159. enseq_mr_A_r_X2_default();
  160. }
  161. void HistoryWithExitPoint::effect_mr_A_r_X1_tr1()
  162. {
  163. exseq_mr_A_r_X1();
  164. react_mr_A_r_exit_to_B();
  165. }
  166. void HistoryWithExitPoint::effect_mr_A_r_X2_tr0()
  167. {
  168. exseq_mr_A_r_X2();
  169. enseq_mr_A_r_X1_default();
  170. }
  171. void HistoryWithExitPoint::effect_mr_A_r_X2_tr1()
  172. {
  173. exseq_mr_A_r_X2();
  174. react_mr_A_r_exit_to_B();
  175. }
  176. void HistoryWithExitPoint::effect_mr_B_tr0()
  177. {
  178. exseq_mr_B();
  179. enseq_mr_A_default();
  180. }
  181. /* 'default' enter sequence for state A */
  182. void HistoryWithExitPoint::enseq_mr_A_default()
  183. {
  184. /* 'default' enter sequence for state A */
  185. enseq_mr_A_r_default();
  186. }
  187. /* 'default' enter sequence for state X1 */
  188. void HistoryWithExitPoint::enseq_mr_A_r_X1_default()
  189. {
  190. /* 'default' enter sequence for state X1 */
  191. stateConfVector[0] = mr_A_r_X1;
  192. stateConfVectorPosition = 0;
  193. historyVector[0] = stateConfVector[0];
  194. }
  195. /* 'default' enter sequence for state X2 */
  196. void HistoryWithExitPoint::enseq_mr_A_r_X2_default()
  197. {
  198. /* 'default' enter sequence for state X2 */
  199. stateConfVector[0] = mr_A_r_X2;
  200. stateConfVectorPosition = 0;
  201. historyVector[0] = stateConfVector[0];
  202. }
  203. /* 'default' enter sequence for state B */
  204. void HistoryWithExitPoint::enseq_mr_B_default()
  205. {
  206. /* 'default' enter sequence for state B */
  207. stateConfVector[0] = mr_B;
  208. stateConfVectorPosition = 0;
  209. }
  210. /* 'default' enter sequence for region mr */
  211. void HistoryWithExitPoint::enseq_mr_default()
  212. {
  213. /* 'default' enter sequence for region mr */
  214. react_mr__entry_Default();
  215. }
  216. /* 'default' enter sequence for region r */
  217. void HistoryWithExitPoint::enseq_mr_A_r_default()
  218. {
  219. /* 'default' enter sequence for region r */
  220. react_mr_A_r__entry_Default();
  221. }
  222. /* shallow enterSequence with history in child r */
  223. void HistoryWithExitPoint::shenseq_mr_A_r()
  224. {
  225. /* shallow enterSequence with history in child r */
  226. /* Handle shallow history entry of r */
  227. switch(historyVector[ 0 ])
  228. {
  229. case mr_A_r_X1 :
  230. {
  231. enseq_mr_A_r_X1_default();
  232. break;
  233. }
  234. case mr_A_r_X2 :
  235. {
  236. enseq_mr_A_r_X2_default();
  237. break;
  238. }
  239. default: break;
  240. }
  241. }
  242. /* Default exit sequence for state A */
  243. void HistoryWithExitPoint::exseq_mr_A()
  244. {
  245. /* Default exit sequence for state A */
  246. exseq_mr_A_r();
  247. }
  248. /* Default exit sequence for state X1 */
  249. void HistoryWithExitPoint::exseq_mr_A_r_X1()
  250. {
  251. /* Default exit sequence for state X1 */
  252. stateConfVector[0] = HistoryWithExitPoint_last_state;
  253. stateConfVectorPosition = 0;
  254. }
  255. /* Default exit sequence for state X2 */
  256. void HistoryWithExitPoint::exseq_mr_A_r_X2()
  257. {
  258. /* Default exit sequence for state X2 */
  259. stateConfVector[0] = HistoryWithExitPoint_last_state;
  260. stateConfVectorPosition = 0;
  261. }
  262. /* Default exit sequence for state B */
  263. void HistoryWithExitPoint::exseq_mr_B()
  264. {
  265. /* Default exit sequence for state B */
  266. stateConfVector[0] = HistoryWithExitPoint_last_state;
  267. stateConfVectorPosition = 0;
  268. }
  269. /* Default exit sequence for region mr */
  270. void HistoryWithExitPoint::exseq_mr()
  271. {
  272. /* Default exit sequence for region mr */
  273. /* Handle exit of all possible states (of HistoryWithExitPoint.mr) at position 0... */
  274. switch(stateConfVector[ 0 ])
  275. {
  276. case mr_A_r_X1 :
  277. {
  278. exseq_mr_A_r_X1();
  279. break;
  280. }
  281. case mr_A_r_X2 :
  282. {
  283. exseq_mr_A_r_X2();
  284. break;
  285. }
  286. case mr_B :
  287. {
  288. exseq_mr_B();
  289. break;
  290. }
  291. default: break;
  292. }
  293. }
  294. /* Default exit sequence for region r */
  295. void HistoryWithExitPoint::exseq_mr_A_r()
  296. {
  297. /* Default exit sequence for region r */
  298. /* Handle exit of all possible states (of HistoryWithExitPoint.mr.A.r) at position 0... */
  299. switch(stateConfVector[ 0 ])
  300. {
  301. case mr_A_r_X1 :
  302. {
  303. exseq_mr_A_r_X1();
  304. break;
  305. }
  306. case mr_A_r_X2 :
  307. {
  308. exseq_mr_A_r_X2();
  309. break;
  310. }
  311. default: break;
  312. }
  313. }
  314. /* The reactions of state X1. */
  315. void HistoryWithExitPoint::react_mr_A_r_X1()
  316. {
  317. /* The reactions of state X1. */
  318. if (check_mr_A_r_X1_tr0_tr0())
  319. {
  320. effect_mr_A_r_X1_tr0();
  321. } else
  322. {
  323. if (check_mr_A_r_X1_tr1_tr1())
  324. {
  325. effect_mr_A_r_X1_tr1();
  326. }
  327. }
  328. }
  329. /* The reactions of state X2. */
  330. void HistoryWithExitPoint::react_mr_A_r_X2()
  331. {
  332. /* The reactions of state X2. */
  333. if (check_mr_A_r_X2_tr0_tr0())
  334. {
  335. effect_mr_A_r_X2_tr0();
  336. } else
  337. {
  338. if (check_mr_A_r_X2_tr1_tr1())
  339. {
  340. effect_mr_A_r_X2_tr1();
  341. }
  342. }
  343. }
  344. /* The reactions of state B. */
  345. void HistoryWithExitPoint::react_mr_B()
  346. {
  347. /* The reactions of state B. */
  348. if (check_mr_B_tr0_tr0())
  349. {
  350. effect_mr_B_tr0();
  351. }
  352. }
  353. /* Default react sequence for initial entry */
  354. void HistoryWithExitPoint::react_mr__entry_Default()
  355. {
  356. /* Default react sequence for initial entry */
  357. enseq_mr_A_default();
  358. }
  359. /* Default react sequence for shallow history entry */
  360. void HistoryWithExitPoint::react_mr_A_r__entry_Default()
  361. {
  362. /* Default react sequence for shallow history entry */
  363. /* Enter the region with shallow history */
  364. if (historyVector[0] != HistoryWithExitPoint_last_state)
  365. {
  366. shenseq_mr_A_r();
  367. } else
  368. {
  369. enseq_mr_A_r_X1_default();
  370. }
  371. }
  372. /* The reactions of exit exit_to_B. */
  373. void HistoryWithExitPoint::react_mr_A_r_exit_to_B()
  374. {
  375. /* The reactions of exit exit_to_B. */
  376. effect_mr_A_tr0();
  377. }