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

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 = [
        "//hw/top_matcha/sw/autogen:top_matcha",
        "//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",
    timeout = "long",
    srcs = [":run_verilator_hello_world.sh"],
    args = [
        "$(location //hw:verilator)",
        "$(location //sw/device/lib/testing/test_rom:test_rom_sim_verilator_scr_vmem)",
        "$(location :hello_world_sim_verilator_vmem)",
        "$(location //hw/top_matcha/data:otp_img_rma)",
    ],
    data = [
        ":hello_world_sim_verilator_vmem",
        ":hello_world_test_expected_gpio.txt",
        "//hw:verilator",
        "//hw/top_matcha/data:otp_img_rma",
        "//sw/device/lib/testing/test_rom:test_rom_sim_verilator_scr_vmem",
    ],
    tags = [
        "verilator",
    ],
)

sh_test(
    name = "verilator_hello_world_gpio_test",
    timeout = "long",
    srcs = [":run_verilator_hello_world.sh"],
    args = [
        "$(location //hw:verilator)",
        "$(location //sw/device/lib/testing/test_rom:test_rom_sim_verilator_scr_vmem)",
        "$(location :hello_world_sim_verilator_vmem)",
        "$(location //hw/top_matcha/data:otp_img_rma)",
        "gpio_test",
    ],
    data = [
        ":hello_world_sim_verilator_vmem",
        "//hw:verilator",
        "//hw/top_matcha/data:otp_img_rma",
        "//sw/device/lib/testing/test_rom:test_rom_sim_verilator_scr_vmem",
    ],
    tags = [
        "verilator",
    ],
)
