mirror of https://github.com/openXC7/prjxray.git
commit
a9c2af5b9d
|
|
@ -35,7 +35,7 @@ def process_db(db, tile_type, process, verbose):
|
||||||
process(line)
|
process(line)
|
||||||
|
|
||||||
|
|
||||||
def get_database(db, tile_type, verbose=False):
|
def get_database(db, tile_type, bit_only=False, verbose=False):
|
||||||
tags = list()
|
tags = list()
|
||||||
|
|
||||||
if tile_type in segbitsdb:
|
if tile_type in segbitsdb:
|
||||||
|
|
@ -48,6 +48,8 @@ def get_database(db, tile_type, verbose=False):
|
||||||
name = parts[0]
|
name = parts[0]
|
||||||
|
|
||||||
if parts[1] == 'always' or parts[1] == 'hint':
|
if parts[1] == 'always' or parts[1] == 'hint':
|
||||||
|
if bit_only:
|
||||||
|
return
|
||||||
tagbits = []
|
tagbits = []
|
||||||
else:
|
else:
|
||||||
tagbits = [util.parse_tagbit(x) for x in parts[1:]]
|
tagbits = [util.parse_tagbit(x) for x in parts[1:]]
|
||||||
|
|
@ -157,7 +159,7 @@ def tag_matched(entry, segbits):
|
||||||
decode_warnings = set()
|
decode_warnings = set()
|
||||||
|
|
||||||
|
|
||||||
def seg_decode(db, seginfo, segbits, segments, verbose=False):
|
def seg_decode(db, seginfo, segbits, segments, bit_only=False, verbose=False):
|
||||||
'''
|
'''
|
||||||
Remove matched tags from segbits
|
Remove matched tags from segbits
|
||||||
Returns a list of all matched tags
|
Returns a list of all matched tags
|
||||||
|
|
@ -181,7 +183,8 @@ def seg_decode(db, seginfo, segbits, segments, verbose=False):
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
entries = get_database(db, tile_type, verbose=verbose)
|
entries = get_database(
|
||||||
|
db, tile_type, bit_only=bit_only, verbose=verbose)
|
||||||
except NoDB:
|
except NoDB:
|
||||||
verbose and print("WARNING: failed to load DB for %s" % tile_type)
|
verbose and print("WARNING: failed to load DB for %s" % tile_type)
|
||||||
assert tile_type != 'BRAM_L'
|
assert tile_type != 'BRAM_L'
|
||||||
|
|
@ -259,10 +262,19 @@ def seg_decode(db, seginfo, segbits, segments, verbose=False):
|
||||||
return segtags
|
return segtags
|
||||||
|
|
||||||
|
|
||||||
def print_seg(segname, segbits, segtags, decode_emit):
|
def print_seg(
|
||||||
|
segname, seginfo, nbits, segbits, segtags, decode_emit, verbose=False):
|
||||||
'''Print segment like used by segmaker/segmatch'''
|
'''Print segment like used by segmaker/segmatch'''
|
||||||
|
|
||||||
print("seg %s" % (segname, ))
|
print("seg %s" % (segname, ))
|
||||||
|
if verbose:
|
||||||
|
print("Bits: %s" % nbits)
|
||||||
|
print(
|
||||||
|
"Address: %s, +%s" %
|
||||||
|
(seginfo["block"]["baseaddr"], seginfo["block"]["frames"]))
|
||||||
|
print(
|
||||||
|
"Words: %s, +%s" %
|
||||||
|
(seginfo["block"]["offset"], seginfo["block"]["words"]))
|
||||||
|
|
||||||
# Bits that weren't decoded
|
# Bits that weren't decoded
|
||||||
for bit in sorted(segbits):
|
for bit in sorted(segbits):
|
||||||
|
|
@ -281,27 +293,34 @@ def handle_segment(
|
||||||
decode_omit,
|
decode_omit,
|
||||||
omit_empty_segs,
|
omit_empty_segs,
|
||||||
segments,
|
segments,
|
||||||
|
bit_only=False,
|
||||||
verbose=False):
|
verbose=False):
|
||||||
|
|
||||||
seginfo = segments[segname]
|
seginfo = segments[segname]
|
||||||
|
|
||||||
# only print bitstream tiles
|
|
||||||
#if segname not in segments:
|
|
||||||
# return
|
|
||||||
|
|
||||||
segbits = mk_segbits(seginfo, bitdata)
|
segbits = mk_segbits(seginfo, bitdata)
|
||||||
|
nbits = len(segbits)
|
||||||
|
|
||||||
if decode_emit or decode_omit:
|
if decode_emit or decode_omit:
|
||||||
segtags = seg_decode(db, seginfo, segbits, segments, verbose=verbose)
|
segtags = seg_decode(
|
||||||
|
db, seginfo, segbits, segments, bit_only=bit_only, verbose=verbose)
|
||||||
else:
|
else:
|
||||||
segtags = set()
|
segtags = set()
|
||||||
|
|
||||||
# Found something to print?
|
# Found something to print?
|
||||||
if not (not omit_empty_segs or len(segbits) > 0 or len(segtags) > 0):
|
keep = not omit_empty_segs or len(segbits) > 0 or len(segtags) > 0
|
||||||
|
if not keep:
|
||||||
return
|
return
|
||||||
|
|
||||||
print()
|
print()
|
||||||
print_seg(segname, segbits, segtags, decode_emit)
|
print_seg(
|
||||||
|
segname,
|
||||||
|
seginfo,
|
||||||
|
nbits,
|
||||||
|
segbits,
|
||||||
|
segtags,
|
||||||
|
decode_emit,
|
||||||
|
verbose=verbose)
|
||||||
|
|
||||||
|
|
||||||
def overlap(a, b):
|
def overlap(a, b):
|
||||||
|
|
@ -414,6 +433,7 @@ def run(
|
||||||
flag_unknown_bits=False,
|
flag_unknown_bits=False,
|
||||||
flag_decode_emit=False,
|
flag_decode_emit=False,
|
||||||
flag_decode_omit=False,
|
flag_decode_omit=False,
|
||||||
|
bit_only=False,
|
||||||
verbose=False):
|
verbose=False):
|
||||||
db = prjxraydb.Database(db_root)
|
db = prjxraydb.Database(db_root)
|
||||||
tiles = load_tiles(db_root)
|
tiles = load_tiles(db_root)
|
||||||
|
|
@ -445,6 +465,7 @@ def run(
|
||||||
flag_decode_omit,
|
flag_decode_omit,
|
||||||
omit_empty_segs,
|
omit_empty_segs,
|
||||||
segments,
|
segments,
|
||||||
|
bit_only=bit_only,
|
||||||
verbose=verbose)
|
verbose=verbose)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -466,19 +487,29 @@ def main():
|
||||||
'-d',
|
'-d',
|
||||||
action='store_true',
|
action='store_true',
|
||||||
help='decode known segment bits and write them as tags')
|
help='decode known segment bits and write them as tags')
|
||||||
# XXX: possibly broken, or we have missing DB data
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-D',
|
'-D',
|
||||||
action='store_true',
|
action='store_true',
|
||||||
help='decode known segment bits and omit them in the output')
|
help='decode known segment bits and omit them in the output')
|
||||||
|
parser.add_argument(
|
||||||
|
'--bit-only',
|
||||||
|
action='store_true',
|
||||||
|
help='only decode real bitstream directives')
|
||||||
parser.add_argument('bits_file', help='')
|
parser.add_argument('bits_file', help='')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'segnames', nargs='*', help='List of tile or tile:block to print')
|
'segnames', nargs='*', help='List of tile or tile:block to print')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
run(
|
run(
|
||||||
args.db_root, args.bits_file, args.segnames, args.z, args.b, args.d,
|
args.db_root,
|
||||||
args.D, args.verbose)
|
args.bits_file,
|
||||||
|
args.segnames,
|
||||||
|
args.z,
|
||||||
|
args.b,
|
||||||
|
args.d,
|
||||||
|
args.D,
|
||||||
|
bit_only=args.bit_only,
|
||||||
|
verbose=args.verbose)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue