def generateJSONObject(hdr, headers, hdrInfo): """Porocess a single header in preparation for JSONification""" #if hdr.name == 'ieee802-1q': # print hdr # print hdr.refCount # print type(hdr.refCount.name) # print hdr.refCount.name # print len(hdr.refCount.name) # sys.exit(1) if hdr.name not in seenHdrs: seenHdrs.add(hdr.name) orderedHdrs.append(hdr.name) #print hdr.name hdrDict = {} if hdrInfo.lenIsVar: hdrDict['len'] = 0 hdrDict['lenBytes'] = hdrInfo.lenBytes lenMap = {} for i in xrange(len(hdrInfo.lengths)): lenMatch = matchToVerilog(hdrInfo.lenMatch[i]) length = hdrInfo.lengths[i] lenMap[lenMatch] = length hdrDict['lenMap'] = lenMap else: hdrDict['len'] = hdrInfo.lengths[0] if len(hdrInfo.nxtHdrs) > 0: hdrDict['nxtHdrBytes'] = hdrInfo.nxtHdrBytes nxtHdrMap = {} for i in xrange(len(hdrInfo.nxtHdrs)): nxtHdrMatch = matchToVerilog(hdrInfo.nxtHdrMatch[i]) nxtHdr = hdrInfo.nxtHdrs[i] if nxtHdr: nxtHdrMap[nxtHdrMatch] = nxtHdr.name else: nxtHdrMap[nxtHdrMatch] = "DONE" hdrDict['nxtHdrMap'] = nxtHdrMap hdrDict['starts'] = sorted(hdrStarts[hdr.name]) hdrDict['extractFields'] = [] for fieldName in hdr.extractFields: field = hdr.fields[fieldName] hdrDict['extractFields'].append(fieldName) hdrDict['extractFields'].append(field.pos) hdrDict['extractFields'].append(field.width) if hdrInfo.defNxtHdrVal is not None: hdrDict['defNxtHdrVal'] = matchToVerilog(hdrInfo.defNxtHdrVal) if hdr.refCount: hdrDict['refCountName'] = hdr.refCount.name simpleHdrs[hdr.name] = hdrDict for nxtHdr in hdrInfo.nxtHdrs: if nxtHdr: exploreHeader(nxtHdr, headers, generateJSONObject, False)
def processHdrStart(hdr, nxtHdr, headers, hdrInfo, pos = 0, hdrSeq = []): if hdr.name not in hdrStarts: hdrStarts[hdr.name] = set() hdrStarts[hdr.name].add(pos) hdrSeq = hdrSeq + [hdr.name, pos, hdrInfo.length] if nxtHdr: phsFunc = lambda phsHdr, phsNxtHdr, phsHeaders, phsInfo : \ processHdrStart(phsHdr, phsNxtHdr, phsHeaders, phsInfo, pos + hdrInfo.length, hdrSeq) exploreHeader(nxtHdr, headers, phsFunc) else: hdrSeqStr = "" for i in xrange(0, len(hdrSeq), 3): hdrSeqStr += "%s:%d:%d==" % (hdrSeq[i], hdrSeq[i+1], hdrSeq[i+2]) if hdrSeqStr not in hdrSeqStrs: hdrSeqStrs.add(hdrSeqStr) hdrSeqs.append(hdrSeq)
def generateJSON(headerList, headers, dstFile = None): """Print out a JSON version of the header list""" resetVars() exploreHeader(headerList[0], headers, processHdrStart, True) exploreHeader(headerList[0], headers, generateJSONObject, False) if dstFile is None: print json.dumps(indent = 4, obj = { 'firstHdr': orderedHdrs[0], 'headers': simpleHdrs, 'hdrSeqs': hdrSeqs, }) else: f = open(dstFile, 'w') json.dump(indent = 4, fp = f, obj = { 'firstHdr': orderedHdrs[0], 'headers': simpleHdrs, 'hdrSeqs': hdrSeqs, }) f.close()