| #!/usr/bin/env python3 | |
| # Copyright lowRISC contributors. | |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
| # SPDX-License-Identifier: Apache-2.0 | |
| r"""Command-line tool to convert i2c to svg | |
| """ | |
| import argparse | |
| import logging as log | |
| import sys | |
| from pathlib import PurePath | |
| import pkg_resources # part of setuptools | |
| from i2csvg import convert | |
| from reggen import version | |
| ep = """defaults or the filename - can be used for stdin/stdout | |
| By default all input files are concatenated into a single output file | |
| this can be changed with the --multiout flag. | |
| """ | |
| def main(): | |
| done_stdin = False | |
| parser = argparse.ArgumentParser( | |
| prog="i2csvg.py", | |
| formatter_class=argparse.RawDescriptionHelpFormatter, | |
| description=__doc__, | |
| epilog=ep) | |
| parser.add_argument('--version', | |
| action='store_true', | |
| help='Show version and exit') | |
| parser.add_argument('-v', | |
| '--verbose', | |
| action='store_true', | |
| help='Verbose output during processing') | |
| parser.add_argument('-d', | |
| '--debug', | |
| action='store_true', | |
| help='Include internal representation in output file') | |
| parser.add_argument('-t', | |
| '--text', | |
| action='store_true', | |
| help='Include text output in output file') | |
| parser.add_argument('-n', | |
| '--nosvg', | |
| action='store_true', | |
| help="Don't include svg in output") | |
| parser.add_argument('-f', | |
| '--fifodata', | |
| action='store_true', | |
| help='Data is hexdump of writes to FDATA fifo') | |
| parser.add_argument( | |
| '-p', | |
| '--prefix', | |
| action='store', | |
| help='Only process lines with this prefix (the prefix is removed)') | |
| parser.add_argument( | |
| '-m', | |
| '--multiout', | |
| action='store_true', | |
| help='Generate separate output file with .svg extension from inputs') | |
| parser.add_argument('-o', | |
| '--output', | |
| type=argparse.FileType('w'), | |
| default=sys.stdout, | |
| metavar='file', | |
| help='Output file (default stdout)') | |
| parser.add_argument('srcfile', | |
| nargs='*', | |
| metavar='input', | |
| default='-', | |
| help='source i2c file (default stdin)') | |
| args = parser.parse_args() | |
| if args.version: | |
| version.show_and_exit(__file__, ["Hjson"]) | |
| if (args.verbose): | |
| log.basicConfig(format="%(levelname)s: %(message)s", level=log.DEBUG) | |
| else: | |
| log.basicConfig(format="%(levelname)s: %(message)s") | |
| outfile = args.output | |
| # output will be: | |
| # .svg if a single input file and no additional details (debug/text) | |
| # or --multiout and no additional details | |
| # .html if combining multiple files (not --multiout) or additional details | |
| # .txt if --nosvg | |
| combiningfiles = (len(args.srcfile) > 1) and not args.multiout | |
| extrainfo = args.debug or args.text or combiningfiles | |
| if args.nosvg: | |
| makehtml = False | |
| outext = '.txt' | |
| elif extrainfo: | |
| makehtml = True | |
| outext = '.html' | |
| else: | |
| makehtml = False | |
| outext = '.svg' | |
| with outfile: | |
| for filename in args.srcfile: | |
| if (filename == '-'): | |
| if (done_stdin): | |
| log.warn("Ignore stdin after first use\n") | |
| continue | |
| done_stdin = True | |
| infile = sys.stdin | |
| else: | |
| infile = open(filename, 'r', encoding='UTF-8') | |
| with infile: | |
| log.info("\nFile now " + filename) | |
| if args.multiout: | |
| outfname = str(PurePath(filename).with_suffix('.svg')) | |
| outf = open(outfname, 'w', encoding='UTF-8') | |
| else: | |
| outf = outfile | |
| if makehtml: | |
| outf.write("<H2>" + filename + "</H2>") | |
| tr = convert.parse_file(infile, args.fifodata, args.prefix) | |
| if args.debug: | |
| convert.output_debug(outf, tr, | |
| '<br>\n' if makehtml else '\n') | |
| outf.write('<br>\n' if makehtml else '\n') | |
| if args.text: | |
| if makehtml: | |
| outf.write("<pre>\n") | |
| convert.output_text(outf, tr, | |
| '<br>\n' if makehtml else '\n') | |
| if makehtml: | |
| outf.write("</pre>\n") | |
| if not args.nosvg: | |
| convert.output_svg(outf, tr, makehtml) | |
| if args.multiout: | |
| outf.close() | |
| if __name__ == '__main__': | |
| main() |