diff --git a/artiq/coredevice/comm_dummy.py b/artiq/coredevice/comm_dummy.py index faea5d0cb..383eb694a 100644 --- a/artiq/coredevice/comm_dummy.py +++ b/artiq/coredevice/comm_dummy.py @@ -7,6 +7,7 @@ from artiq.coredevice.runtime import LinkInterface class _RuntimeEnvironment(LinkInterface): def __init__(self, ref_period): self.ref_period = ref_period + self.initial_time = 0 def emit_object(self): return str(self.llvm_module) diff --git a/artiq/coredevice/core.py b/artiq/coredevice/core.py index 4624c2285..1e578c650 100644 --- a/artiq/coredevice/core.py +++ b/artiq/coredevice/core.py @@ -11,6 +11,7 @@ from artiq.transforms.interleave import interleave from artiq.transforms.lower_time import lower_time from artiq.transforms.unparse import unparse from artiq.py2llvm import get_runtime_binary +from artiq.language.core import * def _announce_unparse(label, node): @@ -46,6 +47,7 @@ class Core: runtime_env = comm.get_runtime_env() self.runtime_env = runtime_env self.comm = comm + self.core = self def transform_stack(self, func_def, rpc_map, exception_map, debug_unparse=_no_debug_unparse): @@ -67,7 +69,7 @@ class Core: interleave(func_def) debug_unparse("interleave", func_def) - lower_time(func_def, getattr(self.runtime_env, "initial_time", 0)) + lower_time(func_def, self.runtime_env.initial_time) debug_unparse("lower_time", func_def) remove_inter_assigns(func_def) @@ -103,3 +105,8 @@ class Core: self.comm.load(binary) self.comm.run(func_def.name) self.comm.serve(rpc_map, exception_map) + + @kernel + def recover_underflow(self): + t = syscall("rtio_get_counter") + self.runtime_env.initial_time + at(cycles_to_time(t)) diff --git a/artiq/coredevice/runtime.py b/artiq/coredevice/runtime.py index 415bd0970..53a87a4ce 100644 --- a/artiq/coredevice/runtime.py +++ b/artiq/coredevice/runtime.py @@ -17,6 +17,7 @@ _syscalls = { "rtio_set": "Iii:n", "rtio_replace": "Iii:n", "rtio_sync": "i:n", + "rtio_get_counter": "n:I", "rtio_get": "i:I", "rtio_pileup_count": "i:i", "dds_phase_clear_en": "ib:n", @@ -48,7 +49,7 @@ def _str_to_functype(s): if c == "+": type_args.append(lc.Type.int()) var_arg_fixcount = n - else: + elif c != "n": type_args.append(_chr_to_type[c]()) return (var_arg_fixcount, lc.Type.function(type_ret, type_args, diff --git a/examples/pulse_performance.py b/examples/pulse_performance.py index 86e65b67d..526b39d3a 100644 --- a/examples/pulse_performance.py +++ b/examples/pulse_performance.py @@ -20,7 +20,7 @@ class PulsePerformance(AutoContext): delay(cycles_to_time(T)) except RTIOUnderflow: T += 1 - delay(1*ms) + self.core.recover_underflow() else: print_min_period(int(cycles_to_time(2*T)/(1*ns))) break diff --git a/soc/runtime/services.c b/soc/runtime/services.c index 7fabde3c1..1eb9f5b24 100644 --- a/soc/runtime/services.c +++ b/soc/runtime/services.c @@ -15,6 +15,7 @@ static const struct symbol syscalls[] = { {"rtio_set", rtio_set}, {"rtio_replace", rtio_replace}, {"rtio_sync", rtio_sync}, + {"rtio_get_counter", rtio_get_counter}, {"rtio_get", rtio_get}, {"rtio_pileup_count", rtio_pileup_count}, {"dds_phase_clear_en", dds_phase_clear_en},