update NAC3

This commit is contained in:
Sebastien Bourdeauducq 2021-11-11 16:32:37 +08:00
parent a8129093df
commit c7cca11ad1
3 changed files with 23 additions and 18 deletions

View File

@ -60,9 +60,9 @@ class Core:
self.comm.close() self.comm.close()
def compile(self, method, args, kwargs, file_output=None): def compile(self, method, args, kwargs, file_output=None):
if core_language._allow_module_registration: if core_language._allow_registration:
self.compiler.analyze_modules(core_language._registered_modules) self.compiler.analyze(core_language._registered_functions, core_language._registered_classes)
core_language._allow_module_registration = False core_language._allow_registration = False
if hasattr(method, "__self__"): if hasattr(method, "__self__"):
obj = method.__self__ obj = method.__self__

View File

@ -4,7 +4,7 @@ Core ARTIQ extensions to the Python language.
from typing import Generic, TypeVar from typing import Generic, TypeVar
from functools import wraps from functools import wraps
from inspect import getfullargspec, getmodule from inspect import getfullargspec
from types import SimpleNamespace from types import SimpleNamespace
@ -25,24 +25,29 @@ def round64(x):
return round(x) return round(x)
_allow_module_registration = True _allow_registration = True
_registered_modules = set() # Delay NAC3 analysis until all referenced variables are supposed to exist on the CPython side.
_registered_functions = set()
_registered_classes = set()
def _register_module_of(obj): def _register_function(fun):
assert _allow_module_registration assert _allow_registration
# Delay NAC3 analysis until all referenced variables are supposed to exist on the CPython side. _registered_functions.add(fun)
_registered_modules.add(getmodule(obj))
def _register_class(cls):
assert _allow_registration
_registered_classes.add(cls)
def extern(function): def extern(function):
"""Decorates a function declaration defined by the core device runtime.""" """Decorates a function declaration defined by the core device runtime."""
_register_module_of(function) _register_function(function)
return function return function
def kernel(function_or_method): def kernel(function_or_method):
"""Decorates a function or method to be executed on the core device.""" """Decorates a function or method to be executed on the core device."""
_register_module_of(function_or_method) _register_function(function_or_method)
argspec = getfullargspec(function_or_method) argspec = getfullargspec(function_or_method)
if argspec.args and argspec.args[0] == "self": if argspec.args and argspec.args[0] == "self":
@wraps(function_or_method) @wraps(function_or_method)
@ -59,7 +64,7 @@ def kernel(function_or_method):
def portable(function): def portable(function):
"""Decorates a function or method to be executed on the same device (host/core device) as the caller.""" """Decorates a function or method to be executed on the same device (host/core device) as the caller."""
_register_module_of(function) _register_function(function)
return function return function
@ -68,7 +73,7 @@ def nac3(cls):
Decorates a class to be analyzed by NAC3. Decorates a class to be analyzed by NAC3.
All classes containing kernels or portable methods must use this decorator. All classes containing kernels or portable methods must use this decorator.
""" """
_register_module_of(cls) _register_class(cls)
return cls return cls

View File

@ -82,11 +82,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1636252154, "lastModified": 1636618109,
"narHash": "sha256-YPRjk9M9GdUiAZircxUl5BDU8rN5t0B0ZkIau+dMqmg=", "narHash": "sha256-dJu9Tw+8mVL3ZMIlcvM9g6WT3hYrKDaVceZJV+BxjTA=",
"ref": "master", "ref": "master",
"rev": "50f1aca1aa7ecb4412aa4b8a0daa1cc644d8ca89", "rev": "c004da85f705fef8952885c1493407610a05b61d",
"revCount": 412, "revCount": 415,
"type": "git", "type": "git",
"url": "https://git.m-labs.hk/M-Labs/nac3.git" "url": "https://git.m-labs.hk/M-Labs/nac3.git"
}, },