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

load("//rules:matcha.bzl", "OPENTITAN_CPU", "sec_flash_binary")
load("//rules:targets.bzl", "get_targets")

TARGETS = get_targets()

sec_flash_binary(
    name = "hello_world",
    srcs = [
        "hello_world.c",
    ],
    copts = [
        "-nostdlib",
        "-ffreestanding",
        # Disable the date-time warning only for the hello world program.
        "-Wno-date-time",
    ],
    deps = [
        ":hello_world_lib",
    ],
)

cc_library(
    name = "hello_world_lib",
    target_compatible_with = [OPENTITAN_CPU],
    deps = [
        "//sw/device/lib/dif:pinmux",
        "//sw/device/lib/testing:pinmux_testutils",
        "//sw/device/lib/testing/test_framework:ottf_start",
        "@lowrisc_opentitan//sw/device/examples:demos",
        "@lowrisc_opentitan//sw/device/lib/base:mmio",
        "@lowrisc_opentitan//sw/device/lib/crt",
        "@lowrisc_opentitan//sw/device/lib/dif:gpio",
        "@lowrisc_opentitan//sw/device/lib/dif:spi_device",
        "@lowrisc_opentitan//sw/device/lib/dif:uart",
        "@lowrisc_opentitan//sw/device/lib/runtime:hart",
        "@lowrisc_opentitan//sw/device/lib/runtime:log",
        "@lowrisc_opentitan//sw/device/lib/runtime:print",
        "@lowrisc_opentitan//sw/device/lib/testing/test_framework:check",
        "@lowrisc_opentitan//sw/device/lib/testing/test_framework:ottf_test_config",
        "@lowrisc_opentitan//sw/device/silicon_creator/lib:manifest_def",
    ],
)

# Use shell test to run the interactive verilator test on UART and GPIO
[sh_test(
    name = "{}_verilator_hello_world_test".format(target),
    timeout = "long",
    srcs = [":run_verilator_hello_world.sh"],
    args = [
        "$(location //hw:{}_verilator)".format(target),
        "$(location //sw/device/lib/testing/test_rom:{}_test_rom_sim_verilator_scr_vmem)".format(target),
        "$(location :hello_world_sim_verilator_vmem)",
        "$(location //hw/top_{}/data:otp_img_rma)".format(target),
    ],
    data = [
        ":hello_world_sim_verilator_vmem",
        ":hello_world_test_expected_gpio.txt",
        "//hw:{}_verilator".format(target),
        "//hw/top_{}/data:otp_img_rma".format(target),
        "//sw/device/lib/testing/test_rom:{}_test_rom_sim_verilator_scr_vmem".format(target),
    ],
    tags = [
        "verilator",
    ],
    visibility = ["//sw/device/tests:sw_device_test_group"],
) for target in TARGETS]

[sh_test(
    name = "{}_verilator_hello_world_gpio_test".format(target),
    timeout = "long",
    srcs = [":run_verilator_hello_world.sh"],
    args = [
        "$(location //hw:{}_verilator)".format(target),
        "$(location //sw/device/lib/testing/test_rom:{}_test_rom_sim_verilator_scr_vmem)".format(target),
        "$(location :hello_world_sim_verilator_vmem)",
        "$(location //hw/top_{}/data:otp_img_rma)".format(target),
        "gpio_test",
    ],
    data = [
        ":hello_world_sim_verilator_vmem",
        "//hw:{}_verilator".format(target),
        "//hw/top_{}/data:otp_img_rma".format(target),
        "//sw/device/lib/testing/test_rom:{}_test_rom_sim_verilator_scr_vmem".format(target),
    ],
    tags = [
        "verilator",
    ],
) for target in TARGETS]
