artiq/artiq/coredevice/core.py

66 lines
1.9 KiB
Python
Raw Normal View History

2015-08-09 20:47:29 +08:00
import sys, tempfile
from pythonparser import diagnostic
2014-12-03 18:20:30 +08:00
from artiq.language.core import *
from artiq.language.units import ns
2014-12-03 18:20:30 +08:00
from artiq.compiler import Stitcher, Module
from artiq.compiler.targets import OR1KTarget
# Import for side effects (creating the exception classes).
from artiq.coredevice import exceptions
class CompileError(Exception):
2014-11-03 18:44:30 +08:00
pass
2015-07-14 04:08:20 +08:00
class Core:
def __init__(self, dmgr, ref_period=8*ns, external_clock=False):
self.comm = dmgr.get("comm")
self.ref_period = ref_period
self.external_clock = external_clock
2014-12-03 18:20:30 +08:00
self.first_run = True
2014-11-21 04:38:52 +08:00
self.core = self
self.comm.core = self
def compile(self, function, args, kwargs, with_attr_writeback=True):
try:
engine = diagnostic.Engine(all_errors_are_fatal=True)
stitcher = Stitcher(engine=engine)
stitcher.stitch_call(function, args, kwargs)
module = Module(stitcher)
target = OR1KTarget()
2015-08-10 20:12:22 +08:00
library = target.compile_and_link([module])
stripped_library = target.strip(library)
return stitcher.rpc_map, stripped_library, \
lambda addresses: target.symbolize(library, addresses)
except diagnostic.Error as error:
print("\n".join(error.diagnostic.render(colored=True)), file=sys.stderr)
raise CompileError() from error
def run(self, function, args, kwargs):
2015-08-10 20:12:22 +08:00
rpc_map, kernel_library, symbolizer = self.compile(function, args, kwargs)
2015-08-09 07:17:19 +08:00
if self.first_run:
self.comm.check_ident()
self.comm.switch_clock(self.external_clock)
self.first_run = False
2015-08-10 20:12:22 +08:00
self.comm.load(kernel_library)
self.comm.run()
2015-08-10 20:12:22 +08:00
self.comm.serve(rpc_map, symbolizer)
2014-11-21 04:38:52 +08:00
2015-02-19 00:56:30 +08:00
@kernel
2015-07-02 04:22:53 +08:00
def get_rtio_counter_mu(self):
return syscall("rtio_get_counter")
2015-02-19 00:56:30 +08:00
2014-11-21 04:38:52 +08:00
@kernel
2015-05-03 20:42:42 +08:00
def break_realtime(self):
2015-07-02 04:22:53 +08:00
at_mu(syscall("rtio_get_counter") + 125000)