#
# Copyright (c) 2020-2022 Arm Limited.
#
# SPDX-License-Identifier: Apache-2.0
#
# 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
#
# 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.
#

if (NOT TARGET freertos_kernel)
    message("Not building ethosu_message_dispatcher, required freertos not built.")
    return()
endif()

# Split total tensor arena equally for each NPU
if (TARGET ethosu_core_driver AND ETHOSU_TARGET_NPU_COUNT GREATER 0)
    set(NUM_ARENAS ${ETHOSU_TARGET_NPU_COUNT})
else()
    set(NUM_ARENAS 1)
endif()

set(MESSAGE_HANDLER_ARENA_SIZE 2000000 CACHE STRING "Total size of all message handler tensor arenas")
math(EXPR TENSOR_ARENA_SIZE "${MESSAGE_HANDLER_ARENA_SIZE} / ${NUM_ARENAS}")

add_subdirectory(lib)
add_subdirectory(test)

set(MESSAGE_HANDLER_MODEL_0 "" CACHE STRING "Path to built in model 0")
set(MESSAGE_HANDLER_MODEL_1 "" CACHE STRING "Path to built in model 1")
set(MESSAGE_HANDLER_MODEL_2 "" CACHE STRING "Path to built in model 2")
set(MESSAGE_HANDLER_MODEL_3 "" CACHE STRING "Path to built in model 3")

ethosu_add_executable(message_handler
    SOURCES
        main.cpp
    LIBRARIES
        message_handler_lib
        freertos_kernel)

target_include_directories(message_handler PRIVATE
    indexed_networks
    ${LINUX_DRIVER_STACK_PATH}/kernel)

target_compile_definitions(message_handler PRIVATE
    TENSOR_ARENA_SIZE=${TENSOR_ARENA_SIZE}
    $<$<BOOL:${MESSAGE_HANDLER_MODEL_0}>:MODEL_0=${MESSAGE_HANDLER_MODEL_0}>
    $<$<BOOL:${MESSAGE_HANDLER_MODEL_1}>:MODEL_1=${MESSAGE_HANDLER_MODEL_1}>
    $<$<BOOL:${MESSAGE_HANDLER_MODEL_2}>:MODEL_2=${MESSAGE_HANDLER_MODEL_2}>
    $<$<BOOL:${MESSAGE_HANDLER_MODEL_3}>:MODEL_3=${MESSAGE_HANDLER_MODEL_3}>)

install(FILES $<TARGET_FILE:message_handler>
    DESTINATION "lib/firmware"
    RENAME "arm-${ETHOSU_TARGET_NPU_CONFIG}.fw"
)
