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