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 virtualenv --python=python3 --system-site-packages env
$(IN_ENV) pip install -r requirements.txt $(IN_ENV) pip install -r requirements.txt
$(IN_ENV) pip install -r docs/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) $(IN_ENV) python -c "import yaml" || (echo "Unable to find python-yaml" && exit 1)
build: build:
@ -25,7 +23,7 @@ test: test-py test-cpp
@true @true
test-py: 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: test-cpp:
mkdir -p build mkdir -p build

View File

@ -96,3 +96,10 @@ class Grid(object):
def get_segment_map(self): def get_segment_map(self):
return segment_map.SegmentMap(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 os
import fasm import fasm
from prjxray import db import fasm.output
from prjxray.db import Database
from prjxray import fasm_disassembler from prjxray import fasm_disassembler
from prjxray import bitstream from prjxray import bitstream
import subprocess 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): 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: with open(bits_file) as f:
bitdata = bitstream.load_bitdata(f) bitdata = bitstream.load_bitdata(f)
print( def is_zero_feature(feature):
fasm.fasm_tuple_to_string( 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), disassembler.find_features_in_bitstream(bitdata, verbose=verbose),
canonical=canonical)) zero_function=is_zero_feature,
sort_key=grid.tile_key,
)
print(fasm.fasm_tuple_to_string(model, canonical=canonical), end='')
def main(): def main():