forked from M-Labs/artiq
108 lines
2.6 KiB
Python
108 lines
2.6 KiB
Python
from random import Random
|
|
import numpy
|
|
|
|
from artiq.language.core import delay, at_mu, kernel
|
|
from artiq.sim import time
|
|
|
|
|
|
class Core:
|
|
def __init__(self, dmgr):
|
|
self.ref_period = 1
|
|
self._level = 0
|
|
|
|
def run(self, k_function, k_args, k_kwargs):
|
|
self._level += 1
|
|
r = k_function.artiq_embedded.function(*k_args, **k_kwargs)
|
|
self._level -= 1
|
|
if self._level == 0:
|
|
print(time.manager.format_timeline())
|
|
time.manager.timeline.clear()
|
|
return r
|
|
|
|
def seconds_to_mu(self, seconds):
|
|
return numpy.int64(seconds//self.ref_period)
|
|
|
|
def mu_to_seconds(self, mu):
|
|
return mu*self.ref_period
|
|
|
|
|
|
class Input:
|
|
def __init__(self, dmgr, name):
|
|
self.core = dmgr.get("core")
|
|
self.name = name
|
|
|
|
self.prng = Random()
|
|
|
|
@kernel
|
|
def gate_rising(self, duration):
|
|
time.manager.event(("gate_rising", self.name, duration))
|
|
delay(duration)
|
|
|
|
@kernel
|
|
def gate_falling(self, duration):
|
|
time.manager.event(("gate_falling", self.name, duration))
|
|
delay(duration)
|
|
|
|
@kernel
|
|
def gate_both(self, duration):
|
|
time.manager.event(("gate_both", self.name, duration))
|
|
delay(duration)
|
|
|
|
@kernel
|
|
def count(self, up_to_timestamp_mu):
|
|
result = self.prng.randrange(0, 100)
|
|
time.manager.event(("count", self.name, result))
|
|
return result
|
|
|
|
@kernel
|
|
def timestamp_mu(self, up_to_timestamp_mu):
|
|
result = time.manager.get_time_mu()
|
|
result += self.prng.randrange(100, 1000)
|
|
time.manager.event(("timestamp_mu", self.name, result))
|
|
at_mu(result)
|
|
return result
|
|
|
|
|
|
class Output:
|
|
def __init__(self, dmgr, name):
|
|
self.core = dmgr.get("core")
|
|
self.name = name
|
|
|
|
@kernel
|
|
def set_o(self, value):
|
|
time.manager.event(("set", self.name, value))
|
|
|
|
@kernel
|
|
def pulse(self, duration):
|
|
time.manager.event(("pulse", self.name, duration))
|
|
delay(duration)
|
|
|
|
@kernel
|
|
def on(self):
|
|
self.set_o(True)
|
|
|
|
@kernel
|
|
def off(self):
|
|
self.set_o(False)
|
|
|
|
|
|
class WaveOutput:
|
|
def __init__(self, dmgr, name):
|
|
self.core = dmgr.get("core")
|
|
self.name = name
|
|
|
|
@kernel
|
|
def pulse(self, frequency, duration):
|
|
time.manager.event(("pulse", self.name, frequency, duration))
|
|
delay(duration)
|
|
|
|
|
|
class VoltageOutput:
|
|
def __init__(self, dmgr, name):
|
|
self.core = dmgr.get("core")
|
|
self.name = name
|
|
|
|
@kernel
|
|
def set(self, value):
|
|
time.manager.event(("set_voltage", self.name, value))
|