# SPDX-FileCopyrightText: Copyright (c) 2026 Nuvoton Technology Corporation
# SPDX-License-Identifier: Apache-2.0

cmake_minimum_required(VERSION 3.20.0)

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})

project(Zephyr_ML_KWS)

# Pick chosen model file (*.tflite)
if(CONFIG_NVT_ML_KWS_MODEL_DS_CNN_M_QUANTIZED_ETHOS_U55_256_SPEED)
    set(MODEL_TFLITE ds_cnn_m_quantized_ethos-u55-256_opt-speed.tflite)
endif()

target_compile_definitions(app
  PRIVATE
    # Required by app for dcache conditional code
    $<$<BOOL:${CONFIG_CACHE_MANAGEMENT}>:NVT_DCACHE_ON>
    # Required by app to enable DMIC
    $<$<BOOL:${CONFIG_NVT_ML_KWS_INPUT_DMIC}>:USE_DMIC>
    # Required by ml-embedded-evaluation-kit to go Ethos-U way
    $<$<BOOL:${CONFIG_NVT_ML_REQUIRES_ETHOS_U}>:ARM_NPU>
    # Required by TFLM to define tensor arena size
    ACTIVATION_BUF_SZ=${CONFIG_NVT_ML_TFLM_TENSOR_ARENA_SIZE}
    # Required by app to tell which model
    $<$<BOOL:${CONFIG_NVT_ML_REQUIRES_KWS_MODEL_DS_CNN_M_QUANTIZED}>:MODEL_DS_CNN>
)

set(APP_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
set(APP_GEN_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated)

target_include_directories(app
  PRIVATE
    ${APP_SOURCE_DIR}/Device/include
    ${APP_SOURCE_DIR}/Model/include
    ${APP_SOURCE_DIR}/NPU/include
    ${APP_SOURCE_DIR}/Pattern/include
    ${APP_SOURCE_DIR}
    ${APP_GEN_DIR}
)

# Add all Device *.cc/*.cpp/*.c files
file(GLOB_RECURSE SOURCE_DEVICE
    "${APP_SOURCE_DIR}/Device/*.cc"
    "${APP_SOURCE_DIR}/Device/*.cpp"
    "${APP_SOURCE_DIR}/Device/*.c"
)
# Exclude DMIC*.c* or dmic*.c* files if not enabled
if(NOT CONFIG_NVT_ML_KWS_INPUT_DMIC)
    list(FILTER SOURCE_DEVICE EXCLUDE REGEX ".*(DMIC)|(dmic).*\\.c.*$")
endif()

# Add all Model *.cc/*.cpp/*.c files
file(GLOB_RECURSE SOURCE_MODEL
    "${APP_SOURCE_DIR}/Model/*.cc"
    "${APP_SOURCE_DIR}/Model/*.cpp"
    "${APP_SOURCE_DIR}/Model/*.c"
)
# Exclude all */Model/*.tflite.c* files from build, except target-specific
list(FILTER SOURCE_MODEL EXCLUDE REGEX ".*/Model/.*\\.tflite\\.c.*$")
list(APPEND SOURCE_MODEL "${APP_SOURCE_DIR}/Model/${MODEL_TFLITE}.cpp")

# Add all Pattern *.cc/*.cpp/*.c files
file(GLOB_RECURSE SOURCE_PATTERN
    "${APP_SOURCE_DIR}/Pattern/*.cc"
    "${APP_SOURCE_DIR}/Pattern/*.cpp"
    "${APP_SOURCE_DIR}/Pattern/*.c"
)

# Add root *.cc/*.cpp/*.c files
file(GLOB SOURCE_ROOT
    "${APP_SOURCE_DIR}/*.cc"
    "${APP_SOURCE_DIR}/*.cpp"
    "${APP_SOURCE_DIR}/*.c"
)

target_sources(app
  PRIVATE
    ${SOURCE_DEVICE}
    ${SOURCE_MODEL}
    ${SOURCE_PATTERN}
    ${SOURCE_ROOT}
)

# Convert picked model to C array data
generate_inc_file_for_target(app
    src/Model/${MODEL_TFLITE}
    ${APP_GEN_DIR}/${MODEL_TFLITE}.inc
)
