﻿//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

#include "RefConvolution2dUint8Workload.hpp"

#include "ConvImpl.hpp"
#include "RefWorkloadUtils.hpp"

#include "Profiling.hpp"

namespace armnn
{
RefConvolution2dUint8Workload::RefConvolution2dUint8Workload(
    const Convolution2dQueueDescriptor& descriptor, const WorkloadInfo& info)
        : Uint8Workload<Convolution2dQueueDescriptor>(descriptor, info),
          m_Weight(std::make_unique<ScopedCpuTensorHandle>(*(descriptor.m_Weight))),
          m_Bias(descriptor.m_Parameters.m_BiasEnabled
                 ? std::make_unique<ScopedCpuTensorHandle>(*(descriptor.m_Bias)) : nullptr) {}

void RefConvolution2dUint8Workload::Execute() const
{
    ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefConvolution2dUint8Workload_Execute");

    const uint8_t* inputData = GetInputTensorDataU8(0, m_Data);
    const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
    const uint8_t* weightsData = m_Weight->template GetConstTensor<uint8_t>();
    const TensorInfo& weightsInfo = GetTensorInfo(m_Weight.get());
    const int32_t* biasData = m_Data.m_Parameters.m_BiasEnabled ?
        m_Bias->template GetConstTensor<int32_t>() :
        nullptr;
    uint8_t* outputData = GetOutputTensorDataU8(0, m_Data);
    const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
    const TensorInfo& filterInfo = m_Weight->GetTensorInfo();

    ConvImpl<armnn::Convolution2dQueueDescriptor, uint8_t, int32_t, int32_t>(
        m_Data,
        inputData, inputInfo.GetQuantizationScale(),  inputInfo.GetQuantizationOffset(),
        weightsData, weightsInfo.GetQuantizationScale(), weightsInfo.GetQuantizationOffset(),
        biasData,
        outputData, outputInfo.GetQuantizationScale(), outputInfo.GetQuantizationOffset(), filterInfo);
}

} //namespace armnn
