add first cut at parallel maxloc, adding random tests
[openpower-isa.git] / src / openpower / decoder / isa / maxloc.py
1 # Implementation of FORTRAN maxloc in python
2 # Copyright (C) Luke Kenneth Casson Leighton <lkcl@lkcl.net>
3 # License: LGPLv3+
4 # https://bugs.libre-soc.org/show_bug.cgi?id=676#c2
5
6 from random import randint
7
8 def m2(a):
9 m = 0;
10 nm = 0;
11 i = 0;
12 n = len(a)
13
14 while (i<n):
15 while (i<n and a[i]<=m) :
16 print("%d idx %d <= m %d" % ( i, a[i], m))
17 i += 1
18 while (i < n and a[i] > m) :
19 print("%d idx %d > m %d" % (i, a[i], m))
20 m = a[i]
21 nm = i
22 i += 1
23 return nm;
24
25 def sv_maxu(gpr, CR, vl, ra, rb, rt):
26 i = 0
27 while i < vl:
28 CR[0] = cmpd(gpr[ra+i], gpr[rb])
29 log("sv_maxss test", i, gpr[ra + i], gpr[rb], CR[0], int(CR[0]))
30 gpr[rt] = gpr[ra+i] if CR[0].lt else gpr[rb]
31 if not CR[0].gt:
32 break
33 i += 1
34 return i # new VL
35
36 # this version is more akin to SVP64, using an implementation of sv.minmax
37 def m3(a):
38 m = 0;
39 nm = 0;
40 i = 0;
41 n = len(a)
42 vl = 4
43
44 while (i<n):
45 while (i<n and a[i]<=m) :
46 print("%d idx %d <= m %d" % ( i, a[i], m))
47 i += 1
48 while (i < n and a[i] > m) :
49 print("%d idx %d > m %d" % (i, a[i], m))
50 m = a[i]
51 nm = i
52 i += 1
53 return nm;
54
55 # /*Testbench*/
56
57 test_data = [
58 ([5,2,8,1,3,7,9,4], 6),
59 ([5,2,8,9,9,7,9,4], 3),
60 ([0,0,0,0,0,0,0,0], 0),
61 ([5,5,5,5,5,5,5,5], 0),
62 ]
63
64 if __name__ == '__main__':
65 for arr, expected in test_data:
66 print("search list", arr)
67 result = m2(arr)
68 print("Index of the maximum value in an array is: %d" % result)
69 assert (result == expected)
70
71 # test m2 against m3
72 for i in range(200):
73 array_len = randint(2, 15)
74 array = []
75 for j in range(array_len):
76 array.append(randint(0, 20))
77 print("randomised search list", array)
78 expected = m2(array)
79 print("Index of the maximum value in an array is: %d" % expected)
80 assert (m3(array) == expected)