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