--
-- Copyright 2023 Google LLC
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
--      http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.

set_project("CHERIoT soundstream demo")

local shodan_dir = os.getenv("ROOTDIR")
if shodan_dir == nil or shodan_dir == '' then
  raise("ROOTDIR not set")
end
local cheriot_out_dir = os.getenv("CHERIOT_OUT_DIR")
if cheriot_out_dir == nil or cheriot_out_dir == '' then
  raise("CHERIOT_OUT_DIR not set")
end

local sdkdir = path.join(shodan_dir, "sw/cheriot-rtos/sdk")
includes(sdkdir)
set_toolchains("cheriot-clang")

option("board")
    set_default("sencha")

local matcha_dir = path.join(shodan_dir, "hw/matcha")
local matcha_lib_dir = path.join(matcha_dir, "sw/device/lib")
local dif_dir = path.join(matcha_lib_dir, "dif")
local dif_autogen_dir = path.join(dif_dir, "autogen")
local opentitan_dir = path.join(shodan_dir, "hw/opentitan-upstream")
local opentitan_lib_dir = path.join(opentitan_dir, "sw/device/lib")
local opentitan_base_dir = path.join(opentitan_lib_dir, "base")
local opentitan_dif_dir = path.join(opentitan_lib_dir, "dif")
local opentitan_dif_autogen_dir = path.join(opentitan_dif_dir, "autogen")
local opentitan_runtime_dir = path.join(opentitan_lib_dir, "runtime")
local opentitan_silicon_dir = path.join(opentitan_dir, "sw/device/silicon_creator/lib")
local opentitan_silicon_drivers_dir = path.join(opentitan_silicon_dir, "drivers")
local opentitan_silicon_base_dir = path.join(opentitan_silicon_dir, "base")
local matcha_gen_dir = path.join(cheriot_out_dir, "opentitan-gen/include/opentitan")

-- Support libraries
includes(path.join(sdkdir, "lib"))
includes(path.join(sdkdir, "lib/freestanding"))

local function is_bancha()
    return is_config("board", "bancha")
end
local function is_sencha()
    return is_config("board", "sencha")
end

-- Each driver operates in a compartment.
compartment("i2s")
    add_files("i2s.cc")
    add_files(path.join(dif_dir, "dif_i2s.c"),
              path.join(dif_autogen_dir, "dif_i2s_autogen.c"))
    add_includedirs(matcha_dir, matcha_gen_dir, opentitan_dir)
    add_defines("CHERIOT_NO_AMBIENT_MALLOC")

if is_sencha() then
compartment("mailbox")
    add_files("mailbox.cc")
    add_files(path.join(dif_dir, "dif_tlul_mailbox.c"),
              path.join(dif_autogen_dir, "dif_tlul_mailbox_autogen.c"))
    add_includedirs(matcha_dir, matcha_gen_dir, opentitan_dir)
    add_defines("CHERIOT_NO_AMBIENT_MALLOC")
end

compartment("ml_top")
    add_files("ml_top.cc")
    add_files(path.join(dif_dir, "dif_ml_top.c"),
              path.join(dif_autogen_dir, "dif_ml_top_autogen.c"))
    add_includedirs(matcha_dir, matcha_gen_dir, opentitan_dir)
    add_defines("CHERIOT_NO_AMBIENT_MALLOC")

if is_bancha() then
compartment("spi")
    add_files("spi.cc")
    add_files(path.join(matcha_lib_dir, "spi_flash.c"),
              path.join(matcha_lib_dir, "eflash.c"),
                path.join(opentitan_dif_dir, "dif_flash_ctrl.c"),
                  path.join(opentitan_dif_autogen_dir, "dif_flash_ctrl_autogen.c"),
                path.join(opentitan_lib_dir, "testing/flash_ctrl_testutils.c"),
                path.join(opentitan_silicon_base_dir, "sec_mmio.c"),
                path.join(opentitan_silicon_drivers_dir, "flash_ctrl.c"),
                path.join(opentitan_silicon_drivers_dir, "otp.c"),
              path.join(matcha_lib_dir, "arch/device_sc_fpga_nexus.c"),
              path.join(opentitan_dif_dir, "dif_spi_host.c"),
                path.join(opentitan_dif_autogen_dir, "dif_spi_host_autogen.c"),
              path.join(opentitan_base_dir, "status.c"),
              path.join(opentitan_lib_dir, "testing/test_framework/status.c"),
              path.join(opentitan_runtime_dir, "log.c"),
              path.join(opentitan_runtime_dir, "print.c"))
    add_includedirs(matcha_dir, matcha_gen_dir)
    add_includedirs(opentitan_dir)
    add_defines("CHERIOT_NO_AMBIENT_MALLOC")
end

-- Soundstream application.
compartment("soundstream")
    add_files("soundstream.cc", "encode.cc")
    add_files(path.join(matcha_dir, "hw/top_matcha/sw/autogen/top_matcha.c"));
    add_includedirs(matcha_dir, matcha_gen_dir, opentitan_dir)
    add_defines("CHERIOT_NO_AMBIENT_MALLOC")

-- Firmware image.
firmware("soundstream-firmware")
    add_deps("i2s", "ml_top")
    if is_sencha() then
        add_deps("mailbox")
    end
    if is_bancha() then
        add_deps("spi", "string")
    end
    add_deps("soundstream")
    add_deps("freestanding", "debug")
    on_load(function(target)
        target:values_set("board", "$(board)")
        -- NB: trusted_stack_frames is a guess; +1'd for any
        --     compartment error handler usage?
        local threads = {
            {
                compartment = "soundstream",
                priority = 1,
                entry_point = "entry",
                stack_size = 0x1000, -- 4KB
                trusted_stack_frames = 5
            },
            -- NB: stack sizes bumped for logging
            {
                compartment = "i2s",
                priority = 10,
                entry_point = "i2s_isr",
                stack_size = 0x400, -- 512B
                trusted_stack_frames = 3
            },
            {
                compartment = "ml_top",
                priority = 10,
                entry_point = "ml_top_isr",
                stack_size = 0x400, -- 512B
                trusted_stack_frames = 3
            },
        }
        if is_sencha() then
            table.insert(threads, {
                compartment = "mailbox",
                priority = 10,
                entry_point = "mailbox_isr",
                stack_size = 0x400, -- 512B
                trusted_stack_frames = 3
            })
        end
        target:values_set("threads", threads, {expand = false})
    end)
