/*
 * SPDX-FileCopyrightText: Copyright 2021-2022 Arm Limited and/or its affiliates <open-source-office@arm.com>
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * 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
 *
 * 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 LAYER_BY_LAYER_PROFILER_H
#define LAYER_BY_LAYER_PROFILER_H

#include "EventRecorder.h"
#include "tensorflow/lite/kernels/internal/compatibility.h"
#include "tensorflow/lite/micro/micro_profiler_interface.h"
#include <memory>
#include <vector>

// NOTE: This profiler only works on systems with 1 NPU due to the use of
// ethosu_reserve_driver().
namespace tflite {
class LayerByLayerProfiler : public MicroProfilerInterface {
public:
    enum Backend { PRINTF, EVENT_RECORDER };

    LayerByLayerProfiler(size_t max_events = 200,
                         Backend backend   = PRINTF,
                         int32_t event_id  = EventID(EventLevelError, EvtStatistics_No, EventRecordNone));

    uint32_t BeginEvent(const char *tag);
    void EndEvent(uint32_t event_handle);
    int32_t GetTotalTicks() const;
    void Log() const;

private:
    std::unique_ptr<const char *[]> tags_;
    std::unique_ptr<uint64_t[]> start_ticks_;
    std::unique_ptr<uint64_t[]> end_ticks_;

    size_t max_events_;
    Backend backend;
    int32_t event_id;
    size_t num_events_;

    TF_LITE_REMOVE_VIRTUAL_DELETE;
};

} // namespace tflite

#endif
