Merge pull request #616 from litghost/non_canonical_sorting

Non-canonical sorting for bit2fasm
This commit is contained in:
litghost 2019-02-06 18:15:36 -08:00 committed by GitHub
commit 8e70e4e9ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 10 deletions

View File

@ -6,8 +6,6 @@ env:
virtualenv --python=python3 --system-site-packages env
$(IN_ENV) pip install -r requirements.txt
$(IN_ENV) pip install -r docs/requirements.txt
ln -sf $(PWD)/prjxray env/lib/python3.*/site-packages/
ln -sf $(PWD)/third_party/fasm/fasm.py env/lib/python3.*/site-packages/
$(IN_ENV) python -c "import yaml" || (echo "Unable to find python-yaml" && exit 1)
build:
@ -25,7 +23,7 @@ test: test-py test-cpp
@true
test-py:
$(IN_ENV) py.test $(TEST_EXCLUDE) --doctest-modules --junitxml=build/py_test_results.xml
$(IN_ENV) PYTHONPATH="$(PWD):$(PWD)/third_party/fasm:$PYTHONPATH" py.test $(TEST_EXCLUDE) --doctest-modules --junitxml=build/py_test_results.xml
test-cpp:
mkdir -p build

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)

2
third_party/fasm vendored

@ -1 +1 @@
Subproject commit b7a578552669954050f3700ced243b9d9e12d649
Subproject commit ece57149c96cea82ab155af3bba04e76eee4ab6a

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,35 @@ 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)
print(
fasm.fasm_tuple_to_string(
disassembler.find_features_in_bitstream(bitdata, verbose=verbose),
canonical=canonical))
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(model, canonical=canonical), end='')
def main():