Browse Source

Fixed resolving of globals in JIT

Yentl Van Tendeloo 7 years ago
parent
commit
05bc4c6d3a
2 changed files with 27 additions and 18 deletions
  1. 26 17
      kernel/modelverse_kernel/main.py
  2. 1 1
      wrappers/modelverse_SCCD.py

+ 26 - 17
kernel/modelverse_kernel/main.py

@@ -159,6 +159,21 @@ class ModelverseKernel(object):
             yield [("CALL", [gen])]
             yield [("END_TRY", [])]
 
+    def execute_jit_internal(self, task_root, inst, taskname, params):
+        print("EXEC INTERNAL")
+        gen = self.execute_jit(task_root, inst, taskname, params)
+        print("Got generator: " + str(gen))
+
+        def handle_jit_failed(exception):
+            # Try again, but this time without the JIT.
+            gen = self.get_inst_phase_generator(inst_v, self.phase_v, task_root)
+            yield [("TAIL_CALL", [gen])]
+
+        yield [("TRY", [])]
+        yield [("CATCH", [jit.JitCompilationFailedException, handle_jit_failed])]
+        yield [("CALL", [gen])]
+        yield [("END_TRY", [])]
+
     def get_inst_phase_generator(self, inst_v, phase_v, task_root):
         """Gets a generator for the given instruction in the given phase,
            for the specified task root."""
@@ -248,10 +263,10 @@ class ModelverseKernel(object):
             str_value, = yield [("RV", [value])]
             if str_value:
                 # Is a global
-                prev = "  " * nested_indent + "_globs, = yield [('RD', [kwargs['root'], '__globals'])]\n" + \
-                       "  " * nested_indent + "%s, = yield [('RD', [_globs, '%s'])]\n" % (str_value, str_value)
+                prev = "  " * nested_indent + "_globs, = yield [('RD', [kwargs['task_root'], 'globals'])]\n" + \
+                       "  " * nested_indent + "%s, = yield [('RD', [_globs, '%s'])]\n" % (str_value, str_value) + \
+                       "  " * nested_indent + "%s, = yield [('RD', [%s, 'var'])]\n" % (str_value, str_value)
                 instruction = str_value
-                print("Resolving global: " + str(str_value))
             else:
                 # Is a local
                 instruction = "var_%s" % value
@@ -267,10 +282,11 @@ class ModelverseKernel(object):
             if prev_var:
                 # Got something to do before the variable is usable, so this is a global!
                 # Therefore we actually do the operation in the Modelverse as well!
-                prev = "  " * nested_indent + "_globs = yield [('RD', [kwargs['root'], '__globals'])]\n" + \
-                       "  " * nested_indent + "_old_edge = yield [('RDE', [_globs, '%s'])]\n" % (instruction_var) + \
-                       "  " * nested_indent + "yield [('DE', [_old_edge])]\n" + \
-                       "  " * nested_indent + "yield [('CD', [_globs, '%s', %s])]\n" % (instruction_var, instruction_val)
+                prev = "  " * nested_indent + "_globs, = yield [('RD', [kwargs['task_root'], 'globals'])]\n" + \
+                       "  " * nested_indent + "_var, = yield [('RD', [_globs, '%s'])]\n" % instruction_var + \
+                       "  " * nested_indent + "_old_edge, = yield [('RDE', [_var, 'var'])]\n" + \
+                       "  " * nested_indent + "yield [('CD', [_var, 'var', %s])]\n" % instruction_var + \
+                       "  " * nested_indent + "yield [('DE', [_old_edge])]\n"
 
         elif inst_type["value"] == "call":
             func_name, = yield [("RD", [inst, "func"])]
@@ -297,7 +313,7 @@ class ModelverseKernel(object):
                 value = "func_result_" + str(ModelverseKernel.counter)
                 ModelverseKernel.counter += 1
                 param_list = "{" + ", ".join(["'%s': %s" % (k, v) for k, v in param_list.items()]) + "}"
-                actual_computation = "%s, = yield [('CALL_KWARGS', [%s, dict(%s.items() + kwargs.items())])]\n" % (value, func_name, param_list)
+                actual_computation = "%s, = yield [('CALL_ARGS', [kwargs['mvk'].execute_jit_internal, (kwargs['task_root'], %s, kwargs['taskname'], %s)])]\n" % (value, func_name, param_list)
 
                 if indent == 0:
                     # No indent, meaning that we use it inline
@@ -375,15 +391,7 @@ class ModelverseKernel(object):
 
         raise primitive_functions.PrimitiveFinished(compiled_func)
 
-        """
-        try:
-            raise primitive_functions.PrimitiveFinished(compiled_func)
-        except Exception as e:
-            print("Exception: " + str(e))
-            raise jit.JitCompilationFailedException("FAIL")
-        """
-
-    def execute_jit(self, task_root, inst, taskname):
+    def execute_jit(self, task_root, inst, taskname, params = {}):
         # execute_jit
         task_frame, =    yield [("RD", [task_root, "frame"])]
         symbols, =       yield [("RD", [task_frame, "symbols"])]
@@ -394,6 +402,7 @@ class ModelverseKernel(object):
         dict_values = yield [("RD", [i, "value"]) for i in dict_values_elem]
 
         parameters = dict(list(zip(dict_keys, dict_values)))
+        parameters.update(params)
 
         parameters["root"] = self.root
         parameters["task_root"] = task_root

+ 1 - 1
wrappers/modelverse_SCCD.py

@@ -1,7 +1,7 @@
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
-Date:   Mon Apr  9 11:16:51 2018
+Date:   Mon Apr  9 11:49:33 2018
 
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server