cavatools: initialize repository
[cavatools.git] / pipesim / make_cache
1 #!/usr/bin/python3
2 #
3 # Copyright (c) 2020 Peter Hsu. All Rights Reserved. See LICENCE file for details.
4 #
5
6 import sys
7
8 if len(sys.argv) != 2:
9 print("usage: ./make_cache <ways associativity>")
10 exit(0)
11
12 N = int(sys.argv[1])
13 filename = 'lru_fsm_{:d}way.h'.format(N)
14 print('Making', N, 'way associative cache in file ', filename)
15
16 def cacheHit(state, hit):
17 new = state.copy()
18 # print("cacheHit(", state, hit, ")")
19 way = new.pop(hit)
20 new.insert(0, way)
21 return new
22
23 def makeKey(state):
24 key = '-'
25 key = key.join(state)
26 return key
27
28 def factorial(state):
29 key = makeKey(state)
30 for i in range(N):
31 nextState = cacheHit(state, i)
32 nextKey = makeKey(nextState)
33 if nextKey not in table:
34 table[nextKey] = [ None ]*N
35 factorial(nextState)
36 table[key][i] = nextKey
37
38 initial = []
39 for i in range(N-1, -1, -1):
40 initial.append(str(i))
41 table = {}
42 table[makeKey(initial)] = [ None ]*N
43 factorial(initial)
44
45 number = {}
46 k = 0
47 for key in sorted(table):
48 number[key] = k
49 k += 1
50
51
52
53 f = open(filename, 'w');
54 f.write('struct lru_fsm_t cache_fsm_{:d}way[] = {{\n'.format(N))
55 f.write('/* Header */\t{{ {:d}, {:3d} }}, /* Ways, Number of states */\n'.format(int(sys.argv[1]), len(table)))
56
57 k = 0
58 for key in sorted(table):
59 ways = key.split('-')
60 for (i, ww) in enumerate(ways):
61 w = int(ww)
62 ns = number[table[key][i]]
63 if ns == k:
64 f.write('/* {:2d} */'.format(k))
65 else:
66 f.write('\t')
67 f.write('\t{{ {:d}, {:3d}*{:d} }}, /* {:s} */\n'.format(w, ns, N, table[key][i]))
68 lru_w = w
69 lru_i = i
70 k += 1
71
72 f.write('};\n')
73
74 f.close()
75 exit(0)