// Copyright 2020 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#ifndef IREE_BINDINGS_TFLITE_TENSOR_H_
#define IREE_BINDINGS_TFLITE_TENSOR_H_

#include "iree/base/api.h"
#include "iree/hal/api.h"
#include "iree/vm/api.h"

// NOTE: we pull in our own copy here in case the tflite API changes upstream.
#define TFL_COMPILE_LIBRARY 1  // force dllexport
#include "bindings/tflite/include/tensorflow/lite/c/c_api.h"
#include "bindings/tflite/include/tensorflow/lite/c/c_api_experimental.h"

// This is the same value as TFLITE_RESHAPE_PARAMS_MAX_DIMENSION_COUNT.
// Since that's all tflite supports internally we are fairly safe to use that
// as our max for the I/O tensors; internal tensors inside of IREE generated
// modules may of course have arbitrary shape ranks.
#define IREE_BINDINGS_TFLITE_MAX_RANK 8

struct TfLiteTensor {
  // Static metadata about the tensor as it was embedded in the module.
  TfLiteType type;
  TfLiteQuantizationParams quantization_params;
  iree_string_view_t name;

  // Queried shape information from the module; in the case of outputs this is
  // the expected output shape based on the current input shapes and will be
  // available even if we haven't yet run and allocated the buffer view.
  int32_t shape_rank;
  int32_t shape_dims[IREE_BINDINGS_TFLITE_MAX_RANK];

  // Allocated buffer view referencing the backing tensor memory.
  iree_hal_buffer_t* buffer;
  // Persistently mapped buffer; invalidated when buffer is resized.
  iree_hal_buffer_mapping_t buffer_mapping;
};

// Parses a tfl.io.names value and sets the |tensor| name.
iree_status_t _TfLiteTensorParseNameAttr(TfLiteTensor* tensor,
                                         iree_string_view_t attr,
                                         iree_allocator_t allocator);

// Parses a tfl.io.types value and sets the |tensor| type.
iree_status_t _TfLiteTensorParseTypeAttr(TfLiteTensor* tensor,
                                         iree_string_view_t attr);

// Parses a tfl.io.quant value and sets the |tensor| quantization parameters.
iree_status_t _TfLiteTensorParseQuantAttr(TfLiteTensor* tensor,
                                          iree_string_view_t attr);

// Reallocates and remaps the tensor buffer view if needed.
// No-op if the buffer view is already allocated and its shape matches the
// current tensor shape.
iree_status_t _TfLiteTensorReallocateIfNeeded(
    TfLiteTensor* tensor, iree_hal_allocator_t* buffer_allocator,
    iree_allocator_t heap_allocator);

// Binds the given |buffer| to the tensor and maps it.
// The tensor shape will be overwritten with the buffer view shape.
iree_status_t _TfLiteTensorBind(TfLiteTensor* tensor,
                                iree_hal_buffer_t* buffer);

// Discards the current buffer view, if any, resetting it to NULL.
void _TfLiteTensorDiscardBuffer(TfLiteTensor* tensor);

// Resets the tensor back to its initial state (no buffers, etc).
void _TfLiteTensorReset(TfLiteTensor* tensor, iree_allocator_t allocator);

#endif  // IREE_BINDINGS_TFLITE_TENSOR_H_
