#!/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()