blob: 9aa84d208409ec086882aa033a77f07211221529 [file] [log] [blame]
Finn Williamse63a0262019-10-22 10:30:49 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
Finn Williams510f6182020-02-21 11:14:08 +00006#include "TimelineDecoder.hpp"
Finn Williamse6a2ccd2020-02-27 16:21:41 +00007#include <ProfilingUtils.hpp>
Finn Williams510f6182020-02-21 11:14:08 +00008#include <iostream>
Finn Williamse6a2ccd2020-02-27 16:21:41 +00009
Finn Williams510f6182020-02-21 11:14:08 +000010namespace armnn
Finn Williamse63a0262019-10-22 10:30:49 +010011{
Finn Williams8a2b4682020-02-26 10:25:26 +000012namespace timelinedecoder
13{
Finn Williamse6a2ccd2020-02-27 16:21:41 +000014
Keith Davis97da5e22020-03-05 16:25:28 +000015TimelineDecoder::TimelineStatus TimelineDecoder::CreateEntity(const Entity &entity)
Finn Williams510f6182020-02-21 11:14:08 +000016{
17 if (m_OnNewEntityCallback == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010018 {
Keith Davis97da5e22020-03-05 16:25:28 +000019 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010020 }
Finn Williams510f6182020-02-21 11:14:08 +000021 m_OnNewEntityCallback(m_Model, entity);
22
Keith Davis97da5e22020-03-05 16:25:28 +000023 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010024}
25
Keith Davis97da5e22020-03-05 16:25:28 +000026TimelineDecoder::TimelineStatus TimelineDecoder::CreateEventClass(const EventClass &eventClass)
Finn Williamse63a0262019-10-22 10:30:49 +010027{
Finn Williams510f6182020-02-21 11:14:08 +000028 if (m_OnNewEventClassCallback == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010029 {
Keith Davis97da5e22020-03-05 16:25:28 +000030 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010031 }
Finn Williams510f6182020-02-21 11:14:08 +000032 m_OnNewEventClassCallback(m_Model, eventClass);
33
Keith Davis97da5e22020-03-05 16:25:28 +000034 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010035}
36
Keith Davis97da5e22020-03-05 16:25:28 +000037TimelineDecoder::TimelineStatus TimelineDecoder::CreateEvent(const Event &event)
Finn Williamse63a0262019-10-22 10:30:49 +010038{
Finn Williams510f6182020-02-21 11:14:08 +000039 if (m_OnNewEventCallback == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010040 {
Keith Davis97da5e22020-03-05 16:25:28 +000041 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010042 }
Finn Williams510f6182020-02-21 11:14:08 +000043 m_OnNewEventCallback(m_Model, event);
44
Keith Davis97da5e22020-03-05 16:25:28 +000045 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010046}
47
Keith Davis97da5e22020-03-05 16:25:28 +000048TimelineDecoder::TimelineStatus TimelineDecoder::CreateLabel(const Label &label)
Finn Williamse63a0262019-10-22 10:30:49 +010049{
Finn Williams510f6182020-02-21 11:14:08 +000050 if (m_OnNewLabelCallback == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010051 {
Keith Davis97da5e22020-03-05 16:25:28 +000052 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010053 }
Finn Williams510f6182020-02-21 11:14:08 +000054 m_OnNewLabelCallback(m_Model, label);
55
Keith Davis97da5e22020-03-05 16:25:28 +000056 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010057}
58
Keith Davis97da5e22020-03-05 16:25:28 +000059TimelineDecoder::TimelineStatus TimelineDecoder::CreateRelationship(const Relationship &relationship)
Finn Williamse63a0262019-10-22 10:30:49 +010060{
Finn Williams510f6182020-02-21 11:14:08 +000061 if (m_OnNewRelationshipCallback == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010062 {
Keith Davis97da5e22020-03-05 16:25:28 +000063 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010064 }
Finn Williams510f6182020-02-21 11:14:08 +000065 m_OnNewRelationshipCallback(m_Model, relationship);
Keith Davis97da5e22020-03-05 16:25:28 +000066 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010067}
68
Finn Williams510f6182020-02-21 11:14:08 +000069const TimelineDecoder::Model &TimelineDecoder::GetModel()
Finn Williamse63a0262019-10-22 10:30:49 +010070{
Finn Williams510f6182020-02-21 11:14:08 +000071 return m_Model;
72}
73
Keith Davis97da5e22020-03-05 16:25:28 +000074TimelineDecoder::TimelineStatus TimelineDecoder::SetEntityCallback(OnNewEntityCallback cb)
Finn Williams510f6182020-02-21 11:14:08 +000075{
76 if (cb == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010077 {
Keith Davis97da5e22020-03-05 16:25:28 +000078 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010079 }
Finn Williams510f6182020-02-21 11:14:08 +000080 m_OnNewEntityCallback = cb;
Keith Davis97da5e22020-03-05 16:25:28 +000081 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010082}
83
Keith Davis97da5e22020-03-05 16:25:28 +000084TimelineDecoder::TimelineStatus TimelineDecoder::SetEventClassCallback(OnNewEventClassCallback cb)
Finn Williamse63a0262019-10-22 10:30:49 +010085{
Finn Williams510f6182020-02-21 11:14:08 +000086 if (cb == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010087 {
Keith Davis97da5e22020-03-05 16:25:28 +000088 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010089 }
Finn Williams510f6182020-02-21 11:14:08 +000090 m_OnNewEventClassCallback = cb;
Keith Davis97da5e22020-03-05 16:25:28 +000091 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010092}
93
Keith Davis97da5e22020-03-05 16:25:28 +000094TimelineDecoder::TimelineStatus TimelineDecoder::SetEventCallback(OnNewEventCallback cb)
Finn Williamse63a0262019-10-22 10:30:49 +010095{
Finn Williams510f6182020-02-21 11:14:08 +000096 if (cb == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010097 {
Keith Davis97da5e22020-03-05 16:25:28 +000098 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010099 }
Finn Williams510f6182020-02-21 11:14:08 +0000100 m_OnNewEventCallback = cb;
Keith Davis97da5e22020-03-05 16:25:28 +0000101 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +0100102}
103
Keith Davis97da5e22020-03-05 16:25:28 +0000104TimelineDecoder::TimelineStatus TimelineDecoder::SetLabelCallback(OnNewLabelCallback cb)
Finn Williamse63a0262019-10-22 10:30:49 +0100105{
Finn Williams510f6182020-02-21 11:14:08 +0000106 if (cb == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +0100107 {
Keith Davis97da5e22020-03-05 16:25:28 +0000108 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +0100109 }
Finn Williams510f6182020-02-21 11:14:08 +0000110 m_OnNewLabelCallback = cb;
Keith Davis97da5e22020-03-05 16:25:28 +0000111 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +0100112}
113
Keith Davis97da5e22020-03-05 16:25:28 +0000114TimelineDecoder::TimelineStatus TimelineDecoder::SetRelationshipCallback(OnNewRelationshipCallback cb)
Finn Williamse63a0262019-10-22 10:30:49 +0100115{
Finn Williams510f6182020-02-21 11:14:08 +0000116 if (cb == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +0100117 {
Keith Davis97da5e22020-03-05 16:25:28 +0000118 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +0100119 }
Finn Williams510f6182020-02-21 11:14:08 +0000120 m_OnNewRelationshipCallback = cb;
Keith Davis97da5e22020-03-05 16:25:28 +0000121 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +0100122}
123
Finn Williamse6a2ccd2020-02-27 16:21:41 +0000124void TimelineDecoder::SetDefaultCallbacks()
125{
126 SetEntityCallback([](Model& model, const ITimelineDecoder::Entity entity)
127 {
128 model.m_Entities.emplace_back(entity);
129 });
130
131 SetEventClassCallback([](Model& model, const ITimelineDecoder::EventClass eventClass)
132 {
133 model.m_EventClasses.emplace_back(eventClass);
134 });
135
136 SetEventCallback([](Model& model, const ITimelineDecoder::Event event)
137 {
138 model.m_Events.emplace_back(event);
139 });
140
141 SetLabelCallback([](Model& model, const ITimelineDecoder::Label label)
142 {
143 model.m_Labels.emplace_back(label);
144 });
145
146 SetRelationshipCallback([](Model& model, const ITimelineDecoder::Relationship relationship)
147 {
148 model.m_Relationships.emplace_back(relationship);
149 });
150}
151
Finn Williams510f6182020-02-21 11:14:08 +0000152void TimelineDecoder::print()
Finn Williamse63a0262019-10-22 10:30:49 +0100153{
Finn Williamsd7fcafa2020-04-23 17:55:18 +0100154 if (m_Model.m_Labels.empty() && m_Model.m_Entities.empty() && m_Model.m_EventClasses.empty() &&
155 m_Model.m_Events.empty() && m_Model.m_Relationships.empty())
156 {
157 std::cout << "No timeline packets received" << std::endl;
158 return;
159 }
160
Finn Williams510f6182020-02-21 11:14:08 +0000161 printLabels();
162 printEntities();
163 printEventClasses();
164 printEvents();
165 printRelationships();
Finn Williamse63a0262019-10-22 10:30:49 +0100166}
167
Finn Williams510f6182020-02-21 11:14:08 +0000168void TimelineDecoder::printLabels()
Finn Williamse63a0262019-10-22 10:30:49 +0100169{
Finn Williams510f6182020-02-21 11:14:08 +0000170 std::string header;
171
172 header.append(profiling::CentreAlignFormatting("guid", 12));
173 header.append(" | ");
174 header.append(profiling::CentreAlignFormatting("value", 30));
175 header.append("\n");
176
177 std::cout << "\n" << "\n";
178 std::cout << profiling::CentreAlignFormatting("LABELS", static_cast<int>(header.size()));
179 std::cout << "\n";
180 std::cout << std::string(header.size(), '=') << "\n";
181 std::cout << header;
182
183 for (uint32_t i = 0; i < m_Model.m_Labels.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100184 {
Finn Williams510f6182020-02-21 11:14:08 +0000185 std::string body;
186
187 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_Labels[i].m_Guid), 12));
188 body.append(" | ");
189 body.append(profiling::CentreAlignFormatting(m_Model.m_Labels[i].m_Name, 30));
190 body.append("\n");
191
192 std::cout << std::string(body.size(), '-') << "\n";
193 std::cout << body;
Finn Williamse63a0262019-10-22 10:30:49 +0100194 }
Finn Williams510f6182020-02-21 11:14:08 +0000195}
Finn Williamse63a0262019-10-22 10:30:49 +0100196
Finn Williams510f6182020-02-21 11:14:08 +0000197void TimelineDecoder::printEntities()
198{
199 std::string header;
200 header.append(profiling::CentreAlignFormatting("guid", 12));
201 header.append("\n");
Finn Williamse63a0262019-10-22 10:30:49 +0100202
Finn Williams510f6182020-02-21 11:14:08 +0000203 std::cout << "\n" << "\n";
204 std::cout << profiling::CentreAlignFormatting("ENTITIES", static_cast<int>(header.size()));
205 std::cout << "\n";
206 std::cout << std::string(header.size(), '=') << "\n";
207 std::cout << header;
208
209 for (uint32_t i = 0; i < m_Model.m_Entities.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100210 {
Finn Williams510f6182020-02-21 11:14:08 +0000211 std::string body;
Finn Williamse63a0262019-10-22 10:30:49 +0100212
Finn Williams510f6182020-02-21 11:14:08 +0000213 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_Entities[i].m_Guid), 12));
214 body.append("\n");
215
216 std::cout << std::string(body.size(), '-') << "\n";
217 std::cout << body;
218 }
219}
220
221void TimelineDecoder::printEventClasses()
222{
223 std::string header;
224 header.append(profiling::CentreAlignFormatting("guid", 12));
225 header.append("\n");
226
227 std::cout << "\n" << "\n";
228 std::cout << profiling::CentreAlignFormatting("EVENT CLASSES", static_cast<int>(header.size()));
229 std::cout << "\n";
230 std::cout << std::string(header.size(), '=') << "\n";
231 std::cout << header;
232
233 for (uint32_t i = 0; i < m_Model.m_EventClasses.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100234 {
Finn Williams510f6182020-02-21 11:14:08 +0000235 std::string body;
Finn Williamse63a0262019-10-22 10:30:49 +0100236
Finn Williams510f6182020-02-21 11:14:08 +0000237 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_EventClasses[i].m_Guid), 12));
238 body.append("\n");
239
240 std::cout << std::string(body.size(), '-') << "\n";
241 std::cout << body;
242 }
243}
244
245void TimelineDecoder::printEvents()
246{
247 std::string header;
248
249 header.append(profiling::CentreAlignFormatting("timestamp", 12));
250 header.append(" | ");
251 header.append(profiling::CentreAlignFormatting("threadId", 12));
252 header.append(" | ");
253 header.append(profiling::CentreAlignFormatting("eventGuid", 12));
254 header.append("\n");
255
256 std::cout << "\n" << "\n";
257 std::cout << profiling::CentreAlignFormatting("EVENTS", static_cast<int>(header.size()));
258 std::cout << "\n";
259 std::cout << std::string(header.size(), '=') << "\n";
260 std::cout << header;
261
262 for (uint32_t i = 0; i < m_Model.m_Events.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100263 {
Finn Williams510f6182020-02-21 11:14:08 +0000264 std::string body;
Finn Williamse63a0262019-10-22 10:30:49 +0100265
Finn Williams510f6182020-02-21 11:14:08 +0000266 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_Events[i].m_TimeStamp), 12));
267 body.append(" | ");
268
269 std::stringstream ss;
270 ss << m_Model.m_Events[i].m_ThreadId;
271 std::string threadId = ss.str();;
272
273 body.append(profiling::CentreAlignFormatting(threadId, 12));
274 body.append(" | ");
275 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_Events[i].m_Guid), 12));
276 body.append("\n");
277
278 std::cout << std::string(body.size(), '-') << "\n";
279 std::cout << body;
280 }
281}
282
283void TimelineDecoder::printRelationships()
284{
285 std::string header;
286 header.append(profiling::CentreAlignFormatting("relationshipType", 20));
287 header.append(" | ");
288 header.append(profiling::CentreAlignFormatting("relationshipGuid", 20));
289 header.append(" | ");
290 header.append(profiling::CentreAlignFormatting("headGuid", 12));
291 header.append(" | ");
292 header.append(profiling::CentreAlignFormatting("tailGuid", 12));
293 header.append("\n");
294
295 std::cout << "\n" << "\n";
296 std::cout << profiling::CentreAlignFormatting("RELATIONSHIPS", static_cast<int>(header.size()));
297 std::cout << "\n";
298 std::cout << std::string(header.size(), '=') << "\n";
299 std::cout << header;
300
301 for (uint32_t i = 0; i < m_Model.m_Relationships.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100302 {
Finn Williams510f6182020-02-21 11:14:08 +0000303 std::string body;
304
305 body.append(
306 profiling::CentreAlignFormatting(std::to_string(static_cast<unsigned int>
307 (m_Model.m_Relationships[i].m_RelationshipType)),
308 20));
309 body.append(" | ");
310 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_Guid), 20));
311 body.append(" | ");
312 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_HeadGuid), 12));
313 body.append(" | ");
314 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_TailGuid), 12));
315 body.append(" | ");
316 body.append("\n");
317
318 std::cout << std::string(body.size(), '-') << "\n";
319 std::cout << body;
Finn Williamse63a0262019-10-22 10:30:49 +0100320 }
Finn Williams510f6182020-02-21 11:14:08 +0000321}
Finn Williams8a2b4682020-02-26 10:25:26 +0000322}
Finn Williamse63a0262019-10-22 10:30:49 +0100323}