|  | # 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.files._tool, | 
|  | arguments = [ | 
|  | "-D", | 
|  | "-o", | 
|  | header.path, | 
|  | ] + [src.path for src in ctx.files.srcs], | 
|  | executable = ctx.files._tool[0], | 
|  | ) | 
|  | return [ | 
|  | CcInfo(compilation_context = cc_common.create_compilation_context( | 
|  | includes = depset([header.dirname]), | 
|  | headers = depset([header]), | 
|  | )), | 
|  | DefaultInfo(files = depset([header])), | 
|  | ] | 
|  |  | 
|  | autogen_hjson_header = rule( | 
|  | implementation = _hjson_header, | 
|  | attrs = { | 
|  | "srcs": attr.label_list(allow_files = True), | 
|  | "_tool": attr.label(default = "//util:regtool.py", allow_files = True), | 
|  | }, | 
|  | ) | 
|  |  | 
|  | def _chip_info(ctx): | 
|  | header = ctx.actions.declare_file("chip_info.h") | 
|  | ctx.actions.run( | 
|  | outputs = [header], | 
|  | inputs = ctx.files.version + ctx.files._tool, | 
|  | arguments = [ | 
|  | "-o", | 
|  | header.dirname, | 
|  | "--ot_version_file", | 
|  | ctx.files.version[0].path, | 
|  | ], | 
|  | executable = ctx.files._tool[0], | 
|  | ) | 
|  | 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_files = True), | 
|  | "_tool": attr.label(default = "//util:rom_chip_info.py", allow_files = True), | 
|  | }, | 
|  | ) | 
|  |  | 
|  | def _otp_image(ctx): | 
|  | output = ctx.actions.declare_file(ctx.attr.name + ".vmem") | 
|  | ctx.actions.run( | 
|  | outputs = [output], | 
|  | inputs = ctx.files.src + ctx.files.deps + ctx.files._tool, | 
|  | arguments = [ | 
|  | "--quiet", | 
|  | "--img-cfg", | 
|  | ctx.files.src[0].path, | 
|  | "--out", | 
|  | output.path, | 
|  | ], | 
|  | executable = ctx.files._tool[0], | 
|  | ) | 
|  | return [DefaultInfo(files = depset([output]), data_runfiles = ctx.runfiles(files = [output]))] | 
|  |  | 
|  | otp_image = rule( | 
|  | implementation = _otp_image, | 
|  | attrs = { | 
|  | "src": attr.label(allow_files = True), | 
|  | "deps": attr.label_list(allow_files = True), | 
|  | "_tool": attr.label(default = "//util:design/gen-otp-img.py", allow_files = True), | 
|  | }, | 
|  | ) |