123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- import unittest
- from modelverse_kernel.main import ModelverseKernel
- from utils import execute_until_finished, MvSWrapper, get_inst, get_phase, get_returnvalue, get_phase_ref, read_primitive_interfaces, get_inst_ref
- import math
- class TestFibNaive(unittest.TestCase):
- def setUp(self):
- self.mvs = MvSWrapper()
- self.root = self.mvs.execute("RR", [])[0]
- self.mvk = ModelverseKernel(self.root)
- self.primitives = read_primitive_interfaces(self.root, self.mvs)
- execute_until_finished(self.mvk, self.mvs, "load_primitives", [])
- def test_fib_0(self):
- # Test for 'no recursion'
- self.helper_construct_and_invoke(0, 1)
- def test_fib_1(self):
- # Test for 'no recursion'
- self.helper_construct_and_invoke(1, 1)
- def test_fib_2(self):
- # Test for 'single recursion'
- self.helper_construct_and_invoke(2, 2)
- def test_fib_3(self):
- # Test for 'multiple recursion'
- self.helper_construct_and_invoke(3, 3)
- def test_fib_4(self):
- # Test for 'multiple recursion'
- self.helper_construct_and_invoke(4, 5)
- def test_fib_5(self):
- # Test for 'multiple recursion'
- self.helper_construct_and_invoke(5, 8)
- def test_fib_6(self):
- # Test for 'multiple recursion'
- self.helper_construct_and_invoke(6, 13)
- def test_fib_7(self):
- # Test for 'multiple recursion'
- self.helper_construct_and_invoke(7, 21)
- def helper_construct_and_invoke(self, param, result, fail=False):
- # Try to follow the same naming as in the dot file
- var_value_4 = self.mvs.execute("CN", [])[0]
- var_4 = self.mvs.execute("CNV", ["function"])[0]
- signature_4 = self.mvs.execute("CN", [])[0]
- params_4 = self.mvs.execute("CN", [])[0]
- body_4 = self.mvs.execute("CN", [])[0]
- params_4_a = self.mvs.execute("CN", [])[0]
- invoke_params = self.mvs.execute("CN", [])[0]
- param_1a = self.mvs.execute("CN", [])[0]
- param_1b = self.mvs.execute("CN", [])[0]
- param_2a = self.mvs.execute("CN", [])[0]
- param_2b = self.mvs.execute("CN", [])[0]
- param_3a = self.mvs.execute("CN", [])[0]
- param_3b = self.mvs.execute("CN", [])[0]
- param_4a = self.mvs.execute("CN", [])[0]
- param_4b = self.mvs.execute("CN", [])[0]
- param_5a = self.mvs.execute("CN", [])[0]
- param_5b = self.mvs.execute("CN", [])[0]
- param_6a = self.mvs.execute("CN", [])[0]
- param_6b = self.mvs.execute("CN", [])[0]
- params_4_a = self.mvs.execute("CN", [])[0]
- value_1 = self.mvs.execute("CNV", [1])[0]
- value_2 = self.mvs.execute("CNV", [1])[0]
- value_3 = self.mvs.execute("CNV", [1])[0]
- value_4 = self.mvs.execute("CNV", [param])[0]
- value_5 = self.mvs.execute("CNV", [2])[0]
- value_a = self.mvs.execute("CNV", ["a"])[0]
- value_b = self.mvs.execute("CNV", ["b"])[0]
- value_c = self.mvs.execute("CNV", ["c"])[0]
- value_a2 = self.mvs.execute("CNV", ["a"])[0]
- value_b2 = self.mvs.execute("CNV", ["b"])[0]
- value_a3 = self.mvs.execute("CNV", ["a"])[0]
- value_b3 = self.mvs.execute("CNV", ["b"])[0]
- value_a4 = self.mvs.execute("CNV", ["a"])[0]
- value_b4 = self.mvs.execute("CNV", ["b"])[0]
- value_n = self.mvs.execute("CNV", ["n"])[0]
- value_n2 = self.mvs.execute("CNV", ["n"])[0]
- value_n3 = self.mvs.execute("CNV", ["n"])[0]
- access_resolve_4 = self.mvs.execute("CNV", [{"value":"access"}])[0]
- access_resolve_7 = self.mvs.execute("CNV", [{"value":"access"}])[0]
- access_resolve_8 = self.mvs.execute("CNV", [{"value":"access"}])[0]
- if_1 = self.mvs.execute("CNV", [{"value":"if"}])[0]
- call_1 = self.mvs.execute("CNV", [{"value":"call"}])[0]
- call_2 = self.mvs.execute("CNV", [{"value":"call"}])[0]
- call_3 = self.mvs.execute("CNV", [{"value":"call"}])[0]
- call_4 = self.mvs.execute("CNV", [{"value":"call"}])[0]
- call_5 = self.mvs.execute("CNV", [{"value":"call"}])[0]
- call_6 = self.mvs.execute("CNV", [{"value":"call"}])[0]
- invoke_fib = self.mvs.execute("CNV", [{"value":"call"}])[0]
- resolve_2 = self.mvs.execute("CNV", [{"value":"resolve"}])[0]
- resolve_4 = self.mvs.execute("CNV", [{"value":"resolve"}])[0]
- resolve_6 = self.mvs.execute("CNV", [{"value":"resolve"}])[0]
- resolve_7 = self.mvs.execute("CNV", [{"value":"resolve"}])[0]
- resolve_8 = self.mvs.execute("CNV", [{"value":"resolve"}])[0]
- resolve_11 = self.mvs.execute("CNV", [{"value":"resolve"}])[0]
- access_1 = self.mvs.execute("CNV", [{"value":"access"}])[0]
- access_3 = self.mvs.execute("CNV", [{"value":"access"}])[0]
- access_4 = self.mvs.execute("CNV", [{"value":"access"}])[0]
- return_1 = self.mvs.execute("CNV", [{"value":"return"}])[0]
- return_2 = self.mvs.execute("CNV", [{"value":"return"}])[0]
- const_1 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
- const_2 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
- const_3 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
- const_4 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
- const_5 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
- const_6 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
- # Rebind the invoke_fib to the initial IP
- root = self.root
- _globals = self.mvs.execute("RD", [root, "__hierarchy"])[0]
- self.mvs.execute("DE", [self.mvs.execute("RDE", [_globals, "__IP"])[0]])
- self.mvs.execute("CD", [_globals, "__IP", invoke_fib])
- self.mvs.execute("CD", [var_value_4, "value", signature_4])
- self.mvs.execute("CD", [signature_4, "body", if_1])
- self.mvs.execute("CD", [signature_4, "params", params_4])
- self.mvs.execute("CD", [params_4, "n", params_4_a])
- self.mvs.execute("CD", [if_1, "cond", call_1])
- self.mvs.execute("CD", [if_1, "then", return_2])
- self.mvs.execute("CD", [if_1, "else", return_1])
- node_3 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
- self.mvs.execute("CD", [call_1, "func", node_3])
- self.mvs.execute("CD", [node_3, "node", self.primitives["integer_gt"]])
- self.mvs.execute("CD", [call_1, "params", param_1a])
- self.mvs.execute("CD", [param_1a, "name", value_a])
- self.mvs.execute("CD", [param_1a, "value", access_1])
- self.mvs.execute("CD", [access_1, "var", resolve_2])
- self.mvs.execute("CD", [resolve_2, "var", params_4_a])
- self.mvs.execute("CD", [param_1a, "next_param", param_1b])
- self.mvs.execute("CD", [param_1b, "name", value_b])
- self.mvs.execute("CD", [param_1b, "value", const_1])
- self.mvs.execute("CD", [const_1, "node", value_1])
- self.mvs.execute("CD", [call_1, "last_param", param_1b])
- self.mvs.execute("CD", [return_1, "value", const_2])
- self.mvs.execute("CD", [const_2, "node", value_2])
- self.mvs.execute("CD", [return_2, "value", call_2])
- node_2 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
- self.mvs.execute("CD", [call_2, "func", node_2])
- self.mvs.execute("CD", [node_2, "node", self.primitives["integer_addition"]])
- self.mvs.execute("CD", [call_2, "params", param_2a])
- self.mvs.execute("CD", [call_2, "last_param", param_2b])
- self.mvs.execute("CD", [param_2a, "name", value_a2])
- self.mvs.execute("CD", [param_2a, "value", call_5])
- self.mvs.execute("CD", [param_2b, "name", value_b2])
- self.mvs.execute("CD", [param_2b, "value", call_3])
- self.mvs.execute("CD", [param_2a, "next_param", param_2b])
- self.mvs.execute("CD", [call_3, "func", access_resolve_4])
- self.mvs.execute("CD", [access_resolve_4, "var", resolve_4])
- self.mvs.execute("CD", [resolve_4, "var", var_4])
- self.mvs.execute("CD", [call_3, "params", param_3a])
- self.mvs.execute("CD", [call_3, "last_param", param_3a])
- self.mvs.execute("CD", [param_3a, "name", value_n])
- self.mvs.execute("CD", [param_3a, "value", call_4])
- node_1 = self.mvs.execute("CNV", [{"value":"constant"}])[0]
- self.mvs.execute("CD", [call_4, "func", node_1])
- self.mvs.execute("CD", [node_1, "node", self.primitives["integer_subtraction"]])
- self.mvs.execute("CD", [call_4, "params", param_4a])
- self.mvs.execute("CD", [param_4a, "name", value_a3])
- self.mvs.execute("CD", [param_4a, "value", access_3])
- self.mvs.execute("CD", [access_3, "var", resolve_6])
- self.mvs.execute("CD", [resolve_6, "var", params_4_a])
- self.mvs.execute("CD", [param_4a, "next_param", param_4b])
- self.mvs.execute("CD", [param_4b, "name", value_b3])
- self.mvs.execute("CD", [param_4b, "value", const_3])
- self.mvs.execute("CD", [const_3, "node", value_3])
- self.mvs.execute("CD", [call_4, "last_param", param_4b])
- self.mvs.execute("CD", [call_5, "func", access_resolve_8])
- self.mvs.execute("CD", [access_resolve_8, "var", resolve_8])
- self.mvs.execute("CD", [resolve_8, "var", var_4])
- self.mvs.execute("CD", [call_5, "params", param_5a])
- self.mvs.execute("CD", [call_5, "last_param", param_5a])
- self.mvs.execute("CD", [param_5a, "name", value_n])
- self.mvs.execute("CD", [param_5a, "value", call_6])
- self.mvs.execute("CD", [call_6, "func", node_1])
- self.mvs.execute("CD", [call_6, "params", param_6a])
- self.mvs.execute("CD", [param_6a, "name", value_a4])
- self.mvs.execute("CD", [param_6a, "value", access_4])
- self.mvs.execute("CD", [access_4, "var", resolve_11])
- self.mvs.execute("CD", [resolve_11, "var", params_4_a])
- self.mvs.execute("CD", [param_6b, "name", value_b4])
- self.mvs.execute("CD", [param_6b, "value", const_5])
- self.mvs.execute("CD", [const_5, "node", value_5])
- self.mvs.execute("CD", [call_6, "last_param", param_6b])
- self.mvs.execute("CD", [param_6a, "next_param", param_6b])
- self.mvs.execute("CD", [invoke_fib, "func", access_resolve_7])
- self.mvs.execute("CD", [access_resolve_7, "var", resolve_7])
- self.mvs.execute("CD", [resolve_7, "var", var_4])
- self.mvs.execute("CD", [invoke_fib, "params", invoke_params])
- self.mvs.execute("CD", [invoke_fib, "last_param", invoke_params])
- self.mvs.execute("CD", [invoke_params, "value", const_4])
- self.mvs.execute("CD", [invoke_params, "name", value_n2])
- self.mvs.execute("CD", [const_4, "node", value_4])
- self.mvs.execute("CD", [invoke_fib, "next", const_6])
- self.mvs.execute("CD", [const_6, "node", value_c])
- execute_until_finished(self.mvk, self.mvs, "initialize_new_task", ["task_1"])
- # Define in globals for task, kind of a hack...
- t = self.mvs.execute("CE", [self.mvs.execute("RD", [self.mvs.execute("RD", [root, "task_1"])[0], "globals"])[0] , var_value_4])[0]
- self.mvs.execute("CE", [t, var_4])
- ### Execute rules
- self.assertEquals(get_inst(self.root, self.mvs), "call")
- self.assertEquals(get_phase(self.root, self.mvs), "init")
- execute_until_finished(self.mvk, self.mvs)
- #i = 0
- while (get_inst_ref(self.root, self.mvs) != const_6) or (get_phase(self.root, self.mvs) != "init"):
- #print("EXEC (%s) -- (%s, %s)" % (i, get_inst(self.root, self.mvs), get_phase(self.root, self.mvs)))
- #i += 1
- #self.mvs.mvs.dump(0, "%i.dot" % i)
- execute_until_finished(self.mvk, self.mvs)
- if not fail:
- self.assertEquals(get_returnvalue(self.root, self.mvs), result)
|