| # Copyright lowRISC contributors. |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| """Autogeneration rules for OpenTitan. |
| |
| The rules in this file are for autogenerating various file resources |
| used by the OpenTitan build, such as register definition files generated |
| from hjson register descriptions. |
| """ |
| |
| def _hjson_header(ctx): |
| header = ctx.actions.declare_file("{}.h".format(ctx.label.name)) |
| ctx.actions.run( |
| outputs = [header], |
| inputs = ctx.files.srcs + [ctx.executable._regtool], |
| arguments = [ |
| "-D", |
| "-q", |
| "-o", |
| header.path, |
| ] + [src.path for src in ctx.files.srcs], |
| executable = ctx.executable._regtool, |
| ) |
| |
| tock = ctx.actions.declare_file("{}.rs".format(ctx.label.name)) |
| ctx.actions.run( |
| outputs = [tock], |
| inputs = ctx.files.srcs + [ctx.executable._regtool, ctx.file.version_stamp], |
| arguments = [ |
| "--tock", |
| "--version-stamp={}".format(ctx.file.version_stamp.path), |
| "-q", |
| "-o", |
| tock.path, |
| ] + [src.path for src in ctx.files.srcs], |
| executable = ctx.executable._regtool, |
| ) |
| |
| return [ |
| CcInfo(compilation_context = cc_common.create_compilation_context( |
| includes = depset([header.dirname]), |
| headers = depset([header]), |
| )), |
| DefaultInfo(files = depset([header, tock])), |
| OutputGroupInfo( |
| header = depset([header]), |
| tock = depset([tock]), |
| ), |
| ] |
| |
| autogen_hjson_header = rule( |
| implementation = _hjson_header, |
| attrs = { |
| "srcs": attr.label_list(allow_files = True), |
| "version_stamp": attr.label( |
| default = "//util:full_version_file", |
| allow_single_file = True, |
| ), |
| "_regtool": attr.label( |
| default = "//util:regtool", |
| executable = True, |
| cfg = "exec", |
| ), |
| }, |
| ) |
| |
| def _chip_info(ctx): |
| header = ctx.actions.declare_file("chip_info.h") |
| ctx.actions.run( |
| outputs = [header], |
| inputs = [ |
| ctx.file.version, |
| ctx.executable._tool, |
| ], |
| arguments = [ |
| "-o", |
| header.dirname, |
| "--ot_version_file", |
| ctx.file.version.path, |
| ], |
| executable = ctx.executable._tool, |
| ) |
| return [ |
| CcInfo(compilation_context = cc_common.create_compilation_context( |
| includes = depset([header.dirname]), |
| headers = depset([header]), |
| )), |
| DefaultInfo(files = depset([header])), |
| ] |
| |
| autogen_chip_info = rule( |
| implementation = _chip_info, |
| attrs = { |
| "version": attr.label( |
| default = "//util:ot_version_file", |
| allow_single_file = True, |
| ), |
| "_tool": attr.label( |
| default = "//util:rom_chip_info", |
| executable = True, |
| cfg = "exec", |
| ), |
| }, |
| ) |
| |
| def _cryptotest_hjson_external(ctx): |
| """ |
| Implementation of the Bazel rule for parsing externally-sourced test vectors. |
| |
| Crypto test vectors are represented in a standard HJSON format; for |
| externally-sourced vectors, we need to parse the original data into the |
| standard format before it can be used. |
| |
| This rule expects an executable script (the `parser` attribute) and a |
| single external data file to pass to this script (the `src` attribute). It |
| assumes that the parser accepts the following syntax: |
| <script> <input file> dst.hjson |
| |
| ...where <input file> is the external test data and dst.hjson is the HJSON |
| file to which the script writes the test vectors. |
| """ |
| |
| hjson = ctx.actions.declare_file(ctx.attr.name + ".hjson") |
| parser_input = ctx.file.src |
| ctx.actions.run( |
| outputs = [hjson], |
| inputs = [ctx.executable.parser, parser_input], |
| arguments = [parser_input.path, hjson.path], |
| executable = ctx.executable.parser, |
| ) |
| |
| return [ |
| DefaultInfo(files = depset([hjson])), |
| OutputGroupInfo( |
| hjson = depset([hjson]), |
| ), |
| ] |
| |
| autogen_cryptotest_hjson_external = rule( |
| implementation = _cryptotest_hjson_external, |
| attrs = { |
| "deps": attr.label_list(allow_files = True), |
| "src": attr.label(allow_single_file = True), |
| "parser": attr.label( |
| mandatory = True, |
| executable = True, |
| cfg = "exec", |
| ), |
| }, |
| ) |
| |
| def _cryptotest_header(ctx): |
| """ |
| Implementation of the Bazel rule for generating crypto test vector headers. |
| |
| Crypto tests are all represented in a standard HJSON format. This rule runs |
| an algorithm-specific script (the `test_setter` attribute) that reads an |
| HJSON file (the `hjson` attribute) and populates a header template (the |
| `template` attribute). |
| |
| Assumes that `test_setter` scripts accept the following syntax: |
| <script> --template dst.h.tpl tests.hjson dst.h |
| |
| ...where dst.h.tpl is the header template, tests.hjson is the file |
| containing the HJSON test vectors and dst.h is the header file to which the |
| output will be written. |
| """ |
| template = ctx.file.template |
| if not template.basename.endswith(".h.tpl"): |
| fail("Expected template to have a `.h.tpl` extension, got: " + str(ctx.files.srcs)) |
| header = ctx.actions.declare_file("{}/{}".format(ctx.label.name, template.basename[:-4])) |
| |
| hjson = ctx.file.hjson |
| ctx.actions.run( |
| outputs = [header], |
| inputs = [template, hjson], |
| arguments = [ |
| "-t", |
| template.path, |
| "-j", |
| hjson.path, |
| "-o", |
| header.path, |
| ], |
| executable = ctx.executable.tool, |
| ) |
| |
| return [ |
| CcInfo(compilation_context = cc_common.create_compilation_context( |
| includes = depset([header.dirname]), |
| headers = depset([header]), |
| defines = depset(["RULE_NAME=\"{}\"".format(ctx.label.name)]), |
| )), |
| DefaultInfo(files = depset([header]), default_runfiles = ctx.runfiles(files = [hjson])), |
| OutputGroupInfo( |
| header = depset([header]), |
| ), |
| ] |
| |
| autogen_cryptotest_header = rule( |
| implementation = _cryptotest_header, |
| attrs = { |
| "deps": attr.label_list(allow_files = True), |
| "template": attr.label(mandatory = True, allow_single_file = [".tpl"]), |
| "hjson": attr.label(mandatory = True, allow_single_file = [".hjson"]), |
| "tool": attr.label( |
| default = "//sw/device/tests/crypto:ecdsa_p256_verify_set_testvectors", |
| executable = True, |
| cfg = "exec", |
| ), |
| }, |
| ) |