sync exception names and ids

This commit is contained in:
abdul124 2024-08-19 11:43:26 +08:00 committed by Sébastien Bourdeauducq
parent e82cf94cae
commit 9591549b37
8 changed files with 71 additions and 33 deletions

View File

@ -57,16 +57,31 @@ class EmbeddingMap:
self.str_forward_map = {} self.str_forward_map = {}
self.str_reverse_map = {} self.str_reverse_map = {}
self.preallocate_runtime_exception_names(["RuntimeError", # Keep this list of exceptions in sync with `EXCEPTION_ID_LOOKUP` in `artiq.firmware.ksupport.eh_artiq``
"RTIOUnderflow", # The exceptions declared here should be defined in `artiq.coredeive.exceptions``
"RTIOOverflow", # Without sync, test cases in artiq.test.coredevice.test_exceptions would fail
"RTIODestinationUnreachable", self.preallocate_runtime_exception_names([
"DMAError", "RTIOUnderflow",
"I2CError", "RTIOOverflow",
"CacheError", "RTIODestinationUnreachable",
"SPIError", "DMAError",
"0:ZeroDivisionError", "I2CError",
"0:IndexError"]) "CacheError",
"SPIError",
"0:AssertionError",
"0:AttributeError",
"0:IndexError",
"0:IOError",
"0:KeyError",
"0:NotImplementedError",
"0:OverflowError",
"0:RuntimeError",
"0:TimeoutError",
"0:TypeError",
"0:ValueError",
"0:ZeroDivisionError"
])
def preallocate_runtime_exception_names(self, names): def preallocate_runtime_exception_names(self, names):
for i, name in enumerate(names): for i, name in enumerate(names):

View File

@ -6,12 +6,26 @@ import os
from artiq import __artiq_dir__ as artiq_dir from artiq import __artiq_dir__ as artiq_dir
from artiq.coredevice.runtime import source_loader from artiq.coredevice.runtime import source_loader
"""
This file should provide class definition for all the exceptions declared in `EmbeddingMap` in artiq.compiler.embedding
For python builtin exceptions, use the `builtins` module
For artiq specific exceptions, inherit from `Exception` class
"""
ZeroDivisionError = builtins.ZeroDivisionError
ValueError = builtins.ValueError
IndexError = builtins.IndexError
RuntimeError = builtins.RuntimeError
AssertionError = builtins.AssertionError AssertionError = builtins.AssertionError
AttributeError = builtins.AttributeError
IndexError = builtins.IndexError
IOError = builtins.IOError
KeyError = builtins.KeyError
NotImplementedError = builtins.NotImplementedError
OverflowError = builtins.OverflowError
RuntimeError = builtins.RuntimeError
TimeoutError = builtins.TimeoutError
TypeError = builtins.TypeError
ValueError = builtins.ValueError
ZeroDivisionError = builtins.ZeroDivisionError
OSError = builtins.OSError
class CoreException: class CoreException:
@ -150,13 +164,13 @@ class DMAError(Exception):
class ClockFailure(Exception): class ClockFailure(Exception):
"""Raised when RTIO PLL has lost lock.""" """Raised when RTIO PLL has lost lock."""
artiq_builtin = True
class I2CError(Exception): class I2CError(Exception):
"""Raised when a I2C transaction fails.""" """Raised when a I2C transaction fails."""
pass artiq_builtin = True
class SPIError(Exception): class SPIError(Exception):
"""Raised when a SPI transaction fails.""" """Raised when a SPI transaction fails."""
pass artiq_builtin = True

View File

@ -333,18 +333,27 @@ extern fn stop_fn(_version: c_int,
} }
} }
static EXCEPTION_ID_LOOKUP: [(&str, u32); 11] = [ // Must be kept in sync with `artq.compiler.embedding`
("RuntimeError", 0), static EXCEPTION_ID_LOOKUP: [(&str, u32); 19] = [
("RTIOUnderflow", 1), ("RTIOUnderflow", 0),
("RTIOOverflow", 2), ("RTIOOverflow", 1),
("RTIODestinationUnreachable", 3), ("RTIODestinationUnreachable", 2),
("DMAError", 4), ("DMAError", 3),
("I2CError", 5), ("I2CError", 4),
("CacheError", 6), ("CacheError", 5),
("SPIError", 7), ("SPIError", 6),
("ZeroDivisionError", 8), ("AssertionError", 7),
("AttributeError", 8),
("IndexError", 9), ("IndexError", 9),
("UnwrapNoneError", 10), ("IOError", 10),
("KeyError", 11),
("NotImplementedError", 12),
("OverflowError", 13),
("RuntimeError", 14),
("TimeoutError", 15),
("TypeError", 16),
("ValueError", 17),
("ZeroDivisionError", 18),
]; ];
pub fn get_exception_id(name: &str) -> u32 { pub fn get_exception_id(name: &str) -> u32 {

View File

@ -8,7 +8,7 @@ def catch(f):
except Exception as e: except Exception as e:
print(e) print(e)
# CHECK-L: 8(0, 0, 0) # CHECK-L: 18(0, 0, 0)
catch(lambda: 1/0) catch(lambda: 1/0)
# CHECK-L: 9(10, 1, 0) # CHECK-L: 9(10, 1, 0)
catch(lambda: [1.0][10]) catch(lambda: [1.0][10])

View File

@ -10,7 +10,7 @@ def catch(f):
except IndexError as ie: except IndexError as ie:
print(ie) print(ie)
# CHECK-L: 8(0, 0, 0) # CHECK-L: 18(0, 0, 0)
catch(lambda: 1/0) catch(lambda: 1/0)
# CHECK-L: 9(10, 1, 0) # CHECK-L: 9(10, 1, 0)
catch(lambda: [1.0][10]) catch(lambda: [1.0][10])

View File

@ -3,7 +3,7 @@
# REQUIRES: exceptions # REQUIRES: exceptions
def f(): def f():
# CHECK-L: Uncaught 8 # CHECK-L: Uncaught 18
# CHECK-L: at input.py:${LINE:+1}: # CHECK-L: at input.py:${LINE:+1}:
1/0 1/0

View File

@ -9,7 +9,7 @@ def g():
try: try:
f() f()
except Exception as e: except Exception as e:
# CHECK-L: Uncaught 8 # CHECK-L: Uncaught 18
# CHECK-L: at input.py:${LINE:+1}: # CHECK-L: at input.py:${LINE:+1}:
raise e raise e

View File

@ -2,6 +2,6 @@
# RUN: OutputCheck %s --file-to-check=%t # RUN: OutputCheck %s --file-to-check=%t
# REQUIRES: exceptions # REQUIRES: exceptions
# CHECK-L: Uncaught 8: cannot divide by zero (0, 0, 0) # CHECK-L: Uncaught 18: cannot divide by zero (0, 0, 0)
# CHECK-L: at input.py:${LINE:+1}: # CHECK-L: at input.py:${LINE:+1}:
1/0 1/0