segprint: use prjxray.db lib

Signed-off-by: John McMaster <johndmcmaster@gmail.com>
This commit is contained in:
John McMaster 2018-10-31 16:58:32 -07:00
parent 5532adac5b
commit b44e9dd49f
2 changed files with 18 additions and 20 deletions

View File

@ -25,14 +25,15 @@ def get_available_databases(prjxray_root):
class Database(object): class Database(object):
def __init__(self, db_root): def __init__(self, db_root=None):
""" Create project x-ray Database at given db_root. """ Create project x-ray Database at given db_root.
db_root: Path to directory containing settings.sh, *.db, tilegrid.json and db_root: Path to directory containing settings.sh, *.db, tilegrid.json and
tileconn.json tileconn.json
""" """
self.db_root = db_root self.db_root = db_root or os.path.join(
os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"))
self.tilegrid = None self.tilegrid = None
self.tileconn = None self.tileconn = None
self.tile_types = None self.tile_types = None

View File

@ -6,6 +6,7 @@ This output is intended for debugging and not directly related to FASM
import sys, os, json, re import sys, os, json, re
from prjxray import bitstream from prjxray import bitstream
from prjxray import db as prjxraydb
class NoDB(Exception): class NoDB(Exception):
@ -18,26 +19,20 @@ segbitsdb = dict()
# int and sites are loaded together so that bit coverage can be checked together # int and sites are loaded together so that bit coverage can be checked together
# however, as currently written, each segment is essentially printed twice # however, as currently written, each segment is essentially printed twice
def process_db(tile_type, process): def process_db(db, tile_type, process, verbose):
fns = [ print(db.get_tile_types())
# sites ttdb = db.get_tile_type(tile_type)
"%s/%s/segbits_%s.db" % (
os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"),
tile_type.lower()),
# interconnect
"%s/%s/segbits_int_%s.db" % (
os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"),
tile_type[-1].lower()),
]
fns = [ttdb.tile_dbs.segbits, ttdb.tile_dbs.ppips]
verbose and print("process_db(%s): %s" % (tile_type, fns))
for fn in fns: for fn in fns:
if os.path.exists(fn): if fn:
with open(fn, "r") as f: with open(fn, "r") as f:
for line in f: for line in f:
process(line) process(line)
def get_database(tile_type): def get_database(db, tile_type, verbose=False):
tags = list() tags = list()
if tile_type in segbitsdb: if tile_type in segbitsdb:
@ -46,7 +41,7 @@ def get_database(tile_type):
def process(l): def process(l):
tags.append(l.split()) tags.append(l.split())
process_db(tile_type, process) process_db(db, tile_type, process, verbose=verbose)
if len(tags) == 0: if len(tags) == 0:
raise NoDB(tile_type) raise NoDB(tile_type)
@ -120,7 +115,7 @@ def tag_matched(entry, segbits):
decode_warnings = set() decode_warnings = set()
def seg_decode(flag_decode_emit, seginfo, segbits, verbose=False): def seg_decode(flag_decode_emit, db, seginfo, segbits, verbose=False):
segtags = set() segtags = set()
# already failed? # already failed?
@ -128,7 +123,7 @@ def seg_decode(flag_decode_emit, seginfo, segbits, verbose=False):
return segtags return segtags
try: try:
for entry in get_database(seginfo["type"]): for entry in get_database(db, seginfo["type"], verbose=verbose):
if not tagmatch(entry, segbits): if not tagmatch(entry, segbits):
continue continue
tag_matched(entry, segbits) tag_matched(entry, segbits)
@ -142,6 +137,7 @@ def seg_decode(flag_decode_emit, seginfo, segbits, verbose=False):
def handle_segment( def handle_segment(
db,
segname, segname,
segments, segments,
bitdata, bitdata,
@ -161,7 +157,7 @@ def handle_segment(
if flag_decode_emit or flag_decode_omit: if flag_decode_emit or flag_decode_omit:
segtags = seg_decode( segtags = seg_decode(
flag_decode_emit, seginfo, segbits, verbose=verbose) flag_decode_emit, db, seginfo, segbits, verbose=verbose)
else: else:
segtags = set() segtags = set()
@ -206,7 +202,6 @@ def mk_grid():
with open("%s/%s/tilegrid.json" % (os.getenv("XRAY_DATABASE_DIR"), with open("%s/%s/tilegrid.json" % (os.getenv("XRAY_DATABASE_DIR"),
os.getenv("XRAY_DATABASE")), "r") as f: os.getenv("XRAY_DATABASE")), "r") as f:
tiles = json.load(f) tiles = json.load(f)
'''Load tilegrid, flattening all blocks into one dictionary''' '''Load tilegrid, flattening all blocks into one dictionary'''
# TODO: Migrate to new tilegrid format via library. # TODO: Migrate to new tilegrid format via library.
return tiles, mk_segments(tiles) return tiles, mk_segments(tiles)
@ -237,6 +232,7 @@ def run(
flag_decode_omit=False, flag_decode_omit=False,
verbose=False): verbose=False):
tiles, segments = mk_grid() tiles, segments = mk_grid()
db = prjxraydb.Database()
bitdata = bitstream.load_bitdata2(open(bits_file, "r")) bitdata = bitstream.load_bitdata2(open(bits_file, "r"))
@ -257,6 +253,7 @@ def run(
# revisit? # revisit?
for segname in segnames: for segname in segnames:
handle_segment( handle_segment(
db,
segname, segname,
segments, segments,
bitdata, bitdata,