artiq/artiq/sim/time.py

74 lines
2.0 KiB
Python
Raw Normal View History

2014-05-17 20:08:50 +08:00
from operator import itemgetter
from artiq.language.units import *
from artiq.language import core as core_language
2014-05-17 20:08:50 +08:00
2014-09-05 12:03:22 +08:00
2014-05-17 20:08:50 +08:00
class SequentialTimeContext:
2014-09-05 12:03:22 +08:00
def __init__(self, current_time):
self.current_time = current_time
self.block_duration = 0*s
def take_time(self, amount):
self.current_time += amount
self.block_duration += amount
2014-05-17 20:08:50 +08:00
class ParallelTimeContext:
2014-09-05 12:03:22 +08:00
def __init__(self, current_time):
self.current_time = current_time
self.block_duration = 0*s
def take_time(self, amount):
if amount > self.block_duration:
self.block_duration = amount
2014-05-17 20:08:50 +08:00
class Manager:
2014-09-05 12:03:22 +08:00
def __init__(self):
self.stack = [SequentialTimeContext(0*s)]
self.timeline = []
def enter_sequential(self):
2015-07-02 04:22:53 +08:00
new_context = SequentialTimeContext(self.get_time_mu())
2014-09-05 12:03:22 +08:00
self.stack.append(new_context)
def enter_parallel(self):
2015-07-02 04:22:53 +08:00
new_context = ParallelTimeContext(self.get_time_mu())
2014-09-05 12:03:22 +08:00
self.stack.append(new_context)
def exit(self):
old_context = self.stack.pop()
self.take_time(old_context.block_duration)
2015-07-02 04:22:53 +08:00
def take_time_mu(self, duration):
2014-09-05 12:03:22 +08:00
self.stack[-1].take_time(duration)
2015-07-02 04:22:53 +08:00
def get_time_mu(self):
2014-09-05 12:03:22 +08:00
return self.stack[-1].current_time
2015-07-02 04:22:53 +08:00
def set_time_mu(self, t):
dt = t - self.get_time_mu()
2014-09-05 12:03:22 +08:00
if dt < 0*s:
raise ValueError("Attempted to go back in time")
self.take_time(dt)
2015-07-02 04:22:53 +08:00
take_time = take_time_mu
2014-09-05 12:03:22 +08:00
def event(self, description):
2015-07-02 04:22:53 +08:00
self.timeline.append((self.get_time_mu(), description))
2014-09-05 12:03:22 +08:00
def format_timeline(self):
r = ""
prev_time = 0*s
for time, description in sorted(self.timeline, key=itemgetter(0)):
2015-07-02 04:22:53 +08:00
r += "@{:.9f} (+{:.9f}) ".format(time, time-prev_time)
2014-09-05 12:03:22 +08:00
for item in description:
r += "{:16}".format(str(item))
r += "\n"
prev_time = time
return r
2014-05-17 20:08:50 +08:00
manager = Manager()
core_language.set_time_manager(manager)