#!/usr/bin/python from struct import unpack, pack import os, os.path import sys import string fun_dict = {} buf_dict = {} ctrl_dict = {} io_dict = {} var_dict = {} def hexdump(s,sep=" "): return sep.join(map(lambda x: "%02x"%ord(x),s)) def ascii(s): s2 = "" for c in s: if ord(c)<0x20 or ord(c)>0x7e: s2 += "." else: s2 += c return s2 def pad(s,c,l): if len(s)>outf, "%08x %s %s |%s|"%(i,pad(hexdump(s[i:i+8],' ')," ",23),pad(hexdump(s[i+8:i+16],' ')," ",23),pad(ascii(s[i:i+16])," ",16)) def chexdumpstr(s): retval = "" for i in range(0,len(s),16): retval += "\n%08x %s %s |%s|"%(i,pad(hexdump(s[i:i+8],' ')," ",23),pad(hexdump(s[i+8:i+16],' ')," ",23),pad(ascii(s[i:i+16])," ",16)) return retval def readpstring(f): strlen = unpack("B", f.read(1))[0] return f.read(strlen) def getpstring(d): strlen = unpack("B", d[0])[0] # print >>outf, "strlen = ",strlen return d[1:(strlen+1)] class TResourceItem: def __init__(self, data): # chexdump(data[0:8]) (self.posn, self.size) = unpack(">outf, "TResourceItem(posn=0x%x,size=0x%x,name='%s')" % (self.posn, self.size, self.name) def __str__(self): return "TResourceItem(posn=0x%x,size=0x%x,name='%s')" % (self.posn, self.size, self.name) def get_item(self, f): f.seek(self.posn) return f.read(self.size) class TResourceCollection: def __init__(self, data): self.data = data def get_resources(self): num_resources, num2, num3 = unpack(">outf, "TResourceCollection(%d,%x,%x)" % (num_resources, num2, num3) retval = [] ptr = 34 # chexdump(self.data[ptr:]) for i in range(num_resources): item = TResourceItem(self.data[ptr:]) ptr += len(item.name)+9 retval.append(item) return retval class TMemDev: def __init__(self, data): self.data = data[8:] self.famcode, self.pinmap, self.a, self.b = unpack(">outf, "TDN: %s %d" % (self.name, self.id) if self.name[0:4] == '_BUF': buf_dict[self.id] = self.name if self.name[0:4] == '_FUN': fun_dict[self.id] = self.name if self.name[0:4] == '_CTR': ctrl_dict[self.id] = self.name if self.name[0:4] == '_IO_': io_dict[self.id] = self.name if self.name[0:4] == '_VAR': var_dict[self.id] = self.name def __str__(self): # return "TDN: %s %d" % (self.name, self.id) # # def pretty(self): return "[%s %x]\n" % (self.name, self.id) class TKernel: def __init__(self, data): self.data = data # chexdump(data) def __str__(self): retval = "TKernel: " data = self.data while len(data) >= 4: (id, wave) = unpack("= 4: (id, wave) = unpack(">outf, "var = " + element self.vars.append(element) ptr += len(element)+1 # chexdump(data) def __str__(self): return "TVarName: " + string.join(self.vars, ', ') def parse_item(data): preamble = unpack(">H", data[0:2])[0] if preamble != 0x25b: print >>outf, "Expected 0x25b for preamble, got" chexdump(data[0:16]) exit() type_name = getpstring(data[2:]) body = data[3+len(type_name):-1] # print >>outf, "Type name = ", type_name if type_name == "TMemDev": return TMemDev(body) if type_name == "TLogDev": return TLogDev(body) if type_name == "TPofDev": return TPofDev(body) if type_name == "TPofFuseDev": return TPofFuseDev(body) if type_name == "TXPMemDev": return TXPMemDev(body) if type_name == "TXilinxMemDev": return TXilinxMemDev(body) if type_name == "TXilinxAddrData": return TXilinxAddrData(body) if type_name == "TDblBufMemDev": return TDblBufMemDev(body) if type_name == "TAddTabMemDev": return TAddTabMemDev(body) if type_name == "TDevPool": return TDevPool(body) if type_name == "TDNCol": return TDNCol(body) if type_name == "TDN": return TDN(body) if type_name == "TKernel": return TKernel(body) if type_name == "TFamCode": return TFamCode(body) if type_name == "TFuseCode": return TFuseCode(body) if type_name == "TPOFCoreCode": return TPOFCoreCode(body) if type_name == "TPinCode": return TPinCode(body) if type_name == "TWaveCode": return TWaveCode(body) if type_name == "TVersion": return TVersion(body) if type_name == "TVarName": return TVarName(body) print >>outf, "Unknown type " + type_name def print_data(indent, f): data = f.read(2) if len(data) != 2: return False preamble = unpack(">H", data)[0] type_name = readpstring(f) if preamble != 0x25b: print >>outf, indent, "preamble = %x" % (preamble) # print >>outf, type_name if type_name == "TVendorCollection": num1, num2, num3 = unpack(">outf, indent, "%s(%d, %d, %d):" % (type_name, num1, num2, num3) for i in range(num1): print >>outf, _data(indent + " ", f) f.read(5) return True if type_name == "TVendor": vendor_name = readpstring(f) postamble = f.read(1) print >>outf, indent, "%s: %s" % (type_name, vendor_name) return True if type_name == "TDevPool": num_devices, num2 = unpack(">outf, indent, num_devices devices = [] for i in range(num_devices): devices.append([unpack(">outf, indent, "value: %x" % unpack(">outf, indent, "--" for i in range(num_devices): devices[i].append(unpack(">outf, type_name+": %04x %04x %04x %02x %04x %04x %02x %04x %02x %02x %s" % tuple(devices[i]) i = i + 1 # print >>outf, chexdump(f.read(num2)) f.read(1) return True if type_name == "TResourceCollection": num_resources, num2, num3 = unpack(">outf, indent, num_resources print >>outf, indent, "%s(%d,%x,%x)" % (type_name, num_resources, num2, num3) for i in range(num_resources): posn, size = unpack(">outf, indent, "%-20s posn=%8x size=%8x" % (name, posn, size) f.read(5) return True if type_name == "TVersion": print >>outf, indent, "Version = %x" % (unpack(">outf, "var = " + readpstring(f) f.read(1) return True if type_name == "TWaveCode": num1, codesize = unpack(">outf, indent, "WaveCode = type:%x len:%x" % (num1, codesize) chexdump(f.read(codesize)) f.read(1) return True if type_name == "TPinCode": size, foo, bar, baz, bazz, buzz = unpack(">outf, indent, "size = %x foo=%d bar=%d baz=%d bazz=%x buzz=%x" % (size, foo, bar, baz, bazz, buzz) # for i in range(size+foo+bar*2+20): # print >>outf, indent, "%x" % unpack(">outf, indent, "FamCode = type:%x len:%x" % (num1, codesize) # chexdump(f.read(num1*4+codesize*10+6)) buf = "" while True: char = f.read(1) if char == ']' and len(buf) > 0x100: break buf += char chexdump(buf) return True if type_name == "TMemDev": print >>outf, indent, "MemDev:" chexdump(f.read(17)) f.read(1) return True if type_name == "TKernel": print >>outf, indent, "Kernel:" chexdump(f.read(240)) f.read(1) return True if type_name == "TDNCol": num = unpack(">outf, indent, "DNCol: %d" % (num) chexdump(f.read(7)) f.read(1) for i in range(num): print >>outf, _data(indent + " ", f) f.read(5) return True if type_name == "TDN": name = readpstring(f) num1 = unpack(">outf, indent, "DN: %s %x" % (name, num1) # chexdump(f.read(13)) f.read(2) # print >>outf, _data(indent, f) return True print >>outf, "Unknown atom ", type_name return False #f = open(sys.argv[1], "rb") outf = open(string.replace(sys.argv[1], "rez", "txt"), "w") #buf = f.read() #magic = f.read(4) #filesize, table_offset = unpack(">outf, "magic = '%s', file size = 0x%x, table offset = 0x%x" % (magic, filesize, table_offset) #f.seek(table_offset) #collection = TResourceCollection(f.read()) #foo = collection.get_resources() #print >>outf, foo #for item in foo: #print >>outf, item.name+": "+str(parse_item(item.get_item(f)))+"\n" #while True: # if not print_data("", f): break