|  | #!/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""" TileLink-Uncached Lightweight Xbar generator | 
|  | """ | 
|  |  | 
|  | import argparse | 
|  | import logging as log | 
|  | import sys | 
|  | from pathlib import Path | 
|  |  | 
|  | import hjson | 
|  |  | 
|  | import tlgen | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | parser = argparse.ArgumentParser(prog="tlgen") | 
|  | parser.add_argument('--topcfg', | 
|  | '-t', | 
|  | metavar='file', | 
|  | type=argparse.FileType('r'), | 
|  | help="`top_cfg.hjson` file.") | 
|  | parser.add_argument('--doc', | 
|  | '-d', | 
|  | action='store_true', | 
|  | help='Generate self HTML document in stdout') | 
|  | parser.add_argument( | 
|  | '--outdir', | 
|  | '-o', | 
|  | help= | 
|  | "Target directory. tlgen needs 'rtl/' and 'dv/' directory under the target dir" | 
|  | ) | 
|  | parser.add_argument('--ip-path', | 
|  | default="", | 
|  | help=''' | 
|  | Additional path to generated rtl/ or dv/ folders: outdir/ip_path/rtl | 
|  | Only needed when there are multiple xbar in outdir''') | 
|  | parser.add_argument('--verbose', '-v', action='store_true', help='Verbose') | 
|  |  | 
|  | args = parser.parse_args() | 
|  |  | 
|  | if args.verbose: | 
|  | log.basicConfig(format="%(levelname)s: %(message)s", level=log.DEBUG) | 
|  | else: | 
|  | log.basicConfig(format="%(levelname)s: %(message)s") | 
|  |  | 
|  | if args.doc: | 
|  | # Generate Doc and return | 
|  | sys.stdout.write(tlgen.selfdoc(heading=3, cmd='tlgen.py --doc')) | 
|  | return | 
|  |  | 
|  | # Check if topcfg defined | 
|  | if not args.topcfg or not args.outdir: | 
|  | log.error("--topcfg option is mandatory to generate codes.") | 
|  |  | 
|  | # Check if outdir exists. If not, show error and exit | 
|  | if not Path(args.outdir).is_dir(): | 
|  | log.error("'--outdir' should point to writable directory") | 
|  |  | 
|  | # Load contents of top_cfg | 
|  | # Skip this part and use internal structure at this time | 
|  | try: | 
|  | obj = hjson.load(args.topcfg, use_decimal=True) | 
|  | except ValueError: | 
|  | raise SystemExit(sys.exc_info()[1]) | 
|  |  | 
|  | log.info(obj) | 
|  |  | 
|  | xbar = tlgen.validate(obj) | 
|  | xbar.ip_path = args.ip_path | 
|  |  | 
|  | if not tlgen.elaborate(xbar): | 
|  | log.error("Elaboration failed." + repr(xbar)) | 
|  |  | 
|  | # Generate | 
|  | results = tlgen.generate(xbar) | 
|  |  | 
|  | dv_path = Path(args.outdir) / args.ip_path / 'dv/autogen' | 
|  | dv_path.mkdir(parents=True, exist_ok=True) | 
|  |  | 
|  | for filename, filecontent in results: | 
|  | filepath = Path(args.outdir) / args.ip_path / filename | 
|  | filepath.parent.mkdir(parents=True, exist_ok=True) | 
|  | with filepath.open(mode='w', encoding='UTF-8') as fout: | 
|  | fout.write(filecontent) | 
|  |  | 
|  | # generate TB | 
|  | tlgen.generate_tb(xbar, dv_path) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main() |