xref: /XiangShan/scripts/cache/parseAddr.py (revision 5a9297bea8a5ee8cf864306038fa9e6b51bb9276)
1#!/bin/python3
2import argparse
3
4blockBits = 6
5
6# create a basic class with three variables: tagBits, setBits, bankBits
7class Addr:
8    def __init__(self, tagBits, setBits, bankBits):
9        self.tagBits  = tagBits
10        self.setBits  = setBits
11        self.bankBits = bankBits
12    def fullAddr(self, tag, set, bank):
13        return ((tag << (self.setBits + self.bankBits)) | (set << self.bankBits) | bank) << blockBits
14    def sepAddr(self, addr):
15        addr = addr >> blockBits
16        return (addr >> (self.setBits + self.bankBits), (addr >> self.bankBits) & ((1 << self.setBits) - 1), addr & ((1 << self.bankBits) - 1))
17    def sepAddrHex(self, addr):
18        tmp = self.sepAddr(addr)
19        return (hex(tmp[0]), hex(tmp[1]), hex(tmp[2]))
20
21tl_test = Addr(3, 7, 0)
22sys_l2  = Addr(19, 9, 2)
23sys_l3  = Addr(16, 12, 2)
24seq = [None, tl_test, sys_l2, sys_l3]
25
26### main ###
27parser = argparse.ArgumentParser(description='0: fullAddr, 1: tl_test, 2: sys_l2, 3: sys_l3')
28parser.add_argument('cmd', help='e.g., 02=fullAddr to l2[tag set bank] of XS')
29parser.add_argument('addr', nargs='*', default=None, help='addr OR tag set bank')
30args = parser.parse_args()
31cmd = args.cmd
32addr = args.addr
33
34i = cmd[0] # input
35o = cmd[1] # output
36ii = seq[int(i)]
37oo = seq[int(o)]
38
39if i == '0':
40    assert(len(addr) == 1)
41    fullAddr = int(addr[0], 16)
42    print(oo.sepAddrHex(fullAddr))
43else:
44    assert(len(addr) == 3)
45    tag = int(addr[0], 16)
46    set = int(addr[1], 16)
47    bank = int(addr[2], 16)
48    fullAddr = ii.fullAddr(tag, set, bank)
49    print(hex(fullAddr))
50    if o != '0':
51        print(oo.sepAddrHex(fullAddr))
52
53# examples:
54# fullAddr to L2:
55# > python3 parseAddr.py 02 0xc5170cc0
56# ('0x628b', '0x10c', '0x3')
57#
58# L2 to L3:
59# > python3 parseAddr.py 23 0x628b 0x10c 0x3
60# 0xc5170cc0
61# ('0xc51', '0x70c', '0x3')
62
63