# For the generated header files, include the generated directory path.
# It is against the c-style recommendation, but we want to create a symlink of
# this directory to ml/ml-models for the internal model zoo so all the models
# can be built there.
include_directories(BEFORE SYSTEM ${CMAKE_CURRENT_BINARY_DIR})

# -------------------------------------------------------------------------------
# Build the mlir bytecode modules with iree-compile. Note the last two flags
# are for RVV support.
# -------------------------------------------------------------------------------

springbok_modules(
  NAME
    hps
  SRC
    "hps_quant.tflite"
  C_IDENTIFIER
    "quant_models_hps"
  FLAGS
    "-iree-input-type=tosa"
  RVV_OFF
)

springbok_modules(
  NAME
    mobilenet_v1
  SRC
    "mobilenet_v1_0.25_224_quant.tflite"
  C_IDENTIFIER
    "quant_models_mobilenet_v1"
  FLAGS
    "-iree-input-type=tosa"
    "-riscv-v-fixed-length-vector-lmul-max=8"
)

springbok_modules(
  NAME
    mobilenet_v2
  SRC
    "mobilenet_v2_1.0_224_quant.tflite"
  C_IDENTIFIER
    "quant_models_mobilenet_v2"
  FLAGS
    "-iree-input-type=tosa"
    "-riscv-v-fixed-length-vector-lmul-max=8"
)

springbok_modules(
  NAME
    person_detection
  SRC
    "person_detection.tflite"
  C_IDENTIFIER
    "quant_models_person_detection"
  FLAGS
    "-iree-input-type=tosa"
    "-riscv-v-fixed-length-vector-lmul-max=8"
  VMVX
)

# ------------------------------------------------------------------------------
# Binaries to execute the IREE model input
# ------------------------------------------------------------------------------

foreach(N RANGE 0 6)
  iree_model_input(
    NAME
      hps_${N}_quant_input
    SHAPE
      "1, 240, 320, 1"
    SRC
      "$ENV{ROOTDIR}/ml/ml-models-public/test_data/hps_${N}.jpg"
    QUANT
    SIGNED
  )
endforeach()

iree_model_input(
  NAME
    mobilenet_quant_input
  SHAPE
    "1, 224, 224, 3"
  SRC
    "https://storage.googleapis.com/download.tensorflow.org/ \
    example_images/YellowLabradorLooking_new.jpg"
  QUANT
)

iree_model_input(
  NAME
    person_detection_quant_input
  SHAPE
    "1, 96, 96, 1"
  SRC
    "https://github.com/tensorflow/tflite-micro/raw/aeac6f39e5c7475cea20c54e86d41e3a38312546/ \
    tensorflow/lite/micro/examples/person_detection/testdata/person.bmp"
  QUANT
)

# ------------------------------------------------------------------------------
# Binaries to execute the MLIR bytecode modules
# ------------------------------------------------------------------------------

# If the program requires a larger stack size, add
#
# LINKOPTS
# "LINKER:--defsym=__stack_size__=<new stack size>"
#
# to increase it.

foreach(N RANGE 0 6)
  set(HPS_COPTS "-DHPS_QUANT_INPUT=hps_${N}_quant_input")
  list(APPEND HPS_COPTS "-DHPS_QUANT_INPUT_C_H=\"hps_${N}_quant_input_c.h\"")
  if (NOT BUILD_NO_WMMU)
    list(APPEND HPS_COPTS "-DNO_STATIC_INPUT")
  endif()

  iree_cc_binary(
    NAME
      hps_${N}_bytecode_static
    SRCS
      "iree_exec/hps.c"
    DEPS
      ::hps_${N}_quant_input_c
      ::hps_bytecode_module_static_c
      ::hps_bytecode_module_static_lib
      iree::vm::bytecode::module
      model_util::util_static
    COPTS
      ${HPS_COPTS}
    LINKOPTS
      "LINKER:--defsym=__stack_size__=200k"
      # TODO(b/241297921): determine HPS heap size
      "LINKER:--defsym=__heap_size__=5M"
  )

  springbok_test(
    NAME
      hps_${N}_emitc_static
    SRCS
      "iree_exec/hps.c"
    DEPS
      ::hps_${N}_quant_input_c
      ::hps_c_module_static_emitc
      ::hps_c_module_static_lib
      model_util::util_static
    LINKOPTS
      "LINKER:--defsym=__stack_size__=200k"
      # TODO(b/241297921): determine HPS heap size
      "LINKER:--defsym=__heap_size__=5M"
    COPTS
      ${HPS_COPTS}
      "-DBUILD_EMITC"
    TESTFILES
      "iree_exec/hps_test.run"
      "iree_exec/hps_${N}_test.filecheck"
  )
endforeach()

iree_cc_binary(
  NAME
    mobilenet_v1_bytecode_static
  SRCS
    "iree_exec/mobilenet_v1.c"
  DEPS
    ::mobilenet_quant_input_c
    ::mobilenet_v1_bytecode_module_static_c
    ::mobilenet_v1_bytecode_module_static_lib
    iree::vm::bytecode::module
    model_util::util_static
  LINKOPTS
    "LINKER:--defsym=__stack_size__=300k"
)

springbok_test(
  NAME
    mobilenet_v1_emitc_static
  SRCS
    "iree_exec/mobilenet_v1.c"
  DEPS
    ::mobilenet_quant_input_c
    ::mobilenet_v1_c_module_static_emitc
    ::mobilenet_v1_c_module_static_lib
    model_util::util_static
  LINKOPTS
    "LINKER:--defsym=__stack_size__=300k"
    "LINKER:--defsym=__heap_size__=1500k"
  COPTS
    "-DBUILD_EMITC"
  TESTFILES
    "iree_exec/mobilenet_v1_test.run"
    "iree_exec/mobilenet_v1_test.filecheck"
)

iree_cc_binary(
  NAME
    mobilenet_v2_bytecode_static
  SRCS
    "iree_exec/mobilenet_v2.c"
  DEPS
    ::mobilenet_quant_input_c
    ::mobilenet_v2_bytecode_module_static_c
    ::mobilenet_v2_bytecode_module_static_lib
    iree::vm::bytecode::module
    model_util::util_static
  LINKOPTS
    "LINKER:--defsym=__stack_size__=300k"
    "LINKER:--defsym=__heap_size__=2m"
)

springbok_test(
  NAME
    mobilenet_v2_emitc_static
  SRCS
    "iree_exec/mobilenet_v2.c"
  DEPS
    ::mobilenet_quant_input_c
    ::mobilenet_v2_c_module_static_emitc
    ::mobilenet_v2_c_module_static_lib
    model_util::util_static
  LINKOPTS
    "LINKER:--defsym=__stack_size__=300k"
    "LINKER:--defsym=__heap_size__=2m"
  COPTS
    "-DBUILD_EMITC"
  TESTFILES
    "iree_exec/mobilenet_v2_test.run"
    "iree_exec/mobilenet_v2_test.filecheck"
)

iree_cc_binary(
  NAME
    person_detection_bytecode_vmvx
  SRCS
    "iree_exec/person_detection.c"
  DEPS
    ::person_detection_bytecode_module_vmvx_c
    ::person_detection_quant_input_c
    model_util::util_vmvx
  LINKOPTS
    "LINKER:--defsym=__stack_size__=128k"
    "LINKER:--defsym=__heap_size__=200k"
  COPTS
    "-DBUILD_VMVX"
)

springbok_test(
  NAME
    person_detection_emitc_vmvx
  SRCS
    "iree_exec/person_detection.c"
  DEPS
    ::person_detection_c_module_vmvx_emitc
    ::person_detection_quant_input_c
    model_util::util_vmvx
  LINKOPTS
    "LINKER:--defsym=__stack_size__=128k"
    "LINKER:--defsym=__heap_size__=200k"
  COPTS
    "-DBUILD_EMITC"
    "-DBUILD_VMVX"
  TESTFILES
    "iree_exec/person_detection_vmvx_test.run"
    "iree_exec/person_detection_test.filecheck"
)

iree_cc_binary(
  NAME
    person_detection_bytecode_static
  SRCS
    "iree_exec/person_detection.c"
  DEPS
    ::person_detection_bytecode_module_static_c
    ::person_detection_bytecode_module_static_lib
    ::person_detection_quant_input_c
    iree::vm::bytecode::module
    model_util::util_static
  LINKOPTS
    "LINKER:--defsym=__stack_size__=128k"
    "LINKER:--defsym=__heap_size__=200k"
)

springbok_test(
  NAME
    person_detection_emitc_static
  SRCS
    "iree_exec/person_detection.c"
  DEPS
    ::person_detection_c_module_static_emitc
    ::person_detection_c_module_static_lib
    ::person_detection_quant_input_c
    model_util::util_static
  LINKOPTS
    "LINKER:--defsym=__stack_size__=128k"
    "LINKER:--defsym=__heap_size__=200k"
  COPTS
    "-DBUILD_EMITC"
  TESTFILES
    "iree_exec/person_detection_test.run"
    "iree_exec/person_detection_test.filecheck"
)
