xref: /aosp_15_r20/external/armnn/profiling/server/src/timelineDecoder/TimelineDecoder.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #include <common/include/CommonProfilingUtils.hpp>
7*89c4ff92SAndroid Build Coastguard Worker #include <server/include/timelineDecoder/TimelineDecoder.hpp>
8*89c4ff92SAndroid Build Coastguard Worker 
9*89c4ff92SAndroid Build Coastguard Worker #include <iostream>
10*89c4ff92SAndroid Build Coastguard Worker #include <sstream>
11*89c4ff92SAndroid Build Coastguard Worker 
12*89c4ff92SAndroid Build Coastguard Worker namespace arm
13*89c4ff92SAndroid Build Coastguard Worker {
14*89c4ff92SAndroid Build Coastguard Worker namespace pipe
15*89c4ff92SAndroid Build Coastguard Worker {
16*89c4ff92SAndroid Build Coastguard Worker 
CreateEntity(const Entity & entity)17*89c4ff92SAndroid Build Coastguard Worker TimelineDecoder::TimelineStatus TimelineDecoder::CreateEntity(const Entity &entity)
18*89c4ff92SAndroid Build Coastguard Worker {
19*89c4ff92SAndroid Build Coastguard Worker     if (m_OnNewEntityCallback == nullptr)
20*89c4ff92SAndroid Build Coastguard Worker     {
21*89c4ff92SAndroid Build Coastguard Worker         return TimelineStatus::TimelineStatus_Fail;
22*89c4ff92SAndroid Build Coastguard Worker     }
23*89c4ff92SAndroid Build Coastguard Worker     ApplyToModel([&](Model& m){
24*89c4ff92SAndroid Build Coastguard Worker         m_OnNewEntityCallback(m, entity);
25*89c4ff92SAndroid Build Coastguard Worker     });
26*89c4ff92SAndroid Build Coastguard Worker     return TimelineStatus::TimelineStatus_Success;
27*89c4ff92SAndroid Build Coastguard Worker }
28*89c4ff92SAndroid Build Coastguard Worker 
CreateEventClass(const EventClass & eventClass)29*89c4ff92SAndroid Build Coastguard Worker TimelineDecoder::TimelineStatus TimelineDecoder::CreateEventClass(const EventClass &eventClass)
30*89c4ff92SAndroid Build Coastguard Worker {
31*89c4ff92SAndroid Build Coastguard Worker     if (m_OnNewEventClassCallback == nullptr)
32*89c4ff92SAndroid Build Coastguard Worker     {
33*89c4ff92SAndroid Build Coastguard Worker         return TimelineStatus::TimelineStatus_Fail;
34*89c4ff92SAndroid Build Coastguard Worker     }
35*89c4ff92SAndroid Build Coastguard Worker     ApplyToModel([&](Model& m){
36*89c4ff92SAndroid Build Coastguard Worker         m_OnNewEventClassCallback(m, eventClass);
37*89c4ff92SAndroid Build Coastguard Worker     });
38*89c4ff92SAndroid Build Coastguard Worker 
39*89c4ff92SAndroid Build Coastguard Worker     return TimelineStatus::TimelineStatus_Success;
40*89c4ff92SAndroid Build Coastguard Worker }
41*89c4ff92SAndroid Build Coastguard Worker 
CreateEvent(const Event & event)42*89c4ff92SAndroid Build Coastguard Worker TimelineDecoder::TimelineStatus TimelineDecoder::CreateEvent(const Event &event)
43*89c4ff92SAndroid Build Coastguard Worker {
44*89c4ff92SAndroid Build Coastguard Worker     if (m_OnNewEventCallback == nullptr)
45*89c4ff92SAndroid Build Coastguard Worker     {
46*89c4ff92SAndroid Build Coastguard Worker         return TimelineStatus::TimelineStatus_Fail;
47*89c4ff92SAndroid Build Coastguard Worker     }
48*89c4ff92SAndroid Build Coastguard Worker     ApplyToModel([&](Model& m){
49*89c4ff92SAndroid Build Coastguard Worker         m_OnNewEventCallback(m, event);
50*89c4ff92SAndroid Build Coastguard Worker     });
51*89c4ff92SAndroid Build Coastguard Worker 
52*89c4ff92SAndroid Build Coastguard Worker     return TimelineStatus::TimelineStatus_Success;
53*89c4ff92SAndroid Build Coastguard Worker }
54*89c4ff92SAndroid Build Coastguard Worker 
CreateLabel(const Label & label)55*89c4ff92SAndroid Build Coastguard Worker TimelineDecoder::TimelineStatus TimelineDecoder::CreateLabel(const Label &label)
56*89c4ff92SAndroid Build Coastguard Worker {
57*89c4ff92SAndroid Build Coastguard Worker     if (m_OnNewLabelCallback == nullptr)
58*89c4ff92SAndroid Build Coastguard Worker     {
59*89c4ff92SAndroid Build Coastguard Worker         return TimelineStatus::TimelineStatus_Fail;
60*89c4ff92SAndroid Build Coastguard Worker     }
61*89c4ff92SAndroid Build Coastguard Worker     ApplyToModel([&](Model& m){
62*89c4ff92SAndroid Build Coastguard Worker         m_OnNewLabelCallback(m, label);
63*89c4ff92SAndroid Build Coastguard Worker     });
64*89c4ff92SAndroid Build Coastguard Worker 
65*89c4ff92SAndroid Build Coastguard Worker     return TimelineStatus::TimelineStatus_Success;
66*89c4ff92SAndroid Build Coastguard Worker }
67*89c4ff92SAndroid Build Coastguard Worker 
CreateRelationship(const Relationship & relationship)68*89c4ff92SAndroid Build Coastguard Worker TimelineDecoder::TimelineStatus TimelineDecoder::CreateRelationship(const Relationship &relationship)
69*89c4ff92SAndroid Build Coastguard Worker {
70*89c4ff92SAndroid Build Coastguard Worker     if (m_OnNewRelationshipCallback == nullptr)
71*89c4ff92SAndroid Build Coastguard Worker     {
72*89c4ff92SAndroid Build Coastguard Worker         return TimelineStatus::TimelineStatus_Fail;
73*89c4ff92SAndroid Build Coastguard Worker     }
74*89c4ff92SAndroid Build Coastguard Worker     ApplyToModel([&](Model& m){
75*89c4ff92SAndroid Build Coastguard Worker         m_OnNewRelationshipCallback(m, relationship);
76*89c4ff92SAndroid Build Coastguard Worker     });
77*89c4ff92SAndroid Build Coastguard Worker     return TimelineStatus::TimelineStatus_Success;
78*89c4ff92SAndroid Build Coastguard Worker }
79*89c4ff92SAndroid Build Coastguard Worker 
SetEntityCallback(OnNewEntityCallback cb)80*89c4ff92SAndroid Build Coastguard Worker TimelineDecoder::TimelineStatus TimelineDecoder::SetEntityCallback(OnNewEntityCallback cb)
81*89c4ff92SAndroid Build Coastguard Worker {
82*89c4ff92SAndroid Build Coastguard Worker     if (cb == nullptr)
83*89c4ff92SAndroid Build Coastguard Worker     {
84*89c4ff92SAndroid Build Coastguard Worker         return TimelineStatus::TimelineStatus_Fail;
85*89c4ff92SAndroid Build Coastguard Worker     }
86*89c4ff92SAndroid Build Coastguard Worker     m_OnNewEntityCallback = cb;
87*89c4ff92SAndroid Build Coastguard Worker     return TimelineStatus::TimelineStatus_Success;
88*89c4ff92SAndroid Build Coastguard Worker }
89*89c4ff92SAndroid Build Coastguard Worker 
SetEventClassCallback(OnNewEventClassCallback cb)90*89c4ff92SAndroid Build Coastguard Worker TimelineDecoder::TimelineStatus TimelineDecoder::SetEventClassCallback(OnNewEventClassCallback cb)
91*89c4ff92SAndroid Build Coastguard Worker {
92*89c4ff92SAndroid Build Coastguard Worker     if (cb == nullptr)
93*89c4ff92SAndroid Build Coastguard Worker     {
94*89c4ff92SAndroid Build Coastguard Worker         return TimelineStatus::TimelineStatus_Fail;
95*89c4ff92SAndroid Build Coastguard Worker     }
96*89c4ff92SAndroid Build Coastguard Worker     m_OnNewEventClassCallback = cb;
97*89c4ff92SAndroid Build Coastguard Worker     return TimelineStatus::TimelineStatus_Success;
98*89c4ff92SAndroid Build Coastguard Worker }
99*89c4ff92SAndroid Build Coastguard Worker 
SetEventCallback(OnNewEventCallback cb)100*89c4ff92SAndroid Build Coastguard Worker TimelineDecoder::TimelineStatus TimelineDecoder::SetEventCallback(OnNewEventCallback cb)
101*89c4ff92SAndroid Build Coastguard Worker {
102*89c4ff92SAndroid Build Coastguard Worker     if (cb == nullptr)
103*89c4ff92SAndroid Build Coastguard Worker     {
104*89c4ff92SAndroid Build Coastguard Worker         return TimelineStatus::TimelineStatus_Fail;
105*89c4ff92SAndroid Build Coastguard Worker     }
106*89c4ff92SAndroid Build Coastguard Worker     m_OnNewEventCallback = cb;
107*89c4ff92SAndroid Build Coastguard Worker     return TimelineStatus::TimelineStatus_Success;
108*89c4ff92SAndroid Build Coastguard Worker }
109*89c4ff92SAndroid Build Coastguard Worker 
SetLabelCallback(OnNewLabelCallback cb)110*89c4ff92SAndroid Build Coastguard Worker TimelineDecoder::TimelineStatus TimelineDecoder::SetLabelCallback(OnNewLabelCallback cb)
111*89c4ff92SAndroid Build Coastguard Worker {
112*89c4ff92SAndroid Build Coastguard Worker     if (cb == nullptr)
113*89c4ff92SAndroid Build Coastguard Worker     {
114*89c4ff92SAndroid Build Coastguard Worker         return TimelineStatus::TimelineStatus_Fail;
115*89c4ff92SAndroid Build Coastguard Worker     }
116*89c4ff92SAndroid Build Coastguard Worker     m_OnNewLabelCallback = cb;
117*89c4ff92SAndroid Build Coastguard Worker     return TimelineStatus::TimelineStatus_Success;
118*89c4ff92SAndroid Build Coastguard Worker }
119*89c4ff92SAndroid Build Coastguard Worker 
SetRelationshipCallback(OnNewRelationshipCallback cb)120*89c4ff92SAndroid Build Coastguard Worker TimelineDecoder::TimelineStatus TimelineDecoder::SetRelationshipCallback(OnNewRelationshipCallback cb)
121*89c4ff92SAndroid Build Coastguard Worker {
122*89c4ff92SAndroid Build Coastguard Worker     if (cb == nullptr)
123*89c4ff92SAndroid Build Coastguard Worker     {
124*89c4ff92SAndroid Build Coastguard Worker         return TimelineStatus::TimelineStatus_Fail;
125*89c4ff92SAndroid Build Coastguard Worker     }
126*89c4ff92SAndroid Build Coastguard Worker     m_OnNewRelationshipCallback = cb;
127*89c4ff92SAndroid Build Coastguard Worker     return TimelineStatus::TimelineStatus_Success;
128*89c4ff92SAndroid Build Coastguard Worker }
129*89c4ff92SAndroid Build Coastguard Worker 
SetDefaultCallbacks()130*89c4ff92SAndroid Build Coastguard Worker void TimelineDecoder::SetDefaultCallbacks()
131*89c4ff92SAndroid Build Coastguard Worker {
132*89c4ff92SAndroid Build Coastguard Worker     SetEntityCallback([](Model& model, const ITimelineDecoder::Entity entity)
133*89c4ff92SAndroid Build Coastguard Worker     {
134*89c4ff92SAndroid Build Coastguard Worker         model.m_Entities.emplace_back(entity);
135*89c4ff92SAndroid Build Coastguard Worker     });
136*89c4ff92SAndroid Build Coastguard Worker 
137*89c4ff92SAndroid Build Coastguard Worker     SetEventClassCallback([](Model& model, const ITimelineDecoder::EventClass eventClass)
138*89c4ff92SAndroid Build Coastguard Worker     {
139*89c4ff92SAndroid Build Coastguard Worker         model.m_EventClasses.emplace_back(eventClass);
140*89c4ff92SAndroid Build Coastguard Worker     });
141*89c4ff92SAndroid Build Coastguard Worker 
142*89c4ff92SAndroid Build Coastguard Worker     SetEventCallback([](Model& model, const ITimelineDecoder::Event event)
143*89c4ff92SAndroid Build Coastguard Worker     {
144*89c4ff92SAndroid Build Coastguard Worker         model.m_Events.emplace_back(event);
145*89c4ff92SAndroid Build Coastguard Worker     });
146*89c4ff92SAndroid Build Coastguard Worker 
147*89c4ff92SAndroid Build Coastguard Worker     SetLabelCallback([](Model& model, const ITimelineDecoder::Label label)
148*89c4ff92SAndroid Build Coastguard Worker     {
149*89c4ff92SAndroid Build Coastguard Worker         model.m_Labels.emplace_back(label);
150*89c4ff92SAndroid Build Coastguard Worker     });
151*89c4ff92SAndroid Build Coastguard Worker 
152*89c4ff92SAndroid Build Coastguard Worker     SetRelationshipCallback([](Model& model, const ITimelineDecoder::Relationship relationship)
153*89c4ff92SAndroid Build Coastguard Worker     {
154*89c4ff92SAndroid Build Coastguard Worker         model.m_Relationships.emplace_back(relationship);
155*89c4ff92SAndroid Build Coastguard Worker     });
156*89c4ff92SAndroid Build Coastguard Worker }
157*89c4ff92SAndroid Build Coastguard Worker 
print()158*89c4ff92SAndroid Build Coastguard Worker void TimelineDecoder::print()
159*89c4ff92SAndroid Build Coastguard Worker {
160*89c4ff92SAndroid Build Coastguard Worker     if (m_Model.m_Labels.empty() && m_Model.m_Entities.empty() && m_Model.m_EventClasses.empty() &&
161*89c4ff92SAndroid Build Coastguard Worker         m_Model.m_Events.empty() && m_Model.m_Relationships.empty())
162*89c4ff92SAndroid Build Coastguard Worker     {
163*89c4ff92SAndroid Build Coastguard Worker         std::cout << "No timeline packets received" << std::endl;
164*89c4ff92SAndroid Build Coastguard Worker         return;
165*89c4ff92SAndroid Build Coastguard Worker     }
166*89c4ff92SAndroid Build Coastguard Worker 
167*89c4ff92SAndroid Build Coastguard Worker     printLabels();
168*89c4ff92SAndroid Build Coastguard Worker     printEntities();
169*89c4ff92SAndroid Build Coastguard Worker     printEventClasses();
170*89c4ff92SAndroid Build Coastguard Worker     printEvents();
171*89c4ff92SAndroid Build Coastguard Worker     printRelationships();
172*89c4ff92SAndroid Build Coastguard Worker }
173*89c4ff92SAndroid Build Coastguard Worker 
printLabels()174*89c4ff92SAndroid Build Coastguard Worker void TimelineDecoder::printLabels()
175*89c4ff92SAndroid Build Coastguard Worker {
176*89c4ff92SAndroid Build Coastguard Worker     std::string header;
177*89c4ff92SAndroid Build Coastguard Worker 
178*89c4ff92SAndroid Build Coastguard Worker     header.append(arm::pipe::CentreAlignFormatting("guid", 12));
179*89c4ff92SAndroid Build Coastguard Worker     header.append(" | ");
180*89c4ff92SAndroid Build Coastguard Worker     header.append(arm::pipe::CentreAlignFormatting("value", 30));
181*89c4ff92SAndroid Build Coastguard Worker     header.append("\n");
182*89c4ff92SAndroid Build Coastguard Worker 
183*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n" << "\n";
184*89c4ff92SAndroid Build Coastguard Worker     std::cout << arm::pipe::CentreAlignFormatting("LABELS", static_cast<int>(header.size()));
185*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n";
186*89c4ff92SAndroid Build Coastguard Worker     std::cout << std::string(header.size(), '=') << "\n";
187*89c4ff92SAndroid Build Coastguard Worker     std::cout << header;
188*89c4ff92SAndroid Build Coastguard Worker 
189*89c4ff92SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < m_Model.m_Labels.size(); ++i)
190*89c4ff92SAndroid Build Coastguard Worker     {
191*89c4ff92SAndroid Build Coastguard Worker         std::string body;
192*89c4ff92SAndroid Build Coastguard Worker 
193*89c4ff92SAndroid Build Coastguard Worker         body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Labels[i].m_Guid), 12));
194*89c4ff92SAndroid Build Coastguard Worker         body.append(" | ");
195*89c4ff92SAndroid Build Coastguard Worker         body.append(arm::pipe::CentreAlignFormatting(m_Model.m_Labels[i].m_Name, 30));
196*89c4ff92SAndroid Build Coastguard Worker         body.append("\n");
197*89c4ff92SAndroid Build Coastguard Worker 
198*89c4ff92SAndroid Build Coastguard Worker         std::cout << std::string(body.size(), '-') << "\n";
199*89c4ff92SAndroid Build Coastguard Worker         std::cout << body;
200*89c4ff92SAndroid Build Coastguard Worker     }
201*89c4ff92SAndroid Build Coastguard Worker }
202*89c4ff92SAndroid Build Coastguard Worker 
printEntities()203*89c4ff92SAndroid Build Coastguard Worker void TimelineDecoder::printEntities()
204*89c4ff92SAndroid Build Coastguard Worker {
205*89c4ff92SAndroid Build Coastguard Worker     std::string header;
206*89c4ff92SAndroid Build Coastguard Worker     header.append(arm::pipe::CentreAlignFormatting("guid", 12));
207*89c4ff92SAndroid Build Coastguard Worker     header.append("\n");
208*89c4ff92SAndroid Build Coastguard Worker 
209*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n" << "\n";
210*89c4ff92SAndroid Build Coastguard Worker     std::cout << arm::pipe::CentreAlignFormatting("ENTITIES", static_cast<int>(header.size()));
211*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n";
212*89c4ff92SAndroid Build Coastguard Worker     std::cout << std::string(header.size(), '=') << "\n";
213*89c4ff92SAndroid Build Coastguard Worker     std::cout << header;
214*89c4ff92SAndroid Build Coastguard Worker 
215*89c4ff92SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < m_Model.m_Entities.size(); ++i)
216*89c4ff92SAndroid Build Coastguard Worker     {
217*89c4ff92SAndroid Build Coastguard Worker         std::string body;
218*89c4ff92SAndroid Build Coastguard Worker 
219*89c4ff92SAndroid Build Coastguard Worker         body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Entities[i].m_Guid), 12));
220*89c4ff92SAndroid Build Coastguard Worker         body.append("\n");
221*89c4ff92SAndroid Build Coastguard Worker 
222*89c4ff92SAndroid Build Coastguard Worker         std::cout << std::string(body.size(), '-') << "\n";
223*89c4ff92SAndroid Build Coastguard Worker         std::cout << body;
224*89c4ff92SAndroid Build Coastguard Worker     }
225*89c4ff92SAndroid Build Coastguard Worker }
226*89c4ff92SAndroid Build Coastguard Worker 
printEventClasses()227*89c4ff92SAndroid Build Coastguard Worker void TimelineDecoder::printEventClasses()
228*89c4ff92SAndroid Build Coastguard Worker {
229*89c4ff92SAndroid Build Coastguard Worker     std::string header;
230*89c4ff92SAndroid Build Coastguard Worker     header.append(arm::pipe::CentreAlignFormatting("guid", 12));
231*89c4ff92SAndroid Build Coastguard Worker     header.append("\n");
232*89c4ff92SAndroid Build Coastguard Worker 
233*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n" << "\n";
234*89c4ff92SAndroid Build Coastguard Worker     std::cout << arm::pipe::CentreAlignFormatting("EVENT CLASSES", static_cast<int>(header.size()));
235*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n";
236*89c4ff92SAndroid Build Coastguard Worker     std::cout << std::string(header.size(), '=') << "\n";
237*89c4ff92SAndroid Build Coastguard Worker     std::cout << header;
238*89c4ff92SAndroid Build Coastguard Worker 
239*89c4ff92SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < m_Model.m_EventClasses.size(); ++i)
240*89c4ff92SAndroid Build Coastguard Worker     {
241*89c4ff92SAndroid Build Coastguard Worker         std::string body;
242*89c4ff92SAndroid Build Coastguard Worker 
243*89c4ff92SAndroid Build Coastguard Worker         body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_EventClasses[i].m_Guid), 12));
244*89c4ff92SAndroid Build Coastguard Worker         body.append("\n");
245*89c4ff92SAndroid Build Coastguard Worker 
246*89c4ff92SAndroid Build Coastguard Worker         std::cout << std::string(body.size(), '-') << "\n";
247*89c4ff92SAndroid Build Coastguard Worker         std::cout << body;
248*89c4ff92SAndroid Build Coastguard Worker     }
249*89c4ff92SAndroid Build Coastguard Worker }
250*89c4ff92SAndroid Build Coastguard Worker 
printEvents()251*89c4ff92SAndroid Build Coastguard Worker void TimelineDecoder::printEvents()
252*89c4ff92SAndroid Build Coastguard Worker {
253*89c4ff92SAndroid Build Coastguard Worker     std::string header;
254*89c4ff92SAndroid Build Coastguard Worker 
255*89c4ff92SAndroid Build Coastguard Worker     header.append(arm::pipe::CentreAlignFormatting("timestamp", 12));
256*89c4ff92SAndroid Build Coastguard Worker     header.append(" | ");
257*89c4ff92SAndroid Build Coastguard Worker     header.append(arm::pipe::CentreAlignFormatting("threadId", 12));
258*89c4ff92SAndroid Build Coastguard Worker     header.append(" | ");
259*89c4ff92SAndroid Build Coastguard Worker     header.append(arm::pipe::CentreAlignFormatting("eventGuid", 12));
260*89c4ff92SAndroid Build Coastguard Worker     header.append("\n");
261*89c4ff92SAndroid Build Coastguard Worker 
262*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n" << "\n";
263*89c4ff92SAndroid Build Coastguard Worker     std::cout << arm::pipe::CentreAlignFormatting("EVENTS", static_cast<int>(header.size()));
264*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n";
265*89c4ff92SAndroid Build Coastguard Worker     std::cout << std::string(header.size(), '=') << "\n";
266*89c4ff92SAndroid Build Coastguard Worker     std::cout << header;
267*89c4ff92SAndroid Build Coastguard Worker 
268*89c4ff92SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < m_Model.m_Events.size(); ++i)
269*89c4ff92SAndroid Build Coastguard Worker     {
270*89c4ff92SAndroid Build Coastguard Worker         std::string body;
271*89c4ff92SAndroid Build Coastguard Worker 
272*89c4ff92SAndroid Build Coastguard Worker         body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Events[i].m_TimeStamp), 12));
273*89c4ff92SAndroid Build Coastguard Worker         body.append(" | ");
274*89c4ff92SAndroid Build Coastguard Worker 
275*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
276*89c4ff92SAndroid Build Coastguard Worker         ss << m_Model.m_Events[i].m_ThreadId;
277*89c4ff92SAndroid Build Coastguard Worker         std::string threadId = ss.str();;
278*89c4ff92SAndroid Build Coastguard Worker 
279*89c4ff92SAndroid Build Coastguard Worker         body.append(arm::pipe::CentreAlignFormatting(threadId, 12));
280*89c4ff92SAndroid Build Coastguard Worker         body.append(" | ");
281*89c4ff92SAndroid Build Coastguard Worker         body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Events[i].m_Guid), 12));
282*89c4ff92SAndroid Build Coastguard Worker         body.append("\n");
283*89c4ff92SAndroid Build Coastguard Worker 
284*89c4ff92SAndroid Build Coastguard Worker         std::cout << std::string(body.size(), '-') << "\n";
285*89c4ff92SAndroid Build Coastguard Worker         std::cout << body;
286*89c4ff92SAndroid Build Coastguard Worker     }
287*89c4ff92SAndroid Build Coastguard Worker }
288*89c4ff92SAndroid Build Coastguard Worker 
printRelationships()289*89c4ff92SAndroid Build Coastguard Worker void TimelineDecoder::printRelationships()
290*89c4ff92SAndroid Build Coastguard Worker {
291*89c4ff92SAndroid Build Coastguard Worker     std::string header;
292*89c4ff92SAndroid Build Coastguard Worker     header.append(arm::pipe::CentreAlignFormatting("relationshipType", 20));
293*89c4ff92SAndroid Build Coastguard Worker     header.append(" | ");
294*89c4ff92SAndroid Build Coastguard Worker     header.append(arm::pipe::CentreAlignFormatting("relationshipGuid", 20));
295*89c4ff92SAndroid Build Coastguard Worker     header.append(" | ");
296*89c4ff92SAndroid Build Coastguard Worker     header.append(arm::pipe::CentreAlignFormatting("headGuid", 12));
297*89c4ff92SAndroid Build Coastguard Worker     header.append(" | ");
298*89c4ff92SAndroid Build Coastguard Worker     header.append(arm::pipe::CentreAlignFormatting("tailGuid", 12));
299*89c4ff92SAndroid Build Coastguard Worker     header.append("\n");
300*89c4ff92SAndroid Build Coastguard Worker 
301*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n" << "\n";
302*89c4ff92SAndroid Build Coastguard Worker     std::cout << arm::pipe::CentreAlignFormatting("RELATIONSHIPS", static_cast<int>(header.size()));
303*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n";
304*89c4ff92SAndroid Build Coastguard Worker     std::cout << std::string(header.size(), '=') << "\n";
305*89c4ff92SAndroid Build Coastguard Worker     std::cout << header;
306*89c4ff92SAndroid Build Coastguard Worker 
307*89c4ff92SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < m_Model.m_Relationships.size(); ++i)
308*89c4ff92SAndroid Build Coastguard Worker     {
309*89c4ff92SAndroid Build Coastguard Worker         std::string body;
310*89c4ff92SAndroid Build Coastguard Worker 
311*89c4ff92SAndroid Build Coastguard Worker         body.append(
312*89c4ff92SAndroid Build Coastguard Worker                 arm::pipe::CentreAlignFormatting(std::to_string(static_cast<unsigned int>
313*89c4ff92SAndroid Build Coastguard Worker                                                                 (m_Model.m_Relationships[i].m_RelationshipType)),
314*89c4ff92SAndroid Build Coastguard Worker                                                  20));
315*89c4ff92SAndroid Build Coastguard Worker         body.append(" | ");
316*89c4ff92SAndroid Build Coastguard Worker         body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_Guid), 20));
317*89c4ff92SAndroid Build Coastguard Worker         body.append(" | ");
318*89c4ff92SAndroid Build Coastguard Worker         body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_HeadGuid), 12));
319*89c4ff92SAndroid Build Coastguard Worker         body.append(" | ");
320*89c4ff92SAndroid Build Coastguard Worker         body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_TailGuid), 12));
321*89c4ff92SAndroid Build Coastguard Worker         body.append(" | ");
322*89c4ff92SAndroid Build Coastguard Worker         body.append("\n");
323*89c4ff92SAndroid Build Coastguard Worker 
324*89c4ff92SAndroid Build Coastguard Worker         std::cout << std::string(body.size(), '-') << "\n";
325*89c4ff92SAndroid Build Coastguard Worker         std::cout << body;
326*89c4ff92SAndroid Build Coastguard Worker     }
327*89c4ff92SAndroid Build Coastguard Worker }
328*89c4ff92SAndroid Build Coastguard Worker 
329*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe
330*89c4ff92SAndroid Build Coastguard Worker } // namespace arm
331