tensorflow/tflite-micro: refactoring TFLM Kelvin kernel

This is the first version for refactoring TFLM Kelvin kernel.

Change-Id: Id61d215e4e6df8e3a09f4663cc5a7f23885f071f
diff --git a/tensorflow/lite/micro/kernels/kelvin/add.cc b/tensorflow/lite/micro/kernels/kelvin/add.cc
index b64c71f..9a647a0 100644
--- a/tensorflow/lite/micro/kernels/kelvin/add.cc
+++ b/tensorflow/lite/micro/kernels/kelvin/add.cc
@@ -1,6 +1,18 @@
-// Copyright 2023 Google LLC
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
+/*
+ * Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
 #include "tensorflow/lite/kernels/internal/reference/add.h"
 
@@ -68,7 +80,7 @@
           tflite::micro::GetTensorShape(output),
           tflite::micro::GetTensorData<int32_t>(output));
     } else {
-      kelvin::opt::elementwise_add_s32(
+      kelvin::opt::ElementwiseAddS32(
           tflite::micro::GetTensorData<int32_t>(input1),
           tflite::micro::GetTensorData<int32_t>(input2),
           tflite::micro::GetTensorData<int32_t>(output),
@@ -107,7 +119,7 @@
           tflite::micro::GetTensorShape(output),
           tflite::micro::GetTensorData<int16_t>(output));
     } else {
-      kelvin::opt::elementwise_add_s16(
+      kelvin::opt::ElementwiseAddS16(
           tflite::micro::GetTensorData<int16_t>(input1),
           tflite::micro::GetTensorData<int16_t>(input2),
           op_params.input1_offset, op_params.input1_multiplier,
@@ -150,7 +162,7 @@
           tflite::micro::GetTensorShape(output),
           tflite::micro::GetTensorData<int8_t>(output));
     } else {
-      kelvin::opt::elementwise_add_s8(
+      kelvin::opt::ElementwiseAddS8(
           tflite::micro::GetTensorData<int8_t>(input1),
           tflite::micro::GetTensorData<int8_t>(input2), op_params.input1_offset,
           op_params.input1_multiplier, op_params.input1_shift,
diff --git a/tensorflow/lite/micro/kernels/kelvin/conv.cc b/tensorflow/lite/micro/kernels/kelvin/conv.cc
index 2e15dd7..d8fb8a1 100644
--- a/tensorflow/lite/micro/kernels/kelvin/conv.cc
+++ b/tensorflow/lite/micro/kernels/kelvin/conv.cc
@@ -1,6 +1,18 @@
-// Copyright 2023 Google LLC
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
+/*
+ * Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
 #include "tensorflow/lite/kernels/internal/reference/conv.h"
 
@@ -69,41 +81,39 @@
     }
     case kTfLiteInt16: {
       const auto params_q = ConvParamsQuantized(params, data);
-      bool opt =
-             !(params_q.padding_values.width > 0 ||
-              params_q.padding_values.height > 0 ||
-              params_q.dilation_width_factor > 1 ||
-              params_q.dilation_height_factor > 1);
+      bool opt = !(params_q.padding_values.width > 0 ||
+                   params_q.padding_values.height > 0 ||
+                   params_q.dilation_width_factor > 1 ||
+                   params_q.dilation_height_factor > 1);
       switch (bias->type) {
         case kTfLiteInt32: {
-          const auto fn = opt ? kelvin::opt::conv_per_channel_b32 : reference_integer_ops::ConvPerChannel<int32_t>;
-          fn(
-              params_q,
-              data.per_channel_output_multiplier, data.per_channel_output_shift,
-              tflite::micro::GetTensorShape(input),
-              tflite::micro::GetTensorData<int16_t>(input),
-              tflite::micro::GetTensorShape(filter),
-              tflite::micro::GetTensorData<int8_t>(filter),
-              tflite::micro::GetTensorShape(bias),
-              tflite::micro::GetOptionalTensorData<std::int32_t>(bias),
-              tflite::micro::GetTensorShape(output),
-              tflite::micro::GetTensorData<int16_t>(output));
+          const auto fn = opt ? kelvin::opt::ConvS16B32
+                              : reference_integer_ops::ConvPerChannel<int32_t>;
+          fn(params_q, data.per_channel_output_multiplier,
+             data.per_channel_output_shift,
+             tflite::micro::GetTensorShape(input),
+             tflite::micro::GetTensorData<int16_t>(input),
+             tflite::micro::GetTensorShape(filter),
+             tflite::micro::GetTensorData<int8_t>(filter),
+             tflite::micro::GetTensorShape(bias),
+             tflite::micro::GetOptionalTensorData<std::int32_t>(bias),
+             tflite::micro::GetTensorShape(output),
+             tflite::micro::GetTensorData<int16_t>(output));
           break;
         }
         case kTfLiteInt64: {
-          const auto fn = opt ? kelvin::opt::conv_per_channel_b64
+          const auto fn = opt ? kelvin::opt::ConvS16B64
                               : reference_integer_ops::ConvPerChannel<int64_t>;
-          fn(
-              params_q,
-              data.per_channel_output_multiplier, data.per_channel_output_shift,
-              tflite::micro::GetTensorShape(input),
-              tflite::micro::GetTensorData<int16_t>(input),
-              tflite::micro::GetTensorShape(filter),
-              tflite::micro::GetTensorData<int8_t>(filter),
-              tflite::micro::GetTensorShape(bias),
-              tflite::micro::GetOptionalTensorData<std::int64_t>(bias),
-              tflite::micro::GetTensorShape(output),
-              tflite::micro::GetTensorData<int16_t>(output));
+          fn(params_q, data.per_channel_output_multiplier,
+             data.per_channel_output_shift,
+             tflite::micro::GetTensorShape(input),
+             tflite::micro::GetTensorData<int16_t>(input),
+             tflite::micro::GetTensorShape(filter),
+             tflite::micro::GetTensorData<int8_t>(filter),
+             tflite::micro::GetTensorShape(bias),
+             tflite::micro::GetOptionalTensorData<std::int64_t>(bias),
+             tflite::micro::GetTensorShape(output),
+             tflite::micro::GetTensorData<int16_t>(output));
           break;
         }
         default:
@@ -136,7 +146,7 @@
         }
         case kTfLiteInt8: {
           const auto params_q = ConvParamsQuantized(params, data);
-          kelvin::opt::conv_per_channel_b8(
+          kelvin::opt::ConvS8(
               params_q, data.per_channel_output_multiplier,
               data.per_channel_output_shift,
               tflite::micro::GetTensorShape(input),
diff --git a/tensorflow/lite/micro/kernels/kelvin/depthwise_conv.cc b/tensorflow/lite/micro/kernels/kelvin/depthwise_conv.cc
index 6e4a28d..f8d9307 100644
--- a/tensorflow/lite/micro/kernels/kelvin/depthwise_conv.cc
+++ b/tensorflow/lite/micro/kernels/kelvin/depthwise_conv.cc
@@ -1,26 +1,27 @@
-/* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
+/*
+ * Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-==============================================================================*/
-
-#include "tensorflow/lite/micro/kernels/depthwise_conv.h"
+#include "tensorflow/lite/kernels/internal/reference/integer_ops/depthwise_conv.h"
 
 #include "tensorflow/lite/c/builtin_op_data.h"
 #include "tensorflow/lite/c/common.h"
 #include "tensorflow/lite/kernels/internal/portable_tensor_utils.h"
 #include "tensorflow/lite/kernels/internal/reference/depthwiseconv_float.h"
-#include "tensorflow/lite/kernels/internal/reference/integer_ops/depthwise_conv.h"
 #include "tensorflow/lite/kernels/kernel_util.h"
+#include "tensorflow/lite/micro/kernels/depthwise_conv.h"
 #include "tensorflow/lite/micro/kernels/kernel_util.h"
 #include "tensorflow/lite/micro/micro_log.h"
 #include "tflm/opt/opt.h"
@@ -90,7 +91,7 @@
         case kTfLiteInt8: {
           tflite::DepthwiseParams dw_params =
               DepthwiseConvParamsQuantized(params, data);
-          kelvin::opt::DepthwiseConv2DKelvin(
+          kelvin::opt::DepthwiseConvS8(
               dw_params, data.per_channel_output_multiplier,
               data.per_channel_output_shift,
               tflite::micro::GetTensorShape(input),
@@ -116,30 +117,7 @@
         case kTfLiteInt8: {
           tflite::DepthwiseParams dw_params =
               DepthwiseConvParamsQuantized(params, data);
-          tflite::RuntimeShape filter_shape =
-              tflite::micro::GetTensorShape(filter);
-          tflite::RuntimeShape input_shape =
-              tflite::micro::GetTensorShape(input);
-          if (dw_params.padding_type == PaddingType::kValid &&
-              dw_params.stride_width == 1 && dw_params.stride_height == 1 &&
-              filter_shape.Dims(1) == 1 && filter_shape.Dims(2) == 3 &&
-              dw_params.dilation_height_factor == 1) {
-            kelvin::opt::DepthwiseConv2DKelvinS16K3x1(
-                tflite::micro::GetTensorData<int16_t>(input),
-                tflite::micro::GetTensorData<int8_t>(filter),
-                tflite::micro::GetOptionalTensorData<int64_t>(bias),
-                filter_shape.Dims(3) /*channels*/,
-                input_shape.Dims(2) /*frames*/,
-                dw_params.dilation_width_factor /*dilation*/,
-                data.per_channel_output_multiplier,
-                data.per_channel_output_shift,
-                dw_params.quantized_activation_min,
-                dw_params.quantized_activation_max,
-                tflite::micro::GetTensorData<int16_t>(output));
-            break;
-          }
-
-          reference_integer_ops::DepthwiseConvPerChannel(
+          kelvin::opt::DepthwiseConvS16(
               dw_params, data.per_channel_output_multiplier,
               data.per_channel_output_shift,
               tflite::micro::GetTensorShape(input),
diff --git a/tensorflow/lite/micro/kernels/kelvin/leaky_relu.cc b/tensorflow/lite/micro/kernels/kelvin/leaky_relu.cc
index 25a8853..2ca8a31 100644
--- a/tensorflow/lite/micro/kernels/kelvin/leaky_relu.cc
+++ b/tensorflow/lite/micro/kernels/kelvin/leaky_relu.cc
@@ -1,6 +1,18 @@
-// Copyright 2023 Google LLC
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
+/*
+ * Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
 #include "tensorflow/lite/kernels/internal/reference/leaky_relu.h"
 
@@ -41,7 +53,7 @@
       return kTfLiteOk;
     } break;
     case kTfLiteInt8: {
-      kelvin::opt::leaky_relu_s8(
+      kelvin::opt::LeakyReluS8(
           tflite::micro::GetTensorData<int8_t>(input),
           tflite::micro::GetTensorData<int8_t>(output),
           MatchingFlatSize(tflite::micro::GetTensorShape(input),
@@ -52,7 +64,7 @@
       return kTfLiteOk;
     } break;
     case kTfLiteInt16: {
-      kelvin::opt::leaky_relu_s16(
+      kelvin::opt::LeakyReluS16(
           tflite::micro::GetTensorData<int16_t>(input),
           tflite::micro::GetTensorData<int16_t>(output),
           MatchingFlatSize(tflite::micro::GetTensorShape(input),
diff --git a/tensorflow/lite/micro/kernels/kelvin/pooling.cc b/tensorflow/lite/micro/kernels/kelvin/pooling.cc
index 47f1362..d343a55 100644
--- a/tensorflow/lite/micro/kernels/kelvin/pooling.cc
+++ b/tensorflow/lite/micro/kernels/kelvin/pooling.cc
@@ -1,17 +1,19 @@
-/* Copyright 2024 The TensorFlow Authors. All Rights Reserved.
+/*
+ * Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-==============================================================================*/
 #include "tensorflow/lite/kernels/internal/reference/pooling.h"
 
 #include "tensorflow/lite/c/builtin_op_data.h"
@@ -86,9 +88,9 @@
       op_params.padding_values.width = data->padding.width;
       op_params.quantized_activation_min = data->activation_min;
       op_params.quantized_activation_max = data->activation_max;
-      kelvin::opt::MaxPoolGeneric(op_params, tflite::micro::GetTensorShape(input),
-                    input->data.int8, tflite::micro::GetTensorShape(output),
-                    output->data.int8);
+      kelvin::opt::MaxPoolS8(
+          op_params, tflite::micro::GetTensorShape(input), input->data.int8,
+          tflite::micro::GetTensorShape(output), output->data.int8);
       break;
     case kTfLiteInt16:
       MaxPoolingEvalQuantized<int16_t>(context, node, params, data, input,
diff --git a/tensorflow/lite/micro/kernels/kelvin/reshape.cc b/tensorflow/lite/micro/kernels/kelvin/reshape.cc
index 9c88385..76e3e52 100644
--- a/tensorflow/lite/micro/kernels/kelvin/reshape.cc
+++ b/tensorflow/lite/micro/kernels/kelvin/reshape.cc
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 #include "tensorflow/lite/c/common.h"
 #include "tensorflow/lite/kernels/kernel_util.h"
 #include "tensorflow/lite/micro/kernels/kernel_util.h"
@@ -86,7 +102,7 @@
   // Do nothing for in-place reshape.
   if (input->data.raw != output->data.raw) {
     // Otherwise perform reshape with copy.
-    kelvin::opt::memcpy(output->data.raw, input->data.raw, input_bytes);
+    kelvin::opt::Memcpy(output->data.raw, input->data.raw, input_bytes);
   }
   return kTfLiteOk;
 }