#!/usr/bin/env python3 import getopt, sys, os, json, re flag_z = False flag_b = False flag_d = False flag_D = False def usage(): print("Usage: %s [options] [segments/tiles]" % sys.argv[0]) print("") print(" -z") print(" do not print a 'seg' header for empty segments") print("") print(" -b") print(" print bits outside of known segments") print("") print(" -d") print(" decode known segment bits and write them as tags") print("") print(" -D") print(" decode known segment bits and omit them in the output") print("") sys.exit(0) try: opts, args = getopt.getopt(sys.argv[1:], "zbdD") except: usage() if len(args) == 0: usage() for o, a in opts: if o == "-z": flag_z = True elif o == "-b": flag_b = True elif o == "-d": flag_d = True elif o == "-D": flag_D = True else: usage() with open("%s/%s/tilegrid.json" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")), "r") as f: grid = json.load(f) bitdata = dict() # print("Loading %s." % sys.argv[1]) with open(args[0], "r") as f: for line in f: line = line.split("_") frame = int(line[1], 16) wordidx = int(line[2], 10) bitidx = int(line[3], 10) if frame not in bitdata: bitdata[frame] = dict() if wordidx not in bitdata[frame]: bitdata[frame][wordidx] = set() bitdata[frame][wordidx].add(bitidx) segbitsdb = dict() def get_database(segtype): if segtype in segbitsdb: return segbitsdb[segtype] segbitsdb[segtype] = list() with open("%s/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), segtype), "r") as f: for line in f: line = line.split() segbitsdb[segtype].append(line) with open("%s/%s/segbits_int_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), segtype[-1]), "r") as f: for line in f: line = line.split() segbitsdb[segtype].append(line) return segbitsdb[segtype] def handle_segment(segname): if segname is None: segframes = dict() for segname, segdata in grid["segments"].items(): framebase = int(segdata["baseaddr"][0], 16) for i in range(segdata["frames"]): if (framebase + i) not in segframes: segframes[framebase + i] = set() for j in range(segdata["baseaddr"][1], segdata["baseaddr"][1] + segdata["words"]): segframes[framebase + i].add(j) for frame in sorted(bitdata.keys()): for wordidx in sorted(bitdata[frame].keys()): if frame in segframes and wordidx in segframes[frame]: continue for bitidx in sorted(bitdata[frame][wordidx]): print("bit_%08x_%03d_%02d" % (frame, wordidx, bitidx)) return if ":" in segname: seg1, seg2 = segname.split(":") if seg1 in grid["tiles"]: seg1 = grid["tiles"][seg1]["segment"] if seg2 in grid["tiles"]: seg2 = grid["tiles"][seg2]["segment"] seginfo1 = grid["segments"][seg1] seginfo2 = grid["segments"][seg2] frame1 = int(seginfo1["baseaddr"][0], 16) word1 = int(seginfo1["baseaddr"][1]) frame2 = int(seginfo2["baseaddr"][0], 16) word2 = int(seginfo2["baseaddr"][1]) if frame1 > frame2: frame1, frame2 = frame2, frame1 if word1 > word2: word1, word2 = word2, word1 segs = list() for seg, seginfo in sorted(grid["segments"].items()): frame = int(seginfo["baseaddr"][0], 16) word = int(seginfo["baseaddr"][1]) if frame1 <= frame <= frame2 and word1 <= word <= word2: segs.append((frame, word, seg)) for _, _, seg in sorted(segs): handle_segment(seg) return if segname in grid["tiles"]: segname = grid["tiles"][segname]["segment"] seginfo = grid["segments"][segname] baseframe = int(seginfo["baseaddr"][0], 16) basewordidx = int(seginfo["baseaddr"][1]) numframes = int(seginfo["frames"]) numwords = int(seginfo["words"]) segbits = set() segtags = set() for frame in range(baseframe, baseframe + numframes): if frame not in bitdata: continue for wordidx in range(basewordidx, basewordidx + numwords): if wordidx not in bitdata[frame]: continue for bitidx in bitdata[frame][wordidx]: segbits.add( "%02d_%02d" % (frame - baseframe, 32 * (wordidx - basewordidx) + bitidx)) if flag_d or flag_D: for entry in get_database(seginfo["type"]): match_entry = True for bit in entry[1:]: if bit[0] != "!" and bit not in segbits: match_entry = False if bit[0] == "!" and bit[1:] in segbits: match_entry = False if match_entry: for bit in entry[1:]: if bit[0] != "!": segbits.remove(bit) if flag_d: segtags.add(entry[0]) if not flag_z or len(segbits) > 0 or len(segtags) > 0: print() print("seg %s" % segname) for bit in sorted(segbits): print("bit %s" % bit) for tag in sorted(segtags): print("tag %s" % tag) if flag_b: handle_segment(None) if len(args) == 1: seglist = list() for seg, seginfo in grid["segments"].items(): seglist.append((seginfo["baseaddr"][0], -seginfo["baseaddr"][1], seg)) for _, _, seg in sorted(seglist): handle_segment(seg) else: for arg in args[1:]: handle_segment(arg)