Ver código fonte

Define JIT primitives

These primitives simply turn the JIT on and off right now, but they may
be extended later.
jonathanvdc 8 anos atrás
pai
commit
d86750fad0

+ 37 - 28
bootstrap/bootstrap.py

@@ -108,6 +108,11 @@ def bootstrap():
                     "time": ["Float"],
                 }
 
+    jit_primitives = {
+        "get_jit_enabled": ["Boolean"],
+        "set_jit_enabled": ["Void", "Boolean"]
+    }
+
     ### Actual script to generate the file
     import os
     import sys
@@ -136,38 +141,42 @@ def bootstrap():
                     f.write('Node __%s("%s")\n' % (node, node))
                     f.write("Edge ___%s(_%s, __%s)\n" % (node, node, node))
 
-                f.write("Node primitives()\n")
-                f.write("Edge _primitives(__hierarchy, primitives)\n")
-                f.write('Node __primitives("primitives")\n')
-                f.write("Edge ___primitives(_primitives, __primitives)\n")
+                def declare_primitive_class(primitive_class_name, primitive_decls):
+                    f.write("Node %s()\n" % primitive_class_name)
+                    f.write("Edge _%s(__hierarchy, %s)\n" % (primitive_class_name, primitive_class_name))
+                    f.write('Node __%s("%s")\n' % (primitive_class_name, primitive_class_name))
+                    f.write("Edge ___%s(_%s, __%s)\n" % (primitive_class_name, primitive_class_name, primitive_class_name))
+
+                    # Define all primitive functions
+                    for function, parameters in primitive_decls.iteritems():
+                        f.write("Node _func_signature_%s()\n" % function)
+                        f.write("Node _func_params_%s()\n" % function)
+                        f.write("Node _func_body_%s()\n" % function)
+                        f.write("Edge _%s_%s(%s, _func_signature_%s)\n" % (primitive_class_name, function, primitive_class_name, function))
+                        f.write('Node _name_%s("%s")\n' % (function, function))
+                        f.write("Edge _%s_name_%s(_%s_%s, _name_%s)\n" % (primitive_class_name, function, primitive_class_name, function, function))
 
-                # Define all primitive functions
-                for function, parameters in primitives.iteritems():
-                    f.write("Node _func_signature_%s()\n" % function)
-                    f.write("Node _func_params_%s()\n" % function)
-                    f.write("Node _func_body_%s()\n" % function)
-                    f.write("Edge _primitives_%s(primitives, _func_signature_%s)\n" % (function, function))
-                    f.write('Node _name_%s("%s")\n' % (function, function))
-                    f.write("Edge _primitives_name_%s(_primitives_%s, _name_%s)\n" % (function, function, function))
+                        f.write('Node _body_%s("body")\n' % function)
+                        f.write("Edge _signature_body_%s(_func_signature_%s, _func_body_%s)\n" % (function, function, function))
+                        f.write("Edge _signature_body_str_%s(_signature_body_%s, _body_%s)\n" % (function, function, function))
 
-                    f.write('Node _body_%s("body")\n' % function)
-                    f.write("Edge _signature_body_%s(_func_signature_%s, _func_body_%s)\n" % (function, function, function))
-                    f.write("Edge _signature_body_str_%s(_signature_body_%s, _body_%s)\n" % (function, function, function))
+                        f.write('Node _params_%s("params")\n' % function)
+                        f.write("Edge _signature_params_%s(_func_signature_%s, _func_params_%s)\n" % (function, function, function))
+                        f.write("Edge _signature_params_str_%s(_signature_params_%s, _params_%s)\n" % (function, function, function))
 
-                    f.write('Node _params_%s("params")\n' % function)
-                    f.write("Edge _signature_params_%s(_func_signature_%s, _func_params_%s)\n" % (function, function, function))
-                    f.write("Edge _signature_params_str_%s(_signature_params_%s, _params_%s)\n" % (function, function, function))
+                        parameter_names = "abcdefghijklmnopqrstuvwxyz"
+                        for number, param in enumerate(parameters[1:]):
+                            param_encoding = "%s_%s" % (function, parameter_names[number])
+                            f.write("Node _func_params_%s()\n" % (param_encoding))
+                            f.write('Node _name_%s("%s")\n' % (param_encoding, parameter_names[number]))
+                            f.write("Edge _param_link_%s(_func_params_%s, _func_params_%s)\n" % (param_encoding, function, param_encoding))
+                            f.write("Edge _param_link_str_%s(_param_link_%s, _name_%s)\n" % (param_encoding, param_encoding, param_encoding))
+                            f.write('Node _name_str_%s("name")\n' % param_encoding)
+                            f.write("Edge _param_name_%s(_func_params_%s, _name_%s)\n" % (param_encoding, param_encoding, param_encoding))
+                            f.write("Edge _param_name_str_%s(_param_name_%s, _name_str_%s)\n" % (param_encoding, param_encoding, param_encoding))
 
-                    parameter_names = "abcdefghijklmnopqrstuvwxyz"
-                    for number, param in enumerate(parameters[1:]):
-                        param_encoding = "%s_%s" % (function, parameter_names[number])
-                        f.write("Node _func_params_%s()\n" % (param_encoding))
-                        f.write('Node _name_%s("%s")\n' % (param_encoding, parameter_names[number]))
-                        f.write("Edge _param_link_%s(_func_params_%s, _func_params_%s)\n" % (param_encoding, function, param_encoding))
-                        f.write("Edge _param_link_str_%s(_param_link_%s, _name_%s)\n" % (param_encoding, param_encoding, param_encoding))
-                        f.write('Node _name_str_%s("name")\n' % param_encoding)
-                        f.write("Edge _param_name_%s(_func_params_%s, _name_%s)\n" % (param_encoding, param_encoding, param_encoding))
-                        f.write("Edge _param_name_str_%s(_param_name_%s, _name_str_%s)\n" % (param_encoding, param_encoding, param_encoding))
+                declare_primitive_class('primitives', primitives)
+                declare_primitive_class('jit', jit_primitives)
 
                 # Create the initial user
                 f.write("Node user_root()\n")

+ 2 - 0
bootstrap/jit.alc

@@ -0,0 +1,2 @@
+Boolean function get_jit_enabled() = ?jit/get_jit_enabled
+Void function set_jit_enabled(a: Boolean) = ?jit/set_jit_enabled

+ 2 - 0
interface/HUTN/includes/jit.alh

@@ -0,0 +1,2 @@
+Boolean function get_jit_enabled()
+Void function set_jit_enabled(a: Boolean)

+ 16 - 0
kernel/modelverse_jit/jit_primitives.py

@@ -0,0 +1,16 @@
+"""Primitive functions that interface with the Modelverse JIT."""
+
+import modelverse_kernel.primitives as primitive_functions
+
+# pylint: disable=I0011,C0103
+
+def get_jit_enabled(**kwargs):
+    """Checks if the JIT is enabled."""
+    result, = yield [("CNV", [kwargs['mvk'].jit.jit_enabled])]
+    raise primitive_functions.PrimitiveFinished(result)
+
+def set_jit_enabled(a, **kwargs):
+    """Enables or disables the JIT."""
+    val, result = yield [("RV", [a]), ("CN", [])]
+    kwargs['mvk'].jit.set_jit_enabled(val)
+    raise primitive_functions.PrimitiveFinished(result)

+ 14 - 7
kernel/modelverse_kernel/main.py

@@ -3,6 +3,7 @@ import modelverse_kernel.compiled as compiled_functions
 from modelverse_kernel.request_handler import RequestHandler
 import modelverse_jit.jit as jit
 import modelverse_jit.intrinsics as jit_intrinsics
+import modelverse_jit.jit_primitives as jit_primitives
 from collections import defaultdict
 import sys
 import time
@@ -140,16 +141,22 @@ class ModelverseKernel(object):
     ### Process primitives ###
     ##########################
     def load_primitives(self, username):
-        hierarchy, =     yield [("RD", [self.root, "__hierarchy"])]
-        primitives, =    yield [("RD", [hierarchy, "primitives"])]
-        keys, =          yield [("RDK", [primitives])]
+        yield [("CALL_ARGS",
+                [self.load_primitives_from, (username, 'primitives', primitive_functions)])]
+        yield [("CALL_ARGS",
+                [self.load_primitives_from, (username, 'jit', jit_primitives)])]
+
+    def load_primitives_from(self, username, source_name, source):
+        hierarchy, = yield [("RD", [self.root, "__hierarchy"])]
+        primitives, = yield [("RD", [hierarchy, source_name])]
+        keys, = yield [("RDK", [primitives])]
         function_names = yield [("RV", [f]) for f in keys]
-        signatures  =    yield [("RDN", [primitives, f]) for f in keys]
-        bodies =         yield [("RD", [f, "body"]) for f in signatures]
+        signatures = yield [("RDN", [primitives, f]) for f in keys]
+        bodies = yield [("RD", [f, "body"]) for f in signatures]
         for i in range(len(keys)):
             self.jit.register_compiled(
-                bodies[i], 
-                getattr(primitive_functions, function_names[i]), 
+                bodies[i],
+                getattr(source, function_names[i]),
                 function_names[i])
 
     def jit_compile(self, user_root, inst):