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

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

sparrow_modules(
  NAME
    mobilenet_v1
  SRC
    "mobilenet_v1_0.25_224_quant.tflite"
  C_IDENTIFIER
    "quant_models_mobilenet_v1"
  TFLITE_OUTPUT
    # TODO(b/287490866): remove this argument after IREE fix is landed
    "--output-array=MobilenetV1/Logits/SpatialSqueeze"
    MobilenetV1/Logits/SpatialSqueeze
  FLAGS
    "-iree-input-type=tosa"
    "-riscv-v-fixed-length-vector-lmul-max=8"
)

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

sparrow_modules(
  NAME
    person_detection
  SRC
    "person_detection.tflite"
  C_IDENTIFIER
    "quant_models_person_detection"
  TFLITE_OUTPUT
    # TODO(b/287490866): remove this argument after IREE fix is landed
    "--output-array=MobilenetV1/Logits/SpatialSqueeze"
  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.

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

sparrow_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"
    "LINKER:--defsym=__tcm_length__=4M"
  COPTS
    "-DBUILD_EMITC"
  TESTFILES
    "iree_exec/mobilenet_v1_test.run"
    "iree_exec/mobilenet_v1_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"
)

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

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

# Do not compile following models for Kelvin
if (${BUILD_WITH_KELVIN})
  return()
endif()

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

  sparrow_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_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"
)

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