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