ONE - On-device Neural Engine
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
onert_micro::import Namespace Reference

Namespaces

namespace  helpers
 

Data Structures

class  KernelBuiltinConfigureRegistry
 
class  KernelCustomConfigureRegistry
 
struct  OMConfigureArgs
 
struct  OMDynamicShapesHandler
 
struct  OMExecutionPlanCreator
 
struct  OMKernelConfiguration
 

Typedefs

using KernelConfigureFunc = OMStatus(const OMConfigureArgs &)
 

Functions

OMStatus SISOHeader (const OMConfigureArgs &execute_args, const circle::Tensor **input, const circle::Tensor **output)
 
OMStatus TISOHeader (const OMConfigureArgs &execute_args, const circle::Tensor **input1, const circle::Tensor **input2, const circle::Tensor **output)
 
OMStatus configure_kernel_CircleAbs (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleAdd (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleAddN (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleArgMax (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleArgMin (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleAveragePool2D (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleBatchToSpaceND (const onert_micro::import::OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleCast (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleCeil (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleConcatenation (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleConv2D (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleCos (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleDepthwiseConv2D (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleDequantize (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleDiv (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleElu (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleEqual (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleExp (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleExpandDims (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleFill (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleFloor (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleFloorDiv (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleFloorMod (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleFullyConnected (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleGather (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleGatherND (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleGreater (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleGreaterEqual (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleGRU (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleL2Normalize (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleL2Pool2D (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleLeakyRelu (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleLess (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleLessEqual (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleLog (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleLogistic (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleLogSoftmax (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleMaximum (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleMaxPool2D (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleMean (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleMinimum (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleMul (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleNeg (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleNotEqual (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CirclePack (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CirclePad (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleQuantize (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleReduceProd (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleRelu (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleRelu6 (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleReshape (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleRound (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleRsqrt (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleSelectV2 (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleShape (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleSin (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleSlice (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleSoftmax (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleSpaceToBatchND (const onert_micro::import::OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleSpaceToDepth (const onert_micro::import::OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleSplit (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleSplitV (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleSqrt (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleSquare (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleSquaredDifference (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleStridedSlice (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleSub (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleSum (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleSVDF (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleTanh (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleTranspose (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleTransposeConv (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleUnpack (const OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleWhile (const onert_micro::import::OMConfigureArgs &config_args)
 
OMStatus configure_kernel_CircleZerosLike (const OMConfigureArgs &config_args)
 

Variables

constexpr KernelBuiltinConfigureRegistry kernel_builtin_configure
 
constexpr KernelCustomConfigureRegistry kernel_custom_configure
 

Typedef Documentation

◆ KernelConfigureFunc

Function Documentation

◆ configure_kernel_CircleAbs()

OMStatus onert_micro::import::configure_kernel_CircleAbs ( const OMConfigureArgs config_args)

Definition at line 27 of file Abs.cpp.

28{
30}
OMStatus configure_SISO_kernel(const OMConfigureArgs &config_args)

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleAdd()

OMStatus onert_micro::import::configure_kernel_CircleAdd ( const OMConfigureArgs config_args)

Definition at line 27 of file Add.cpp.

28{
30}
OMStatus configure_TISO_kernel(const OMConfigureArgs &config_args)

References onert_micro::import::helpers::configure_TISO_kernel().

◆ configure_kernel_CircleAddN()

OMStatus onert_micro::import::configure_kernel_CircleAddN ( const OMConfigureArgs config_args)

Definition at line 38 of file AddN.cpp.

39{
40 OMRuntimeContext &runtime_context = config_args.runtime_context;
41 uint16_t op_index = config_args.kernel_index;
42
44
45 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
46 if (status != Ok)
47 return status;
48
49 const auto kInputsNum = runtime_kernel.inputs_num;
50
51 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
52 assert(output != nullptr);
53 const circle::Tensor *input1 = runtime_kernel.inputs[input1TensorIdx];
54 assert(input1 != nullptr);
55 const OMRuntimeShape input1_shape(input1);
56
57 for (int idx = 1; idx < kInputsNum; ++idx)
58 {
59 const circle::Tensor *input = runtime_kernel.inputs[idx];
60 assert(input != nullptr);
61 status = utils::checkCondition(input1->type() == input->type());
62 if (status != Ok)
63 return status;
64 }
65
66 status = utils::checkCondition(input1->type() == output->type());
67 if (status != Ok)
68 return status;
69
70 for (int idx = 1; idx < kInputsNum; ++idx)
71 {
72 const circle::Tensor *input = runtime_kernel.inputs[idx];
73 assert(input != nullptr);
74 const OMRuntimeShape input_shape(input);
75 status = utils::checkCondition(input_shape == input1_shape);
76 if (status != Ok)
77 return status;
78 }
79
80 status = utils::checkCondition(input1->type() != circle::TensorType_INT8 and
81 input1->type() != circle::TensorType_INT16);
82 if (status != Ok)
83 return status;
84
85 return status;
86}
OMStatus readKernel(uint16_t op_index, core::OMRuntimeContext &runtime_context)
const circle::Tensor * outputs[maxOutputSize]
const circle::Tensor * inputs[maxInputSize]
core::OMRuntimeContext & runtime_context

References onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_num, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleArgMax()

OMStatus onert_micro::import::configure_kernel_CircleArgMax ( const OMConfigureArgs config_args)

Definition at line 27 of file ArgMax.cpp.

28{
29 return helpers::configure_arg_kernel_common(config_args);
30}

References onert_micro::import::helpers::configure_arg_kernel_common().

◆ configure_kernel_CircleArgMin()

OMStatus onert_micro::import::configure_kernel_CircleArgMin ( const OMConfigureArgs config_args)

Definition at line 27 of file ArgMin.cpp.

28{
29 return helpers::configure_arg_kernel_common(config_args);
30}

References onert_micro::import::helpers::configure_arg_kernel_common().

◆ configure_kernel_CircleAveragePool2D()

OMStatus onert_micro::import::configure_kernel_CircleAveragePool2D ( const OMConfigureArgs config_args)

Definition at line 27 of file AveragePool2D.cpp.

28{
30}
OMStatus configure_pooling_kernel_common(const OMConfigureArgs &config_args)

References onert_micro::import::helpers::configure_pooling_kernel_common().

◆ configure_kernel_CircleBatchToSpaceND()

OMStatus onert_micro::import::configure_kernel_CircleBatchToSpaceND ( const onert_micro::import::OMConfigureArgs config_args)

Definition at line 28 of file BatchToSpaceND.cpp.

29{
30 return helpers::configure_spaces_batches_nd_kernel_common(config_args);
31}

References onert_micro::import::helpers::configure_spaces_batches_nd_kernel_common().

◆ configure_kernel_CircleCast()

OMStatus onert_micro::import::configure_kernel_CircleCast ( const OMConfigureArgs config_args)

Definition at line 38 of file Cast.cpp.

39{
40 OMRuntimeContext &runtime_context = config_args.runtime_context;
41 uint16_t op_index = config_args.kernel_index;
42
44
45 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
46 if (status != Ok)
47 return status;
48
49 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
50 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
51
52 assert(input != nullptr);
53 assert(output != nullptr);
54
55 OMRuntimeShape input_shape(input);
57
58 // Check shapes
59 status = utils::checkCondition(input_shape == output_shape);
60 if (status != Ok)
61 return status;
62
63 return status;
64}
const luci_interpreter::RuntimeShape output_shape

References onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleCeil()

OMStatus onert_micro::import::configure_kernel_CircleCeil ( const OMConfigureArgs config_args)

Definition at line 27 of file Ceil.cpp.

28{
30}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleConcatenation()

OMStatus onert_micro::import::configure_kernel_CircleConcatenation ( const OMConfigureArgs config_args)

Definition at line 32 of file Concatenation.cpp.

33{
34 OMRuntimeContext &runtime_context = config_args.runtime_context;
35 uint16_t op_index = config_args.kernel_index;
36
38
39 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
40 if (status != Ok)
41 return status;
42
43 const int num_inputs = runtime_kernel.inputs_num;
44
45 const auto *t0 = runtime_kernel.inputs[0];
46 const auto *output = runtime_kernel.outputs[0];
47
48 const auto *params = runtime_kernel.first_operator->builtin_options_as_ConcatenationOptions();
49
50 // TODO: Support concat with fused activation function
51 if (params->fused_activation_function() != circle::ActivationFunctionType_NONE)
52 return UnknownError;
53
54 OMRuntimeShape input_shape(t0);
55 int axis = params->axis();
56 if (axis < 0)
57 axis += input_shape.dimensionsCount();
58
59 if (axis < 0 or axis > input_shape.dimensionsCount())
61
62 for (int i = 1; i < num_inputs; ++i)
63 {
64 const auto *tensor = runtime_kernel.inputs[i];
65 if (tensor->type() != t0->type())
67 }
68
69 if (t0->type() != circle::TensorType_INT8 and t0->type() != circle::TensorType_INT16)
70 return Ok;
71
72#ifndef DIS_QUANT
73 // If input tensors are INT8 or INT16 type then quantization parameters of all input tensors and
74 // the output should be the same
75 for (int i = 0; i < num_inputs; ++i)
76 {
77 const auto *tensor = runtime_kernel.inputs[i];
78
79 if (tensor->quantization() == nullptr)
81
82 if (tensor->quantization()->scale()->size() != 1)
84
85 if (tensor->quantization()->zero_point()->size() != 1)
87
88 if (*tensor->quantization()->scale()->begin() != *output->quantization()->scale()->begin())
90
91 if (*tensor->quantization()->zero_point()->begin() !=
92 *output->quantization()->zero_point()->begin())
94 }
95#endif // DIS_QUANT
96
97 return Ok;
98}
const circle::Operator * first_operator
@ FailedCheckCondition
Definition OMStatus.h:32

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::FailedCheckCondition, onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_num, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::import::OMConfigureArgs::runtime_context, and onert_micro::UnknownError.

◆ configure_kernel_CircleConv2D()

OMStatus onert_micro::import::configure_kernel_CircleConv2D ( const OMConfigureArgs config_args)

Definition at line 46 of file Conv2D.cpp.

47{
48 OMRuntimeContext &runtime_context = config_args.runtime_context;
49 uint16_t op_index = config_args.kernel_index;
50
51 execute::OMRuntimeKernel runtime_kernel;
52 runtime_kernel.readKernel(op_index, runtime_context);
53
54 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
55 const circle::Tensor *weight = runtime_kernel.inputs[weightTensorIdx];
56 const circle::Tensor *bias = runtime_kernel.inputs[biasTensorIdx];
57
58 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
59
60 assert(input != nullptr);
61 assert(weight != nullptr);
62 // Bias can be nullptr
63 assert(output != nullptr);
64
65 OMStatus status = Ok;
66
67 if ((input->type() == circle::TensorType_FLOAT32 &&
68 weight->type() != circle::TensorType_FLOAT32) or
69 (input->type() == circle::TensorType_INT8 && weight->type() != circle::TensorType_INT8) or
70 (input->type() == circle::TensorType_INT16 && weight->type() != circle::TensorType_INT16))
71 {
72 return UnsupportedType;
73 }
74
75 core::OMRuntimeShape input_shape(input);
76 core::OMRuntimeShape weight_shape(weight);
77 core::OMRuntimeShape bias_shape(bias);
79
80 status = utils::checkCondition(input_shape.dimensionsCount() == 4);
81 if (status != Ok)
82 return status;
83
84 status = utils::checkCondition(input_shape.dimensionsCount() == output_shape.dimensionsCount());
85 if (status != Ok)
86 return status;
87
88 status = utils::checkCondition(input_shape.dimensionsCount() == weight_shape.dimensionsCount());
89 if (status != Ok)
90 return status;
91
92 status = utils::checkCondition(bias == nullptr or weight_shape.dims(0) == bias_shape.flatSize());
93
94 if (input->type() == circle::TensorType_FLOAT32)
95 return status;
96
97 auto input_quant = input->quantization();
98 auto filter_quant = weight->quantization();
99 auto output_quant = output->quantization();
100
101 status = utils::checkCondition(input_quant != nullptr and filter_quant != nullptr and
102 output_quant != nullptr);
103 if (status != Ok)
104 return status;
105
106 auto input_scales = input_quant->scale();
107 auto filter_scales = filter_quant->scale();
108 auto output_scales = output_quant->scale();
109
110 status = utils::checkCondition(input_scales != nullptr and filter_scales != nullptr and
111 output_scales != nullptr);
112 if (status != Ok)
113 return status;
114
115 // Support only per channel
116 status = utils::checkCondition(filter_scales->size() > 1);
117 if (status != Ok)
118 return status;
119
120 return status;
121}
int32_t dimensionsCount() const
Definition Tensor.h:106
@ UnsupportedType
Definition OMStatus.h:26

References luci_interpreter::RuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::import::OMConfigureArgs::runtime_context, and onert_micro::UnsupportedType.

◆ configure_kernel_CircleCos()

OMStatus onert_micro::import::configure_kernel_CircleCos ( const OMConfigureArgs config_args)

Definition at line 27 of file Cos.cpp.

28{
30}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleDepthwiseConv2D()

OMStatus onert_micro::import::configure_kernel_CircleDepthwiseConv2D ( const OMConfigureArgs config_args)

Definition at line 46 of file DepthwiseConv2D.cpp.

47{
48 OMRuntimeContext &runtime_context = config_args.runtime_context;
49 uint16_t op_index = config_args.kernel_index;
50
51 execute::OMRuntimeKernel runtime_kernel;
52 runtime_kernel.readKernel(op_index, runtime_context);
53
54 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
55 const circle::Tensor *weight = runtime_kernel.inputs[weightTensorIdx];
56 const circle::Tensor *bias = runtime_kernel.inputs[biasTensorIdx];
57
58 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
59
60 assert(input != nullptr);
61 assert(weight != nullptr);
62 // Bias can be nullptr
63 assert(output != nullptr);
64
65 OMStatus status = Ok;
66 const auto *options = runtime_kernel.first_operator->builtin_options_as_DepthwiseConv2DOptions();
67
68 core::OMRuntimeShape input_shape(input);
69 core::OMRuntimeShape weight_shape(weight);
70 core::OMRuntimeShape bias_shape(bias);
72
73 status = utils::checkCondition(input->type() == output->type());
74 if (status != Ok)
75 return status;
76
77 status = utils::checkCondition(input->type() == weight->type());
78 if (status != Ok)
79 return status;
80
81 status = utils::checkCondition(input_shape.dimensionsCount() == 4);
82 if (status != Ok)
83 return status;
84
85 status = utils::checkCondition(input_shape.dimensionsCount() == output_shape.dimensionsCount());
86 if (status != Ok)
87 return status;
88
89 status = utils::checkCondition(input_shape.dimensionsCount() == weight_shape.dimensionsCount());
90 if (status != Ok)
91 return status;
92
93 const auto output_depth = output_shape.dims(3);
94
95 status = utils::checkCondition(
96 bias == nullptr or (bias_shape.dimensionsCount() == 1 && bias_shape.dims(0) == output_depth));
97 if (status != Ok)
98 return status;
99
100 switch (options->fused_activation_function())
101 {
102 case circle::ActivationFunctionType_NONE:
103 case circle::ActivationFunctionType_RELU:
104 case circle::ActivationFunctionType_RELU6:
105 case circle::ActivationFunctionType_RELU_N1_TO_1:
106 break;
107 default:
109 }
110
111 if (input->type() == circle::TensorType_FLOAT32)
112 {
113 status = utils::checkCondition(bias == nullptr or input->type() == bias->type());
114 return status;
115 }
116
117 auto input_quant = input->quantization();
118 auto filter_quant = weight->quantization();
119 auto output_quant = output->quantization();
120
121 status = utils::checkCondition(input_quant != nullptr and filter_quant != nullptr and
122 output_quant != nullptr);
123 if (status != Ok)
124 return status;
125
126 auto input_scales = input_quant->scale();
127 auto filter_scales = filter_quant->scale();
128 auto output_scales = output_quant->scale();
129
130 status = utils::checkCondition(input_scales != nullptr and filter_scales != nullptr and
131 output_scales != nullptr);
132 if (status != Ok)
133 return status;
134
135 // Support only per channel
136 status = utils::checkCondition(filter_scales->size() > 1);
137 if (status != Ok)
138 return status;
139
140 return status;
141}
int32_t dims(int i) const
Definition Tensor.h:108
@ UnsupportedActivation
Definition OMStatus.h:28

References luci_interpreter::RuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dimensionsCount(), luci_interpreter::RuntimeShape::dims(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::import::OMConfigureArgs::runtime_context, and onert_micro::UnsupportedActivation.

◆ configure_kernel_CircleDequantize()

OMStatus onert_micro::import::configure_kernel_CircleDequantize ( const OMConfigureArgs config_args)

Definition at line 38 of file Dequantize.cpp.

39{
40 OMRuntimeContext &runtime_context = config_args.runtime_context;
41 uint16_t op_index = config_args.kernel_index;
42
44
45 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
46 if (status != Ok)
47 return status;
48
49 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
50 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
51
52 assert(input != nullptr);
53 assert(output != nullptr);
54
55 OMRuntimeShape input_shape(input);
57
58 // Check shapes
59 status = utils::checkCondition(input_shape == output_shape);
60 if (status != Ok)
61 return status;
62
63 // Check output type is float
64 status = utils::checkCondition(output->type() == circle::TensorType_FLOAT32);
65 if (status != Ok)
66 return status;
67
68 // Check input quantization params
69 const auto *input_quantization = input->quantization();
70 status = utils::checkCondition(input->type() != circle::TensorType_FLOAT32 or
71 input_quantization != nullptr and
72 input_quantization->scale() != nullptr and
73 input_quantization->scale()->size() == 1);
74 if (status != Ok)
75 return status;
76
77 return status;
78}

References onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleDiv()

OMStatus onert_micro::import::configure_kernel_CircleDiv ( const OMConfigureArgs config_args)

Definition at line 27 of file Div.cpp.

28{
30}

References onert_micro::import::helpers::configure_TISO_kernel().

◆ configure_kernel_CircleElu()

OMStatus onert_micro::import::configure_kernel_CircleElu ( const OMConfigureArgs config_args)

Definition at line 27 of file Elu.cpp.

28{
30}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleEqual()

OMStatus onert_micro::import::configure_kernel_CircleEqual ( const OMConfigureArgs config_args)

Definition at line 42 of file Equal.cpp.

43{
44 const circle::Tensor *input1;
45 const circle::Tensor *input2;
46 const circle::Tensor *output;
47
48 TISOHeader(config_args, &input1, &input2, &output);
49
50 OMStatus status;
51
52 status = utils::checkCondition(input1->type() == input2->type());
53 if (status != Ok)
54 return status;
55
56 status = utils::checkCondition(output->type() == circle::TensorType_BOOL);
57 if (status != Ok)
58 return status;
59
60 return status;
61}

References onert_micro::Ok, and TISOHeader().

◆ configure_kernel_CircleExp()

OMStatus onert_micro::import::configure_kernel_CircleExp ( const OMConfigureArgs config_args)

Definition at line 27 of file Exp.cpp.

28{
30}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleExpandDims()

OMStatus onert_micro::import::configure_kernel_CircleExpandDims ( const OMConfigureArgs config_args)

Definition at line 40 of file ExpandDims.cpp.

41{
42 OMRuntimeContext &runtime_context = config_args.runtime_context;
43 uint16_t op_index = config_args.kernel_index;
44 OMRuntimeStorage &runtime_storage = config_args.runtime_storage;
45
47
48 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
49 if (status != Ok)
50 return status;
51
52 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
53 const circle::Tensor *axis = runtime_kernel.inputs[axisTensorIdx];
54 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
55
56 assert(input != nullptr);
57 assert(axis != nullptr);
58 assert(output != nullptr);
59
60 status = utils::checkCondition(input->type() == output->type());
61 if (status != Ok)
62 return status;
63
64 OMRuntimeShape input_shape(input);
65
66 status = utils::checkCondition(axis->type() == circle::TensorType_INT32 or
67 axis->type() == circle::TensorType_INT64);
68 if (status != Ok)
69 return status;
70
71 // Check axis value
72 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
73 uint8_t *axis_data = runtime_kernel.inputs_data[axisTensorIdx];
74 status = utils::checkCondition(axis_data != nullptr);
75 if (status != Ok)
76 return status;
77
78 if (axis->type() == circle::TensorType_INT32)
79 {
80 int32_t axis_value = *reinterpret_cast<int32_t *>(axis_data);
81 if (axis_value < 0)
82 {
83 axis_value += input_shape.dimensionsCount() + 1;
84 }
85
86 status = utils::checkCondition(axis_value <= input_shape.dimensionsCount() and axis_value >= 0);
87 if (status != Ok)
88 return status;
89 }
90 else
91 {
92 int64_t axis_value = *reinterpret_cast<int64_t *>(axis_data);
93 if (axis_value < 0)
94 {
95 axis_value += input_shape.dimensionsCount() + 1;
96 }
97
98 status = utils::checkCondition(axis_value <= input_shape.dimensionsCount() and axis_value >= 0);
99 if (status != Ok)
100 return status;
101 }
102
103 return status;
104}
OMStatus getDataFromStorage(uint16_t op_index, core::OMRuntimeStorage &storage, core::OMRuntimeContext &context)
core::OMRuntimeStorage & runtime_storage

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::import::OMConfigureArgs::runtime_context, and onert_micro::import::OMConfigureArgs::runtime_storage.

◆ configure_kernel_CircleFill()

OMStatus onert_micro::import::configure_kernel_CircleFill ( const OMConfigureArgs config_args)

Definition at line 40 of file Fill.cpp.

41{
42 OMRuntimeContext &runtime_context = config_args.runtime_context;
43 uint16_t op_index = config_args.kernel_index;
44
46
47 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
48 if (status != Ok)
49 return status;
50
51 const circle::Tensor *input1 = runtime_kernel.inputs[input1TensorIdx];
52 const circle::Tensor *input2 = runtime_kernel.inputs[input2TensorIdx];
53 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
54
55 assert(input1 != nullptr);
56 assert(input2 != nullptr);
57 assert(output != nullptr);
58
59 status = utils::checkCondition(input1->type() == circle::TensorType_INT32 or
60 input1->type() == circle::TensorType_INT64);
61 if (status != Ok)
62 return status;
63
64 status = utils::checkCondition(input2->type() == output->type());
65 if (status != Ok)
66 return status;
67
68 OMRuntimeShape value_shape(input2);
69 status = utils::checkCondition(value_shape.dimensionsCount() == 0 or value_shape.flatSize() == 1);
70
71 return status;
72}

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleFloor()

OMStatus onert_micro::import::configure_kernel_CircleFloor ( const OMConfigureArgs config_args)

Definition at line 27 of file Floor.cpp.

28{
30}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleFloorDiv()

OMStatus onert_micro::import::configure_kernel_CircleFloorDiv ( const OMConfigureArgs config_args)

Definition at line 36 of file FloorDiv.cpp.

37{
39}
OMStatus configure_floor_kernel_common(const OMConfigureArgs &config_args)

References onert_micro::import::helpers::configure_floor_kernel_common().

◆ configure_kernel_CircleFloorMod()

OMStatus onert_micro::import::configure_kernel_CircleFloorMod ( const OMConfigureArgs config_args)

◆ configure_kernel_CircleFullyConnected()

OMStatus onert_micro::import::configure_kernel_CircleFullyConnected ( const OMConfigureArgs config_args)

Definition at line 45 of file FullyConnected.cpp.

46{
47
48 OMRuntimeContext &runtime_context = config_args.runtime_context;
49 uint16_t op_index = config_args.kernel_index;
50 OMRuntimeStorage &runtime_storage = config_args.runtime_storage;
51
52 execute::OMRuntimeKernel runtime_kernel;
53 runtime_kernel.readKernel(op_index, runtime_context);
54
55 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
56 const circle::Tensor *weight = runtime_kernel.inputs[weightTensorIdx];
57 const circle::Tensor *bias = runtime_kernel.inputs[biasTensorIdx];
58 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
59
60 assert(input != nullptr);
61 assert(weight != nullptr);
62 // Bias can be nullptr
63 assert(output != nullptr);
64
65 OMStatus status = Ok;
66
67#ifndef DIS_FLOAT
68 if (weight->type() == circle::TensorType_FLOAT32)
69 {
70
71 status = utils::checkCondition(input->type() == circle::TensorType_FLOAT32 and
72 output->type() == circle::TensorType_FLOAT32 and
73 (!bias or bias->type() == circle::TensorType_FLOAT32));
74 if (status != Ok)
75 return status;
76 }
77#endif // DIS_FLOAT
78#ifndef DIS_QUANT
79 if (weight->type() == circle::TensorType_UINT8)
80 {
81
82 status = utils::checkCondition(input->type() == circle::TensorType_UINT8 and
83 output->type() == circle::TensorType_UINT8 and
84 (!bias or bias->type() == circle::TensorType_INT32));
85 if (status != Ok)
86 return status;
87 }
88 else if (weight->type() == circle::TensorType_INT8)
89 {
90 status = utils::checkCondition(input->type() == circle::TensorType_INT8 or
91 input->type() == circle::TensorType_FLOAT32);
92 if (status != Ok)
93 return status;
94
95 status = utils::checkCondition(output->type() == circle::TensorType_INT8 or
96 output->type() == circle::TensorType_FLOAT32);
97 if (status != Ok)
98 return status;
99
100 status = utils::checkCondition(!bias or bias->type() == circle::TensorType_INT32 or
101 bias->type() == circle::TensorType_INT64 or
102 bias->type() == circle::TensorType_FLOAT32);
103 if (status != Ok)
104 return status;
105
106 if (input->type() == circle::TensorType_FLOAT32)
107 {
108 // hybrid mode
109 // Check it is channel wise quantization
110 status = utils::checkCondition(weight->quantization() != nullptr and
111 weight->quantization()->scale() != nullptr);
112 if (status != Ok)
113 return status;
114 }
115 }
116 else if (weight->type() == circle::TensorType_INT16)
117 {
118
119 status = utils::checkCondition(input->type() == circle::TensorType_INT16 and
120 output->type() == circle::TensorType_INT16 and
121 (!bias or bias->type() == circle::TensorType_INT32));
122 if (status != Ok)
123 return status;
124 }
125#endif // DIS_QUANT
126
127 core::OMRuntimeShape weight_shape(weight);
128 core::OMRuntimeShape bias_shape(bias);
129 core::OMRuntimeShape input_shape(input);
131
132 status = utils::checkCondition(weight_shape.dimensionsCount() == 2);
133 if (status != Ok)
134 return status;
135
136 if (input_shape.flatSize() == 1 and output_shape.flatSize() != 1)
137 {
138#ifndef DIS_DYN_SHAPES
139 input_shape =
140 runtime_storage.getDynamicRuntimeShape(runtime_kernel.inputs_index[inputTensorIdx]);
141 if (input_shape.flatSize() == 0)
143#else
145#endif // DIS_DYN_SHAPES
146 }
147
148 status = utils::checkCondition(bias == nullptr or weight_shape.dims(0) == bias_shape.flatSize());
149
150 if (input->type() == circle::TensorType_FLOAT32)
151 return status;
152
153#ifndef DIS_QUANT
154
155 // Check quantized version
156 if (input->quantization() == nullptr or output->quantization() == nullptr or
157 weight->quantization() == nullptr)
158 return NoQuantization;
159
160 if (output->quantization()->scale() == nullptr or output->quantization()->scale()->size() != 1)
162
163 if (output->quantization()->zero_point() == nullptr or
164 output->quantization()->zero_point()->size() != 1)
166
167 if (weight->quantization()->scale() == nullptr or weight->quantization()->scale()->size() != 1)
169
170 if (weight->quantization()->zero_point() == nullptr or
171 weight->quantization()->zero_point()->size() != 1)
173
174#endif // DIS_QUANT
175
176 return status;
177}
OMRuntimeShape getDynamicRuntimeShape(uint16_t tensor_index)
@ UnsupportedQuantizationType
Definition OMStatus.h:27
@ NoQuantization
Definition OMStatus.h:33
@ UnsupportedDynamicShapeCase
Definition OMStatus.h:34

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dims(), luci_interpreter::RuntimeShape::flatSize(), onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::core::OMRuntimeStorage::getDynamicRuntimeShape(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_index, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::NoQuantization, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::import::OMConfigureArgs::runtime_context, onert_micro::import::OMConfigureArgs::runtime_storage, onert_micro::UnsupportedDynamicShapeCase, and onert_micro::UnsupportedQuantizationType.

◆ configure_kernel_CircleGather()

OMStatus onert_micro::import::configure_kernel_CircleGather ( const OMConfigureArgs config_args)

Definition at line 40 of file Gather.cpp.

41{
42 OMRuntimeContext &runtime_context = config_args.runtime_context;
43 uint16_t op_index = config_args.kernel_index;
44
46
47 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
48 if (status != Ok)
49 return status;
50
51 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
52 const circle::Tensor *positions = runtime_kernel.inputs[positionsTensorIdx];
53 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
54
55 assert(input != nullptr);
56 assert(positions != nullptr);
57 assert(output != nullptr);
58
59 status = utils::checkCondition(input->type() == output->type());
60 if (status != Ok)
61 return status;
62
63 const auto *options = runtime_kernel.first_operator->builtin_options_as_GatherOptions();
64
65 if (options == nullptr)
66 return UnknownError;
67
68 status = utils::checkCondition(positions->type() == circle::TensorType_INT32);
69 if (status != Ok)
70 return status;
71
72 auto input_type = input->type();
73 status = utils::checkCondition(input_type == circle::TensorType_INT32 or
74 input_type == circle::TensorType_FLOAT32 or
75 input_type == circle::TensorType_INT8);
76 if (status != Ok)
77 return status;
78
79#ifndef DIS_QUANT
80 if (input_type == circle::TensorType_INT8)
81 {
82 status = utils::checkCondition(*output->quantization()->scale()->begin() ==
83 *input->quantization()->scale()->begin());
84 if (status != Ok)
85 return status;
86 status = utils::checkCondition(*output->quantization()->zero_point()->begin() ==
87 *input->quantization()->zero_point()->begin());
88 if (status != Ok)
89 return status;
90 }
91#endif // DIS_QUANT
92
93 int32_t axis = options->axis();
94
95 core::OMRuntimeShape input_shape(input);
96 core::OMRuntimeShape positions_shape(positions);
97
98 int32_t num_dims = input_shape.dimensionsCount();
99 if (axis < 0)
100 {
101 axis += num_dims;
102 }
103
104 status = utils::checkCondition(axis >= 0 and axis < num_dims);
105 if (status != Ok)
106 return status;
107
108 int32_t batch_dims = options->batch_dims();
109 int32_t coords_num_dims = positions_shape.dimensionsCount();
110 // batch_dims should be in range: [-rank(coords), rank(coords)].
111 // Negative batch_dims is added with rank of coords.
112 if (batch_dims < 0)
113 {
114 batch_dims += coords_num_dims;
115 }
116
117 status = utils::checkCondition(batch_dims <= axis and batch_dims >= 0 and
118 batch_dims < num_dims and batch_dims <= coords_num_dims);
119
120 if (status != Ok)
121 return status;
122
123 for (int i = 0; i < batch_dims; ++i)
124 {
125 status = utils::checkCondition(input_shape.dims(i) == positions_shape.dims(i));
126 }
127
128 return status;
129}

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::import::OMConfigureArgs::runtime_context, and onert_micro::UnknownError.

◆ configure_kernel_CircleGatherND()

OMStatus onert_micro::import::configure_kernel_CircleGatherND ( const OMConfigureArgs config_args)

Definition at line 43 of file GatherND.cpp.

44{
45
46 OMRuntimeContext &runtime_context = config_args.runtime_context;
47 uint16_t op_index = config_args.kernel_index;
48
50
51 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
52 if (status != Ok)
53 return status;
54
55 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
56 const circle::Tensor *positions = runtime_kernel.inputs[positionsTensorIdx];
57 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
58
59 assert(input != nullptr);
60 assert(positions != nullptr);
61 assert(output != nullptr);
62
63 status = utils::checkCondition(input->type() == output->type());
64 if (status != Ok)
65 return status;
66
67 status = utils::checkCondition(positions->type() == circle::TensorType_INT32);
68 if (status != Ok)
69 return status;
70
71 auto input_type = input->type();
72 status = utils::checkCondition(input_type == circle::TensorType_FLOAT32);
73 if (status != Ok)
74 return status;
75
76 core::OMRuntimeShape input_shape(input);
77 core::OMRuntimeShape positions_shape(positions);
78
79 int32_t shape_num_dims = input_shape.dimensionsCount();
80
81 status = utils::checkCondition(shape_num_dims >= 1);
82 if (status != Ok)
83 return status;
84
85 int32_t positions_num_dims = positions_shape.dimensionsCount();
86 int32_t positions_num_dims_nd = positions_shape.dims(positions_num_dims - 1);
87
88 status = utils::checkCondition(positions_num_dims >= 1);
89 if (status != Ok)
90 return status;
91
92 status = utils::checkCondition(positions_num_dims_nd <= shape_num_dims);
93 if (status != Ok)
94 return status;
95
96 status =
97 utils::checkCondition(positions_num_dims_nd <= onert_micro::execute::pal::MAX_INDICES_ND);
98 if (status != Ok)
99 return status;
100
101 return Ok;
102}
constexpr int MAX_INDICES_ND
Definition PALGatherND.h:32

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::execute::pal::MAX_INDICES_ND, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleGreater()

OMStatus onert_micro::import::configure_kernel_CircleGreater ( const OMConfigureArgs config_args)

Definition at line 41 of file Greater.cpp.

42{
43 const circle::Tensor *input1;
44 const circle::Tensor *input2;
45 const circle::Tensor *output;
46
47 TISOHeader(config_args, &input1, &input2, &output);
48
49 OMStatus status;
50
51 status = utils::checkCondition(input1->type() == input2->type());
52 if (status != Ok)
53 return status;
54
55 status = utils::checkCondition(output->type() == circle::TensorType_BOOL);
56 if (status != Ok)
57 return status;
58
59 return status;
60}

References onert_micro::Ok, and TISOHeader().

◆ configure_kernel_CircleGreaterEqual()

OMStatus onert_micro::import::configure_kernel_CircleGreaterEqual ( const OMConfigureArgs config_args)

Definition at line 41 of file GreaterEqual.cpp.

42{
43 const circle::Tensor *input1;
44 const circle::Tensor *input2;
45 const circle::Tensor *output;
46
47 TISOHeader(config_args, &input1, &input2, &output);
48
49 OMStatus status;
50
51 status = utils::checkCondition(input1->type() == input2->type());
52 if (status != Ok)
53 return status;
54
55 status = utils::checkCondition(output->type() == circle::TensorType_BOOL);
56 if (status != Ok)
57 return status;
58
59 return status;
60}

References onert_micro::Ok, and TISOHeader().

◆ configure_kernel_CircleGRU()

OMStatus onert_micro::import::configure_kernel_CircleGRU ( const OMConfigureArgs config_args)

Definition at line 48 of file GRU.cpp.

49{
50 core::OMRuntimeContext &runtime_context = config_args.runtime_context;
51 uint16_t op_index = config_args.kernel_index;
52
53 const circle::Tensor *input;
54 const circle::Tensor *hidden_hidden;
55 const circle::Tensor *hidden_hidden_bias;
56 const circle::Tensor *hidden_input;
57 const circle::Tensor *hidden_input_bias;
58 const circle::Tensor *state;
59
60 const circle::Tensor *output;
61
62 // Read kernel
63 execute::OMRuntimeKernel runtime_kernel;
64 runtime_kernel.readKernel(op_index, runtime_context);
65
66 input = runtime_kernel.inputs[inputTensorIdx];
67 hidden_hidden = runtime_kernel.inputs[hiddenHiddenTensorIdx];
68 hidden_hidden_bias = runtime_kernel.inputs[hiddenHiddenBiasTensorIdx];
69 hidden_input = runtime_kernel.inputs[hiddenInputTensorIdx];
70 hidden_input_bias = runtime_kernel.inputs[hiddenInputBiasTensorIdx];
71 state = runtime_kernel.inputs[stateTensorIdx];
72
73 output = runtime_kernel.outputs[outputTensorIdx];
74 assert(input != nullptr);
75 assert(hidden_hidden != nullptr);
76 assert(hidden_input != nullptr);
77 assert(state != nullptr);
78 // Biases can be nullptr
79 assert(output != nullptr);
80
81 OMStatus status = Ok;
82
83 OMRuntimeShape hidden_hidden_shape(hidden_hidden);
84 OMRuntimeShape hidden_input_shape(hidden_input);
86 OMRuntimeShape state_shape(state);
87
88 status = utils::checkCondition(hidden_hidden_shape.dims(0) == hidden_input_shape.dims(0));
89 if (status != Ok)
90 return status;
91
92 const int32_t div_factor = 3;
93 status =
94 utils::checkCondition(hidden_hidden_shape.dims(0) ==
95 (div_factor * output_shape.dims(output_shape.dimensionsCount() - 1)));
96 if (status != Ok)
97 return status;
98
99 status = utils::checkCondition(output_shape.dims(output_shape.dimensionsCount() - 1) ==
100 state_shape.dims(state_shape.dimensionsCount() - 1));
101 if (status != Ok)
102 return status;
103
104 status = utils::checkCondition(input->type() == output->type());
105 if (status != Ok)
106 return status;
107
108 return status;
109}

References luci_interpreter::RuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dimensionsCount(), luci_interpreter::RuntimeShape::dims(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleL2Normalize()

OMStatus onert_micro::import::configure_kernel_CircleL2Normalize ( const OMConfigureArgs config_args)

Definition at line 39 of file L2Normalize.cpp.

40{
42
43 return status;
44}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleL2Pool2D()

OMStatus onert_micro::import::configure_kernel_CircleL2Pool2D ( const OMConfigureArgs config_args)

Definition at line 27 of file L2Pool2D.cpp.

28{
29 return helpers::configure_pooling_kernel_common(config_args);
30}

References onert_micro::import::helpers::configure_pooling_kernel_common().

◆ configure_kernel_CircleLeakyRelu()

OMStatus onert_micro::import::configure_kernel_CircleLeakyRelu ( const OMConfigureArgs config_args)

◆ configure_kernel_CircleLess()

OMStatus onert_micro::import::configure_kernel_CircleLess ( const OMConfigureArgs config_args)

Definition at line 41 of file Less.cpp.

42{
43 const circle::Tensor *input1;
44 const circle::Tensor *input2;
45 const circle::Tensor *output;
46
47 TISOHeader(config_args, &input1, &input2, &output);
48
49 OMStatus status;
50
51 status = utils::checkCondition(input1->type() == input2->type());
52 if (status != Ok)
53 return status;
54
55 status = utils::checkCondition(output->type() == circle::TensorType_BOOL);
56 if (status != Ok)
57 return status;
58
59 return status;
60}

References onert_micro::Ok, and TISOHeader().

◆ configure_kernel_CircleLessEqual()

OMStatus onert_micro::import::configure_kernel_CircleLessEqual ( const OMConfigureArgs config_args)

Definition at line 41 of file LessEqual.cpp.

42{
43 const circle::Tensor *input1;
44 const circle::Tensor *input2;
45 const circle::Tensor *output;
46
47 TISOHeader(config_args, &input1, &input2, &output);
48
49 OMStatus status;
50
51 status = utils::checkCondition(input1->type() == input2->type());
52 if (status != Ok)
53 return status;
54
55 status = utils::checkCondition(output->type() == circle::TensorType_BOOL);
56 if (status != Ok)
57 return status;
58
59 return status;
60}

References onert_micro::Ok, and TISOHeader().

◆ configure_kernel_CircleLog()

OMStatus onert_micro::import::configure_kernel_CircleLog ( const OMConfigureArgs config_args)

Definition at line 27 of file Log.cpp.

28{
30}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleLogistic()

OMStatus onert_micro::import::configure_kernel_CircleLogistic ( const OMConfigureArgs config_args)

◆ configure_kernel_CircleLogSoftmax()

OMStatus onert_micro::import::configure_kernel_CircleLogSoftmax ( const OMConfigureArgs config_args)

◆ configure_kernel_CircleMaximum()

OMStatus onert_micro::import::configure_kernel_CircleMaximum ( const OMConfigureArgs config_args)

Definition at line 39 of file Maximum.cpp.

40{
41
42 OMRuntimeContext &runtime_context = config_args.runtime_context;
43 uint16_t op_index = config_args.kernel_index;
44
46
47 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
48 if (status != Ok)
49 return status;
50
51 const circle::Tensor *input1 = runtime_kernel.inputs[input1TensorIdx];
52 const circle::Tensor *input2 = runtime_kernel.inputs[input2TensorIdx];
53 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
54
55 assert(input1 != nullptr);
56 assert(input2 != nullptr);
57 assert(output != nullptr);
58
59 status = utils::checkCondition(input1->type() == input2->type());
60 if (status != Ok)
61 return status;
62
63 status = utils::checkCondition(input1->type() == output->type());
64 if (status != Ok)
65 return status;
66
67 return status;
68}

References onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleMaxPool2D()

OMStatus onert_micro::import::configure_kernel_CircleMaxPool2D ( const OMConfigureArgs config_args)

Definition at line 27 of file MaxPool2D.cpp.

28{
29 return helpers::configure_pooling_kernel_common(config_args);
30}

References onert_micro::import::helpers::configure_pooling_kernel_common().

◆ configure_kernel_CircleMean()

OMStatus onert_micro::import::configure_kernel_CircleMean ( const OMConfigureArgs config_args)

Definition at line 36 of file Mean.cpp.

37{
38 OMRuntimeContext &runtime_context = config_args.runtime_context;
39 uint16_t op_index = config_args.kernel_index;
40
42
43 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
44 if (status != Ok)
45 return status;
46
47 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
48 const circle::Tensor *axis = runtime_kernel.inputs[axisTensorIdx];
49 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
50
51 assert(input != nullptr);
52 assert(axis != nullptr);
53 assert(output != nullptr);
54
55 status = utils::checkCondition(axis->type() == circle::TensorType_INT32);
56 status = utils::checkCondition(input->type() == output->type());
57
58 return status;
59}

References onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleMinimum()

OMStatus onert_micro::import::configure_kernel_CircleMinimum ( const OMConfigureArgs config_args)

Definition at line 39 of file Minimum.cpp.

40{
41
42 OMRuntimeContext &runtime_context = config_args.runtime_context;
43 uint16_t op_index = config_args.kernel_index;
44
46
47 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
48 if (status != Ok)
49 return status;
50
51 const circle::Tensor *input1 = runtime_kernel.inputs[input1TensorIdx];
52 const circle::Tensor *input2 = runtime_kernel.inputs[input2TensorIdx];
53 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
54
55 assert(input1 != nullptr);
56 assert(input2 != nullptr);
57 assert(output != nullptr);
58
59 status = utils::checkCondition(input1->type() == input2->type());
60 if (status != Ok)
61 return status;
62
63 status = utils::checkCondition(input1->type() == output->type());
64 if (status != Ok)
65 return status;
66
67 return status;
68}

References onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleMul()

OMStatus onert_micro::import::configure_kernel_CircleMul ( const OMConfigureArgs config_args)

Definition at line 27 of file Mul.cpp.

28{
30}

References onert_micro::import::helpers::configure_TISO_kernel().

◆ configure_kernel_CircleNeg()

OMStatus onert_micro::import::configure_kernel_CircleNeg ( const OMConfigureArgs config_args)

Definition at line 27 of file Neg.cpp.

28{
30}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleNotEqual()

OMStatus onert_micro::import::configure_kernel_CircleNotEqual ( const OMConfigureArgs config_args)

Definition at line 42 of file NotEqual.cpp.

43{
44 const circle::Tensor *input1;
45 const circle::Tensor *input2;
46 const circle::Tensor *output;
47
48 TISOHeader(config_args, &input1, &input2, &output);
49
50 OMStatus status;
51
52 status = utils::checkCondition(input1->type() == input2->type());
53 if (status != Ok)
54 return status;
55
56 status = utils::checkCondition(output->type() == circle::TensorType_BOOL);
57 if (status != Ok)
58 return status;
59
60 return status;
61}

References onert_micro::Ok, and TISOHeader().

◆ configure_kernel_CirclePack()

OMStatus onert_micro::import::configure_kernel_CirclePack ( const OMConfigureArgs config_args)

Definition at line 33 of file Pack.cpp.

34{
35 OMRuntimeContext &runtime_context = config_args.runtime_context;
36 uint16_t op_index = config_args.kernel_index;
37
39
40 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
41 if (status != Ok)
42 return status;
43
44 const int num_inputs = runtime_kernel.inputs_num;
45
46 const auto *t0 = runtime_kernel.inputs[0];
47 const auto *output = runtime_kernel.outputs[0];
48
49 if (output->type() != t0->type())
51
52 const auto *params = runtime_kernel.first_operator->builtin_options_as_PackOptions();
53
54 OMRuntimeShape input_shape(t0);
55 int axis = params->axis();
56 if (axis < 0)
57 axis += input_shape.dimensionsCount();
58
59 if (axis < 0 or axis > input_shape.dimensionsCount())
61
62 for (int i = 1; i < num_inputs; ++i)
63 {
64 const auto *tensor = runtime_kernel.inputs[i];
65 if (tensor->type() != t0->type())
67 }
68
69 return Ok;
70}

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::FailedCheckCondition, onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_num, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CirclePad()

OMStatus onert_micro::import::configure_kernel_CirclePad ( const OMConfigureArgs config_args)

Definition at line 27 of file Pad.cpp.

28{
30}
OMStatus configure_pad_kernel_common(const OMConfigureArgs &config_args)

References onert_micro::import::helpers::configure_pad_kernel_common().

◆ configure_kernel_CircleQuantize()

OMStatus onert_micro::import::configure_kernel_CircleQuantize ( const OMConfigureArgs config_args)

Definition at line 38 of file Quantize.cpp.

39{
40 OMRuntimeContext &runtime_context = config_args.runtime_context;
41 uint16_t op_index = config_args.kernel_index;
42
44
45 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
46 if (status != Ok)
47 return status;
48
49 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
50 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
51
52 assert(input != nullptr);
53 assert(output != nullptr);
54
55 OMRuntimeShape input_shape(input);
57
58 // Check shapes
59 status = utils::checkCondition(input_shape == output_shape);
60 if (status != Ok)
61 return status;
62
63 // Check input type is float
64 status = utils::checkCondition(input->type() == circle::TensorType_FLOAT32);
65 if (status != Ok)
66 return status;
67
68 // Check output quantization params
69 const auto *output_quantization = output->quantization();
70 status = utils::checkCondition(output->type() != circle::TensorType_FLOAT32 or
71 output_quantization != nullptr and
72 output_quantization->scale() != nullptr and
73 output_quantization->scale()->size() == 1);
74 if (status != Ok)
75 return status;
76
77 return status;
78}

References onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleReduceProd()

OMStatus onert_micro::import::configure_kernel_CircleReduceProd ( const OMConfigureArgs config_args)

Definition at line 36 of file ReduceProd.cpp.

37{
38 OMRuntimeContext &runtime_context = config_args.runtime_context;
39 uint16_t op_index = config_args.kernel_index;
40
42
43 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
44 if (status != Ok)
45 return status;
46
47 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
48 const circle::Tensor *axis = runtime_kernel.inputs[axisTensorIdx];
49 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
50
51 assert(input != nullptr);
52 assert(axis != nullptr);
53 assert(output != nullptr);
54
55 status = utils::checkCondition(axis->type() == circle::TensorType_INT32);
56 status = utils::checkCondition(input->type() == output->type());
57
58 return status;
59}

References onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleRelu()

OMStatus onert_micro::import::configure_kernel_CircleRelu ( const OMConfigureArgs config_args)

Definition at line 27 of file Relu.cpp.

28{
30}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleRelu6()

OMStatus onert_micro::import::configure_kernel_CircleRelu6 ( const OMConfigureArgs config_args)

Definition at line 27 of file Relu6.cpp.

28{
29
31}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleReshape()

OMStatus onert_micro::import::configure_kernel_CircleReshape ( const OMConfigureArgs config_args)

Definition at line 40 of file Reshape.cpp.

41{
42 OMRuntimeContext &runtime_context = config_args.runtime_context;
43 uint16_t op_index = config_args.kernel_index;
44 OMRuntimeStorage &runtime_storage = config_args.runtime_storage;
45
47
48 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
49 if (status != Ok)
50 return status;
51
52 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
53 const circle::Tensor *shape = runtime_kernel.inputs[shapeTensorIdx];
54 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
55
56 assert(input != nullptr);
57 assert(shape != nullptr);
58 assert(output != nullptr);
59
60 status = utils::checkCondition(input->type() == output->type());
61 if (status != Ok)
62 return status;
63
64 OMRuntimeShape input_shape(input);
66
67#ifndef DIS_DYN_SHAPES
68 auto is_dynamic =
69 runtime_context.isConstTensor(runtime_kernel.inputs_index[shapeTensorIdx]) == false;
70
71 if (is_dynamic)
72 {
73 auto input_shape_size = input_shape.flatSize();
74
75 status = utils::checkCondition(output_shape.flatSize() == 1);
76 if (status != Ok)
77 return status;
78
79 status = utils::checkCondition(input_shape_size != 1);
80 if (status != Ok)
81 return status;
82
83 runtime_storage.setDynamicRuntimeShape(runtime_kernel.outputs_index[outputTensorIdx],
84 input_shape);
85 }
86 else
87 {
88 status = utils::checkCondition(input_shape.flatSize() == output_shape.flatSize());
89 assert(status == Ok);
90 if (status != Ok)
91 return status;
92 }
93#else
94 status = utils::checkCondition(
95 runtime_context.getCircleReader().isConstTensor(runtime_kernel.inputs_index[shapeTensorIdx]));
96 assert(status == Ok);
97 if (status != Ok)
98 return status;
99#endif // DIS_DYN_SHAPES
100
101 return status;
102}
bool isConstTensor(uint32_t tensor_index)
OMStatus setDynamicRuntimeShape(uint16_t tensor_index, const OMRuntimeShape &shape)

References luci_interpreter::RuntimeShape::flatSize(), onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_index, onert_micro::core::OMRuntimeContext::isConstTensor(), onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_index, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::import::OMConfigureArgs::runtime_context, onert_micro::import::OMConfigureArgs::runtime_storage, and onert_micro::core::OMRuntimeStorage::setDynamicRuntimeShape().

◆ configure_kernel_CircleRound()

OMStatus onert_micro::import::configure_kernel_CircleRound ( const OMConfigureArgs config_args)

Definition at line 27 of file Round.cpp.

28{
30}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleRsqrt()

OMStatus onert_micro::import::configure_kernel_CircleRsqrt ( const OMConfigureArgs config_args)

Definition at line 27 of file Rsqrt.cpp.

28{
30}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleSelectV2()

OMStatus onert_micro::import::configure_kernel_CircleSelectV2 ( const OMConfigureArgs config_args)

Definition at line 40 of file SelectV2.cpp.

41{
42 OMRuntimeContext &runtime_context = config_args.runtime_context;
43 uint16_t op_index = config_args.kernel_index;
44
46
47 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
48 if (status != Ok)
49 return status;
50
51 const circle::Tensor *input_cond = runtime_kernel.inputs[inputCond];
52 const circle::Tensor *input_x = runtime_kernel.inputs[inputX];
53 const circle::Tensor *input_y = runtime_kernel.inputs[inputY];
54 const circle::Tensor *output = runtime_kernel.outputs[outputIndex];
55
56 assert(input_cond != nullptr);
57 assert(input_x != nullptr);
58 assert(input_y != nullptr);
59 assert(output != nullptr);
60
61 if (input_cond->type() != circle::TensorType_BOOL)
62 return status;
63
64 if (input_x->type() != input_y->type())
65 return status;
66
67 return status;
68}

References onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleShape()

OMStatus onert_micro::import::configure_kernel_CircleShape ( const OMConfigureArgs config_args)

Definition at line 39 of file Shape.cpp.

40{
41 OMRuntimeContext &runtime_context = config_args.runtime_context;
42 uint16_t op_index = config_args.kernel_index;
43
45
46 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
47 if (status != Ok)
48 return status;
49
50 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
51
52 assert(output != nullptr);
53
54 status = utils::checkCondition(output->type() == circle::TensorType_INT32);
55
56 return status;
57}

References onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleSin()

OMStatus onert_micro::import::configure_kernel_CircleSin ( const OMConfigureArgs config_args)

Definition at line 27 of file Sin.cpp.

28{
30}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleSlice()

OMStatus onert_micro::import::configure_kernel_CircleSlice ( const OMConfigureArgs config_args)

Definition at line 46 of file Slice.cpp.

47{
48 OMRuntimeContext &runtime_context = config_args.runtime_context;
49 uint16_t op_index = config_args.kernel_index;
50
51 execute::OMRuntimeKernel runtime_kernel;
52 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
53 if (status != Ok)
54 return status;
55
56 const circle::Tensor *input1 = runtime_kernel.inputs[input1TensorIdx];
57 const circle::Tensor *input2 = runtime_kernel.inputs[input2TensorIdx];
58 const circle::Tensor *input3 = runtime_kernel.inputs[input3TensorIdx];
59
60 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
61
62 assert(input1 != nullptr);
63 assert(input2 != nullptr);
64 assert(input3 != nullptr);
65 assert(output != nullptr);
66
67 status = utils::checkCondition(input1->type() == output->type());
68 if (status != Ok)
69 return status;
70
71 status = utils::checkCondition(input2->type() == circle::TensorType_INT32 and
72 input3->type() == circle::TensorType_INT32);
73 if (status != Ok)
74 return status;
75
76 status = utils::checkCondition(OMRuntimeShape(input2).dimensionsCount() == 1 and
77 OMRuntimeShape(input3).dimensionsCount() == 1);
78 if (status != Ok)
79 return status;
80
81 status = utils::checkCondition(OMRuntimeShape(input1).dimensionsCount() <= MAX_DIM);
82 if (status != Ok)
83 return status;
84
85 return status;
86}

References onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleSoftmax()

OMStatus onert_micro::import::configure_kernel_CircleSoftmax ( const OMConfigureArgs config_args)

Definition at line 42 of file Softmax.cpp.

43{
44 const circle::Tensor *input;
45 const circle::Tensor *output;
46
47 SISOHeader(config_args, &input, &output);
48
49 OMStatus status;
50 status = utils::checkCondition(input->type() == output->type());
51 if (status != Ok)
52 return status;
53
54 OMRuntimeShape input_shape(input);
56
57 status = utils::checkCondition(input_shape.dimensionsCount() == output_shape.dimensionsCount());
58 if (status != Ok)
59 return status;
60
61 status = utils::checkCondition(input_shape.dimensionsCount() >= 1);
62 if (status != Ok)
63 return status;
64
65 if (input->type() != circle::TensorType_INT8 and input->type() != circle::TensorType_INT16 and
66 input->type() != circle::TensorType_UINT8)
67 return status;
68
69 // Check quantized version
70 if (input->quantization() == nullptr or output->quantization() == nullptr)
71 return NoQuantization;
72
73 if (output->quantization()->scale() == nullptr or output->quantization()->scale()->size() != 1)
74 return NoQuantization;
75
76 if (input->quantization()->scale() == nullptr or input->quantization()->scale()->size() != 1)
77 return NoQuantization;
78
79 if (output->quantization()->zero_point() == nullptr or
80 output->quantization()->zero_point()->size() != 1)
81 return NoQuantization;
82
83 if (input->quantization()->zero_point() == nullptr or
84 input->quantization()->zero_point()->size() != 1)
85 return NoQuantization;
86
87 return status;
88}

References luci_interpreter::RuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::NoQuantization, onert_micro::Ok, output_shape, and SISOHeader().

◆ configure_kernel_CircleSpaceToBatchND()

OMStatus onert_micro::import::configure_kernel_CircleSpaceToBatchND ( const onert_micro::import::OMConfigureArgs config_args)

Definition at line 28 of file SpaceToBatchND.cpp.

29{
30 return helpers::configure_spaces_batches_nd_kernel_common(config_args);
31}

References onert_micro::import::helpers::configure_spaces_batches_nd_kernel_common().

◆ configure_kernel_CircleSpaceToDepth()

OMStatus onert_micro::import::configure_kernel_CircleSpaceToDepth ( const onert_micro::import::OMConfigureArgs config_args)

Definition at line 39 of file SpaceToDepth.cpp.

40{
41 OMRuntimeContext &runtime_context = config_args.runtime_context;
42 uint16_t op_index = config_args.kernel_index;
43
45
46 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
47 if (status != Ok)
48 return status;
49
50 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
51 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
52
53 assert(input != nullptr);
54 assert(output != nullptr);
55
56 status = utils::checkCondition(input->type() == output->type());
57 if (status != Ok)
58 return status;
59
60 OMRuntimeShape input_shape(input);
62
63 const auto *options = runtime_kernel.first_operator->builtin_options_as_SpaceToDepthOptions();
64 const int32_t block_size = options->block_size();
65
66 status = utils::checkCondition(block_size > 0);
67 if (status != Ok)
68 return status;
69
70 constexpr int kHeightRank = 1;
71 constexpr int kWidthRank = 2;
72
73 const int input_height = input_shape.dims(kHeightRank);
74 const int input_width = input_shape.dims(kWidthRank);
75 int output_height = output_shape.dims(kHeightRank);
76 int output_width = output_shape.dims(kWidthRank);
77
78 status = utils::checkCondition(input_height == output_height * block_size);
79 if (status != Ok)
80 return status;
81
82 status = utils::checkCondition(input_width == output_width * block_size);
83 if (status != Ok)
84 return status;
85 return status;
86}

References luci_interpreter::RuntimeShape::dims(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleSplit()

OMStatus onert_micro::import::configure_kernel_CircleSplit ( const OMConfigureArgs config_args)

Definition at line 40 of file Split.cpp.

41{
42 OMRuntimeContext &runtime_context = config_args.runtime_context;
43 OMRuntimeStorage &runtime_storage = config_args.runtime_storage;
44 uint16_t op_index = config_args.kernel_index;
45
47
48 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
49 if (status != Ok)
50 return status;
51
52 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
53 const circle::Tensor *axis = runtime_kernel.inputs[axisTensorIdx];
54 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
55
56 assert(input != nullptr);
57 assert(axis != nullptr);
58 assert(output != nullptr);
59
60 status = utils::checkCondition(output->type() == input->type());
61 if (status != Ok)
62 return status;
63
64 status = utils::checkCondition(axis->type() == circle::TensorType_INT32);
65 if (status != Ok)
66 return status;
67
68 // Check it is scalar
69 status = utils::checkCondition(OMRuntimeShape(axis).flatSize() == 1);
70 if (status != Ok)
71 return status;
72
73 // Check axis value
74 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
75 auto *axis_data = reinterpret_cast<int32_t *>(runtime_kernel.inputs_data[axisTensorIdx]);
76 status = utils::checkCondition(axis_data != nullptr);
77 if (status != Ok)
78 return status;
79
80 int32_t axis_value = axis_data[0];
81
82 OMRuntimeShape input_shape(input);
83 if (axis_value < 0)
84 {
85 axis_value += input_shape.dimensionsCount() + 1;
86 }
87
88 status = utils::checkCondition(axis_value <= input_shape.dimensionsCount() and axis_value >= 0);
89 if (status != Ok)
90 return status;
91
92 return status;
93}

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::import::OMConfigureArgs::runtime_context, and onert_micro::import::OMConfigureArgs::runtime_storage.

◆ configure_kernel_CircleSplitV()

OMStatus onert_micro::import::configure_kernel_CircleSplitV ( const OMConfigureArgs config_args)

Definition at line 41 of file SplitV.cpp.

42{
43 OMRuntimeContext &runtime_context = config_args.runtime_context;
44 OMRuntimeStorage &runtime_storage = config_args.runtime_storage;
45 uint16_t op_index = config_args.kernel_index;
46
48
49 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
50 if (status != Ok)
51 return status;
52
53 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
54 const circle::Tensor *size = runtime_kernel.inputs[sizeTensorIdx];
55 const circle::Tensor *axis = runtime_kernel.inputs[axisTensorIdx];
56 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
57
58 assert(input != nullptr);
59 assert(axis != nullptr);
60 assert(size != nullptr);
61 assert(output != nullptr);
62
63 status = utils::checkCondition(output->type() == input->type());
64 if (status != Ok)
65 return status;
66
67 // Check all outputs have the same type
68 for (uint32_t i = 1; i < runtime_kernel.outputs_num; ++i)
69 {
70 status = utils::checkCondition(output->type() == runtime_kernel.outputs[i]->type());
71 if (status != Ok)
72 return status;
73 }
74
75 status = utils::checkCondition(axis->type() == circle::TensorType_INT32);
76 if (status != Ok)
77 return status;
78
79 status = utils::checkCondition(size->type() == circle::TensorType_INT32);
80 if (status != Ok)
81 return status;
82
83 // Check size tensor contains exactly output_nums_tensors values
84 status = utils::checkCondition(OMRuntimeShape(size).flatSize() == runtime_kernel.outputs_num);
85
86 // Check it is scalar
87 status = utils::checkCondition(OMRuntimeShape(axis).flatSize() == 1);
88 if (status != Ok)
89 return status;
90
91 // Check axis value
92 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
93 auto *axis_data = reinterpret_cast<int32_t *>(runtime_kernel.inputs_data[axisTensorIdx]);
94 status = utils::checkCondition(axis_data != nullptr);
95 if (status != Ok)
96 return status;
97
98 int32_t axis_value = axis_data[0];
99
100 OMRuntimeShape input_shape(input);
101 if (axis_value < 0)
102 {
103 axis_value += input_shape.dimensionsCount() + 1;
104 }
105
106 status = utils::checkCondition(axis_value <= input_shape.dimensionsCount() and axis_value >= 0);
107 if (status != Ok)
108 return status;
109
110 return status;
111}
int32_t size[5]
Definition Slice.cpp:35

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_num, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::import::OMConfigureArgs::runtime_context, onert_micro::import::OMConfigureArgs::runtime_storage, and size.

◆ configure_kernel_CircleSqrt()

OMStatus onert_micro::import::configure_kernel_CircleSqrt ( const OMConfigureArgs config_args)

Definition at line 26 of file Sqrt.cpp.

27{
29}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleSquare()

OMStatus onert_micro::import::configure_kernel_CircleSquare ( const OMConfigureArgs config_args)

◆ configure_kernel_CircleSquaredDifference()

OMStatus onert_micro::import::configure_kernel_CircleSquaredDifference ( const OMConfigureArgs config_args)

Definition at line 27 of file SquaredDifference.cpp.

28{
30}

References onert_micro::import::helpers::configure_TISO_kernel().

◆ configure_kernel_CircleStridedSlice()

OMStatus onert_micro::import::configure_kernel_CircleStridedSlice ( const OMConfigureArgs config_args)

Definition at line 46 of file StridedSlice.cpp.

47{
48 OMRuntimeContext &runtime_context = config_args.runtime_context;
49 uint16_t op_index = config_args.kernel_index;
50
51 execute::OMRuntimeKernel runtime_kernel;
52 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
53 if (status != Ok)
54 return status;
55
56 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
57 const circle::Tensor *begin = runtime_kernel.inputs[beginTensorIdx];
58 const circle::Tensor *end = runtime_kernel.inputs[endTensorIdx];
59 const circle::Tensor *strides = runtime_kernel.inputs[stridesTensorIdx];
60
61 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
62
63 assert(input != nullptr);
64 assert(begin != nullptr);
65 assert(end != nullptr);
66 assert(strides != nullptr);
67 assert(output != nullptr);
68
69 status = utils::checkCondition(input->type() == output->type());
70 if (status != Ok)
71 return status;
72
73 status = utils::checkCondition(begin->type() == circle::TensorType_INT32 and
74 end->type() == circle::TensorType_INT32 and
75 strides->type() == circle::TensorType_INT32);
76 if (status != Ok)
77 return status;
78
79 return status;
80}
int32_t begin[5]
Definition Slice.cpp:33

References begin, onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleSub()

OMStatus onert_micro::import::configure_kernel_CircleSub ( const OMConfigureArgs config_args)

Definition at line 27 of file Sub.cpp.

28{
30}

References onert_micro::import::helpers::configure_TISO_kernel().

◆ configure_kernel_CircleSum()

OMStatus onert_micro::import::configure_kernel_CircleSum ( const OMConfigureArgs config_args)

Definition at line 37 of file Sum.cpp.

38{
39 OMRuntimeContext &runtime_context = config_args.runtime_context;
40 uint16_t op_index = config_args.kernel_index;
41
43
44 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
45 if (status != Ok)
46 return status;
47
48 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
49 const circle::Tensor *axis = runtime_kernel.inputs[axisTensorIdx];
50 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
51
52 assert(input != nullptr);
53 assert(axis != nullptr);
54 assert(output != nullptr);
55
56 status = utils::checkCondition(axis->type() == circle::TensorType_INT32);
57 status = utils::checkCondition(input->type() == output->type());
58
59 return status;
60}

References onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleSVDF()

OMStatus onert_micro::import::configure_kernel_CircleSVDF ( const OMConfigureArgs config_args)

Definition at line 48 of file SVDF.cpp.

49{
50 // Validate Tensor Inputs (dtype depends on quantization):
51 // [0] = Input, {2, batch_size, input_size}
52 // [1] = Weights Feature, {2, num_filters, input_size}
53 // [2] = Weights Time, {2, num_filters, memory_size}
54 // [3] = Bias (optional), {1, num_units}
55 // [4] = Activation State (variable), {2, batch_size, memory_size * num_filters}
56
57 OMRuntimeContext &runtime_context = config_args.runtime_context;
58 uint16_t op_index = config_args.kernel_index;
59
60 execute::OMRuntimeKernel runtime_kernel;
61 runtime_kernel.readKernel(op_index, runtime_context);
62
63 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
64 const circle::Tensor *weights_feature = runtime_kernel.inputs[weightsFeatureTensorIdx];
65 const circle::Tensor *weights_time = runtime_kernel.inputs[weightsTimeTensorIdx];
66 const circle::Tensor *bias = runtime_kernel.inputs[biasTensorIdx];
67 const circle::Tensor *activation_state = runtime_kernel.inputs[inputActivationStateTensorIdx];
68
69 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
70
71 assert(input != nullptr);
72 assert(weights_feature != nullptr);
73 assert(weights_time != nullptr);
74 // bias can be nullptr
75 assert(activation_state != nullptr);
76 assert(output != nullptr);
77
78 OMStatus status = Ok;
79
80 const auto *options = runtime_kernel.first_operator->builtin_options_as_SVDFOptions();
81 status = utils::checkCondition(options != nullptr);
82 if (status != Ok)
83 return status;
84
85 OMRuntimeShape input_shape(input);
86 OMRuntimeShape weights_feature_shape(weights_feature);
87 OMRuntimeShape weights_time_shape(weights_time);
88 OMRuntimeShape activation_state_shape(activation_state);
90
91 // Define input constants based on input tensor definition above:
92 const int rank = options->rank();
93 const int input_size = input_shape.dims(1);
94 const int batch_size = input_shape.dims(0);
95 const int num_filters = weights_feature_shape.dims(0);
96 status = utils::checkCondition(num_filters % rank == 0);
97 if (status != Ok)
98 return status;
99
100 const int num_units = num_filters / rank;
101 const int memory_size = weights_time_shape.dims(1);
102
103 status = utils::checkCondition(input_shape.dimensionsCount() == 2);
104 if (status != Ok)
105 return status;
106 // Validate Tensor Output:
107 // [0] = float/int8_t, {2, batch_size, num_units}
108 status =
109 utils::checkCondition(output_shape.dimensionsCount() == 2 and
110 output_shape.dims(0) == batch_size and output_shape.dims(1) == num_units);
111 if (status != Ok)
112 return status;
113
114 // Validate Weights Feature Input Tensor
115 status = utils::checkCondition(weights_feature_shape.dimensionsCount() == 2 and
116 weights_feature_shape.dims(1) == input_size);
117 if (status != Ok)
118 return status;
119
120 // Validate Weights Time Input Tensor:
121 status = utils::checkCondition(weights_time_shape.dimensionsCount() == 2 and
122 weights_time_shape.dims(0) == num_filters and
123 weights_time_shape.dims(1) == memory_size);
124 if (status != Ok)
125 return status;
126
127 // Validate Optional Bias Input Tensor:
128 if (bias != nullptr)
129 {
130 status = utils::checkCondition(OMRuntimeShape(bias).dims(0) == num_units);
131 if (status != Ok)
132 return status;
133 }
134
135 // Validate Activation State Input Tensor:
136 status = utils::checkCondition(activation_state_shape.dimensionsCount() == 2 and
137 activation_state_shape.dims(0) == batch_size and
138 activation_state_shape.dims(1) == memory_size * num_filters);
139 if (status != Ok)
140 return status;
141
142 if (input->type() == circle::TensorType_FLOAT32)
143 {
144 status = utils::checkCondition(weights_feature->type() == circle::TensorType_FLOAT32 and
145 weights_time->type() == circle::TensorType_FLOAT32 and
146 activation_state->type() == circle::TensorType_FLOAT32 and
147 output->type() == circle::TensorType_FLOAT32);
148 if (status != Ok)
149 return status;
150 if (bias)
151 {
152 status = utils::checkCondition(bias->type() == circle::TensorType_FLOAT32);
153 if (status != Ok)
154 return status;
155 }
156 }
157
158 return status;
159}

References luci_interpreter::RuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dimensionsCount(), luci_interpreter::RuntimeShape::dims(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleTanh()

OMStatus onert_micro::import::configure_kernel_CircleTanh ( const OMConfigureArgs config_args)

Definition at line 27 of file Tanh.cpp.

28{
30}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ configure_kernel_CircleTranspose()

OMStatus onert_micro::import::configure_kernel_CircleTranspose ( const OMConfigureArgs config_args)

Definition at line 43 of file Transpose.cpp.

44{
45 OMRuntimeContext &runtime_context = config_args.runtime_context;
46 uint16_t op_index = config_args.kernel_index;
47
48 execute::OMRuntimeKernel runtime_kernel;
49 runtime_kernel.readKernel(op_index, runtime_context);
50
51 const circle::Tensor *input = runtime_kernel.inputs[kInputTensorIdx];
52 const circle::Tensor *perm = runtime_kernel.inputs[kPermTensorIdx];
53 const circle::Tensor *output = runtime_kernel.outputs[kOutputTensorIdx];
54
55 assert(input != nullptr);
56 assert(perm != nullptr);
57 assert(output != nullptr);
58
59 OMStatus status = Ok;
60
61 status = utils::checkCondition(perm->type() == circle::TensorType_INT32);
62 if (status != Ok)
63 return status;
64
65 core::OMRuntimeShape input_shape(input);
66 core::OMRuntimeShape perm_shape(perm);
67
68 status = utils::checkCondition(perm_shape.dimensionsCount() == 1);
69 if (status != Ok)
70 return status;
71
72 status = utils::checkCondition(perm_shape.dims(0) == input_shape.dimensionsCount());
73 if (status != Ok)
74 return status;
75
76 return status;
77}

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleTransposeConv()

OMStatus onert_micro::import::configure_kernel_CircleTransposeConv ( const OMConfigureArgs config_args)

Definition at line 50 of file TransposeConv.cpp.

51{
52 OMRuntimeContext &runtime_context = config_args.runtime_context;
53 uint16_t op_index = config_args.kernel_index;
54
55 execute::OMRuntimeKernel runtime_kernel;
56 runtime_kernel.readKernel(op_index, runtime_context);
57
58 const circle::Tensor *input = runtime_kernel.inputs[kInputTensorIdx];
59 const circle::Tensor *weight = runtime_kernel.inputs[kWeightTensorIdx];
60 const circle::Tensor *output = runtime_kernel.outputs[kOutputTensorIdx];
61
62 assert(input != nullptr);
63 assert(weight != nullptr);
64 // Bias can be nullptr
65 assert(output != nullptr);
66
67 OMStatus status = Ok;
68
69 status = utils::checkCondition(input->type() == output->type());
70 if (status != Ok)
71 return status;
72
73 status = utils::checkCondition(input->type() == weight->type());
74 if (status != Ok)
75 return status;
76
77 core::OMRuntimeShape input_shape(input);
78 core::OMRuntimeShape weight_shape(weight);
79
80 status = utils::checkCondition(input_shape.dimensionsCount() == 4);
81 if (status != Ok)
82 return status;
83
84 status = utils::checkCondition(input_shape.dimensionsCount() == weight_shape.dimensionsCount());
85 if (status != Ok)
86 return status;
87
88 return status;
89}

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), and onert_micro::import::OMConfigureArgs::runtime_context.

◆ configure_kernel_CircleUnpack()

OMStatus onert_micro::import::configure_kernel_CircleUnpack ( const OMConfigureArgs config_args)

Definition at line 39 of file Unpack.cpp.

40{
41 OMRuntimeContext &runtime_context = config_args.runtime_context;
42 OMRuntimeStorage &runtime_storage = config_args.runtime_storage;
43 uint16_t op_index = config_args.kernel_index;
44
46
47 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
48 if (status != Ok)
49 return status;
50
51 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
52 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
53
54 assert(input != nullptr);
55 assert(output != nullptr);
56
57 status = utils::checkCondition(output->type() == input->type());
58 if (status != Ok)
59 return status;
60
61 auto options = runtime_kernel.first_operator->builtin_options_as_UnpackOptions();
62 status = utils::checkCondition(options != nullptr);
63 if (status != Ok)
64 return status;
65
66 status = utils::checkCondition(runtime_kernel.outputs_num == options->num());
67 if (status != Ok)
68 return status;
69
70 // Check all outputs have the same type and shapes
72 for (uint32_t i = 1; i < options->num(); ++i)
73 {
74 const circle::Tensor *cur_output = runtime_kernel.outputs[i];
75 status = utils::checkCondition(output->type() == cur_output->type());
76 if (status != Ok)
77 return status;
78
79 OMRuntimeShape cur_output_shape(cur_output);
80 status = utils::checkCondition(output_shape == cur_output_shape);
81 if (status != Ok)
82 return status;
83 }
84
85 // Check shapes input and output
86 OMRuntimeShape input_shape(input);
87 for (int i = 0; i < input_shape.dimensionsCount(); ++i)
88 {
89 if (i == options->axis())
90 continue;
91
92 if (i < options->axis())
93 {
94 status = utils::checkCondition(input_shape.dims(i) == output_shape.dims(i));
95 }
96 else
97 {
98 status = utils::checkCondition(input_shape.dims(i) == output_shape.dims(i - 1));
99 }
100 if (status != Ok)
101 return status;
102 }
103
104 return status;
105}

References onert_micro::core::OMRuntimeShape::dimensionsCount(), luci_interpreter::RuntimeShape::dims(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_num, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::import::OMConfigureArgs::runtime_context, and onert_micro::import::OMConfigureArgs::runtime_storage.

◆ configure_kernel_CircleWhile()

OMStatus onert_micro::import::configure_kernel_CircleWhile ( const onert_micro::import::OMConfigureArgs config_args)

Definition at line 30 of file While.cpp.

31{
32 OMRuntimeModule &runtime_module = config_args.runtime_module;
33 OMRuntimeContext &runtime_context = config_args.runtime_context;
34 uint16_t op_index = config_args.kernel_index;
35
37
38 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
39 if (status != Ok)
40 return status;
41
42 auto options = runtime_kernel.first_operator->builtin_options_as_WhileOptions();
43 status = utils::checkCondition(options != nullptr);
44 if (status != Ok)
45 return status;
46
47 // Num of inputs equals to num of outputs
48 status = utils::checkCondition(runtime_kernel.inputs_num == runtime_kernel.outputs_num);
49 if (status != Ok)
50 return status;
51
52 // Obtain conditional and body runtime subgraphs
53 const auto body_subgraph_index = options->body_subgraph_index();
54 const auto cond_subgraph_index = options->cond_subgraph_index();
55 OMRuntimeGraph *cond_runtime_graph = nullptr;
56 OMRuntimeGraph *body_runtime_graph = nullptr;
57 status = runtime_module.getRuntimeGraphAt(cond_subgraph_index, &cond_runtime_graph);
58 if (status != Ok)
59 return status;
60 status = runtime_module.getRuntimeGraphAt(body_subgraph_index, &body_runtime_graph);
61 if (status != Ok)
62 return status;
63
64 OMRuntimeContext &cond_runtime_context = cond_runtime_graph->getRuntimeContext();
65 OMRuntimeContext &body_runtime_context = body_runtime_graph->getRuntimeContext();
66
67 // Check cond runtime graph
68 status =
69 utils::checkCondition(cond_runtime_graph->getNumberOfInputs() == runtime_kernel.inputs_num and
70 cond_runtime_graph->getNumberOfOutputs() == 1);
71 if (status != Ok)
72 return status;
73
74 const auto cond_output_index = cond_runtime_context.getGraphOutputTensorIndex(0);
75 const auto cond_output_tensor =
76 cond_runtime_context.getTensorByIndex(static_cast<int32_t>(cond_output_index));
77 status = utils::checkCondition(cond_output_tensor->type() == circle::TensorType_BOOL);
78
79 // Check body runtime graph
80 status =
81 utils::checkCondition(body_runtime_graph->getNumberOfInputs() == runtime_kernel.inputs_num and
82 body_runtime_graph->getNumberOfOutputs() == runtime_kernel.outputs_num);
83 return status;
84}
uint32_t getGraphOutputTensorIndex(uint32_t index)
const circle::Tensor * getTensorByIndex(int32_t tensor_index)
OMRuntimeContext & getRuntimeContext()
OMStatus getRuntimeGraphAt(uint32_t pos, OMRuntimeGraph **runtime_graph)
core::OMRuntimeModule & runtime_module

References onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::core::OMRuntimeContext::getGraphOutputTensorIndex(), onert_micro::core::OMRuntimeGraph::getNumberOfInputs(), onert_micro::core::OMRuntimeGraph::getNumberOfOutputs(), onert_micro::core::OMRuntimeGraph::getRuntimeContext(), onert_micro::core::OMRuntimeModule::getRuntimeGraphAt(), onert_micro::core::OMRuntimeContext::getTensorByIndex(), onert_micro::execute::OMRuntimeKernel::inputs_num, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs_num, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::import::OMConfigureArgs::runtime_context, and onert_micro::import::OMConfigureArgs::runtime_module.

◆ configure_kernel_CircleZerosLike()

OMStatus onert_micro::import::configure_kernel_CircleZerosLike ( const OMConfigureArgs config_args)

Definition at line 40 of file ZerosLike.cpp.

41{
43}

References onert_micro::import::helpers::configure_SISO_kernel().

◆ SISOHeader()

OMStatus onert_micro::import::SISOHeader ( const OMConfigureArgs execute_args,
const circle::Tensor **  input,
const circle::Tensor **  output 
)

Definition at line 23 of file OMUtils.cpp.

26{
27 OMStatus status;
28
29 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
30 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
31 uint16_t op_index = execute_args.kernel_index;
32
33 OMRuntimeKernel runtime_kernel;
34 status = runtime_kernel.readKernel(op_index, runtime_context);
35
36 *input = runtime_kernel.inputs[0];
37 *output = runtime_kernel.outputs[0];
38
39 assert(*input != nullptr);
40 assert(*output != nullptr);
41
42 return status;
43}

References onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::import::OMConfigureArgs::runtime_context, and onert_micro::import::OMConfigureArgs::runtime_storage.

Referenced by configure_kernel_CircleSoftmax().

◆ TISOHeader()

OMStatus onert_micro::import::TISOHeader ( const OMConfigureArgs execute_args,
const circle::Tensor **  input1,
const circle::Tensor **  input2,
const circle::Tensor **  output 
)

Definition at line 45 of file OMUtils.cpp.

49{
50 OMStatus status;
51
52 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
53 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
54 uint16_t op_index = execute_args.kernel_index;
55
56 OMRuntimeKernel runtime_kernel;
57 status = runtime_kernel.readKernel(op_index, runtime_context);
58
59 *input2 = runtime_kernel.inputs[0];
60 *input1 = runtime_kernel.inputs[1];
61 *output = runtime_kernel.outputs[0];
62
63 assert(*input1 != nullptr);
64 assert(*input2 != nullptr);
65 assert(*output != nullptr);
66
67 return status;
68}

References onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::import::OMConfigureArgs::kernel_index, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::import::OMConfigureArgs::runtime_context, and onert_micro::import::OMConfigureArgs::runtime_storage.

Referenced by configure_kernel_CircleEqual(), configure_kernel_CircleGreater(), configure_kernel_CircleGreaterEqual(), configure_kernel_CircleLess(), configure_kernel_CircleLessEqual(), and configure_kernel_CircleNotEqual().

Variable Documentation

◆ kernel_builtin_configure

constexpr KernelBuiltinConfigureRegistry onert_micro::import::kernel_builtin_configure
constexpr

◆ kernel_custom_configure

constexpr KernelCustomConfigureRegistry onert_micro::import::kernel_custom_configure
constexpr