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