2017-11-11 02:33:02 +01:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
2017-11-16 04:59:28 +01:00
|
|
|
import getopt, sys, os, json, re
|
|
|
|
|
|
|
|
|
|
flag_z = 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(" -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:], "zdD")
|
|
|
|
|
except:
|
|
|
|
|
usage()
|
|
|
|
|
|
|
|
|
|
if len(args) == 0:
|
|
|
|
|
usage()
|
|
|
|
|
|
|
|
|
|
for o, a in opts:
|
|
|
|
|
if o == "-z":
|
|
|
|
|
flag_z = 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:
|
2017-11-11 02:33:02 +01:00
|
|
|
grid = json.load(f)
|
|
|
|
|
|
|
|
|
|
bitdata = dict()
|
|
|
|
|
|
|
|
|
|
# print("Loading %s." % sys.argv[1])
|
2017-11-16 04:59:28 +01:00
|
|
|
with open(args[0], "r") as f:
|
2017-11-11 02:33:02 +01:00
|
|
|
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)
|
|
|
|
|
|
2017-11-16 04:59:28 +01:00
|
|
|
segbitsdb = dict()
|
|
|
|
|
|
|
|
|
|
def get_database(segtype):
|
|
|
|
|
if segtype in segbitsdb:
|
|
|
|
|
return segbitsdb[segtype]
|
|
|
|
|
|
|
|
|
|
segbitsdb[segtype] = list()
|
|
|
|
|
|
|
|
|
|
with open("%s/%s/seg_%s.segbits" % (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/seg_%s.segbits" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), segtype.replace("_", "_int_")), "r") as f:
|
|
|
|
|
for line in f:
|
|
|
|
|
line = line.split()
|
|
|
|
|
segbitsdb[segtype].append(line)
|
|
|
|
|
|
|
|
|
|
return segbitsdb[segtype]
|
|
|
|
|
|
2017-11-14 04:43:57 +01:00
|
|
|
def handle_segment(segname):
|
|
|
|
|
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"]
|
2017-11-11 02:33:02 +01:00
|
|
|
|
|
|
|
|
seginfo = grid["segments"][segname]
|
|
|
|
|
|
|
|
|
|
baseframe = int(seginfo["baseaddr"][0], 16)
|
|
|
|
|
basewordidx = int(seginfo["baseaddr"][1])
|
|
|
|
|
numframes = int(seginfo["frames"])
|
|
|
|
|
numwords = int(seginfo["words"])
|
|
|
|
|
|
2017-11-16 04:59:28 +01:00
|
|
|
segbits = set()
|
|
|
|
|
segtags = set()
|
|
|
|
|
|
2017-11-11 02:33:02 +01:00
|
|
|
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]:
|
2017-11-16 04:59:28 +01:00
|
|
|
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 not in segbits:
|
|
|
|
|
match_entry = False
|
|
|
|
|
if match_entry:
|
|
|
|
|
for bit in entry[1:]:
|
|
|
|
|
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 len(args) == 1:
|
|
|
|
|
for seg in grid["segments"]:
|
|
|
|
|
handle_segment(seg)
|
|
|
|
|
else:
|
|
|
|
|
for arg in args[1:]:
|
|
|
|
|
handle_segment(arg)
|
2017-11-14 04:43:57 +01:00
|
|
|
|