summaryrefslogtreecommitdiff
path: root/compiler/enco/test/tflite/CMakeLists.txt
blob: d5a96a6da3a2685b296acda642621eaf21442be8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
option(ENCO_TFLITE_TEST "Enable enco test for TFLite" ON)

if(NOT ENCO_TFLITE_TEST)
  return()
endif(NOT ENCO_TFLITE_TEST)

###
### Common function(s)
###
function(get_test_configuration PREFIX)
  set(RECIPE_FILE "${PREFIX}.recipe" PARENT_SCOPE)
  set(TFLITEMODEL_FILE "${PREFIX}.tflite" PARENT_SCOPE)
  set(SOURCE_FILE ${PREFIX}.cpp PARENT_SCOPE)
  set(ASM_FILE ${PREFIX}.embed.S PARENT_SCOPE)
  set(BIN_FILE ${PREFIX}.bin PARENT_SCOPE)
endfunction(get_test_configuration)

###
### Prepare test(s)
###
if(NOT TARGET tflchef-file)
  return()
endif(NOT TARGET tflchef-file)

if(NOT TARGET enco_tflite_frontend)
  return()
endif(NOT TARGET enco_tflite_frontend)

file(GLOB MODELS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/test.recipe")

foreach(MODEL IN ITEMS ${MODELS})
  get_filename_component(PREFIX ${MODEL} DIRECTORY)
  get_test_configuration(${PREFIX})

  set(MODEL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${MODEL})

  # Copy recipe
  add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${RECIPE_FILE}
                     COMMAND ${CMAKE_COMMAND} -E copy "${MODEL_FILE}"
                                                      "${CMAKE_CURRENT_BINARY_DIR}/${RECIPE_FILE}"
                     DEPENDS "${MODEL_FILE}"
                     COMMENT "Copying ${RECIPE_FILE}")

  # Generate tflitemodel
  add_custom_command(OUTPUT ${TFLITEMODEL_FILE}
                     COMMAND $<TARGET_FILE:tflchef-file> ${RECIPE_FILE} ${TFLITEMODEL_FILE}
                     DEPENDS tflchef ${CMAKE_CURRENT_BINARY_DIR}/${RECIPE_FILE}
                     COMMENT "Generating ${TFLITEMODEL_FILE}")

  # Generate C++ code
  add_custom_command(OUTPUT ${SOURCE_FILE} ${ASM_FILE} ${BIN_FILE}
                     COMMAND $<TARGET_FILE:enco-cli>
                         --frontend $<TARGET_FILE:enco_tflite_frontend>
                         --frontend-arg ${TFLITEMODEL_FILE}
                         --backend-arg ${PREFIX}
                     DEPENDS enco-cli enco_caffe_frontend ${TFLITEMODEL_FILE}
                     COMMENT "Generating ${SOURCE_FILE}")
  set_source_files_properties(${ASM_FILE} PROPERTIES GENERATED TRUE LANGUAGE C)

  list(APPEND CANDIDATES ${PREFIX})
endforeach(MODEL)

###
### Inference test
###
if(NOT TARGET ann_ref_static)
  return()
endif(NOT TARGET ann_ref_static)

find_program(H5DIFF h5diff)

if (NOT H5DIFF)
  return()
endif(NOT H5DIFF)

message(STATUS "Enable enco(tflite) inference test")

foreach(PREFIX IN ITEMS ${CANDIDATES})
  if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PREFIX}/INFERENCE")
    continue()
  endif()

  get_test_configuration(${PREFIX})

  set(BINDER_TARGET enco_tflite_test_${PREFIX}_binder)

  # Compile nnkit binder (from generated C++ code)
  add_library(${BINDER_TARGET} SHARED ${CMAKE_CURRENT_SOURCE_DIR}/../binder.cpp ${SOURCE_FILE} ${ASM_FILE})
  target_include_directories(${BINDER_TARGET} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
  target_link_libraries(${BINDER_TARGET} nnkit_intf_backend)
  target_link_libraries(${BINDER_TARGET} ann_api)
  target_link_libraries(${BINDER_TARGET} ann_ref_static)
  target_link_libraries(${BINDER_TARGET} stdex)
  set_target_properties(${BINDER_TARGET} PROPERTIES OUTPUT_NAME ${PREFIX})

  list(APPEND TESTS ${PREFIX})
endforeach(PREFIX)

# Run tests
add_test(NAME enco_test_tflite
         COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/runall.sh"
                            $<TARGET_FILE:nnkit-run>
                            $<TARGET_FILE:nnkit_tflite_backend>
                            $<TARGET_FILE:nnkit_randomize_action>
                            $<TARGET_FILE:nnkit_HDF5_export_action>
                            $<TARGET_FILE:nnkit_HDF5_import_action>
                            "${CMAKE_CURRENT_BINARY_DIR}"
                            ${TESTS})