# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

load("//rules:fusesoc.bzl", "fusesoc_build")
load("//rules:splice.bzl", "bitstream_splice")

package(default_visibility = ["//visibility:public"])

# The readmem directives in the fusesoc-ized build tree will be in the subdir
# ${build_root}/src/lowrisc_prim_util_memload_0/rtl/prim_util_memload.svh,
# and ${build_root} will be a subdirectory called `build.fpga_cw310` inside of
# bazel-out/k8-{configname}/bin/hw/bitstream/vivado.
# Therefore, the relative path between prim_util_memload.svh and the project-root
# relative $(location ...) resolved labels is up 10 subdirectories.
_PREFIX = "../../../../../../../../../.."

_FPGA_CW310_TESTROM = "//sw/device/lib/testing/test_rom:test_rom_fpga_cw310_scr_vmem"

_FPGA_CW310_OTP_RMA = "//hw/ip/otp_ctrl/data:rma_image_verilator"

_FPGA_CW310_TESTROM_PATH = "{}/$(location {})".format(_PREFIX, _FPGA_CW310_TESTROM)

_FPGA_CW310_OTP_RMA_PATH = "{}/$(location {})".format(_PREFIX, _FPGA_CW310_OTP_RMA)

# Note: all of the targets are tagged with "manual" to prevent them from being
# matched by bazel wildcards like "//...".  In order to build the bitstream,
# you need to ask for it directly or by dependency via another rule, such as
# a functest.
fusesoc_build(
    name = "fpga_cw310",
    srcs = [
        "//hw:all_files",
        _FPGA_CW310_TESTROM,
        _FPGA_CW310_OTP_RMA,
    ],
    cores = ["//:cores"],
    data = ["//hw/ip/otbn:all_files"],
    flags = [
        "--BootRomInitFile=" + _FPGA_CW310_TESTROM_PATH,
        "--OtpCtrlMemInitFile=" + _FPGA_CW310_OTP_RMA_PATH,
    ],
    output_groups = {
        "bitstream": ["synth-vivado/lowrisc_systems_chip_earlgrey_cw310_0.1.bit"],
        "mmi": ["synth-vivado/rom.mmi"],
    },
    systems = ["lowrisc:systems:chip_earlgrey_cw310"],
    tags = ["manual"],
    target = "synth",
)

filegroup(
    name = "fpga_cw310_test_rom",
    srcs = [":fpga_cw310"],
    output_group = "bitstream",
    tags = ["manual"],
)

filegroup(
    name = "rom_mmi",
    srcs = [":fpga_cw310"],
    output_group = "mmi",
    tags = ["manual"],
)

bitstream_splice(
    name = "fpga_cw310_mask_rom",
    src = ":fpga_cw310_test_rom",
    data = "//sw/device/silicon_creator/mask_rom:mask_rom_fpga_cw310_scr_vmem",
    meminfo = ":rom_mmi",
    tags = ["manual"],
)
