transforms.interleaver: handle function calls (as atomic so far).

This commit solves issue #2 described in 50e7b44; a function call
is now a valid decomposition for a delay instruction, and this
metadata is propagated when the interleaver converts delays.

However, the interleaver does not yet detect that a called function
is compound, i.e. it is not correct.
This commit is contained in:
whitequark 2015-11-21 03:32:53 +08:00
parent 57dd163d37
commit 82b470891f
3 changed files with 57 additions and 1 deletions

View File

@ -104,7 +104,7 @@ class Interleaver:
new_decomp.loc = old_decomp.loc
source_terminator.basic_block.insert(source_terminator, new_decomp)
else:
assert False # TODO
old_decomp, new_decomp = None, old_decomp
source_terminator.replace_with(ir.Delay(iodelay.Const(target_time_delta), {},
new_decomp, source_terminator.target()))

View File

@ -0,0 +1,28 @@
# RUN: %python -m artiq.compiler.testbench.jit %s >%t
# RUN: OutputCheck %s --file-to-check=%t
def f():
delay_mu(2)
def g():
with parallel:
with sequential:
print("A", now_mu())
f()
#
print("B", now_mu())
with sequential:
print("C", now_mu())
f()
#
print("D", now_mu())
f()
#
print("E", now_mu())
# CHECK-L: A 0
# CHECK-L: C 0
# CHECK-L: B 2
# CHECK-L: D 2
# CHECK-L: E 4
g()

View File

@ -0,0 +1,28 @@
# RUN: %python -m artiq.compiler.testbench.jit %s >%t
# RUN: OutputCheck %s --file-to-check=%t
def f(n):
delay_mu(n)
def g():
with parallel:
with sequential:
print("A", now_mu())
f(2)
#
print("B", now_mu())
with sequential:
print("C", now_mu())
f(2)
#
print("D", now_mu())
f(2)
#
print("E", now_mu())
# CHECK-L: A 0
# CHECK-L: C 0
# CHECK-L: B 2
# CHECK-L: D 2
# CHECK-L: E 4
g()