blob: e464fa7b1ff6cd731e79f68c7586b71cbacd3ee7 [file] [log] [blame]
#!/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] <bits_file> [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)