forked from M-Labs/artiq
sim: align API closer to non-sim
* add Output * also clear timeline after it has been printed (multiple kernel invocations) The sim core device API has diverged quite a bit from the non-sim API. More work is needed.
This commit is contained in:
parent
856821849f
commit
5599ec16ea
|
@ -1,7 +1,6 @@
|
||||||
from random import Random
|
from random import Random
|
||||||
|
|
||||||
from artiq.language.core import delay, kernel
|
from artiq.language.core import delay, at_mu, kernel
|
||||||
from artiq.language import units
|
|
||||||
from artiq.sim import time
|
from artiq.sim import time
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,6 +15,7 @@ class Core:
|
||||||
self._level -= 1
|
self._level -= 1
|
||||||
if self._level == 0:
|
if self._level == 0:
|
||||||
print(time.manager.format_timeline())
|
print(time.manager.format_timeline())
|
||||||
|
time.manager.timeline.clear()
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
@ -27,18 +27,57 @@ class Input:
|
||||||
self.prng = Random()
|
self.prng = Random()
|
||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def wait_edge(self):
|
def gate_rising(self, duration):
|
||||||
duration = self.prng.randrange(0, 20)*units.ms
|
time.manager.event(("gate_rising", self.name, duration))
|
||||||
time.manager.event(("wait_edge", self.name, duration))
|
|
||||||
delay(duration)
|
delay(duration)
|
||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def count_gate(self, duration):
|
def gate_falling(self, duration):
|
||||||
result = self.prng.randrange(0, 100)
|
time.manager.event(("gate_falling", self.name, duration))
|
||||||
time.manager.event(("count_gate", self.name, duration, result))
|
|
||||||
delay(duration)
|
delay(duration)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def gate_both(self, duration):
|
||||||
|
time.manager.event(("gate_both", self.name, duration))
|
||||||
|
delay(duration)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def count(self):
|
||||||
|
result = self.prng.randrange(0, 100)
|
||||||
|
time.manager.event(("count", self.name, result))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def timestamp_mu(self):
|
||||||
|
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:
|
class WaveOutput:
|
||||||
def __init__(self, dmgr, name):
|
def __init__(self, dmgr, name):
|
||||||
|
|
|
@ -20,7 +20,8 @@ class AluminumSpectroscopy(EnvExperiment):
|
||||||
def run(self):
|
def run(self):
|
||||||
state_0_count = 0
|
state_0_count = 0
|
||||||
for count in range(100):
|
for count in range(100):
|
||||||
self.mains_sync.wait_edge()
|
self.mains_sync.gate_rising(1*s/60)
|
||||||
|
at_mu(self.mains_sync.timestamp_mu() + 100*us)
|
||||||
delay(10*us)
|
delay(10*us)
|
||||||
self.laser_cooling.pulse(100*MHz, 100*us)
|
self.laser_cooling.pulse(100*MHz, 100*us)
|
||||||
delay(5*us)
|
delay(5*us)
|
||||||
|
@ -34,9 +35,10 @@ class AluminumSpectroscopy(EnvExperiment):
|
||||||
delay(5*us)
|
delay(5*us)
|
||||||
with parallel:
|
with parallel:
|
||||||
self.state_detection.pulse(100*MHz, 10*us)
|
self.state_detection.pulse(100*MHz, 10*us)
|
||||||
photon_count = self.pmt.count_gate(10*us)
|
self.pmt.gate_rising(10*us)
|
||||||
if (photon_count < self.photon_limit_low
|
photon_count = self.pmt.count()
|
||||||
or photon_count > self.photon_limit_high):
|
if (photon_count < self.photon_limit_low or
|
||||||
|
photon_count > self.photon_limit_high):
|
||||||
break
|
break
|
||||||
if photon_count < self.photon_limit_low:
|
if photon_count < self.photon_limit_low:
|
||||||
state_0_count += 1
|
state_0_count += 1
|
||||||
|
|
Loading…
Reference in New Issue