Procházet zdrojové kódy

Fixes to JIT, seems to work in basic cases

Yentl Van Tendeloo před 7 roky
rodič
revize
42db8c7ba3

+ 12 - 3
kernel/modelverse_kernel/main.py

@@ -316,6 +316,7 @@ class ModelverseKernel(object):
             (prev_var, instruction_var), (prev_val, instruction_val) = \
                         yield [("CALL_ARGS", [self.print_instruction, (var, 0, indent)]),
                                ("CALL_ARGS", [self.print_instruction, (val, 0, indent)])]
+
             instruction = prev_val + "  " * indent + instruction_var + " = " + instruction_val + "\n"
 
             if prev_var:
@@ -324,9 +325,13 @@ class ModelverseKernel(object):
                 instruction += \
                        "  " * nested_indent + "_globs, = yield [('RD', [kwargs['task_root'], 'globals'])]\n" + \
                        "  " * 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 + "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":
             func_name, = yield [("RD", [inst, "func"])]
@@ -353,7 +358,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_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:
                     # No indent, meaning that we use it inline
@@ -407,6 +412,11 @@ class ModelverseKernel(object):
         else:
             func = "def " + suggested_name + "(**kwargs):\n" + printed
         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)
 
     def jit_compile(self, task_root, inst):
@@ -416,7 +426,6 @@ class ModelverseKernel(object):
             suggested_name = "func_%s" % str(inst)
 
         # Have the JIT compile the function.
-
         if inst is None:
             raise ValueError('body_id cannot be None: ' + str(suggested_name))
         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):
         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
         elif destination not in self.nodes and destination not in self.edges:
             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)
 
-Date:   Mon Apr 23 10:25:50 2018
+Date:   Mon Apr 23 13:56:41 2018
 
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server