| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "edge-impulse-sdk/tensorflow/lite/c/builtin_op_data.h" |
| #include "edge-impulse-sdk/tensorflow/lite/c/common.h" |
| #include "edge-impulse-sdk/tensorflow/lite/kernels/internal/compatibility.h" |
| #include "edge-impulse-sdk/tensorflow/lite/kernels/internal/quantization_util.h" |
| #include "edge-impulse-sdk/tensorflow/lite/kernels/internal/tensor_ctypes.h" |
| #include "edge-impulse-sdk/tensorflow/lite/kernels/kernel_util.h" |
| #include "edge-impulse-sdk/tensorflow/lite/kernels/op_macros.h" |
| #include "edge-impulse-sdk/tensorflow/lite/micro/flatbuffer_utils.h" |
| #include "edge-impulse-sdk/tensorflow/lite/micro/kernels/circular_buffer.h" |
| #include "edge-impulse-sdk/tensorflow/lite/micro/kernels/kernel_util.h" |
|
|
| namespace tflite { |
|
|
| |
| const int kCircularBufferInputTensor = 0; |
| const int kCircularBufferOutputTensor = 0; |
|
|
| |
| |
| |
| const int kCircularBufferCyclesMaxIndex = 0; |
|
|
| |
| const TfLiteStatus kTfLiteAbort = static_cast<TfLiteStatus>(-9); |
|
|
| TfLiteStatus CircularBufferPrepare(TfLiteContext* context, TfLiteNode* node) { |
| MicroContext* micro_context = GetMicroContext(context); |
|
|
| TfLiteTensor* input = |
| micro_context->AllocateTempInputTensor(node, kCircularBufferInputTensor); |
| TfLiteTensor* output = micro_context->AllocateTempOutputTensor( |
| node, kCircularBufferOutputTensor); |
|
|
| TFLITE_DCHECK(node->user_data != nullptr); |
| OpDataCircularBuffer* op_data = |
| static_cast<OpDataCircularBuffer*>(node->user_data); |
|
|
| TF_LITE_ENSURE(context, input != nullptr); |
| TF_LITE_ENSURE(context, output != nullptr); |
| TF_LITE_ENSURE_EQ(context, input->dims->data[0], output->dims->data[0]); |
| TF_LITE_ENSURE_EQ(context, 1, input->dims->data[1]); |
| TF_LITE_ENSURE_EQ(context, input->dims->data[2], output->dims->data[2]); |
| TF_LITE_ENSURE_EQ(context, output->dims->data[3], input->dims->data[3]); |
|
|
| TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); |
|
|
| |
| TF_LITE_ENSURE_TYPES_EQ(context, input->type, kTfLiteInt8); |
|
|
| if (op_data->cycles_max <= 0) { |
| |
| |
| |
| static int cb_prepare_count = 0; |
| cb_prepare_count++; |
| |
| |
| |
|
|
| |
| |
| |
| if (output->dims->data[1] == 5 || output->dims->data[1] == 13 || |
| output->dims->data[1] == 25 || |
| (cb_prepare_count == 5 && output->dims->data[2] == 2 && |
| output->dims->data[3] == 96)) { |
| op_data->cycles_max = 1; |
| cb_prepare_count = 0; |
| } else { |
| op_data->cycles_max = 2; |
| } |
| } |
| op_data->cycles_until_run = op_data->cycles_max; |
| node->user_data = op_data; |
|
|
| micro_context->DeallocateTempTfLiteTensor(input); |
| micro_context->DeallocateTempTfLiteTensor(output); |
|
|
| return kTfLiteOk; |
| } |
|
|
| } |
|
|