blob: fae368b64e0fda4981b74e0e99b1d26dbfe20135 [file] [log] [blame]
Nikhil Rajbc626052019-08-15 15:49:45 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
Matteo Martincighd0613b52019-10-09 16:47:04 +01005
Nikhil Rajbc626052019-08-15 15:49:45 +01006#pragma once
7
Aron Virginas-Tare898db92019-08-22 12:56:34 +01008#include <armnn/Exceptions.hpp>
Nikhil Rajbc626052019-08-15 15:49:45 +01009
Matteo Martincighd0613b52019-10-09 16:47:04 +010010#include <memory>
Nikhil Rajbc626052019-08-15 15:49:45 +010011
Aron Virginas-Tare898db92019-08-22 12:56:34 +010012namespace armnn
13{
14
15namespace profiling
16{
Nikhil Rajbc626052019-08-15 15:49:45 +010017
18class Packet
19{
20public:
Matteo Martincigh24e8f922019-09-19 11:57:46 +010021 Packet()
22 : m_Header(0)
23 , m_Length(0)
24 , m_Data(nullptr)
25 {}
26
Matteo Martincigh54fb9572019-10-02 12:50:57 +010027 Packet(uint32_t header)
28 : m_Header(header)
29 , m_Length(0)
30 , m_Data(nullptr)
31 {
32 m_PacketId = ((header >> 16) & 1023);
33 m_PacketFamily = (header >> 26);
34 }
35
FinnWilliamsArma0c78712019-09-16 12:06:47 +010036 Packet(uint32_t header, uint32_t length, std::unique_ptr<char[]>& data)
Matteo Martincigh24e8f922019-09-19 11:57:46 +010037 : m_Header(header)
38 , m_Length(length)
39 , m_Data(std::move(data))
Matteo Martincigh149528e2019-09-05 12:02:04 +010040 {
41 m_PacketId = ((header >> 16) & 1023);
42 m_PacketFamily = (header >> 26);
Nikhil Rajbc626052019-08-15 15:49:45 +010043
Matteo Martincigh149528e2019-09-05 12:02:04 +010044 if (length == 0 && m_Data != nullptr)
45 {
46 throw armnn::InvalidArgumentException("Data should be null when length is zero");
47 }
48 }
Nikhil Rajbc626052019-08-15 15:49:45 +010049
Matteo Martincighd0613b52019-10-09 16:47:04 +010050 Packet(Packet&& other)
51 : m_Header(other.m_Header)
52 , m_PacketFamily(other.m_PacketFamily)
53 , m_PacketId(other.m_PacketId)
54 , m_Length(other.m_Length)
55 , m_Data(std::move(other.m_Data))
56 {
57 other.m_Header = 0;
58 other.m_PacketFamily = 0;
59 other.m_PacketId = 0;
60 other.m_Length = 0;
61 }
62
63 ~Packet() = default;
FinnWilliamsArma0c78712019-09-16 12:06:47 +010064
65 Packet(const Packet& other) = delete;
66 Packet& operator=(const Packet&) = delete;
Matteo Martincigh54fb9572019-10-02 12:50:57 +010067 Packet& operator=(Packet&&) = default;
FinnWilliamsArma0c78712019-09-16 12:06:47 +010068
Matteo Martincighd0613b52019-10-09 16:47:04 +010069 uint32_t GetHeader() const { return m_Header; }
70 uint32_t GetPacketFamily() const { return m_PacketFamily; }
71 uint32_t GetPacketId() const { return m_PacketId; }
72 uint32_t GetPacketClass() const { return m_PacketId >> 3; }
73 uint32_t GetPacketType() const { return m_PacketId & 7; }
74 uint32_t GetLength() const { return m_Length; }
75 const char* const GetData() const { return m_Data.get(); }
Nikhil Rajbc626052019-08-15 15:49:45 +010076
Matteo Martincigh24e8f922019-09-19 11:57:46 +010077 bool IsEmpty() { return m_Header == 0 && m_Length == 0; }
78
Nikhil Rajbc626052019-08-15 15:49:45 +010079private:
80 uint32_t m_Header;
81 uint32_t m_PacketFamily;
82 uint32_t m_PacketId;
83 uint32_t m_Length;
FinnWilliamsArma0c78712019-09-16 12:06:47 +010084 std::unique_ptr<char[]> m_Data;
Aron Virginas-Tare898db92019-08-22 12:56:34 +010085};
86
87} // namespace profiling
88
89} // namespace armnn