test_fib_naive.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. import unittest
  2. from modelverse_kernel.main import ModelverseKernel
  3. from utils import execute_until_finished, MvSWrapper, get_inst, get_phase, get_returnvalue, get_phase_ref, read_primitive_interfaces, get_inst_ref
  4. import math
  5. class TestFibNaive(unittest.TestCase):
  6. def setUp(self):
  7. self.mvs = MvSWrapper()
  8. self.root = self.mvs.execute("RR", [])[0]
  9. self.mvk = ModelverseKernel(self.root)
  10. self.primitives = read_primitive_interfaces(self.root, self.mvs)
  11. execute_until_finished(self.mvk, self.mvs, "load_primitives", [])
  12. def test_fib_0(self):
  13. # Test for 'no recursion'
  14. self.helper_construct_and_invoke(0, 1)
  15. def test_fib_1(self):
  16. # Test for 'no recursion'
  17. self.helper_construct_and_invoke(1, 1)
  18. def test_fib_2(self):
  19. # Test for 'single recursion'
  20. self.helper_construct_and_invoke(2, 2)
  21. def test_fib_3(self):
  22. # Test for 'multiple recursion'
  23. self.helper_construct_and_invoke(3, 3)
  24. def test_fib_4(self):
  25. # Test for 'multiple recursion'
  26. self.helper_construct_and_invoke(4, 5)
  27. def test_fib_5(self):
  28. # Test for 'multiple recursion'
  29. self.helper_construct_and_invoke(5, 8)
  30. def test_fib_6(self):
  31. # Test for 'multiple recursion'
  32. self.helper_construct_and_invoke(6, 13)
  33. def test_fib_7(self):
  34. # Test for 'multiple recursion'
  35. self.helper_construct_and_invoke(7, 21)
  36. def helper_construct_and_invoke(self, param, result, fail=False):
  37. # Try to follow the same naming as in the dot file
  38. var_value_4 = self.mvs.execute("CN", [])[0]
  39. var_4 = self.mvs.execute("CNV", ["function"])[0]
  40. signature_4 = self.mvs.execute("CN", [])[0]
  41. params_4 = self.mvs.execute("CN", [])[0]
  42. body_4 = self.mvs.execute("CN", [])[0]
  43. params_4_a = self.mvs.execute("CN", [])[0]
  44. invoke_params = self.mvs.execute("CN", [])[0]
  45. param_1a = self.mvs.execute("CN", [])[0]
  46. param_1b = self.mvs.execute("CN", [])[0]
  47. param_2a = self.mvs.execute("CN", [])[0]
  48. param_2b = self.mvs.execute("CN", [])[0]
  49. param_3a = self.mvs.execute("CN", [])[0]
  50. param_3b = self.mvs.execute("CN", [])[0]
  51. param_4a = self.mvs.execute("CN", [])[0]
  52. param_4b = self.mvs.execute("CN", [])[0]
  53. param_5a = self.mvs.execute("CN", [])[0]
  54. param_5b = self.mvs.execute("CN", [])[0]
  55. param_6a = self.mvs.execute("CN", [])[0]
  56. param_6b = self.mvs.execute("CN", [])[0]
  57. params_4_a = self.mvs.execute("CN", [])[0]
  58. value_1 = self.mvs.execute("CNV", [1])[0]
  59. value_2 = self.mvs.execute("CNV", [1])[0]
  60. value_3 = self.mvs.execute("CNV", [1])[0]
  61. value_4 = self.mvs.execute("CNV", [param])[0]
  62. value_5 = self.mvs.execute("CNV", [2])[0]
  63. value_a = self.mvs.execute("CNV", ["a"])[0]
  64. value_b = self.mvs.execute("CNV", ["b"])[0]
  65. value_c = self.mvs.execute("CNV", ["c"])[0]
  66. value_a2 = self.mvs.execute("CNV", ["a"])[0]
  67. value_b2 = self.mvs.execute("CNV", ["b"])[0]
  68. value_a3 = self.mvs.execute("CNV", ["a"])[0]
  69. value_b3 = self.mvs.execute("CNV", ["b"])[0]
  70. value_a4 = self.mvs.execute("CNV", ["a"])[0]
  71. value_b4 = self.mvs.execute("CNV", ["b"])[0]
  72. value_n = self.mvs.execute("CNV", ["n"])[0]
  73. value_n2 = self.mvs.execute("CNV", ["n"])[0]
  74. value_n3 = self.mvs.execute("CNV", ["n"])[0]
  75. access_resolve_4 = self.mvs.execute("CNV", [{"value":"access"}])[0]
  76. access_resolve_7 = self.mvs.execute("CNV", [{"value":"access"}])[0]
  77. access_resolve_8 = self.mvs.execute("CNV", [{"value":"access"}])[0]
  78. if_1 = self.mvs.execute("CNV", [{"value":"if"}])[0]
  79. call_1 = self.mvs.execute("CNV", [{"value":"call"}])[0]
  80. call_2 = self.mvs.execute("CNV", [{"value":"call"}])[0]
  81. call_3 = self.mvs.execute("CNV", [{"value":"call"}])[0]
  82. call_4 = self.mvs.execute("CNV", [{"value":"call"}])[0]
  83. call_5 = self.mvs.execute("CNV", [{"value":"call"}])[0]
  84. call_6 = self.mvs.execute("CNV", [{"value":"call"}])[0]
  85. invoke_fib = self.mvs.execute("CNV", [{"value":"call"}])[0]
  86. resolve_2 = self.mvs.execute("CNV", [{"value":"resolve"}])[0]
  87. resolve_4 = self.mvs.execute("CNV", [{"value":"resolve"}])[0]
  88. resolve_6 = self.mvs.execute("CNV", [{"value":"resolve"}])[0]
  89. resolve_7 = self.mvs.execute("CNV", [{"value":"resolve"}])[0]
  90. resolve_8 = self.mvs.execute("CNV", [{"value":"resolve"}])[0]
  91. resolve_11 = self.mvs.execute("CNV", [{"value":"resolve"}])[0]
  92. access_1 = self.mvs.execute("CNV", [{"value":"access"}])[0]
  93. access_3 = self.mvs.execute("CNV", [{"value":"access"}])[0]
  94. access_4 = self.mvs.execute("CNV", [{"value":"access"}])[0]
  95. return_1 = self.mvs.execute("CNV", [{"value":"return"}])[0]
  96. return_2 = self.mvs.execute("CNV", [{"value":"return"}])[0]
  97. const_1 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
  98. const_2 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
  99. const_3 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
  100. const_4 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
  101. const_5 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
  102. const_6 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
  103. # Rebind the invoke_fib to the initial IP
  104. root = self.root
  105. _globals = self.mvs.execute("RD", [root, "__hierarchy"])[0]
  106. self.mvs.execute("DE", [self.mvs.execute("RDE", [_globals, "__IP"])[0]])
  107. self.mvs.execute("CD", [_globals, "__IP", invoke_fib])
  108. self.mvs.execute("CD", [var_value_4, "value", signature_4])
  109. self.mvs.execute("CD", [signature_4, "body", if_1])
  110. self.mvs.execute("CD", [signature_4, "params", params_4])
  111. self.mvs.execute("CD", [params_4, "n", params_4_a])
  112. self.mvs.execute("CD", [if_1, "cond", call_1])
  113. self.mvs.execute("CD", [if_1, "then", return_2])
  114. self.mvs.execute("CD", [if_1, "else", return_1])
  115. node_3 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
  116. self.mvs.execute("CD", [call_1, "func", node_3])
  117. self.mvs.execute("CD", [node_3, "node", self.primitives["integer_gt"]])
  118. self.mvs.execute("CD", [call_1, "params", param_1a])
  119. self.mvs.execute("CD", [param_1a, "name", value_a])
  120. self.mvs.execute("CD", [param_1a, "value", access_1])
  121. self.mvs.execute("CD", [access_1, "var", resolve_2])
  122. self.mvs.execute("CD", [resolve_2, "var", params_4_a])
  123. self.mvs.execute("CD", [param_1a, "next_param", param_1b])
  124. self.mvs.execute("CD", [param_1b, "name", value_b])
  125. self.mvs.execute("CD", [param_1b, "value", const_1])
  126. self.mvs.execute("CD", [const_1, "node", value_1])
  127. self.mvs.execute("CD", [call_1, "last_param", param_1b])
  128. self.mvs.execute("CD", [return_1, "value", const_2])
  129. self.mvs.execute("CD", [const_2, "node", value_2])
  130. self.mvs.execute("CD", [return_2, "value", call_2])
  131. node_2 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
  132. self.mvs.execute("CD", [call_2, "func", node_2])
  133. self.mvs.execute("CD", [node_2, "node", self.primitives["integer_addition"]])
  134. self.mvs.execute("CD", [call_2, "params", param_2a])
  135. self.mvs.execute("CD", [call_2, "last_param", param_2b])
  136. self.mvs.execute("CD", [param_2a, "name", value_a2])
  137. self.mvs.execute("CD", [param_2a, "value", call_5])
  138. self.mvs.execute("CD", [param_2b, "name", value_b2])
  139. self.mvs.execute("CD", [param_2b, "value", call_3])
  140. self.mvs.execute("CD", [param_2a, "next_param", param_2b])
  141. self.mvs.execute("CD", [call_3, "func", access_resolve_4])
  142. self.mvs.execute("CD", [access_resolve_4, "var", resolve_4])
  143. self.mvs.execute("CD", [resolve_4, "var", var_4])
  144. self.mvs.execute("CD", [call_3, "params", param_3a])
  145. self.mvs.execute("CD", [call_3, "last_param", param_3a])
  146. self.mvs.execute("CD", [param_3a, "name", value_n])
  147. self.mvs.execute("CD", [param_3a, "value", call_4])
  148. node_1 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
  149. self.mvs.execute("CD", [call_4, "func", node_1])
  150. self.mvs.execute("CD", [node_1, "node", self.primitives["integer_subtraction"]])
  151. self.mvs.execute("CD", [call_4, "params", param_4a])
  152. self.mvs.execute("CD", [param_4a, "name", value_a3])
  153. self.mvs.execute("CD", [param_4a, "value", access_3])
  154. self.mvs.execute("CD", [access_3, "var", resolve_6])
  155. self.mvs.execute("CD", [resolve_6, "var", params_4_a])
  156. self.mvs.execute("CD", [param_4a, "next_param", param_4b])
  157. self.mvs.execute("CD", [param_4b, "name", value_b3])
  158. self.mvs.execute("CD", [param_4b, "value", const_3])
  159. self.mvs.execute("CD", [const_3, "node", value_3])
  160. self.mvs.execute("CD", [call_4, "last_param", param_4b])
  161. self.mvs.execute("CD", [call_5, "func", access_resolve_8])
  162. self.mvs.execute("CD", [access_resolve_8, "var", resolve_8])
  163. self.mvs.execute("CD", [resolve_8, "var", var_4])
  164. self.mvs.execute("CD", [call_5, "params", param_5a])
  165. self.mvs.execute("CD", [call_5, "last_param", param_5a])
  166. self.mvs.execute("CD", [param_5a, "name", value_n])
  167. self.mvs.execute("CD", [param_5a, "value", call_6])
  168. self.mvs.execute("CD", [call_6, "func", node_1])
  169. self.mvs.execute("CD", [call_6, "params", param_6a])
  170. self.mvs.execute("CD", [param_6a, "name", value_a4])
  171. self.mvs.execute("CD", [param_6a, "value", access_4])
  172. self.mvs.execute("CD", [access_4, "var", resolve_11])
  173. self.mvs.execute("CD", [resolve_11, "var", params_4_a])
  174. self.mvs.execute("CD", [param_6b, "name", value_b4])
  175. self.mvs.execute("CD", [param_6b, "value", const_5])
  176. self.mvs.execute("CD", [const_5, "node", value_5])
  177. self.mvs.execute("CD", [call_6, "last_param", param_6b])
  178. self.mvs.execute("CD", [param_6a, "next_param", param_6b])
  179. self.mvs.execute("CD", [invoke_fib, "func", access_resolve_7])
  180. self.mvs.execute("CD", [access_resolve_7, "var", resolve_7])
  181. self.mvs.execute("CD", [resolve_7, "var", var_4])
  182. self.mvs.execute("CD", [invoke_fib, "params", invoke_params])
  183. self.mvs.execute("CD", [invoke_fib, "last_param", invoke_params])
  184. self.mvs.execute("CD", [invoke_params, "value", const_4])
  185. self.mvs.execute("CD", [invoke_params, "name", value_n2])
  186. self.mvs.execute("CD", [const_4, "node", value_4])
  187. self.mvs.execute("CD", [invoke_fib, "next", const_6])
  188. self.mvs.execute("CD", [const_6, "node", value_c])
  189. execute_until_finished(self.mvk, self.mvs, "initialize_new_task", ["task_1"])
  190. # Define in globals for task, kind of a hack...
  191. t = self.mvs.execute("CE", [self.mvs.execute("RD", [self.mvs.execute("RD", [root, "task_1"])[0], "globals"])[0] , var_value_4])[0]
  192. self.mvs.execute("CE", [t, var_4])
  193. ### Execute rules
  194. self.assertEquals(get_inst(self.root, self.mvs), "call")
  195. self.assertEquals(get_phase(self.root, self.mvs), "init")
  196. execute_until_finished(self.mvk, self.mvs)
  197. #i = 0
  198. while (get_inst_ref(self.root, self.mvs) != const_6) or (get_phase(self.root, self.mvs) != "init"):
  199. #print("EXEC (%s) -- (%s, %s)" % (i, get_inst(self.root, self.mvs), get_phase(self.root, self.mvs)))
  200. #i += 1
  201. #self.mvs.mvs.dump(0, "%i.dot" % i)
  202. execute_until_finished(self.mvk, self.mvs)
  203. if not fail:
  204. self.assertEquals(get_returnvalue(self.root, self.mvs), result)