forked from M-Labs/artiq
compiler/inline: embeddable calls
This commit is contained in:
parent
8cb3d33c67
commit
d87b207b8a
|
@ -1,5 +1,5 @@
|
||||||
from collections import namedtuple, defaultdict
|
from collections import namedtuple, defaultdict
|
||||||
import inspect, textwrap, ast, builtins
|
import inspect, textwrap, ast
|
||||||
|
|
||||||
from artiq.compiler.tools import eval_ast
|
from artiq.compiler.tools import eval_ast
|
||||||
from artiq.language import experiment, units
|
from artiq.language import experiment, units
|
||||||
|
@ -39,13 +39,11 @@ class _ReferenceManager:
|
||||||
|
|
||||||
# reserved names
|
# reserved names
|
||||||
self.use_count["Quantity"] = 1
|
self.use_count["Quantity"] = 1
|
||||||
self.use_count["syscall"] = 1
|
|
||||||
self.use_count["base_s_unit"] = 1
|
self.use_count["base_s_unit"] = 1
|
||||||
self.use_count["base_Hz_unit"] = 1
|
self.use_count["base_Hz_unit"] = 1
|
||||||
for kg in experiment.kernel_globals:
|
for kg in experiment.kernel_globals:
|
||||||
self.use_count[kg] = 1
|
self.use_count[kg] = 1
|
||||||
for bi in dir(builtins):
|
self.use_count["range"] = 1
|
||||||
self.use_count[bi] = 1
|
|
||||||
|
|
||||||
def new_name(self, base_name):
|
def new_name(self, base_name):
|
||||||
if base_name[-1].isdigit():
|
if base_name[-1].isdigit():
|
||||||
|
@ -87,8 +85,7 @@ class _ReferenceManager:
|
||||||
if repl is not None:
|
if repl is not None:
|
||||||
return repl
|
return repl
|
||||||
|
|
||||||
print("GET: {}.{} {}".format(str(obj), funcname, ast.dump(ref)))
|
raise KeyError
|
||||||
return ref
|
|
||||||
|
|
||||||
def set(self, obj, funcname, name, value):
|
def set(self, obj, funcname, name, value):
|
||||||
self.to_inlined[(id(obj), funcname, name)] = value
|
self.to_inlined[(id(obj), funcname, name)] = value
|
||||||
|
@ -100,6 +97,12 @@ class _ReferenceManager:
|
||||||
and funcname == r_funcname
|
and funcname == r_funcname
|
||||||
and not isinstance(v, _UserVariable)}
|
and not isinstance(v, _UserVariable)}
|
||||||
|
|
||||||
|
_embeddable_calls = {
|
||||||
|
units.Quantity,
|
||||||
|
experiment.delay, experiment.at, experiment.now, experiment.syscall,
|
||||||
|
range
|
||||||
|
}
|
||||||
|
|
||||||
class _ReferenceReplacer(ast.NodeTransformer):
|
class _ReferenceReplacer(ast.NodeTransformer):
|
||||||
def __init__(self, rm, obj, funcname):
|
def __init__(self, rm, obj, funcname):
|
||||||
self.rm = rm
|
self.rm = rm
|
||||||
|
@ -119,7 +122,7 @@ class _ReferenceReplacer(ast.NodeTransformer):
|
||||||
calldict.update(self.module.__dict__)
|
calldict.update(self.module.__dict__)
|
||||||
func = eval_ast(node.func, calldict)
|
func = eval_ast(node.func, calldict)
|
||||||
|
|
||||||
if inspect.getmodule(func) is builtins:
|
if func in _embeddable_calls:
|
||||||
new_func = ast.Name(func.__name__, ast.Load())
|
new_func = ast.Name(func.__name__, ast.Load())
|
||||||
new_args = [self.visit(arg) for arg in node.args]
|
new_args = [self.visit(arg) for arg in node.args]
|
||||||
return ast.Call(func=new_func, args=new_args,
|
return ast.Call(func=new_func, args=new_args,
|
||||||
|
|
Loading…
Reference in New Issue