# 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 = [
        "//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",
    ],
    visibility = ["//sw/device/tests:sw_device_test_group"],
)

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",
    ],
)
