nac3/nac3artiq/language.py

49 lines
1.3 KiB
Python
Raw Normal View History

from inspect import isclass, getmodule
2020-12-18 23:44:45 +08:00
from functools import wraps
import nac3artiq
2020-12-18 23:44:45 +08:00
2021-09-29 15:33:12 +08:00
import device_db
2020-12-18 23:44:45 +08:00
2021-09-27 10:13:03 +08:00
__all__ = ["extern", "kernel"]
2020-12-18 23:44:45 +08:00
2021-09-29 15:33:12 +08:00
nac3 = nac3artiq.NAC3(device_db.device_db["core"]["arguments"]["target"])
allow_module_registration = True
2021-09-30 22:30:54 +08:00
registered_ids = set()
2021-09-24 11:39:26 +08:00
2021-09-27 10:13:03 +08:00
def extern(function):
2021-09-30 22:30:54 +08:00
global registered_ids
assert allow_module_registration
2021-09-30 22:30:54 +08:00
module = getmodule(function)
module_id = id(module)
if module_id not in registered_ids:
nac3.register_module(module)
registered_ids.add(module_id)
2021-09-24 11:39:26 +08:00
return function
2020-12-18 23:44:45 +08:00
def kernel(class_or_function):
global allow_module_registration
2021-09-30 22:30:54 +08:00
global registered_ids
2021-09-23 19:30:03 +08:00
assert allow_module_registration
2021-09-30 22:30:54 +08:00
module = getmodule(class_or_function)
module_id = id(module)
if module_id not in registered_ids:
nac3.register_module(module)
registered_ids.add(module_id)
if isclass(class_or_function):
return class_or_function
2021-09-23 19:30:03 +08:00
else:
@wraps(class_or_function)
2021-09-23 19:30:03 +08:00
def run_on_core(self, *args, **kwargs):
global allow_module_registration
if allow_module_registration:
2021-09-23 19:30:03 +08:00
nac3.analyze()
allow_module_registration = False
2021-09-30 22:30:54 +08:00
nac3.compile_method(id(self.__class__), class_or_function.__name__)
2021-09-23 19:30:03 +08:00
return run_on_core