|  | # 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", | 
|  | ), | 
|  | }, | 
|  | ) |