#!/usr/bin/python3 # # Copyright (c) 2020 Peter Hsu. All Rights Reserved. See LICENCE file for details. # import sys if len(sys.argv) != 2: print("usage: ./make_cache ") exit(0) N = int(sys.argv[1]) filename = 'lru_fsm_{:d}way.h'.format(N) print('Making', N, 'way associative cache in file ', filename) def cacheHit(state, hit): new = state.copy() # print("cacheHit(", state, hit, ")") way = new.pop(hit) new.insert(0, way) return new def makeKey(state): key = '-' key = key.join(state) return key def factorial(state): key = makeKey(state) for i in range(N): nextState = cacheHit(state, i) nextKey = makeKey(nextState) if nextKey not in table: table[nextKey] = [ None ]*N factorial(nextState) table[key][i] = nextKey initial = [] for i in range(N-1, -1, -1): initial.append(str(i)) table = {} table[makeKey(initial)] = [ None ]*N factorial(initial) number = {} k = 0 for key in sorted(table): number[key] = k k += 1 f = open(filename, 'w'); f.write('struct lru_fsm_t cache_fsm_{:d}way[] = {{\n'.format(N)) f.write('/* Header */\t{{ {:d}, {:3d} }}, /* Ways, Number of states */\n'.format(int(sys.argv[1]), len(table))) k = 0 for key in sorted(table): ways = key.split('-') for (i, ww) in enumerate(ways): w = int(ww) ns = number[table[key][i]] if ns == k: f.write('/* {:2d} */'.format(k)) else: f.write('\t') f.write('\t{{ {:d}, {:3d}*{:d} }}, /* {:s} */\n'.format(w, ns, N, table[key][i])) lru_w = w lru_i = i k += 1 f.write('};\n') f.close() exit(0)