blob: f7f4663530a16ae3f390bdbd0e385fb7a850a070 [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 Williams510f6182020-02-21 11:14:08 +0000154 printLabels();
155 printEntities();
156 printEventClasses();
157 printEvents();
158 printRelationships();
Finn Williamse63a0262019-10-22 10:30:49 +0100159}
160
Finn Williams510f6182020-02-21 11:14:08 +0000161void TimelineDecoder::printLabels()
Finn Williamse63a0262019-10-22 10:30:49 +0100162{
Finn Williams510f6182020-02-21 11:14:08 +0000163 std::string header;
164
165 header.append(profiling::CentreAlignFormatting("guid", 12));
166 header.append(" | ");
167 header.append(profiling::CentreAlignFormatting("value", 30));
168 header.append("\n");
169
170 std::cout << "\n" << "\n";
171 std::cout << profiling::CentreAlignFormatting("LABELS", static_cast<int>(header.size()));
172 std::cout << "\n";
173 std::cout << std::string(header.size(), '=') << "\n";
174 std::cout << header;
175
176 for (uint32_t i = 0; i < m_Model.m_Labels.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100177 {
Finn Williams510f6182020-02-21 11:14:08 +0000178 std::string body;
179
180 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_Labels[i].m_Guid), 12));
181 body.append(" | ");
182 body.append(profiling::CentreAlignFormatting(m_Model.m_Labels[i].m_Name, 30));
183 body.append("\n");
184
185 std::cout << std::string(body.size(), '-') << "\n";
186 std::cout << body;
Finn Williamse63a0262019-10-22 10:30:49 +0100187 }
Finn Williams510f6182020-02-21 11:14:08 +0000188}
Finn Williamse63a0262019-10-22 10:30:49 +0100189
Finn Williams510f6182020-02-21 11:14:08 +0000190void TimelineDecoder::printEntities()
191{
192 std::string header;
193 header.append(profiling::CentreAlignFormatting("guid", 12));
194 header.append("\n");
Finn Williamse63a0262019-10-22 10:30:49 +0100195
Finn Williams510f6182020-02-21 11:14:08 +0000196 std::cout << "\n" << "\n";
197 std::cout << profiling::CentreAlignFormatting("ENTITIES", static_cast<int>(header.size()));
198 std::cout << "\n";
199 std::cout << std::string(header.size(), '=') << "\n";
200 std::cout << header;
201
202 for (uint32_t i = 0; i < m_Model.m_Entities.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100203 {
Finn Williams510f6182020-02-21 11:14:08 +0000204 std::string body;
Finn Williamse63a0262019-10-22 10:30:49 +0100205
Finn Williams510f6182020-02-21 11:14:08 +0000206 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_Entities[i].m_Guid), 12));
207 body.append("\n");
208
209 std::cout << std::string(body.size(), '-') << "\n";
210 std::cout << body;
211 }
212}
213
214void TimelineDecoder::printEventClasses()
215{
216 std::string header;
217 header.append(profiling::CentreAlignFormatting("guid", 12));
218 header.append("\n");
219
220 std::cout << "\n" << "\n";
221 std::cout << profiling::CentreAlignFormatting("EVENT CLASSES", static_cast<int>(header.size()));
222 std::cout << "\n";
223 std::cout << std::string(header.size(), '=') << "\n";
224 std::cout << header;
225
226 for (uint32_t i = 0; i < m_Model.m_EventClasses.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100227 {
Finn Williams510f6182020-02-21 11:14:08 +0000228 std::string body;
Finn Williamse63a0262019-10-22 10:30:49 +0100229
Finn Williams510f6182020-02-21 11:14:08 +0000230 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_EventClasses[i].m_Guid), 12));
231 body.append("\n");
232
233 std::cout << std::string(body.size(), '-') << "\n";
234 std::cout << body;
235 }
236}
237
238void TimelineDecoder::printEvents()
239{
240 std::string header;
241
242 header.append(profiling::CentreAlignFormatting("timestamp", 12));
243 header.append(" | ");
244 header.append(profiling::CentreAlignFormatting("threadId", 12));
245 header.append(" | ");
246 header.append(profiling::CentreAlignFormatting("eventGuid", 12));
247 header.append("\n");
248
249 std::cout << "\n" << "\n";
250 std::cout << profiling::CentreAlignFormatting("EVENTS", static_cast<int>(header.size()));
251 std::cout << "\n";
252 std::cout << std::string(header.size(), '=') << "\n";
253 std::cout << header;
254
255 for (uint32_t i = 0; i < m_Model.m_Events.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100256 {
Finn Williams510f6182020-02-21 11:14:08 +0000257 std::string body;
Finn Williamse63a0262019-10-22 10:30:49 +0100258
Finn Williams510f6182020-02-21 11:14:08 +0000259 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_Events[i].m_TimeStamp), 12));
260 body.append(" | ");
261
262 std::stringstream ss;
263 ss << m_Model.m_Events[i].m_ThreadId;
264 std::string threadId = ss.str();;
265
266 body.append(profiling::CentreAlignFormatting(threadId, 12));
267 body.append(" | ");
268 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_Events[i].m_Guid), 12));
269 body.append("\n");
270
271 std::cout << std::string(body.size(), '-') << "\n";
272 std::cout << body;
273 }
274}
275
276void TimelineDecoder::printRelationships()
277{
278 std::string header;
279 header.append(profiling::CentreAlignFormatting("relationshipType", 20));
280 header.append(" | ");
281 header.append(profiling::CentreAlignFormatting("relationshipGuid", 20));
282 header.append(" | ");
283 header.append(profiling::CentreAlignFormatting("headGuid", 12));
284 header.append(" | ");
285 header.append(profiling::CentreAlignFormatting("tailGuid", 12));
286 header.append("\n");
287
288 std::cout << "\n" << "\n";
289 std::cout << profiling::CentreAlignFormatting("RELATIONSHIPS", static_cast<int>(header.size()));
290 std::cout << "\n";
291 std::cout << std::string(header.size(), '=') << "\n";
292 std::cout << header;
293
294 for (uint32_t i = 0; i < m_Model.m_Relationships.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100295 {
Finn Williams510f6182020-02-21 11:14:08 +0000296 std::string body;
297
298 body.append(
299 profiling::CentreAlignFormatting(std::to_string(static_cast<unsigned int>
300 (m_Model.m_Relationships[i].m_RelationshipType)),
301 20));
302 body.append(" | ");
303 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_Guid), 20));
304 body.append(" | ");
305 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_HeadGuid), 12));
306 body.append(" | ");
307 body.append(profiling::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_TailGuid), 12));
308 body.append(" | ");
309 body.append("\n");
310
311 std::cout << std::string(body.size(), '-') << "\n";
312 std::cout << body;
Finn Williamse63a0262019-10-22 10:30:49 +0100313 }
Finn Williams510f6182020-02-21 11:14:08 +0000314}
Finn Williams8a2b4682020-02-26 10:25:26 +0000315}
Finn Williamse63a0262019-10-22 10:30:49 +0100316}