Skip to content

Commit 0d43595

Browse files
agattidpgeorge
authored andcommitted
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>
1 parent c8c8b04 commit 0d43595

12 files changed

+309
-178
lines changed

tests/micropython/viper_ptr16_load_boundary.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,38 @@
22

33
GET_TEMPLATE = """
44
@micropython.viper
5-
def get{off}(src: ptr16) -> int:
6-
return src[{off}]
7-
print(b[{off} * 2:({off} + 1) * 2])
5+
def get{off}(src: ptr16) -> uint:
6+
return uint(src[{off}])
7+
print(hex(get{off}(buffer)))
88
"""
99

1010

11+
BIT_THRESHOLDS = (5, 8, 11, 12)
12+
SIZE = 2
13+
14+
1115
@micropython.viper
1216
def get_index(src: ptr16, i: int) -> int:
1317
return src[i]
1418

1519

16-
b = bytearray(5000)
17-
b[28:38] = b"0123456789"
18-
b[252:262] = b"ABCDEFGHIJ"
19-
b[4092:4102] = b"KLMNOPQRST"
20+
def data(start, len):
21+
output = bytearray(len)
22+
for idx in range(len):
23+
output[idx] = (start + idx) & 0xFF
24+
return output
25+
26+
27+
buffer = bytearray((((1 << max(BIT_THRESHOLDS)) + 1) // 1024) * 1024)
28+
val = 0
29+
for bit in BIT_THRESHOLDS:
30+
print("---", bit)
31+
pre, idx, post = ((1 << bit) - (2 * SIZE), (1 << bit) - (1 * SIZE), 1 << bit)
32+
buffer[pre:post] = data(val, 3 * SIZE)
33+
val = val + (3 * SIZE)
2034

21-
for pre, idx, post in (15, 16, 17), (127, 128, 129), (2047, 2048, 2049):
22-
print(get_index(b, pre), get_index(b, idx), get_index(b, post))
35+
pre, idx, post = pre // SIZE, idx // SIZE, post // SIZE
36+
print(hex(get_index(buffer, pre)), hex(get_index(buffer, idx)), hex(get_index(buffer, post)))
2337
exec(GET_TEMPLATE.format(off=pre))
2438
exec(GET_TEMPLATE.format(off=idx))
2539
exec(GET_TEMPLATE.format(off=post))
Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
1-
13106 13620 14134
2-
bytearray(b'23')
3-
bytearray(b'45')
4-
bytearray(b'67')
5-
17475 17989 18503
6-
bytearray(b'CD')
7-
bytearray(b'EF')
8-
bytearray(b'GH')
9-
20045 20559 21073
10-
bytearray(b'MN')
11-
bytearray(b'OP')
12-
bytearray(b'QR')
1+
--- 5
2+
0x100 0x302 0x504
3+
0x100
4+
0x302
5+
0x504
6+
--- 8
7+
0x706 0x908 0xb0a
8+
0x706
9+
0x908
10+
0xb0a
11+
--- 11
12+
0xd0c 0xf0e 0x1110
13+
0xd0c
14+
0xf0e
15+
0x1110
16+
--- 12
17+
0x1312 0x1514 0x1716
18+
0x1312
19+
0x1514
20+
0x1716

tests/micropython/viper_ptr16_store_boundary.py

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,50 @@
44
@micropython.viper
55
def set{off}(dest: ptr16):
66
dest[{off}] = {val}
7-
set{off}(b)
8-
print(b[{off} * 2:({off} + 1) * 2])
7+
set{off}(buffer)
8+
print(hex(get_index(buffer, {off})))
99
"""
1010

11-
TEST_DATA = (
12-
(15, (0x4241, 0x4443, 0x4645)),
13-
(127, (0x4847, 0x4A49, 0x4C4B)),
14-
(2047, (0x4E4D, 0x504F, 0x5251)),
15-
)
11+
BIT_THRESHOLDS = (5, 8, 11, 12)
12+
SIZE = 2
13+
MASK = (1 << (8 * SIZE)) - 1
1614

1715

1816
@micropython.viper
19-
def set_index(dest: ptr16, i: int, val: int):
17+
def set_index(dest: ptr16, i: int, val: uint):
2018
dest[i] = val
2119

2220

23-
@micropython.viper
24-
def set_index(dest: ptr16, i: int, val: int):
25-
dest[i] = val
26-
27-
28-
b = bytearray(5000)
29-
for start, vals in TEST_DATA:
30-
for i, v in enumerate(vals):
31-
set_index(b, start + i, v)
32-
print(b[(start + i) * 2 : (start + i + 1) * 2])
33-
34-
35-
for i in range(len(b)):
36-
b[i] = 0
37-
38-
39-
for start, vals in TEST_DATA:
40-
for i, v in enumerate(vals):
41-
exec(SET_TEMPLATE.format(off=start + i, val=v + 0x0101))
21+
def get_index(src, i):
22+
return src[i * SIZE] + (src[(i * SIZE) + 1] << 8)
23+
24+
25+
buffer = bytearray(((1 << max(BIT_THRESHOLDS) + 1) // 1024) * 1024)
26+
next = 1
27+
val = 0
28+
for bit in BIT_THRESHOLDS:
29+
print("---", bit)
30+
pre, idx, post = (
31+
(((1 << bit) - (2 * SIZE)) // SIZE),
32+
(((1 << bit) - (1 * SIZE)) // SIZE),
33+
((1 << bit) // SIZE),
34+
)
35+
val = (val << 8) + next
36+
next += 1
37+
set_index(buffer, pre, val & MASK)
38+
val = (val << 8) + next
39+
next += 1
40+
set_index(buffer, idx, val & MASK)
41+
val = (val << 8) + next
42+
next += 1
43+
set_index(buffer, post, val & MASK)
44+
val = (val << 8) + next
45+
next += 1
46+
print(hex(get_index(buffer, pre)), hex(get_index(buffer, idx)), hex(get_index(buffer, post)))
47+
exec(SET_TEMPLATE.format(off=pre, val=val & MASK))
48+
val = (val << 8) + next
49+
next += 1
50+
exec(SET_TEMPLATE.format(off=idx, val=val & MASK))
51+
val = (val << 8) + next
52+
next += 1
53+
exec(SET_TEMPLATE.format(off=post, val=val & MASK))
Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
1-
bytearray(b'AB')
2-
bytearray(b'CD')
3-
bytearray(b'EF')
4-
bytearray(b'GH')
5-
bytearray(b'IJ')
6-
bytearray(b'KL')
7-
bytearray(b'MN')
8-
bytearray(b'OP')
9-
bytearray(b'QR')
10-
bytearray(b'BC')
11-
bytearray(b'DE')
12-
bytearray(b'FG')
13-
bytearray(b'HI')
14-
bytearray(b'JK')
15-
bytearray(b'LM')
16-
bytearray(b'NO')
17-
bytearray(b'PQ')
18-
bytearray(b'RS')
1+
--- 5
2+
0x1 0x102 0x203
3+
0x304
4+
0x405
5+
0x506
6+
--- 8
7+
0x607 0x708 0x809
8+
0x90a
9+
0xa0b
10+
0xb0c
11+
--- 11
12+
0xc0d 0xd0e 0xe0f
13+
0xf10
14+
0x1011
15+
0x1112
16+
--- 12
17+
0x1213 0x1314 0x1415
18+
0x1516
19+
0x1617
20+
0x1718

tests/micropython/viper_ptr32_load_boundary.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,38 @@
22

33
GET_TEMPLATE = """
44
@micropython.viper
5-
def get{off}(src: ptr32) -> int:
6-
return src[{off}]
7-
print(b[{off} * 4:({off} + 1) * 4])
5+
def get{off}(src: ptr32) -> uint:
6+
return uint(src[{off}])
7+
print(hex(get{off}(buffer)))
88
"""
99

1010

11+
BIT_THRESHOLDS = (5, 8, 11, 12)
12+
SIZE = 4
13+
14+
1115
@micropython.viper
1216
def get_index(src: ptr32, i: int) -> int:
1317
return src[i]
1418

1519

16-
b = bytearray(5000)
17-
b[24:43] = b"0123456789ABCDEFGHIJ"
18-
b[248:268] = b"KLMNOPQRSTUVWXYZabcd"
19-
b[4088:4108] = b"efghijklmnopqrstuvwx"
20+
def data(start, len):
21+
output = bytearray(len)
22+
for idx in range(len):
23+
output[idx] = (start + idx) & 0xFF
24+
return output
25+
26+
27+
buffer = bytearray((((1 << max(BIT_THRESHOLDS)) + 1) // 1024) * 1024)
28+
val = 0
29+
for bit in BIT_THRESHOLDS:
30+
print("---", bit)
31+
pre, idx, post = (((1 << bit) - (2 * SIZE)), ((1 << bit) - (1 * SIZE)), (1 << bit))
32+
buffer[pre:post] = data(val, 3 * SIZE)
33+
val = val + (3 * SIZE)
2034

21-
for pre, idx, post in (7, 8, 9), (63, 64, 65), (1023, 1024, 1025):
22-
print(get_index(b, pre), get_index(b, idx), get_index(b, post))
35+
pre, idx, post = pre // SIZE, idx // SIZE, post // SIZE
36+
print(hex(get_index(buffer, pre)), hex(get_index(buffer, idx)), hex(get_index(buffer, post)))
2337
exec(GET_TEMPLATE.format(off=pre))
2438
exec(GET_TEMPLATE.format(off=idx))
2539
exec(GET_TEMPLATE.format(off=post))
Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
1-
926299444 1111570744 1178944579
2-
bytearray(b'4567')
3-
bytearray(b'89AB')
4-
bytearray(b'CDEF')
5-
1381060687 1448432723 1515804759
6-
bytearray(b'OPQR')
7-
bytearray(b'STUV')
8-
bytearray(b'WXYZ')
9-
1818978921 1886350957 1953722993
10-
bytearray(b'ijkl')
11-
bytearray(b'mnop')
12-
bytearray(b'qrst')
1+
--- 5
2+
0x3020100 0x7060504 0xb0a0908
3+
0x3020100
4+
0x7060504
5+
0xb0a0908
6+
--- 8
7+
0xf0e0d0c 0x13121110 0x17161514
8+
0xf0e0d0c
9+
0x13121110
10+
0x17161514
11+
--- 11
12+
0x1b1a1918 0x1f1e1d1c 0x23222120
13+
0x1b1a1918
14+
0x1f1e1d1c
15+
0x23222120
16+
--- 12
17+
0x27262524 0x2b2a2928 0x2f2e2d2c
18+
0x27262524
19+
0x2b2a2928
20+
0x2f2e2d2c
Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,58 @@
11
# Test boundary conditions for various architectures
22

3-
TEST_DATA = (
4-
(3, (0x04030201, 0x08070605, 0x0C0B0A09)),
5-
(63, (0x100F0E0D, 0x14131211, 0x18171615)),
6-
(1023, (0x1C1B1A19, 0x201F1E1D, 0x24232221)),
7-
)
8-
93
SET_TEMPLATE = """
104
@micropython.viper
115
def set{off}(dest: ptr32):
12-
dest[{off}] = {val} & 0x3FFFFFFF
13-
set{off}(b)
14-
print(b[{off} * 4:({off} + 1) * 4])
6+
dest[{off}] = {val}
7+
set{off}(buffer)
8+
print(hex(get_index(buffer, {off})))
159
"""
1610

11+
BIT_THRESHOLDS = (5, 8, 11, 12)
12+
SIZE = 4
13+
MASK = (1 << (8 * SIZE)) - 1
14+
1715

1816
@micropython.viper
19-
def set_index(dest: ptr32, i: int, val: int):
17+
def set_index(dest: ptr32, i: int, val: uint):
2018
dest[i] = val
2119

2220

23-
b = bytearray(5000)
24-
for start, vals in TEST_DATA:
25-
for i, v in enumerate(vals):
26-
set_index(b, start + i, v)
27-
print(b[(start + i) * 4 : (start + i + 1) * 4])
28-
29-
for i in range(len(b)):
30-
b[i] = 0
31-
32-
33-
for start, vals in TEST_DATA:
34-
for i, v in enumerate(vals):
35-
exec(SET_TEMPLATE.format(off=start + i, val=v + 0x01010101))
21+
def get_index(src, i):
22+
return (
23+
src[i * SIZE]
24+
+ (src[(i * SIZE) + 1] << 8)
25+
+ (src[(i * SIZE) + 2] << 16)
26+
+ (src[(i * SIZE) + 3] << 24)
27+
)
28+
29+
30+
buffer = bytearray(((1 << max(BIT_THRESHOLDS) + 1) // 1024) * 1024)
31+
next = 1
32+
val = 0
33+
for bit in BIT_THRESHOLDS:
34+
print("---", bit)
35+
pre, idx, post = (
36+
(((1 << bit) - (2 * SIZE)) // SIZE),
37+
(((1 << bit) - (1 * SIZE)) // SIZE),
38+
((1 << bit) // SIZE),
39+
)
40+
val = (val << 8) + next
41+
next += 1
42+
set_index(buffer, pre, val & MASK)
43+
val = (val << 8) + next
44+
next += 1
45+
set_index(buffer, idx, val & MASK)
46+
val = (val << 8) + next
47+
next += 1
48+
set_index(buffer, post, val & MASK)
49+
val = (val << 8) + next
50+
next += 1
51+
print(hex(get_index(buffer, pre)), hex(get_index(buffer, idx)), hex(get_index(buffer, post)))
52+
exec(SET_TEMPLATE.format(off=pre, val=val & MASK))
53+
val = (val << 8) + next
54+
next += 1
55+
exec(SET_TEMPLATE.format(off=idx, val=val & MASK))
56+
val = (val << 8) + next
57+
next += 1
58+
exec(SET_TEMPLATE.format(off=post, val=val & MASK))
Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
1-
bytearray(b'\x01\x02\x03\x04')
2-
bytearray(b'\x05\x06\x07\x08')
3-
bytearray(b'\t\n\x0b\x0c')
4-
bytearray(b'\r\x0e\x0f\x10')
5-
bytearray(b'\x11\x12\x13\x14')
6-
bytearray(b'\x15\x16\x17\x18')
7-
bytearray(b'\x19\x1a\x1b\x1c')
8-
bytearray(b'\x1d\x1e\x1f ')
9-
bytearray(b'!"#$')
10-
bytearray(b'\x02\x03\x04\x05')
11-
bytearray(b'\x06\x07\x08\t')
12-
bytearray(b'\n\x0b\x0c\r')
13-
bytearray(b'\x0e\x0f\x10\x11')
14-
bytearray(b'\x12\x13\x14\x15')
15-
bytearray(b'\x16\x17\x18\x19')
16-
bytearray(b'\x1a\x1b\x1c\x1d')
17-
bytearray(b'\x1e\x1f !')
18-
bytearray(b'"#$%')
1+
--- 5
2+
0x1 0x102 0x10203
3+
0x1020304
4+
0x2030405
5+
0x3040506
6+
--- 8
7+
0x4050607 0x5060708 0x6070809
8+
0x708090a
9+
0x8090a0b
10+
0x90a0b0c
11+
--- 11
12+
0xa0b0c0d 0xb0c0d0e 0xc0d0e0f
13+
0xd0e0f10
14+
0xe0f1011
15+
0xf101112
16+
--- 12
17+
0x10111213 0x11121314 0x12131415
18+
0x13141516
19+
0x14151617
20+
0x15161718

0 commit comments

Comments
 (0)