tests/micropython: Improve viper ptr boundary tests.

This commit reworks the Viper pointer boundary tests in order to make
them more accurate and easier to extend.

The tests are now easier to reason about in their output, using easier
to read values, and bit thresholds are now more configurable.  If a new
conditional code sequence is introduced, adding a new bit threshold is
just a matter of adding a value into a tuple at the beginning of the
relevant test file.

Load tests have also been made more accurate, with better function
templates to test register-indexed operations.

Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit is contained in:
Alessandro Gatti
2025-06-11 09:31:34 +02:00
committed by Damien George
parent c8c8b04569
commit 0d435959e0
12 changed files with 303 additions and 172 deletions

View File

@@ -2,24 +2,38 @@
GET_TEMPLATE = """
@micropython.viper
def get{off}(src: ptr16) -> int:
return src[{off}]
print(b[{off} * 2:({off} + 1) * 2])
def get{off}(src: ptr16) -> uint:
return uint(src[{off}])
print(hex(get{off}(buffer)))
"""
BIT_THRESHOLDS = (5, 8, 11, 12)
SIZE = 2
@micropython.viper
def get_index(src: ptr16, i: int) -> int:
return src[i]
b = bytearray(5000)
b[28:38] = b"0123456789"
b[252:262] = b"ABCDEFGHIJ"
b[4092:4102] = b"KLMNOPQRST"
def data(start, len):
output = bytearray(len)
for idx in range(len):
output[idx] = (start + idx) & 0xFF
return output
for pre, idx, post in (15, 16, 17), (127, 128, 129), (2047, 2048, 2049):
print(get_index(b, pre), get_index(b, idx), get_index(b, post))
buffer = bytearray((((1 << max(BIT_THRESHOLDS)) + 1) // 1024) * 1024)
val = 0
for bit in BIT_THRESHOLDS:
print("---", bit)
pre, idx, post = ((1 << bit) - (2 * SIZE), (1 << bit) - (1 * SIZE), 1 << bit)
buffer[pre:post] = data(val, 3 * SIZE)
val = val + (3 * SIZE)
pre, idx, post = pre // SIZE, idx // SIZE, post // SIZE
print(hex(get_index(buffer, pre)), hex(get_index(buffer, idx)), hex(get_index(buffer, post)))
exec(GET_TEMPLATE.format(off=pre))
exec(GET_TEMPLATE.format(off=idx))
exec(GET_TEMPLATE.format(off=post))

View File

@@ -1,12 +1,20 @@
13106 13620 14134
bytearray(b'23')
bytearray(b'45')
bytearray(b'67')
17475 17989 18503
bytearray(b'CD')
bytearray(b'EF')
bytearray(b'GH')
20045 20559 21073
bytearray(b'MN')
bytearray(b'OP')
bytearray(b'QR')
--- 5
0x100 0x302 0x504
0x100
0x302
0x504
--- 8
0x706 0x908 0xb0a
0x706
0x908
0xb0a
--- 11
0xd0c 0xf0e 0x1110
0xd0c
0xf0e
0x1110
--- 12
0x1312 0x1514 0x1716
0x1312
0x1514
0x1716

View File

@@ -4,38 +4,50 @@ SET_TEMPLATE = """
@micropython.viper
def set{off}(dest: ptr16):
dest[{off}] = {val}
set{off}(b)
print(b[{off} * 2:({off} + 1) * 2])
set{off}(buffer)
print(hex(get_index(buffer, {off})))
"""
TEST_DATA = (
(15, (0x4241, 0x4443, 0x4645)),
(127, (0x4847, 0x4A49, 0x4C4B)),
(2047, (0x4E4D, 0x504F, 0x5251)),
)
BIT_THRESHOLDS = (5, 8, 11, 12)
SIZE = 2
MASK = (1 << (8 * SIZE)) - 1
@micropython.viper
def set_index(dest: ptr16, i: int, val: int):
def set_index(dest: ptr16, i: int, val: uint):
dest[i] = val
@micropython.viper
def set_index(dest: ptr16, i: int, val: int):
dest[i] = val
def get_index(src, i):
return src[i * SIZE] + (src[(i * SIZE) + 1] << 8)
b = bytearray(5000)
for start, vals in TEST_DATA:
for i, v in enumerate(vals):
set_index(b, start + i, v)
print(b[(start + i) * 2 : (start + i + 1) * 2])
for i in range(len(b)):
b[i] = 0
for start, vals in TEST_DATA:
for i, v in enumerate(vals):
exec(SET_TEMPLATE.format(off=start + i, val=v + 0x0101))
buffer = bytearray(((1 << max(BIT_THRESHOLDS) + 1) // 1024) * 1024)
next = 1
val = 0
for bit in BIT_THRESHOLDS:
print("---", bit)
pre, idx, post = (
(((1 << bit) - (2 * SIZE)) // SIZE),
(((1 << bit) - (1 * SIZE)) // SIZE),
((1 << bit) // SIZE),
)
val = (val << 8) + next
next += 1
set_index(buffer, pre, val & MASK)
val = (val << 8) + next
next += 1
set_index(buffer, idx, val & MASK)
val = (val << 8) + next
next += 1
set_index(buffer, post, val & MASK)
val = (val << 8) + next
next += 1
print(hex(get_index(buffer, pre)), hex(get_index(buffer, idx)), hex(get_index(buffer, post)))
exec(SET_TEMPLATE.format(off=pre, val=val & MASK))
val = (val << 8) + next
next += 1
exec(SET_TEMPLATE.format(off=idx, val=val & MASK))
val = (val << 8) + next
next += 1
exec(SET_TEMPLATE.format(off=post, val=val & MASK))

View File

@@ -1,18 +1,20 @@
bytearray(b'AB')
bytearray(b'CD')
bytearray(b'EF')
bytearray(b'GH')
bytearray(b'IJ')
bytearray(b'KL')
bytearray(b'MN')
bytearray(b'OP')
bytearray(b'QR')
bytearray(b'BC')
bytearray(b'DE')
bytearray(b'FG')
bytearray(b'HI')
bytearray(b'JK')
bytearray(b'LM')
bytearray(b'NO')
bytearray(b'PQ')
bytearray(b'RS')
--- 5
0x1 0x102 0x203
0x304
0x405
0x506
--- 8
0x607 0x708 0x809
0x90a
0xa0b
0xb0c
--- 11
0xc0d 0xd0e 0xe0f
0xf10
0x1011
0x1112
--- 12
0x1213 0x1314 0x1415
0x1516
0x1617
0x1718

View File

@@ -2,24 +2,38 @@
GET_TEMPLATE = """
@micropython.viper
def get{off}(src: ptr32) -> int:
return src[{off}]
print(b[{off} * 4:({off} + 1) * 4])
def get{off}(src: ptr32) -> uint:
return uint(src[{off}])
print(hex(get{off}(buffer)))
"""
BIT_THRESHOLDS = (5, 8, 11, 12)
SIZE = 4
@micropython.viper
def get_index(src: ptr32, i: int) -> int:
return src[i]
b = bytearray(5000)
b[24:43] = b"0123456789ABCDEFGHIJ"
b[248:268] = b"KLMNOPQRSTUVWXYZabcd"
b[4088:4108] = b"efghijklmnopqrstuvwx"
def data(start, len):
output = bytearray(len)
for idx in range(len):
output[idx] = (start + idx) & 0xFF
return output
for pre, idx, post in (7, 8, 9), (63, 64, 65), (1023, 1024, 1025):
print(get_index(b, pre), get_index(b, idx), get_index(b, post))
buffer = bytearray((((1 << max(BIT_THRESHOLDS)) + 1) // 1024) * 1024)
val = 0
for bit in BIT_THRESHOLDS:
print("---", bit)
pre, idx, post = (((1 << bit) - (2 * SIZE)), ((1 << bit) - (1 * SIZE)), (1 << bit))
buffer[pre:post] = data(val, 3 * SIZE)
val = val + (3 * SIZE)
pre, idx, post = pre // SIZE, idx // SIZE, post // SIZE
print(hex(get_index(buffer, pre)), hex(get_index(buffer, idx)), hex(get_index(buffer, post)))
exec(GET_TEMPLATE.format(off=pre))
exec(GET_TEMPLATE.format(off=idx))
exec(GET_TEMPLATE.format(off=post))

View File

@@ -1,12 +1,20 @@
926299444 1111570744 1178944579
bytearray(b'4567')
bytearray(b'89AB')
bytearray(b'CDEF')
1381060687 1448432723 1515804759
bytearray(b'OPQR')
bytearray(b'STUV')
bytearray(b'WXYZ')
1818978921 1886350957 1953722993
bytearray(b'ijkl')
bytearray(b'mnop')
bytearray(b'qrst')
--- 5
0x3020100 0x7060504 0xb0a0908
0x3020100
0x7060504
0xb0a0908
--- 8
0xf0e0d0c 0x13121110 0x17161514
0xf0e0d0c
0x13121110
0x17161514
--- 11
0x1b1a1918 0x1f1e1d1c 0x23222120
0x1b1a1918
0x1f1e1d1c
0x23222120
--- 12
0x27262524 0x2b2a2928 0x2f2e2d2c
0x27262524
0x2b2a2928
0x2f2e2d2c

View File

@@ -1,35 +1,58 @@
# Test boundary conditions for various architectures
TEST_DATA = (
(3, (0x04030201, 0x08070605, 0x0C0B0A09)),
(63, (0x100F0E0D, 0x14131211, 0x18171615)),
(1023, (0x1C1B1A19, 0x201F1E1D, 0x24232221)),
)
SET_TEMPLATE = """
@micropython.viper
def set{off}(dest: ptr32):
dest[{off}] = {val} & 0x3FFFFFFF
set{off}(b)
print(b[{off} * 4:({off} + 1) * 4])
dest[{off}] = {val}
set{off}(buffer)
print(hex(get_index(buffer, {off})))
"""
BIT_THRESHOLDS = (5, 8, 11, 12)
SIZE = 4
MASK = (1 << (8 * SIZE)) - 1
@micropython.viper
def set_index(dest: ptr32, i: int, val: int):
def set_index(dest: ptr32, i: int, val: uint):
dest[i] = val
b = bytearray(5000)
for start, vals in TEST_DATA:
for i, v in enumerate(vals):
set_index(b, start + i, v)
print(b[(start + i) * 4 : (start + i + 1) * 4])
for i in range(len(b)):
b[i] = 0
def get_index(src, i):
return (
src[i * SIZE]
+ (src[(i * SIZE) + 1] << 8)
+ (src[(i * SIZE) + 2] << 16)
+ (src[(i * SIZE) + 3] << 24)
)
for start, vals in TEST_DATA:
for i, v in enumerate(vals):
exec(SET_TEMPLATE.format(off=start + i, val=v + 0x01010101))
buffer = bytearray(((1 << max(BIT_THRESHOLDS) + 1) // 1024) * 1024)
next = 1
val = 0
for bit in BIT_THRESHOLDS:
print("---", bit)
pre, idx, post = (
(((1 << bit) - (2 * SIZE)) // SIZE),
(((1 << bit) - (1 * SIZE)) // SIZE),
((1 << bit) // SIZE),
)
val = (val << 8) + next
next += 1
set_index(buffer, pre, val & MASK)
val = (val << 8) + next
next += 1
set_index(buffer, idx, val & MASK)
val = (val << 8) + next
next += 1
set_index(buffer, post, val & MASK)
val = (val << 8) + next
next += 1
print(hex(get_index(buffer, pre)), hex(get_index(buffer, idx)), hex(get_index(buffer, post)))
exec(SET_TEMPLATE.format(off=pre, val=val & MASK))
val = (val << 8) + next
next += 1
exec(SET_TEMPLATE.format(off=idx, val=val & MASK))
val = (val << 8) + next
next += 1
exec(SET_TEMPLATE.format(off=post, val=val & MASK))

View File

@@ -1,18 +1,20 @@
bytearray(b'\x01\x02\x03\x04')
bytearray(b'\x05\x06\x07\x08')
bytearray(b'\t\n\x0b\x0c')
bytearray(b'\r\x0e\x0f\x10')
bytearray(b'\x11\x12\x13\x14')
bytearray(b'\x15\x16\x17\x18')
bytearray(b'\x19\x1a\x1b\x1c')
bytearray(b'\x1d\x1e\x1f ')
bytearray(b'!"#$')
bytearray(b'\x02\x03\x04\x05')
bytearray(b'\x06\x07\x08\t')
bytearray(b'\n\x0b\x0c\r')
bytearray(b'\x0e\x0f\x10\x11')
bytearray(b'\x12\x13\x14\x15')
bytearray(b'\x16\x17\x18\x19')
bytearray(b'\x1a\x1b\x1c\x1d')
bytearray(b'\x1e\x1f !')
bytearray(b'"#$%')
--- 5
0x1 0x102 0x10203
0x1020304
0x2030405
0x3040506
--- 8
0x4050607 0x5060708 0x6070809
0x708090a
0x8090a0b
0x90a0b0c
--- 11
0xa0b0c0d 0xb0c0d0e 0xc0d0e0f
0xd0e0f10
0xe0f1011
0xf101112
--- 12
0x10111213 0x11121314 0x12131415
0x13141516
0x14151617
0x15161718

View File

@@ -2,24 +2,37 @@
GET_TEMPLATE = """
@micropython.viper
def get{off}(src: ptr8) -> int:
return src[{off}]
print(get{off}(b))
def get{off}(src: ptr8) -> uint:
return uint(src[{off}])
print(hex(get{off}(buffer)))
"""
BIT_THRESHOLDS = (5, 8, 11, 12)
SIZE = 1
@micropython.viper
def get_index(src: ptr8, i: int) -> int:
return src[i]
b = bytearray(5000)
b[30:32] = b"123"
b[254:256] = b"456"
b[4094:4096] = b"789"
def data(start, len):
output = bytearray(len)
for idx in range(len):
output[idx] = (start + idx) & 0xFF
return output
for pre, idx, post in (30, 31, 32), (254, 255, 256), (4094, 4095, 4096):
print(get_index(b, pre), get_index(b, idx), get_index(b, post))
buffer = bytearray((((1 << max(BIT_THRESHOLDS)) + 1) // 1024) * 1024)
val = 0
for bit in BIT_THRESHOLDS:
print("---", bit)
pre, idx, post = (((1 << bit) - (2 * SIZE)), ((1 << bit) - (1 * SIZE)), (1 << bit))
buffer[pre:post] = data(val, 3 * SIZE)
val = val + (3 * SIZE)
print(hex(get_index(buffer, pre)), hex(get_index(buffer, idx)), hex(get_index(buffer, post)))
exec(GET_TEMPLATE.format(off=pre))
exec(GET_TEMPLATE.format(off=idx))
exec(GET_TEMPLATE.format(off=post))

View File

@@ -1,12 +1,20 @@
49 50 51
49
50
51
52 53 54
52
53
54
55 56 57
55
56
57
--- 5
0x0 0x1 0x2
0x0
0x1
0x2
--- 8
0x3 0x4 0x5
0x3
0x4
0x5
--- 11
0x6 0x7 0x8
0x6
0x7
0x8
--- 12
0x9 0xa 0xb
0x9
0xa
0xb

View File

@@ -1,30 +1,49 @@
# Test boundary conditions for various architectures
TEST_DATA = ((49, 30, 3), (52, 254, 3), (55, 4094, 3))
SET_TEMPLATE = """
@micropython.viper
def set{off}(dest: ptr8):
dest[{off}] = {val}
set{off}(b)
print(b[{off}])
set{off}(buffer)
print(hex(get_index(buffer, {off})))
"""
BIT_THRESHOLDS = (5, 8, 11, 12)
SIZE = 1
MASK = (1 << (8 * SIZE)) - 1
@micropython.viper
def set_index(dest: ptr8, i: int, val: int):
def set_index(dest: ptr8, i: int, val: uint):
dest[i] = val
b = bytearray(5000)
for val, start, count in TEST_DATA:
for i in range(count):
set_index(b, start + i, val + i)
print(b[start : start + count])
def get_index(src: ptr8, i: int):
return src[i]
for i in range(len(b)):
b[i] = 0
for val, start, count in TEST_DATA:
for i in range(count):
exec(SET_TEMPLATE.format(off=start + i, val=val + i + 16))
buffer = bytearray(((1 << max(BIT_THRESHOLDS) + 1) // 1024) * 1024)
next = 1
val = 0
for bit in BIT_THRESHOLDS:
print("---", bit)
pre, idx, post = (((1 << bit) - (2 * SIZE)), ((1 << bit) - (1 * SIZE)), (1 << bit))
val = (val << 8) + next
next += 1
set_index(buffer, pre, val & MASK)
val = (val << 8) + next
next += 1
set_index(buffer, idx, val & MASK)
val = (val << 8) + next
next += 1
set_index(buffer, post, val & MASK)
val = (val << 8) + next
next += 1
print(hex(get_index(buffer, pre)), hex(get_index(buffer, idx)), hex(get_index(buffer, post)))
exec(SET_TEMPLATE.format(off=pre, val=val & MASK))
val = (val << 8) + next
next += 1
exec(SET_TEMPLATE.format(off=idx, val=val & MASK))
val = (val << 8) + next
next += 1
exec(SET_TEMPLATE.format(off=post, val=val & MASK))

View File

@@ -1,12 +1,20 @@
bytearray(b'123')
bytearray(b'456')
bytearray(b'789')
65
66
67
68
69
70
71
72
73
--- 5
0x1 0x2 0x3
0x4
0x5
0x6
--- 8
0x7 0x8 0x9
0xa
0xb
0xc
--- 11
0xd 0xe 0xf
0x10
0x11
0x12
--- 12
0x13 0x14 0x15
0x16
0x17
0x18