| #!/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 |
| |
| import logging |
| import subprocess |
| import sys |
| from pathlib import Path |
| from typing import List |
| |
| from autogen_banner import get_autogen_banner |
| from make_new_dif.ip import Ip |
| from mako.template import Template |
| |
| # This file is $REPO_TOP/util/autogen_testutils.py, so it takes two parent() |
| # calls to get back to the top. |
| REPO_TOP = Path(__file__).resolve().parent.parent.parent |
| |
| |
| def gen_testutils(ips_with_difs: List[Ip]) -> None: |
| """Generate testutils libraries that are rendered from Mako templates. |
| |
| Args: |
| ips_with_difs: List of IP objects that have existing DIF libraries. |
| |
| Returns: |
| None |
| """ |
| # Sort input so the templates get rendered in the same order every time. |
| ips_with_difs.sort(key=lambda ip: ip.name_snake) |
| |
| # Define input/output directories. |
| testutils_templates_dir = REPO_TOP / "util/autogen_testutils/templates" |
| autogen_testutils_dir = REPO_TOP / "sw/device/lib/testing/autogen" |
| |
| # Create output directories if needed. |
| autogen_testutils_dir.mkdir(exist_ok=True) |
| |
| testutilses = [] |
| |
| # Render templates. |
| for testutils_template_path in testutils_templates_dir.iterdir(): |
| if testutils_template_path.suffix == ".tpl": |
| comment_syntax = "#" if testutils_template_path.stem.endswith( |
| ".build") else "//" |
| # Read in template, render it, and write it to the output file. |
| testutils_template = Template(testutils_template_path.read_text()) |
| testutils = autogen_testutils_dir / testutils_template_path.stem |
| testutils.write_text( |
| testutils_template.render(ips_with_difs=ips_with_difs, |
| autogen_banner=get_autogen_banner( |
| "util/autogen_testutils.py", |
| comment=comment_syntax))) |
| testutilses += [testutils] |
| |
| # Format autogenerated file with clang-format. |
| try: |
| subprocess.check_call( |
| ["./bazelisk.sh", "run", "//quality:clang_format_fix", "--"] + testutilses |
| ) |
| except subprocess.CalledProcessError: |
| logging.error( |
| f"failed to format {testutilses} with clang-format.") |
| sys.exit(1) |
| |
| print(f"testutils successfully written to {str(testutilses)}.") |