From 1739e0f2f872eeb109d2d8a83e55df5ffe11ff85 Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Thu, 10 Mar 2016 10:45:16 +0800 Subject: [PATCH] coredevice: put cache into separate file/device --- artiq/coredevice/cache.py | 45 +++++++++++++++++++++++++++ artiq/coredevice/core.py | 36 --------------------- artiq/test/coredevice/test_cache.py | 7 +++-- doc/manual/core_drivers_reference.rst | 6 ++++ examples/master/device_db.pyon | 6 ++++ 5 files changed, 61 insertions(+), 39 deletions(-) create mode 100644 artiq/coredevice/cache.py diff --git a/artiq/coredevice/cache.py b/artiq/coredevice/cache.py new file mode 100644 index 000000000..02d07d5d5 --- /dev/null +++ b/artiq/coredevice/cache.py @@ -0,0 +1,45 @@ +from artiq.language.core import * +from artiq.language.types import * + + +@syscall +def cache_get(key: TStr) -> TList(TInt32): + raise NotImplementedError("syscall not simulated") + +@syscall +def cache_put(key: TStr, value: TList(TInt32)) -> TNone: + raise NotImplementedError("syscall not simulated") + + +class CoreCache: + """Core device cache access""" + def __init__(self, dmgr, core_device="core"): + self.core = dmgr.get(core_device) + + @kernel + def get(self, key): + """Extract a value from the core device cache. + After a value is extracted, it cannot be replaced with another value using + :meth:`put` until all kernel functions finish executing; attempting + to replace it will result in a :class:`artiq.coredevice.exceptions.CacheError`. + + If the cache does not contain any value associated with ``key``, an empty list + is returned. + + The value is not copied, so mutating it will change what's stored in the cache. + + :param str key: cache key + :return: a list of 32-bit integers + """ + return cache_get(key) + + @kernel + def put(self, key, value): + """Put a value into the core device cache. The value will persist until reboot. + + To remove a value from the cache, call :meth:`put` with an empty list. + + :param str key: cache key + :param list value: a list of 32-bit integers + """ + cache_put(key, value) diff --git a/artiq/coredevice/core.py b/artiq/coredevice/core.py index 7aa17fa9b..a836f5093 100644 --- a/artiq/coredevice/core.py +++ b/artiq/coredevice/core.py @@ -41,14 +41,6 @@ class CompileError(Exception): def rtio_get_counter() -> TInt64: raise NotImplementedError("syscall not simulated") -@syscall -def cache_get(key: TStr) -> TList(TInt32): - raise NotImplementedError("syscall not simulated") - -@syscall -def cache_put(key: TStr, value: TList(TInt32)) -> TNone: - raise NotImplementedError("syscall not simulated") - class Core: """Core device driver. @@ -127,31 +119,3 @@ class Core: min_now = rtio_get_counter() + 125000 if now_mu() < min_now: at_mu(min_now) - - @kernel - def get_cache(self, key): - """Extract a value from the core device cache. - After a value is extracted, it cannot be replaced with another value using - :meth:`put_cache` until all kernel functions finish executing; attempting - to replace it will result in a :class:`artiq.coredevice.exceptions.CacheError`. - - If the cache does not contain any value associated with ``key``, an empty list - is returned. - - The value is not copied, so mutating it will change what's stored in the cache. - - :param str key: cache key - :return: a list of 32-bit integers - """ - return cache_get(key) - - @kernel - def put_cache(self, key, value): - """Put a value into the core device cache. The value will persist until reboot. - - To remove a value from the cache, call :meth:`put_cache` with an empty list. - - :param str key: cache key - :param list value: a list of 32-bit integers - """ - cache_put(key, value) diff --git a/artiq/test/coredevice/test_cache.py b/artiq/test/coredevice/test_cache.py index a81950e00..717f68b34 100644 --- a/artiq/test/coredevice/test_cache.py +++ b/artiq/test/coredevice/test_cache.py @@ -5,21 +5,22 @@ from artiq.test.hardware_testbench import ExperimentCase class _Cache(EnvExperiment): def build(self): self.setattr_device("core") - self.print = lambda x: print(x) + self.setattr_device("core_cache") @kernel def get(self, key): - return self.core.get_cache(key) + return self.core_cache.get(key) @kernel def put(self, key, value): - self.core.put_cache(key, value) + self.core_cache.put(key, value) @kernel def get_put(self, key, value): self.get(key) self.put(key, value) + class CacheTest(ExperimentCase): def test_get_empty(self): exp = self.create(_Cache) diff --git a/doc/manual/core_drivers_reference.rst b/doc/manual/core_drivers_reference.rst index e174930e4..9895b04f7 100644 --- a/doc/manual/core_drivers_reference.rst +++ b/doc/manual/core_drivers_reference.rst @@ -42,6 +42,12 @@ These drivers are for the core device and the peripherals closely integrated int .. automodule:: artiq.coredevice.i2c :members: +:mod:`artiq.coredevice.cache` module +----------------------------------------- + +.. automodule:: artiq.coredevice.cache + :members: + :mod:`artiq.coredevice.exceptions` module ----------------------------------------- diff --git a/examples/master/device_db.pyon b/examples/master/device_db.pyon index 05f9bc7ca..ebc75b1ff 100644 --- a/examples/master/device_db.pyon +++ b/examples/master/device_db.pyon @@ -1,5 +1,6 @@ # This is an example device database that needs to be adapted to your setup. # The RTIO channel numbers here are for NIST CLOCK on KC705. +# The list of devices here is not exhaustive. { "comm": { @@ -14,6 +15,11 @@ "class": "Core", "arguments": {"ref_period": 1e-9} }, + "core_cache": { + "type": "local", + "module": "artiq.coredevice.cache", + "class": "CoreCache" + }, "core_dds": { "type": "local", "module": "artiq.coredevice.dds",