# 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.

# vec_cc_generated_test()
#
# CMake function to generate vector test from a given template.
#
# Parameters:
# NAME: Name of the op_code the test will verify
# TEMPLATE: mako template to use in generating the CPP file
# PREFIX: prefix to add to the target
# LINKOPTS: additional link options
# TIMEOUT: test specific timeout
#
# Note:
#  This will generate an elf file that can be executed on target
#  It also adds a test that can be run via CTest

function(vec_cc_generated_test)
  cmake_parse_arguments(
    _RULE
    ""
    "NAME"
    "TEMPLATE;PREFIX;LINKOPTS;TIMEOUT"
    ${ARGN}
  )

set(_TEST_NAME "${_RULE_PREFIX}${_RULE_NAME}_test")
set(_OP_CODE ${_RULE_NAME})
string(REPLACE ".tpl" "" _TEST_SRC_FILENAME ${_RULE_TEMPLATE})

set(_TEST_SRC ${CMAKE_CURRENT_BINARY_DIR}/generated/${_OP_CODE}/${_TEST_SRC_FILENAME})
find_file(_GEN_VEC_SCRIPT generate_vector_tests.py ${CMAKE_SOURCE_DIR}/scripts)
file(GLOB_RECURSE TEMPLATES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.tpl")
add_custom_command(
    OUTPUT
      ${_TEST_SRC}
    DEPENDS
     ${CMAKE_CURRENT_SOURCE_DIR}/templates/${_RULE_TEMPLATE}
     ${TEMPLATES}
    COMMAND python3 ${_GEN_VEC_SCRIPT}
      --template-path=${CMAKE_CURRENT_SOURCE_DIR}/templates/
      --template=${_RULE_TEMPLATE}
      --out-path=${CMAKE_CURRENT_BINARY_DIR}/generated/${_OP_CODE}
      --op=${_OP_CODE}
)

vec_cc_test(
  NAME
    ${_TEST_NAME}
  SRCS
    ${_TEST_SRC}
  DEPS
    softrvv
  LINKOPTS
    ${_RULE_LINKOPTS}
  TIMEOUT
    ${_RULE_TIMEOUT}
)
endfunction()

function(softrvv_vec_cc_generated_test)
  cmake_parse_arguments(
    _RULE
    ""
    "NAME"
    "TEMPLATE;LINKOPTS;TIMEOUT"
    ${ARGN}
  )

vec_cc_generated_test(
  NAME
    ${_RULE_NAME}
  PREFIX
    softrvv_
  TEMPLATE
    ${_RULE_TEMPLATE}
  LINKOPTS
    ${_RULE_LINKOPTS}
  TIMEOUT
    ${_RULE_TIMEOUT}
)

endfunction()
