forked from M-Labs/artiq
75 lines
2.2 KiB
Python
Executable File
75 lines
2.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import sys, logging, argparse
|
|
|
|
from artiq.protocols.file_db import FlatFileDB
|
|
from artiq.master.worker_db import DeviceManager
|
|
from artiq.coredevice.core import CompileError
|
|
from artiq.tools import *
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def get_argparser():
|
|
parser = argparse.ArgumentParser(description="ARTIQ static compiler")
|
|
|
|
verbosity_args(parser)
|
|
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 compile")
|
|
|
|
parser.add_argument("-o", "--output", default=None,
|
|
help="output file")
|
|
parser.add_argument("file",
|
|
help="file containing the experiment to compile")
|
|
parser.add_argument("arguments", nargs="*", help="run arguments")
|
|
|
|
return parser
|
|
|
|
|
|
def main():
|
|
args = get_argparser().parse_args()
|
|
init_logger(args)
|
|
|
|
dmgr = DeviceManager(FlatFileDB(args.ddb))
|
|
pdb = FlatFileDB(args.pdb)
|
|
|
|
try:
|
|
module = file_import(args.file)
|
|
exp = get_experiment(module, args.experiment)
|
|
arguments = parse_arguments(args.arguments)
|
|
exp_inst = exp(dmgr, pdb, **arguments)
|
|
|
|
if not hasattr(exp.run, "artiq_embedded"):
|
|
raise ValueError("Experiment entry point must be a kernel")
|
|
core_name = exp.run.artiq_embedded.core_name
|
|
core = getattr(exp_inst, core_name)
|
|
|
|
object_map, kernel_library, symbolizer = \
|
|
core.compile(exp.run, [exp_inst], {},
|
|
with_attr_writeback=False)
|
|
except CompileError as error:
|
|
print(error.render_string(colored=True), file=sys.stderr)
|
|
return
|
|
finally:
|
|
dmgr.close_devices()
|
|
|
|
if object_map.has_rpc():
|
|
raise ValueError("Experiment must not use RPC")
|
|
|
|
output = args.output
|
|
if output is None:
|
|
basename, ext = os.path.splitext(args.file)
|
|
output = "{}.elf".format(basename)
|
|
|
|
with open(output, "wb") as f:
|
|
f.write(kernel_library)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|