artiq_run,master: introduce __artiq_unit__ attribute to mark and name experiments

This commit is contained in:
Sebastien Bourdeauducq 2015-02-20 14:01:34 -07:00
parent 5cfdac9c7c
commit 65555a3a09
13 changed files with 35 additions and 6 deletions

View File

@ -114,8 +114,7 @@ def main():
units = [(k, v) for k, v in module.__dict__.items() units = [(k, v) for k, v in module.__dict__.items()
if k[0] != "_" if k[0] != "_"
and isclass(v) and isclass(v)
and issubclass(v, AutoDB) and hasattr(v, "__artiq_unit__")]
and v is not AutoDB]
l = len(units) l = len(units)
if l == 0: if l == 0:
print("No units found in module") print("No units found in module")
@ -123,7 +122,7 @@ def main():
elif l > 1: elif l > 1:
print("More than one unit found in module:") print("More than one unit found in module:")
for k, v in sorted(units, key=itemgetter(0)): for k, v in sorted(units, key=itemgetter(0)):
print(" " + k) print(" {} ({})".format(k, v.__artiq_unit__))
print("Use -u to specify which unit to use.") print("Use -u to specify which unit to use.")
sys.exit(1) sys.exit(1)
else: else:

View File

@ -6,7 +6,6 @@ import h5py
from artiq.protocols import pyon from artiq.protocols import pyon
from artiq.tools import file_import from artiq.tools import file_import
from artiq.language.db import AutoDB
from artiq.master.db import DBHub, ResultDB from artiq.master.db import DBHub, ResultDB
@ -72,8 +71,7 @@ def get_unit(file, unit):
units = [v for k, v in module.__dict__.items() units = [v for k, v in module.__dict__.items()
if k[0] != "_" if k[0] != "_"
and isclass(v) and isclass(v)
and issubclass(v, AutoDB) and hasattr(v, "__artiq_unit__")]
and v is not AutoDB]
if len(units) != 1: if len(units) != 1:
raise ValueError("Found {} units in module".format(len(units))) raise ValueError("Found {} units in module".format(len(units)))
return units[0] return units[0]

View File

@ -2,10 +2,14 @@ from artiq import *
import pulse_rate, rtio_skew, rpc_timing import pulse_rate, rtio_skew, rpc_timing
from pulse_rate import PulseRate
from rtio_skew import RTIOSkew
_units = [pulse_rate.PulseRate, rtio_skew.RTIOSkew, rpc_timing.RPCTiming] _units = [pulse_rate.PulseRate, rtio_skew.RTIOSkew, rpc_timing.RPCTiming]
class AllBenchmarks(AutoDB): class AllBenchmarks(AutoDB):
__artiq_unit__ = "All benchmarks"
def build(self): def build(self):
self.se = [] self.se = []
for unit in _units: for unit in _units:

View File

@ -3,6 +3,8 @@ from artiq.coredevice.runtime_exceptions import RTIOUnderflow
class PulseRate(AutoDB): class PulseRate(AutoDB):
__artiq_unit__ = "Pulse rate"
class DBKeys: class DBKeys:
ttl0 = Device() ttl0 = Device()
pulse_rate = Result() pulse_rate = Result()

View File

@ -4,6 +4,8 @@ from artiq import *
class RPCTiming(AutoDB): class RPCTiming(AutoDB):
__artiq_unit__ = "RPC timing"
class DBKeys: class DBKeys:
repeats = Argument(100) repeats = Argument(100)
rpc_time_mean = Result() rpc_time_mean = Result()

View File

@ -6,6 +6,8 @@ class PulseNotReceived(Exception):
class RTIOSkew(AutoDB): class RTIOSkew(AutoDB):
__artiq_unit__ = "RTIO skew"
class DBKeys: class DBKeys:
pmt0 = Device() pmt0 = Device()
ttl0 = Device() ttl0 = Device()

View File

@ -10,6 +10,8 @@ As a very first step, we will turn on a LED on the core device. Create a file ``
class LED(AutoDB): class LED(AutoDB):
__artiq_unit__ = "ARTIQ tutorial"
class DBKeys: class DBKeys:
led = Device() led = Device()
@ -20,6 +22,8 @@ As a very first step, we will turn on a LED on the core device. Create a file ``
The central part of our code is our ``LED`` class, that derives from :class:`artiq.language.db.AutoDB`. ``AutoDB`` is part of the mechanism that attaches device drivers and retrieves parameters according to a database. Our ``DBKeys`` class lists the devices (and parameters) that ``LED`` needs in order to operate, and the names of the attributes (e.g. ``led``) are used to search the database. ``AutoDB`` replaces them with the actual device drivers (and parameter values). Finally, the ``@kernel`` decorator tells the system that the ``run`` method must be executed on the core device (instead of the host). The central part of our code is our ``LED`` class, that derives from :class:`artiq.language.db.AutoDB`. ``AutoDB`` is part of the mechanism that attaches device drivers and retrieves parameters according to a database. Our ``DBKeys`` class lists the devices (and parameters) that ``LED`` needs in order to operate, and the names of the attributes (e.g. ``led``) are used to search the database. ``AutoDB`` replaces them with the actual device drivers (and parameter values). Finally, the ``@kernel`` decorator tells the system that the ``run`` method must be executed on the core device (instead of the host).
The ``__artiq_unit__`` attribute tells the ARTIQ tools that our class is a "unit" (an entry point for an experiment) and gives it a name. The name can be any string, and its purpose is to name the experiment in user interfaces.
Copy the files ``ddb.pyon`` and ``pdb.pyon`` (containing the device and parameter databases) from the ``examples`` folder of ARTIQ into the same directory as ``led.py`` (alternatively, you can use the ``-d`` and ``-p`` options of ``artiq_run.py``). You can open the database files using a text editor - their contents are in a human-readable format. Copy the files ``ddb.pyon`` and ``pdb.pyon`` (containing the device and parameter databases) from the ``examples`` folder of ARTIQ into the same directory as ``led.py`` (alternatively, you can use the ``-d`` and ``-p`` options of ``artiq_run.py``). You can open the database files using a text editor - their contents are in a human-readable format.
Run your code using ``artiq_run.py``, which is part of the ARTIQ front-end tools: :: Run your code using ``artiq_run.py``, which is part of the ARTIQ front-end tools: ::
@ -39,6 +43,8 @@ Modify the code as follows: ::
return int(input("Enter desired LED state: ")) return int(input("Enter desired LED state: "))
class LED(AutoDB): class LED(AutoDB):
__artiq_unit__ = "ARTIQ tutorial"
class DBKeys: class DBKeys:
led = Device() led = Device()
@ -82,6 +88,8 @@ Create a new file ``rtio.py`` containing the following: ::
from artiq import * from artiq import *
class Tutorial(AutoDB): class Tutorial(AutoDB):
__artiq_unit__ = "ARTIQ tutorial"
class DBKeys: class DBKeys:
ttl0 = Device() ttl0 = Device()
@ -104,6 +112,8 @@ Try reducing the period of the generated waveform until the CPU cannot keep up w
print("RTIO underflow occured") print("RTIO underflow occured")
class Tutorial(AutoDB): class Tutorial(AutoDB):
__artiq_unit__ = "ARTIQ tutorial"
class DBKeys: class DBKeys:
led = Device() led = Device()
ttl0 = Device() ttl0 = Device()

View File

@ -2,6 +2,8 @@ from artiq import *
class DDSTest(AutoDB): class DDSTest(AutoDB):
__artiq_unit__ = "DDS test"
class DBKeys: class DBKeys:
dds0 = Device() dds0 = Device()
dds1 = Device() dds1 = Device()

View File

@ -24,6 +24,8 @@ def model_numpy(xdata, F0):
class FloppingF(AutoDB): class FloppingF(AutoDB):
__artiq_unit__ = "Flopping F simulation"
class DBKeys: class DBKeys:
implicit_core = False implicit_core = False

View File

@ -4,6 +4,8 @@ from artiq import *
class Mandelbrot(AutoDB): class Mandelbrot(AutoDB):
__artiq_unit__ = "Mandelbrot set demo"
def col(self, i): def col(self, i):
sys.stdout.write(" .,-:;i+hHM$*#@ "[i]) sys.stdout.write(" .,-:;i+hHM$*#@ "[i])

View File

@ -2,6 +2,8 @@ from artiq import *
class PhotonHistogram(AutoDB): class PhotonHistogram(AutoDB):
__artiq_unit__ = "Photon histogram"
class DBKeys: class DBKeys:
bd = Device() bd = Device()
bdd = Device() bdd = Device()

View File

@ -2,6 +2,8 @@ from artiq import *
class SimpleSimulation(AutoDB): class SimpleSimulation(AutoDB):
__artiq_unit__ = "Simple simulation"
class DBKeys: class DBKeys:
a = Device() a = Device()
b = Device() b = Device()

View File

@ -11,6 +11,8 @@ transport_data = dict(
) )
class Transport(AutoDB): class Transport(AutoDB):
__artiq_unit__ = "Transport"
class DBKeys: class DBKeys:
bd = Device() bd = Device()
bdd = Device() bdd = Device()