Browse Source

Fixes to JIT, seems to work in basic cases

Yentl Van Tendeloo 7 years ago
parent
commit
42db8c7ba3
3 changed files with 15 additions and 4 deletions
  1. 12 3
      kernel/modelverse_kernel/main.py
  2. 2 0
      state/modelverse_state/main.py
  3. 1 1
      wrappers/modelverse_SCCD.py

+ 12 - 3
kernel/modelverse_kernel/main.py

@@ -316,6 +316,7 @@ class ModelverseKernel(object):
             (prev_var, instruction_var), (prev_val, instruction_val) = \
             (prev_var, instruction_var), (prev_val, instruction_val) = \
                         yield [("CALL_ARGS", [self.print_instruction, (var, 0, indent)]),
                         yield [("CALL_ARGS", [self.print_instruction, (var, 0, indent)]),
                                ("CALL_ARGS", [self.print_instruction, (val, 0, indent)])]
                                ("CALL_ARGS", [self.print_instruction, (val, 0, indent)])]
+
             instruction = prev_val + "  " * indent + instruction_var + " = " + instruction_val + "\n"
             instruction = prev_val + "  " * indent + instruction_var + " = " + instruction_val + "\n"
 
 
             if prev_var:
             if prev_var:
@@ -324,9 +325,13 @@ class ModelverseKernel(object):
                 instruction += \
                 instruction += \
                        "  " * nested_indent + "_globs, = yield [('RD', [kwargs['task_root'], 'globals'])]\n" + \
                        "  " * nested_indent + "_globs, = yield [('RD', [kwargs['task_root'], 'globals'])]\n" + \
                        "  " * nested_indent + "_var, = yield [('RD', [_globs, '%s'])]\n" % instruction_var + \
                        "  " * nested_indent + "_var, = yield [('RD', [_globs, '%s'])]\n" % instruction_var + \
+                       "  " * nested_indent + "if _var is None:\n" + \
+                       "  " * (nested_indent + 1) + "_var, = yield [('CN', [])]\n" + \
+                       "  " * (nested_indent + 1) + "yield [('CD', [_globs, '%s', _var])]\n" % instruction_var + \
                        "  " * nested_indent + "_old_edge, = yield [('RDE', [_var, 'value'])]\n" + \
                        "  " * nested_indent + "_old_edge, = yield [('RDE', [_var, 'value'])]\n" + \
                        "  " * nested_indent + "yield [('CD', [_var, 'value', %s])]\n" % instruction_var + \
                        "  " * nested_indent + "yield [('CD', [_var, 'value', %s])]\n" % instruction_var + \
-                       "  " * nested_indent + "yield [('DE', [_old_edge])]\n"
+                       "  " * nested_indent + "yield [('DE', [_old_edge])]\n" + \
+                       "  " * nested_indent + "kwargs['mvk'].jit.register_global('%s', %s)\n" % (instruction_var, instruction_var)
 
 
         elif inst_type["value"] == "call":
         elif inst_type["value"] == "call":
             func_name, = yield [("RD", [inst, "func"])]
             func_name, = yield [("RD", [inst, "func"])]
@@ -353,7 +358,7 @@ class ModelverseKernel(object):
                 value = "func_result_" + str(ModelverseKernel.counter)
                 value = "func_result_" + str(ModelverseKernel.counter)
                 ModelverseKernel.counter += 1
                 ModelverseKernel.counter += 1
                 param_list = "{" + ", ".join(["'%s': %s" % (k, v) for k, v in param_list.items()]) + "}"
                 param_list = "{" + ", ".join(["'%s': %s" % (k, v) for k, v in param_list.items()]) + "}"
-                actual_computation = "%s, = yield [('CALL_ARGS', [kwargs['mvk'].execute_jit_internal, (kwargs['task_root'], %s, kwargs['taskname'], %s)])]\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:
                 if indent == 0:
                     # No indent, meaning that we use it inline
                     # No indent, meaning that we use it inline
@@ -407,6 +412,11 @@ class ModelverseKernel(object):
         else:
         else:
             func = "def " + suggested_name + "(**kwargs):\n" + printed
             func = "def " + suggested_name + "(**kwargs):\n" + printed
         print(func)
         print(func)
+
+        # To write out all generated functions
+        #with open('/tmp/junk/%s' % suggested_name, 'w') as f:
+        #    f.write(func)
+
         raise primitive_functions.PrimitiveFinished(func)
         raise primitive_functions.PrimitiveFinished(func)
 
 
     def jit_compile(self, task_root, inst):
     def jit_compile(self, task_root, inst):
@@ -416,7 +426,6 @@ class ModelverseKernel(object):
             suggested_name = "func_%s" % str(inst)
             suggested_name = "func_%s" % str(inst)
 
 
         # Have the JIT compile the function.
         # Have the JIT compile the function.
-
         if inst is None:
         if inst is None:
             raise ValueError('body_id cannot be None: ' + str(suggested_name))
             raise ValueError('body_id cannot be None: ' + str(suggested_name))
         elif inst in self.jit.jitted_entry_points:
         elif inst in self.jit.jitted_entry_points:

+ 2 - 0
state/modelverse_state/main.py

@@ -176,6 +176,8 @@ class ModelverseState(object):
 
 
     def create_dict(self, source, data, destination):
     def create_dict(self, source, data, destination):
         if source not in self.nodes and source not in self.edges:
         if source not in self.nodes and source not in self.edges:
+            if destination is not None:
+                print("CREATE DICT FAILED FOR " + str(locals()))
             return None
             return None
         elif destination not in self.nodes and destination not in self.edges:
         elif destination not in self.nodes and destination not in self.edges:
             return None
             return None

+ 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)
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
 
-Date:   Mon Apr 23 10:25:50 2018
+Date:   Mon Apr 23 13:56:41 2018
 
 
 Model author: Yentl Van Tendeloo
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server
 Model name:   MvK Server