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