Add support for non-canonical sorted output.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
This commit is contained in:
Keith Rothman 2019-02-06 16:41:04 -08:00
parent f7c6f76bb3
commit 310d197b8e
2 changed files with 36 additions and 4 deletions

View File

@ -96,3 +96,10 @@ class Grid(object):
def get_segment_map(self):
return segment_map.SegmentMap(self)
def tile_key(self, tilename):
gridinfo = self.gridinfo_at_tilename(tilename)
loc = self.loc_of_tilename(tilename)
tile_type = gridinfo.tile_type
return (tile_type, loc.grid_x, -loc.grid_y)

View File

@ -5,7 +5,8 @@ Take bitstream .bit files and decode them to FASM.
import os
import fasm
from prjxray import db
import fasm.output
from prjxray.db import Database
from prjxray import fasm_disassembler
from prjxray import bitstream
import subprocess
@ -26,15 +27,39 @@ def bit_to_bits(bitread, part_yaml, bit_file, bits_file, frame_range=None):
def bits_to_fasm(db_root, bits_file, verbose, canonical):
disassembler = fasm_disassembler.FasmDisassembler(db.Database(db_root))
db = Database(db_root)
grid = db.grid()
disassembler = fasm_disassembler.FasmDisassembler(db)
with open(bits_file) as f:
bitdata = bitstream.load_bitdata(f)
def is_zero_feature(feature):
parts = feature.split('.')
tile = parts[0]
gridinfo = grid.gridinfo_at_tilename(tile)
feature = '.'.join(parts[1:])
db_k = '%s.%s' % (gridinfo.tile_type, feature)
segbits = db.get_tile_segbits(gridinfo.tile_type)
any_bits = False
for bit in segbits.feature_to_bits(db_k):
if bit.isset:
any_bits = True
return not any_bits
model = fasm.output.merge_and_sort(
disassembler.find_features_in_bitstream(bitdata, verbose=verbose),
zero_function=is_zero_feature,
sort_key=grid.tile_key,
)
print(
fasm.fasm_tuple_to_string(
disassembler.find_features_in_bitstream(bitdata, verbose=verbose),
canonical=canonical))
model,
canonical=canonical),
end='')
def main():