# 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"
)

# TODO(lundong): Re-enable VMVX after
# github.com/openxla/iree/issues/12836 is resolved
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"
)

# ------------------------------------------------------------------------------
# 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"
)

# TODO(lundong): Re-enable VMVX after
# github.com/openxla/iree/issues/12836 is resolved
#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"
)
