From d2add0a683db749808769fbe13f29d499395ca89 Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Sat, 26 Mar 2022 16:00:49 +0800 Subject: [PATCH] update NAC3, define option type --- artiq/coredevice/exceptions.py | 3 ++- artiq/language/core.py | 46 ++++++++++++++++++++++++++++++--- artiq/language/embedding_map.py | 3 ++- flake.lock | 8 +++--- 4 files changed, 50 insertions(+), 10 deletions(-) diff --git a/artiq/coredevice/exceptions.py b/artiq/coredevice/exceptions.py index 29d10e4e9..8afc444a7 100644 --- a/artiq/coredevice/exceptions.py +++ b/artiq/coredevice/exceptions.py @@ -1,6 +1,7 @@ -from artiq.language.core import nac3 +from artiq.language.core import nac3, UnwrapNoneError from builtins import ZeroDivisionError, ValueError, IndexError, RuntimeError, AssertionError + @nac3 class RTIOUnderflow(Exception): """Raised when the CPU or DMA core fails to submit a RTIO event early diff --git a/artiq/language/core.py b/artiq/language/core.py index 3cff29c15..0e66cdb54 100644 --- a/artiq/language/core.py +++ b/artiq/language/core.py @@ -6,7 +6,6 @@ from typing import Generic, TypeVar from functools import wraps from inspect import getfullargspec, getmodule from types import SimpleNamespace -from typing import TypeVar from math import floor, ceil from artiq.language import import_cache @@ -16,9 +15,10 @@ __all__ = [ "Kernel", "KernelInvariant", "virtual", "round64", "floor64", "ceil64", "extern", "kernel", "portable", "nac3", "rpc", + "print_rpc", + "Option", "Some", "none", "UnwrapNoneError", "parallel", "sequential", "set_watchdog_factory", "watchdog", "TerminationRequested", - "print_rpc" ] @@ -109,13 +109,51 @@ def rpc(arg=None, flags={}): return arg -T = TypeVar('T') - @rpc def print_rpc(a: T): print(a) +@nac3 +class UnwrapNoneError(Exception): + """Raised when unwrapping a none Option.""" + artiq_builtin = True + +class Option(Generic[T]): + _nac3_option: T + + def __init__(self, v: T): + self._nac3_option = v + + def is_none(self): + return self._nac3_option is None + + def is_some(self): + return self._nac3_option is not None + + def unwrap(self): + if self.is_none(): + raise UnwrapNoneError() + return self._nac3_option + + def __repr__(self) -> str: + if self.is_none(): + return "none" + else: + return "Some({})".format(repr(self._nac3_option)) + + def __str__(self) -> str: + if self.is_none(): + return "none" + else: + return "Some({})".format(str(self._nac3_option)) + +def Some(v: T) -> Option[T]: + return Option(v) + +none = Option(None) + + @nac3 class KernelContextManager: @kernel diff --git a/artiq/language/embedding_map.py b/artiq/language/embedding_map.py index 6c323e7a4..64a041a6f 100644 --- a/artiq/language/embedding_map.py +++ b/artiq/language/embedding_map.py @@ -23,7 +23,8 @@ class EmbeddingMap: "CacheError", "SPIError", "0:ZeroDivisionError", - "0:IndexError"]) + "0:IndexError", + "0:UnwrapNoneError"]) def preallocate_runtime_exception_names(self, names): for i, name in enumerate(names): diff --git a/flake.lock b/flake.lock index b89102281..b75e5f65e 100644 --- a/flake.lock +++ b/flake.lock @@ -45,11 +45,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1648132215, - "narHash": "sha256-Sts6AGduDi4jsD6YSYR2bwHW35TByGgHAfVPrenrCxg=", + "lastModified": 1648280781, + "narHash": "sha256-HSelJSl7Q4LNI1cCApsUULidDCnRcXRocT+/e31iHL8=", "ref": "master", - "rev": "55db05fdbb2ee35a907d32de778887716f71f5fe", - "revCount": 680, + "rev": "1ad4b0227c87736beec62d94161291b7e27de6cc", + "revCount": 685, "type": "git", "url": "https://git.m-labs.hk/m-labs/nac3.git" },