| #!/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 | |
| # make_new_dif.py is a script for instantiating templates needed to begin | |
| # development on a new DIF. | |
| # | |
| # To instantiate the files for a new IP named my_ip, run the command | |
| # $ util/make_new_dif.py --ip my_ip --peripheral "my peripheral" | |
| # where "my peripheral" is a documentation-friendly name for your peripheral. | |
| # Compare "pwrmgr" and "power manager". | |
| # | |
| # It will instantiate: | |
| # - `sw/device/lib/dif/dif_template.h.tpl` as the DIF Header (into dif_<ip>.h). | |
| # - `doc/project/sw_checklist.md.tpl` as the DIF Checklist (into dif_<ip>.md). | |
| # | |
| # See both templates for more information. | |
| # | |
| # You can also use the `--only=header` or `--only=checklist` to instantiate a | |
| # subset of the templates. This can be passed multiple times, and including | |
| # `--only=all` will instantiate every template. | |
| # | |
| # The produced files will still need some cleaning up before they can be used. | |
| import argparse | |
| from pathlib import Path | |
| from mako.template import Template | |
| # This file is $REPO_TOP/util/make_new_dif.py, so it takes two parent() | |
| # calls to get back to the top. | |
| REPO_TOP = Path(__file__).resolve().parent.parent | |
| ALL_PARTS = ["header", "checklist"] | |
| def main(): | |
| dif_dir = REPO_TOP / 'sw/device/lib/dif' | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument('--ip', | |
| '-i', | |
| required=True, | |
| help='the short name of the IP, in snake_case') | |
| parser.add_argument('--peripheral', | |
| '-p', | |
| required=True, | |
| help='the documentation-friendly name of the IP') | |
| parser.add_argument( | |
| '--handle-param', | |
| '-a', | |
| default='handle', | |
| help='an optional name to replace the `handle` parameter name') | |
| parser.add_argument('--only', | |
| choices=['all'] + ALL_PARTS, | |
| default=[], | |
| action='append', | |
| help='only create some files; defaults to all.') | |
| parser.add_argument('--output', | |
| '-o', | |
| type=Path, | |
| default=dif_dir, | |
| help='directory to place the output files into.') | |
| args = parser.parse_args() | |
| if len(args.only) == 0: | |
| args.only += ['all'] | |
| if 'all' in args.only: | |
| args.only += ALL_PARTS | |
| ip_snake = args.ip | |
| ip_camel = ''.join([word.capitalize() for word in args.ip.split('_')]) | |
| ip_upper = ip_snake.upper() | |
| periph_lower = args.peripheral | |
| # We just want to set the first character to title case. In particular, | |
| # .capitalize() does not do the right thing, since it would convert | |
| # UART to Uart. | |
| periph_upper = periph_lower[0].upper() + periph_lower[1:] | |
| handle = args.handle_param | |
| if len(args.only) > 0: | |
| args.output.mkdir(exist_ok=True) | |
| if "header" in args.only: | |
| header_template_file = args.output / 'dif_template.h.tpl' | |
| with header_template_file.open('r') as f: | |
| header_template = Template(f.read()) | |
| header_out_file = dif_dir / 'dif_{}.h'.format(ip_snake) | |
| with header_out_file.open('w') as f: | |
| f.write( | |
| header_template.render( | |
| ip_snake=ip_snake, | |
| ip_camel=ip_camel, | |
| ip_upper=ip_upper, | |
| periph_lower=periph_lower, | |
| periph_upper=periph_upper, | |
| handle=handle, | |
| )) | |
| print('DIF header successfully written to {}.'.format( | |
| str(header_out_file))) | |
| if "checklist" in args.only: | |
| checklist_template_file = REPO_TOP / 'doc/project/sw_checklist.md.tpl' | |
| with checklist_template_file.open('r') as f: | |
| markdown_template = Template(f.read()) | |
| checklist_out_file = args.output / 'dif_{}.md'.format(ip_snake) | |
| with checklist_out_file.open('w') as f: | |
| f.write( | |
| markdown_template.render( | |
| ip_name=ip_snake, | |
| dif_name=ip_snake, | |
| display_name=periph_upper, | |
| )) | |
| print('DIF Checklist successfully written to {}.'.format( | |
| str(checklist_out_file))) | |
| if __name__ == '__main__': | |
| main() |