| #!/usr/bin/env python3 |
| # -*- coding: utf-8 -*- |
| # |
| # Copyright (C) 2017-2020 The Project X-Ray Authors. |
| # |
| # Use of this source code is governed by a ISC-style |
| # license that can be found in the LICENSE file or at |
| # https://opensource.org/licenses/ISC |
| # |
| # SPDX-License-Identifier: ISC |
| ''' |
| Pretty print FASM. |
| |
| Sanity checks FASM against prjxray database. |
| Can output canonical FASM. |
| In the future may support other formatting options. |
| |
| ''' |
| |
| import os |
| import fasm |
| from prjxray import db |
| |
| |
| def process_fasm(db_root, part, fasm_file, canonical): |
| database = db.Database(db_root, part) |
| grid = database.grid() |
| |
| for fasm_line in fasm.parse_fasm_filename(fasm_file): |
| if not fasm_line.set_feature: |
| if not canonical: |
| yield fasm_line |
| |
| for feature in fasm.canonical_features(fasm_line.set_feature): |
| parts = feature.feature.split('.') |
| tile = parts[0] |
| |
| gridinfo = grid.gridinfo_at_tilename(tile) |
| tile_segbits = database.get_tile_segbits(gridinfo.tile_type) |
| |
| address = 0 |
| if feature.start is not None: |
| address = feature.start |
| |
| feature_name = '{}.{}'.format( |
| gridinfo.tile_type, '.'.join(parts[1:])) |
| |
| # Convert feature to bits. If no bits are set, feature is |
| # psuedo pip, and should not be output from canonical FASM. |
| bits = tuple( |
| tile_segbits.feature_to_bits(feature_name, address=address)) |
| if len(bits) == 0 and canonical: |
| continue |
| |
| # In canonical output, only output the canonical features. |
| if canonical: |
| yield fasm.FasmLine( |
| set_feature=feature, |
| annotations=None, |
| comment=None, |
| ) |
| |
| # If not in canonical mode, output original FASM line |
| if not canonical: |
| yield fasm_line |
| |
| |
| def run(db_root, part, fasm_file, canonical): |
| print( |
| fasm.fasm_tuple_to_string( |
| process_fasm(db_root, part, fasm_file, canonical), |
| canonical=canonical)) |
| |
| |
| def main(): |
| import argparse |
| |
| parser = argparse.ArgumentParser(description='Pretty print a FASM file.') |
| |
| util.db_root_arg(parser) |
| util.part_arg(parser) |
| parser.add_argument('fasm_file', help='Input FASM file') |
| parser.add_argument( |
| '--canonical', help='Output canonical bitstream.', action='store_true') |
| args = parser.parse_args() |
| |
| run(args.db_root, args.part, args.fasm_file, args.canonical) |
| |
| |
| if __name__ == '__main__': |
| main() |