| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include <stddef.h> |
|
|
| #include <cstring> |
|
|
| #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/kernel_util.h" |
| #include "edge-impulse-sdk/tensorflow/lite/micro/kernels/kernel_util.h" |
| #include "edge-impulse-sdk/tensorflow/lite/micro/memory_helpers.h" |
| #include "edge-impulse-sdk/tensorflow/lite/micro/micro_graph.h" |
| #include "edge-impulse-sdk/tensorflow/lite/micro/micro_log.h" |
| #include "edge-impulse-sdk/tensorflow/lite/micro/micro_resource_variable.h" |
| #include "edge-impulse-sdk/tensorflow/lite/schema/schema_generated.h" |
|
|
| namespace tflite { |
|
|
| namespace { |
|
|
| constexpr int kInputVariableId = 0; |
| constexpr int kInputValue = 1; |
|
|
| TfLiteStatus Prepare(TfLiteContext* context, TfLiteNode* node) { |
| TF_LITE_ENSURE_EQ(context, NumInputs(node), 2); |
| TF_LITE_ENSURE_EQ(context, NumOutputs(node), 0); |
|
|
| |
| |
| |
| |
| |
| |
| const TfLiteEvalTensor* input_resource_id_tensor = |
| tflite::micro::GetEvalInput(context, node, kInputVariableId); |
| TFLITE_DCHECK(input_resource_id_tensor != nullptr); |
| TF_LITE_ENSURE(context, (input_resource_id_tensor->type == kTfLiteResource || |
| input_resource_id_tensor->type == kTfLiteInt32)); |
| TF_LITE_ENSURE_EQ(context, NumElements(input_resource_id_tensor->dims), 1); |
|
|
| tflite::MicroContext* micro_context = tflite::GetMicroContext(context); |
| TfLiteTensor* input_value = |
| micro_context->AllocateTempInputTensor(node, kInputValue); |
| TFLITE_DCHECK(input_value != nullptr); |
|
|
| MicroGraph& graph_info = micro_context->graph(); |
|
|
| MicroResourceVariables* resources = graph_info.GetResourceVariables(); |
| TF_LITE_ENSURE_OK(context, |
| resources->Allocate(input_resource_id_tensor->data.i32[0], |
| context, input_value)); |
|
|
| micro_context->DeallocateTempTfLiteTensor(input_value); |
| return kTfLiteOk; |
| } |
|
|
| TfLiteStatus Eval(TfLiteContext* context, TfLiteNode* node) { |
| const TfLiteEvalTensor* input_id = |
| tflite::micro::GetEvalInput(context, node, kInputVariableId); |
| TFLITE_DCHECK(input_id != nullptr); |
|
|
| const TfLiteEvalTensor* input_value = |
| tflite::micro::GetEvalInput(context, node, kInputValue); |
| TFLITE_DCHECK(input_value != nullptr); |
|
|
| tflite::MicroContext* micro_context = tflite::GetMicroContext(context); |
| MicroGraph& graph_info = micro_context->graph(); |
|
|
| MicroResourceVariables* resources = graph_info.GetResourceVariables(); |
| if (resources == nullptr) { |
| MicroPrintf( |
| "ASSIGN_VARIABLE requires resource variables. Please create " |
| "ResourceVariables and pass it to the interpreter."); |
| return kTfLiteError; |
| } |
| TF_LITE_ENSURE_OK(context, |
| resources->Assign(input_id->data.i32[0], input_value)); |
| return kTfLiteOk; |
| } |
|
|
| } |
|
|
| TfLiteRegistration Register_ASSIGN_VARIABLE() { |
| return tflite::micro::RegisterOp(nullptr, Prepare, Eval); |
| } |
|
|
| } |
|
|