xref: /aosp_15_r20/external/armnn/src/armnn/JsonPrinter.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #pragma once
7 
8 #include <string>
9 #include <map>
10 #include <set>
11 #include <sstream>
12 
13 #include <ProfilingGuid.hpp>
14 #include "Instrument.hpp"
15 #include "JsonUtils.hpp"
16 
17 namespace armnn
18 {
19 
20 enum class JsonObjectType
21 {
22     Measurement,
23     Event,
24     ExecObjectDesc
25 };
26 
27 struct JsonChildObject
28 {
29     // Object type changes according to the JsonObjectType specified in enum
JsonChildObjectarmnn::JsonChildObject30     JsonChildObject(const std::string& label)
31         : m_Label(label),
32           m_Unit(Measurement::Unit::TIME_MS),
33           m_Type(JsonObjectType::Event),
34           m_Guid(armnn::EmptyOptional()),
35           m_DetailsOnly(false)
36     {}
37     JsonChildObject(const JsonChildObject&) = default;
38 
AddMeasurementarmnn::JsonChildObject39     void AddMeasurement(const double measurement)
40     {
41         m_Measurements.push_back(measurement);
42     }
43 
SetAndParseDetailsarmnn::JsonChildObject44     void SetAndParseDetails(std::string layerDetailsStr)
45     {
46         std::stringstream layerDetails(layerDetailsStr);
47         std::string stringLine;
48         while (std::getline(layerDetails, stringLine, '\n'))
49         {
50             m_LayerDetailsList.push_back(stringLine);
51         }
52     }
53 
SetGuidarmnn::JsonChildObject54     void SetGuid(arm::pipe::ProfilingGuid guid)
55     {
56         m_Guid = Optional<arm::pipe::ProfilingGuid>(guid);
57     }
58 
AddChildarmnn::JsonChildObject59     void AddChild(const JsonChildObject& childObject)
60     {
61         m_Children.push_back(childObject);
62     }
63 
GetChildarmnn::JsonChildObject64     JsonChildObject& GetChild(const unsigned int index)
65     {
66         return m_Children[index];
67     }
68 
SetUnitarmnn::JsonChildObject69     void SetUnit(const Measurement::Unit unit)
70     {
71         m_Unit = unit;
72     }
73 
NumChildrenarmnn::JsonChildObject74     size_t NumChildren() const
75     {
76         return m_Children.size();
77     }
78 
SetTypearmnn::JsonChildObject79     void SetType(JsonObjectType type)
80     {
81         m_Type = type;
82     }
83 
GetTypearmnn::JsonChildObject84     JsonObjectType GetType() const
85     {
86         return m_Type;
87     }
88 
EnableDetailsOnlyarmnn::JsonChildObject89     void EnableDetailsOnly()
90     {
91         m_DetailsOnly = true;
92     }
93 
IsDetailsOnlyEnabledarmnn::JsonChildObject94     bool IsDetailsOnlyEnabled() const
95     {
96         return m_DetailsOnly;
97     }
98 
99     ~JsonChildObject() = default;
100 
101     std::string m_Label;
102     Measurement::Unit m_Unit;
103     JsonObjectType m_Type;
104     Optional<arm::pipe::ProfilingGuid> m_Guid;
105     std::vector<double> m_Measurements;
106     std::vector<std::string> m_LayerDetailsList;
107     std::vector<JsonChildObject> m_Children;
108 
109 private:
110     bool m_DetailsOnly;
111     JsonChildObject() = delete;
112 };
113 
114 class JsonPrinter : public JsonUtils
115 {
116 public:
117     void PrintJsonChildObject(const JsonChildObject& object, size_t& id);
118     void PrintLabel(const std::string& label, size_t id);
119     void PrintUnit(armnn::Measurement::Unit unit);
120     void PrintType(armnn::JsonObjectType type);
121     void PrintGuid(arm::pipe::ProfilingGuid guid);
122     void PrintMeasurementsList(const std::vector<double>& measurementsVector);
123 
124 public:
JsonPrinter(std::ostream & outputStream)125     JsonPrinter(std::ostream& outputStream)
126         : JsonUtils(outputStream), m_OutputStream(outputStream)
127     {}
128 
129 private:
130     std::string MakeKey(const std::string& label, size_t id);
131 
132     std::ostream& m_OutputStream;
133 };
134 
135 } // namespace armnn