artiq/artiq/frontend/artiq_run.py

149 lines
4.4 KiB
Python
Raw Normal View History

2014-12-03 18:20:30 +08:00
#!/usr/bin/env python3
import argparse
import sys
2015-02-20 03:09:37 +08:00
import time
2014-12-03 18:20:30 +08:00
from operator import itemgetter
2015-01-13 19:12:19 +08:00
from itertools import chain
import logging
2014-12-03 18:20:30 +08:00
2015-02-04 18:46:55 +08:00
import h5py
2015-07-14 04:08:20 +08:00
from artiq.language.environment import EnvExperiment
from artiq.protocols.file_db import FlatFileDB
2015-07-14 04:08:20 +08:00
from artiq.master.worker_db import DeviceManager, ResultDB
2015-08-28 14:54:51 +08:00
from artiq.coredevice.core import CompileError
from artiq.compiler.embedding import ObjectMap
from artiq.compiler.targets import OR1KTarget
2015-08-28 14:54:51 +08:00
from artiq.tools import *
2014-12-03 18:20:30 +08:00
logger = logging.getLogger(__name__)
2015-07-14 04:08:20 +08:00
class ELFRunner(EnvExperiment):
def build(self):
self.attr_device("core")
self.attr_argument("file")
2014-12-03 18:20:30 +08:00
def run(self):
with open(self.file, "rb") as f:
kernel_library = f.read()
target = OR1KTarget()
self.core.comm.load(kernel_library)
self.core.comm.run()
self.core.comm.serve(ObjectMap(),
lambda addresses: target.symbolize(kernel_library, addresses))
2014-12-03 18:20:30 +08:00
class SimpleParamLogger:
def set(self, timestamp, name, value):
logger.info("Parameter change: {} = {}".format(name, value))
2015-02-20 03:09:37 +08:00
class DummyScheduler:
2015-07-14 04:08:20 +08:00
def __init__(self):
2015-02-20 03:09:37 +08:00
self.next_rid = 0
self.pipeline_name = "main"
self.priority = 0
2015-07-14 04:08:20 +08:00
self.expid = None
2015-02-20 03:09:37 +08:00
def submit(self, pipeline_name, expid, priority, due_date, flush):
2015-02-20 03:09:37 +08:00
rid = self.next_rid
self.next_rid += 1
logger.info("Submitting: %s, RID=%s", expid, rid)
2015-02-20 03:09:37 +08:00
return rid
def delete(self, rid):
logger.info("Deleting RID %s", rid)
2015-02-20 03:09:37 +08:00
2015-04-05 11:17:24 +08:00
def get_argparser(with_file=True):
parser = argparse.ArgumentParser(
description="Local experiment running tool")
2014-12-03 18:20:30 +08:00
2015-02-04 19:09:54 +08:00
verbosity_args(parser)
2014-12-03 18:20:30 +08:00
parser.add_argument("-d", "--ddb", default="ddb.pyon",
help="device database file")
parser.add_argument("-p", "--pdb", default="pdb.pyon",
help="parameter database file")
parser.add_argument("-e", "--experiment", default=None,
help="experiment to run")
2015-02-04 18:46:55 +08:00
parser.add_argument("-o", "--hdf5", default=None,
help="write results to specified HDF5 file"
" (default: print them)")
if with_file:
parser.add_argument("file",
help="file containing the experiment to run")
parser.add_argument("arguments", nargs="*",
help="run arguments")
2014-12-03 18:20:30 +08:00
2015-01-23 00:52:13 +08:00
return parser
2014-12-03 18:20:30 +08:00
2015-07-14 04:08:20 +08:00
def _build_experiment(dmgr, pdb, rdb, args):
if hasattr(args, "file"):
if args.file.endswith(".elf"):
if args.arguments:
raise ValueError("arguments not supported for ELF kernels")
if args.experiment:
raise ValueError("experiment-by-name not supported "
"for ELF kernels")
2015-07-14 04:08:20 +08:00
return ELFRunner(dmgr, pdb, rdb, file=args.file)
else:
module = file_import(args.file)
file = args.file
else:
module = sys.modules["__main__"]
file = getattr(module, "__file__")
exp = get_experiment(module, args.experiment)
arguments = parse_arguments(args.arguments)
expid = {
"file": file,
"experiment": args.experiment,
"arguments": arguments
}
2015-07-14 04:08:20 +08:00
dmgr.virtual_devices["scheduler"].expid = expid
return exp(dmgr, pdb, rdb, **arguments)
def run(with_file=False):
args = get_argparser(with_file).parse_args()
2015-02-04 19:09:54 +08:00
init_logger(args)
2014-12-03 18:20:30 +08:00
2015-07-14 04:08:20 +08:00
dmgr = DeviceManager(FlatFileDB(args.ddb),
virtual_devices={"scheduler": DummyScheduler()})
pdb = FlatFileDB(args.pdb)
pdb.hooks.append(SimpleParamLogger())
2015-07-14 04:08:20 +08:00
rdb = ResultDB()
try:
2015-07-14 04:08:20 +08:00
exp_inst = _build_experiment(dmgr, pdb, rdb, args)
exp_inst.prepare()
exp_inst.run()
exp_inst.analyze()
2015-08-28 14:54:51 +08:00
except CompileError as error:
message = "\n".join(error.__cause__.diagnostic.render(colored=True))
message = message.replace(os.path.normpath(os.path.join(os.path.dirname(__file__), "..")),
"<artiq>")
print(message, file=sys.stderr)
finally:
2015-07-14 04:08:20 +08:00
dmgr.close_devices()
if args.hdf5 is not None:
with h5py.File(args.hdf5, "w") as f:
rdb.write_hdf5(f)
2015-07-14 04:08:20 +08:00
elif rdb.rt.read or rdb.nrt:
r = chain(rdb.rt.read.items(), rdb.nrt.items())
for k, v in sorted(r, key=itemgetter(0)):
print("{}: {}".format(k, v))
def main():
return run(with_file=True)
2014-12-03 18:20:30 +08:00
if __name__ == "__main__":
main()