forked from M-Labs/artiq
Transform test
This commit is contained in:
parent
7b406e7e35
commit
e3620cc61f
|
@ -0,0 +1,56 @@
|
|||
import inspect, textwrap, ast
|
||||
|
||||
from artiq import units, unparse
|
||||
|
||||
_now = "_ARTIQ_now"
|
||||
|
||||
class _RequestTransformer(ast.NodeTransformer):
|
||||
def __init__(self, target_globals):
|
||||
self.target_globals = target_globals
|
||||
|
||||
def visit_FunctionDef(self, node):
|
||||
self.generic_visit(node)
|
||||
node.body.insert(0, ast.copy_location(
|
||||
ast.Assign(targets=[ast.Name(id=_now, ctx=ast.Store())],
|
||||
value=ast.Num(n=0)), node))
|
||||
node.body.append(ast.copy_location(
|
||||
ast.Return(value=ast.Name(id=_now, ctx=ast.Store())),
|
||||
node))
|
||||
return node
|
||||
|
||||
def visit_Return(self, node):
|
||||
raise TypeError("Kernels cannot return values")
|
||||
|
||||
def visit_Call(self, node):
|
||||
self.generic_visit(node)
|
||||
name = node.func.id
|
||||
if name == "delay":
|
||||
if len(node.args) != 1:
|
||||
raise TypeError("delay() takes 1 positional argument but {} were given".format(len(node.args)))
|
||||
return ast.copy_location(ast.AugAssign(
|
||||
target=ast.Name(id=_now, ctx=ast.Store()),
|
||||
op=ast.Add(), value=node.args[0]), node)
|
||||
return node
|
||||
|
||||
def visit_Name(self, node):
|
||||
if not isinstance(node.ctx, ast.Load):
|
||||
return node
|
||||
try:
|
||||
obj = self.target_globals[node.id]
|
||||
except KeyError:
|
||||
return node
|
||||
if isinstance(obj, units.Quantity):
|
||||
return ast.Num(obj.amount)
|
||||
else:
|
||||
return node
|
||||
|
||||
def request_transform(target_ast, target_globals):
|
||||
transformer = _RequestTransformer(target_globals)
|
||||
transformer.visit(target_ast)
|
||||
|
||||
if __name__ == "__main__":
|
||||
import threads_test
|
||||
kernel = threads_test.threads_test
|
||||
a = ast.parse(textwrap.dedent(inspect.getsource(kernel)))
|
||||
request_transform(a, kernel.__globals__)
|
||||
unparse.Unparser(a)
|
Loading…
Reference in New Issue