| # Copyright lowRISC contributors. | 
 | # Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
 | # SPDX-License-Identifier: Apache-2.0 | 
 |  | 
 | load("@nonhermetic//:env.bzl", "ENV") | 
 |  | 
 | """Rules for memory splicing with Vivado. | 
 | """ | 
 |  | 
 | def _bitstream_splice_impl(ctx): | 
 |     update = ctx.actions.declare_file("{}.update.mem".format(ctx.label.name)) | 
 |     output = ctx.actions.declare_file("{}.bit".format(ctx.label.name)) | 
 |  | 
 |     ctx.actions.run( | 
 |         mnemonic = "GenVivadoImage", | 
 |         outputs = [update], | 
 |         inputs = [ctx.executable._tool, ctx.file.data], | 
 |         arguments = [ | 
 |             ctx.file.data.path, | 
 |             update.path, | 
 |         ] + ["--swap-nibbles"] if ctx.attr.swap_nybbles else [], | 
 |         executable = ctx.executable._tool, | 
 |         use_default_shell_env = True, | 
 |         execution_requirements = { | 
 |             "no-sandbox": "", | 
 |         }, | 
 |     ) | 
 |  | 
 |     ctx.actions.run( | 
 |         mnemonic = "SpliceBitstream", | 
 |         outputs = [output], | 
 |         inputs = [ctx.file.src, ctx.file.meminfo, update], | 
 |         arguments = [ | 
 |             "-force", | 
 |             "--meminfo", | 
 |             ctx.file.meminfo.path, | 
 |             "--data", | 
 |             update.path, | 
 |             "--bit", | 
 |             ctx.file.src.path, | 
 |             "--proc", | 
 |             "dummy", | 
 |             "--out", | 
 |             output.path, | 
 |         ] + ["--debug"] if ctx.attr.debug else [], | 
 |         executable = "updatemem", | 
 |         use_default_shell_env = False, | 
 |         execution_requirements = { | 
 |             "no-sandbox": "", | 
 |         }, | 
 |         env = ENV, | 
 |     ) | 
 |  | 
 |     return [ | 
 |         DefaultInfo( | 
 |             files = depset([output]), | 
 |             data_runfiles = ctx.runfiles(files = [output]), | 
 |         ), | 
 |         OutputGroupInfo( | 
 |             bitstream = depset([output]), | 
 |             update = depset([update]), | 
 |         ), | 
 |     ] | 
 |  | 
 | bitstream_splice = rule( | 
 |     implementation = _bitstream_splice_impl, | 
 |     attrs = { | 
 |         "meminfo": attr.label(allow_single_file = True, doc = "Memory layout info file (an .mmi file)"), | 
 |         "src": attr.label(allow_single_file = True, doc = "The bitstream to splice"), | 
 |         "data": attr.label(allow_single_file = True, doc = "The memory image to splice into the bitstream"), | 
 |         "swap_nybbles": attr.bool(default = True, doc = "Swap nybbles while preparing the memory image"), | 
 |         "debug": attr.bool(default = True, doc = "Emit debug info while updating"), | 
 |         "_tool": attr.label( | 
 |             default = "//hw/ip/rom_ctrl/util:gen_vivado_mem_image", | 
 |             executable = True, | 
 |             cfg = "exec", | 
 |         ), | 
 |     }, | 
 | ) |