// Patched by Edge Impulse to include reference and hardware-accelerated kernels
#include "../../../../classifier/ei_classifier_config.h"
#if EI_CLASSIFIER_TFLITE_ENABLE_ARC == 1
/* Copyright 2021 The TensorFlow Authors. All Rights Reserved.

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.
==============================================================================*/

#ifndef TENSORFLOW_LITE_MICRO_ARC_SCRATCH_BUFFERS_H_
#define TENSORFLOW_LITE_MICRO_ARC_SCRATCH_BUFFERS_H_

#include "mli_api.h"  // NOLINT
#include "edge-impulse-sdk/tensorflow/lite/c/common.h"

namespace tflite {
namespace ops {
namespace micro {

void init_arc_scratch_buffers(void);
void* get_arc_scratch_buffer(int size);  // Function to assign fast memory
                                         // from one of 3 scratch buffers.

void get_arc_scratch_buffer_max_size(int* size);
void get_arc_scratch_buffer_two_max_sizes(int* size1, int* size2);

static inline bool inside_arc_dccm(void* p) {
#if core_config_dccm_present
  return ((unsigned)p >= core_config_dccm_base) &&
         ((unsigned)p < core_config_dccm_base + core_config_dccm_size);
#else
  return false;
#endif
}

static inline bool inside_arc_xccm(void* p) {
#if core_config_xy
  return ((unsigned)p >= core_config_xy_x_base) &&
         ((unsigned)p < core_config_xy_x_base + core_config_xy_size);
#else
  return false;
#endif
}

static inline bool inside_arc_yccm(void* p) {
#if core_config_xy_size
  return ((unsigned)p >= core_config_xy_y_base) &&
         ((unsigned)p < core_config_xy_y_base + core_config_xy_size);
#else
  return false;
#endif
}

static inline bool inside_arc_vccm(void* p) {
#if core_config_vec_mem_size
  return ((unsigned)p >= core_config_vec_mem_base) &&
         ((unsigned)p < core_config_vec_mem_base + core_config_vec_mem_size);
#else
  return false;
#endif
}

static inline bool inside_arc_ccm(void* p) {
  return inside_arc_dccm(p) || inside_arc_xccm(p) || inside_arc_yccm(p) ||
         inside_arc_vccm(p);
}

}  // namespace micro
}  // namespace ops
}  // namespace tflite

#endif  // TENSORFLOW_LITE_MICRO_ARC_SCRATCH_BUFFERS_H_

#endif // EI_CLASSIFIER_TFLITE_ENABLE_ARC == 1
