blob: 0d73c1878363ef060a7ea9ece6a76360945ce084 [file] [log] [blame]
#!/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()