#! /usr/bin/python # encoding: UTF-8 import sys class pha(object): def __init__(self, s=None): if s==None: self.clear() elif isinstance(s, str): self.parse_string(s) else: raise TypeError("pha object constructor needs a string") def clear(self): self.mask = 0 self.trig = 0 self.lost = 0 self.dtime = 0 self.A = [0]*30 self.T = [0]*30 self.B = [0]*30 def parse_string(self, s): ss = [int(sss,0) for sss in s.split()] self.mask = ss[0] self.trig = ss[1] self.lost = ss[2] self.dtime = ss[3] self.A = ss[4:34] self.T = ss[34:64] self.B = ss[64:94] def __str__(self): return ("0x%08x 0x%02x %u %u"+3*(" "+30*" %d")) % ( (self.mask, self.trig, self.lost, self.dtime) + tuple(self.A+self.T+self.B)) def raw_astream(self): r = [0xbeef, 0xa128, int(self.mask>>16), int(self.mask&0xffff), (self.trig<<8) | self.lost, self.dtime ] for i in range(30): if self.mask & (1<>= 1 b >>= 1 w= ((self.A[i] << 14) | ((b & 0x3ff)<<4) | (self.T[i] & 15)) & 0xffffffff r += [int(w>>16), int(w&0xffff)] return r def l3input(self): r = self.raw_astream()[2:] r = [(r[i]<<16)|r[i+1] for i in range(0,len(r),2)] if r[0] & 0x80000000: r[0] |= 0x3fffffff if r[1] & 0xe000: r[1] |= 0xffff l3 = [ r[0] & 0x3fffff, (r[1]<<16)&0xffff0000 | (r[1]>>16)&0xff00 | (r[0]>>22)&0xff ] p = r[0:2] j = 2 for i in range(30): if r[0] & (1<>6)&0xffffff00) j+=1 else: l3.append(0) p.append(0) return (l3,p) def l3_class(self, tclass=0b1110000010110000): c = 0 if self.trig & tclass: c |= 1 if self.trig & (tclass>>8): c |= 2 return c def pha_main(): from getopt import getopt opt,files = getopt(sys.argv[1:], "F:") F = None for o,v in opt: if o=='-F': F = v import fileinput for s in fileinput.input(files): ss=None if s[:4]=="ITF ": sss = s.split(None,3) if sss[2] == "0x57ea": ss=sss[3] if s[:8]=="EHETEPT ": ss = s[8:] if s[:2]=="0x": ss = s if ss: p = pha(ss) if F[0] in "aA": print " ".join(["0x%04x" % w for w in p.raw_astream()]) elif F[0]=='3': print str(p.l3_class())+" "+" ".join(["0x%08x" % w for w in p.l3input()[0]]) else: print p if __name__ == '__main__': pha_main()