xref: /aosp_15_r20/external/armnn/src/profiling/test/TimelineModel.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 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 "TimelineModel.hpp"
7*89c4ff92SAndroid Build Coastguard Worker 
8*89c4ff92SAndroid Build Coastguard Worker #include <common/include/LabelsAndEventClasses.hpp>
9*89c4ff92SAndroid Build Coastguard Worker 
10*89c4ff92SAndroid Build Coastguard Worker #include <algorithm>
11*89c4ff92SAndroid Build Coastguard Worker 
12*89c4ff92SAndroid Build Coastguard Worker namespace arm
13*89c4ff92SAndroid Build Coastguard Worker {
14*89c4ff92SAndroid Build Coastguard Worker 
15*89c4ff92SAndroid Build Coastguard Worker namespace pipe
16*89c4ff92SAndroid Build Coastguard Worker {
17*89c4ff92SAndroid Build Coastguard Worker 
AddLabel(const arm::pipe::ITimelineDecoder::Label & label)18*89c4ff92SAndroid Build Coastguard Worker void TimelineModel::AddLabel(const arm::pipe::ITimelineDecoder::Label& label)
19*89c4ff92SAndroid Build Coastguard Worker {
20*89c4ff92SAndroid Build Coastguard Worker     m_LabelMap.emplace(label.m_Guid, label);
21*89c4ff92SAndroid Build Coastguard Worker }
22*89c4ff92SAndroid Build Coastguard Worker 
FindLabel(uint64_t guid)23*89c4ff92SAndroid Build Coastguard Worker std::string* TimelineModel::FindLabel(uint64_t guid)
24*89c4ff92SAndroid Build Coastguard Worker {
25*89c4ff92SAndroid Build Coastguard Worker     auto iter = m_LabelMap.find(guid);
26*89c4ff92SAndroid Build Coastguard Worker     if (iter != m_LabelMap.end())
27*89c4ff92SAndroid Build Coastguard Worker     {
28*89c4ff92SAndroid Build Coastguard Worker         return &iter->second.m_Name;
29*89c4ff92SAndroid Build Coastguard Worker     }
30*89c4ff92SAndroid Build Coastguard Worker     else
31*89c4ff92SAndroid Build Coastguard Worker     {
32*89c4ff92SAndroid Build Coastguard Worker         return nullptr;
33*89c4ff92SAndroid Build Coastguard Worker     }
34*89c4ff92SAndroid Build Coastguard Worker }
35*89c4ff92SAndroid Build Coastguard Worker 
AddEntity(uint64_t guid)36*89c4ff92SAndroid Build Coastguard Worker void TimelineModel::AddEntity(uint64_t guid)
37*89c4ff92SAndroid Build Coastguard Worker {
38*89c4ff92SAndroid Build Coastguard Worker     m_Entities.emplace(guid, guid);
39*89c4ff92SAndroid Build Coastguard Worker }
40*89c4ff92SAndroid Build Coastguard Worker 
FindEntity(uint64_t id)41*89c4ff92SAndroid Build Coastguard Worker Entity* TimelineModel::FindEntity(uint64_t id)
42*89c4ff92SAndroid Build Coastguard Worker {
43*89c4ff92SAndroid Build Coastguard Worker     auto iter = m_Entities.find(id);
44*89c4ff92SAndroid Build Coastguard Worker     if (iter != m_Entities.end())
45*89c4ff92SAndroid Build Coastguard Worker     {
46*89c4ff92SAndroid Build Coastguard Worker         return &(iter->second);
47*89c4ff92SAndroid Build Coastguard Worker     }
48*89c4ff92SAndroid Build Coastguard Worker     else
49*89c4ff92SAndroid Build Coastguard Worker     {
50*89c4ff92SAndroid Build Coastguard Worker         return nullptr;
51*89c4ff92SAndroid Build Coastguard Worker     }
52*89c4ff92SAndroid Build Coastguard Worker }
53*89c4ff92SAndroid Build Coastguard Worker 
AddRelationship(const arm::pipe::ITimelineDecoder::Relationship & relationship)54*89c4ff92SAndroid Build Coastguard Worker void TimelineModel::AddRelationship(const arm::pipe::ITimelineDecoder::Relationship& relationship)
55*89c4ff92SAndroid Build Coastguard Worker {
56*89c4ff92SAndroid Build Coastguard Worker     m_Relationships.emplace(relationship.m_Guid, relationship);
57*89c4ff92SAndroid Build Coastguard Worker     if (relationship.m_RelationshipType == arm::pipe::ITimelineDecoder::RelationshipType::LabelLink)
58*89c4ff92SAndroid Build Coastguard Worker     {
59*89c4ff92SAndroid Build Coastguard Worker         HandleLabelLink(relationship);
60*89c4ff92SAndroid Build Coastguard Worker     }
61*89c4ff92SAndroid Build Coastguard Worker     else if (relationship.m_RelationshipType == ITimelineDecoder::RelationshipType::RetentionLink)
62*89c4ff92SAndroid Build Coastguard Worker     {
63*89c4ff92SAndroid Build Coastguard Worker         // Take care of the special case of a connection between layers in ArmNN
64*89c4ff92SAndroid Build Coastguard Worker         // modelled by a retention link between two layer entities with an attribute GUID
65*89c4ff92SAndroid Build Coastguard Worker         // of connection
66*89c4ff92SAndroid Build Coastguard Worker         if (relationship.m_AttributeGuid == LabelsAndEventClasses::CONNECTION_GUID)
67*89c4ff92SAndroid Build Coastguard Worker         {
68*89c4ff92SAndroid Build Coastguard Worker             HandleConnection(relationship);
69*89c4ff92SAndroid Build Coastguard Worker         }
70*89c4ff92SAndroid Build Coastguard Worker         else if (relationship.m_AttributeGuid == LabelsAndEventClasses::CHILD_GUID)
71*89c4ff92SAndroid Build Coastguard Worker         {
72*89c4ff92SAndroid Build Coastguard Worker             HandleChild(relationship);
73*89c4ff92SAndroid Build Coastguard Worker         }
74*89c4ff92SAndroid Build Coastguard Worker         else if (relationship.m_AttributeGuid == LabelsAndEventClasses::EXECUTION_OF_GUID)
75*89c4ff92SAndroid Build Coastguard Worker         {
76*89c4ff92SAndroid Build Coastguard Worker             HandleExecutionOf(relationship);
77*89c4ff92SAndroid Build Coastguard Worker         }
78*89c4ff92SAndroid Build Coastguard Worker         else
79*89c4ff92SAndroid Build Coastguard Worker         {
80*89c4ff92SAndroid Build Coastguard Worker             // report unknown relationship type
81*89c4ff92SAndroid Build Coastguard Worker             std::stringstream ss;
82*89c4ff92SAndroid Build Coastguard Worker             ss << "Encountered a RetentionLink of unknown type [" << relationship.m_AttributeGuid << "]";
83*89c4ff92SAndroid Build Coastguard Worker             m_Errors.push_back(arm::pipe::ProfilingException(ss.str()));
84*89c4ff92SAndroid Build Coastguard Worker         }
85*89c4ff92SAndroid Build Coastguard Worker     }
86*89c4ff92SAndroid Build Coastguard Worker     else if (relationship.m_RelationshipType == arm::pipe::ITimelineDecoder::RelationshipType::ExecutionLink)
87*89c4ff92SAndroid Build Coastguard Worker     {
88*89c4ff92SAndroid Build Coastguard Worker         HandleExecutionLink(relationship);
89*89c4ff92SAndroid Build Coastguard Worker     }
90*89c4ff92SAndroid Build Coastguard Worker }
91*89c4ff92SAndroid Build Coastguard Worker 
HandleLabelLink(const arm::pipe::ITimelineDecoder::Relationship & relationship)92*89c4ff92SAndroid Build Coastguard Worker void TimelineModel::HandleLabelLink(const arm::pipe::ITimelineDecoder::Relationship& relationship)
93*89c4ff92SAndroid Build Coastguard Worker {
94*89c4ff92SAndroid Build Coastguard Worker     Entity* entity = FindEntity(relationship.m_HeadGuid);
95*89c4ff92SAndroid Build Coastguard Worker     // we have a label attribute of an entity
96*89c4ff92SAndroid Build Coastguard Worker     std::string* value = nullptr;
97*89c4ff92SAndroid Build Coastguard Worker     std::string* attribute = nullptr;
98*89c4ff92SAndroid Build Coastguard Worker     value = FindLabel(relationship.m_TailGuid);
99*89c4ff92SAndroid Build Coastguard Worker     if (value == nullptr)
100*89c4ff92SAndroid Build Coastguard Worker     {
101*89c4ff92SAndroid Build Coastguard Worker         //report an error
102*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
103*89c4ff92SAndroid Build Coastguard Worker         ss << "could not find label link [" << relationship.m_Guid <<
104*89c4ff92SAndroid Build Coastguard Worker            "] value [" << relationship.m_TailGuid << "]";
105*89c4ff92SAndroid Build Coastguard Worker         m_Errors.push_back(arm::pipe::ProfilingException(ss.str()));
106*89c4ff92SAndroid Build Coastguard Worker     }
107*89c4ff92SAndroid Build Coastguard Worker     if (relationship.m_AttributeGuid != 0)
108*89c4ff92SAndroid Build Coastguard Worker     {
109*89c4ff92SAndroid Build Coastguard Worker         attribute = FindLabel(relationship.m_AttributeGuid);
110*89c4ff92SAndroid Build Coastguard Worker         if (attribute == nullptr)
111*89c4ff92SAndroid Build Coastguard Worker         {
112*89c4ff92SAndroid Build Coastguard Worker             //report an error
113*89c4ff92SAndroid Build Coastguard Worker             std::stringstream ss;
114*89c4ff92SAndroid Build Coastguard Worker             ss << "could not find label link [" << relationship.m_Guid <<
115*89c4ff92SAndroid Build Coastguard Worker                "] attribute [" << relationship.m_AttributeGuid << "]";
116*89c4ff92SAndroid Build Coastguard Worker             m_Errors.push_back(arm::pipe::ProfilingException(ss.str()));
117*89c4ff92SAndroid Build Coastguard Worker         }
118*89c4ff92SAndroid Build Coastguard Worker     }
119*89c4ff92SAndroid Build Coastguard Worker     else
120*89c4ff92SAndroid Build Coastguard Worker     {
121*89c4ff92SAndroid Build Coastguard Worker         //report an error
122*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
123*89c4ff92SAndroid Build Coastguard Worker         ss << "label link [" << relationship.m_Guid << "] has a zero attribute guid";
124*89c4ff92SAndroid Build Coastguard Worker         m_Errors.push_back(arm::pipe::ProfilingException(ss.str()));
125*89c4ff92SAndroid Build Coastguard Worker     }
126*89c4ff92SAndroid Build Coastguard Worker     if (entity != nullptr && attribute != nullptr && value != nullptr)
127*89c4ff92SAndroid Build Coastguard Worker     {
128*89c4ff92SAndroid Build Coastguard Worker         entity->AddAttribute(*attribute, *value);
129*89c4ff92SAndroid Build Coastguard Worker         // if the attribute is 'type' and the value is 'inference'
130*89c4ff92SAndroid Build Coastguard Worker         // we need to cache the entity guid as an inference
131*89c4ff92SAndroid Build Coastguard Worker         if (LabelsAndEventClasses::TYPE_LABEL.compare(*attribute) == 0 &&
132*89c4ff92SAndroid Build Coastguard Worker             LabelsAndEventClasses::INFERENCE.compare(*value) == 0)
133*89c4ff92SAndroid Build Coastguard Worker         {
134*89c4ff92SAndroid Build Coastguard Worker             m_InferenceGuids.push_back(relationship.m_HeadGuid);
135*89c4ff92SAndroid Build Coastguard Worker         }
136*89c4ff92SAndroid Build Coastguard Worker     }
137*89c4ff92SAndroid Build Coastguard Worker 
138*89c4ff92SAndroid Build Coastguard Worker     if (entity == nullptr)
139*89c4ff92SAndroid Build Coastguard Worker     {
140*89c4ff92SAndroid Build Coastguard Worker         //report an error
141*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
142*89c4ff92SAndroid Build Coastguard Worker         ss << "could not find label link [" << relationship.m_Guid <<
143*89c4ff92SAndroid Build Coastguard Worker            "] entity [" << relationship.m_HeadGuid << "] ";
144*89c4ff92SAndroid Build Coastguard Worker         if (value != nullptr)
145*89c4ff92SAndroid Build Coastguard Worker         {
146*89c4ff92SAndroid Build Coastguard Worker             ss << "value [" << *value << "] ";
147*89c4ff92SAndroid Build Coastguard Worker         }
148*89c4ff92SAndroid Build Coastguard Worker         if (attribute != nullptr)
149*89c4ff92SAndroid Build Coastguard Worker         {
150*89c4ff92SAndroid Build Coastguard Worker             ss << "attribute [" << *attribute << "] ";
151*89c4ff92SAndroid Build Coastguard Worker         }
152*89c4ff92SAndroid Build Coastguard Worker         m_Errors.push_back(arm::pipe::ProfilingException(ss.str()));
153*89c4ff92SAndroid Build Coastguard Worker     }
154*89c4ff92SAndroid Build Coastguard Worker }
155*89c4ff92SAndroid Build Coastguard Worker 
HandleConnection(const arm::pipe::ITimelineDecoder::Relationship & relationship)156*89c4ff92SAndroid Build Coastguard Worker void TimelineModel::HandleConnection(const arm::pipe::ITimelineDecoder::Relationship& relationship)
157*89c4ff92SAndroid Build Coastguard Worker {
158*89c4ff92SAndroid Build Coastguard Worker     Entity* outputLayer = FindEntity(relationship.m_HeadGuid);
159*89c4ff92SAndroid Build Coastguard Worker     if (outputLayer == nullptr)
160*89c4ff92SAndroid Build Coastguard Worker     {
161*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
162*89c4ff92SAndroid Build Coastguard Worker         ss << "could not find output entity [" << relationship.m_HeadGuid << "]";
163*89c4ff92SAndroid Build Coastguard Worker         ss << " of connection [" << relationship.m_Guid << "]";
164*89c4ff92SAndroid Build Coastguard Worker         m_Errors.push_back(arm::pipe::ProfilingException(ss.str()));
165*89c4ff92SAndroid Build Coastguard Worker         return;
166*89c4ff92SAndroid Build Coastguard Worker     }
167*89c4ff92SAndroid Build Coastguard Worker     Entity* inputLayer = FindEntity(relationship.m_TailGuid);
168*89c4ff92SAndroid Build Coastguard Worker     if (inputLayer == nullptr)
169*89c4ff92SAndroid Build Coastguard Worker     {
170*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
171*89c4ff92SAndroid Build Coastguard Worker         ss << "could not find input entity [" << relationship.m_TailGuid << "]";
172*89c4ff92SAndroid Build Coastguard Worker         ss << " of connection [" << relationship.m_Guid << "]";
173*89c4ff92SAndroid Build Coastguard Worker         m_Errors.push_back(arm::pipe::ProfilingException(ss.str()));
174*89c4ff92SAndroid Build Coastguard Worker         return;
175*89c4ff92SAndroid Build Coastguard Worker     }
176*89c4ff92SAndroid Build Coastguard Worker     Connection connection(relationship.m_Guid, outputLayer, inputLayer);
177*89c4ff92SAndroid Build Coastguard Worker     outputLayer->AddConnection(connection);
178*89c4ff92SAndroid Build Coastguard Worker }
179*89c4ff92SAndroid Build Coastguard Worker 
HandleChild(const arm::pipe::ITimelineDecoder::Relationship & relationship)180*89c4ff92SAndroid Build Coastguard Worker void TimelineModel::HandleChild(const arm::pipe::ITimelineDecoder::Relationship& relationship)
181*89c4ff92SAndroid Build Coastguard Worker {
182*89c4ff92SAndroid Build Coastguard Worker     Entity* parentEntity = FindEntity(relationship.m_HeadGuid);
183*89c4ff92SAndroid Build Coastguard Worker     if (parentEntity == nullptr)
184*89c4ff92SAndroid Build Coastguard Worker     {
185*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
186*89c4ff92SAndroid Build Coastguard Worker         ss << "could not find parent entity [" << relationship.m_HeadGuid << "]";
187*89c4ff92SAndroid Build Coastguard Worker         ss << " of child relationship [" << relationship.m_Guid << "]";
188*89c4ff92SAndroid Build Coastguard Worker         m_Errors.push_back(arm::pipe::ProfilingException(ss.str()));
189*89c4ff92SAndroid Build Coastguard Worker         return;
190*89c4ff92SAndroid Build Coastguard Worker     }
191*89c4ff92SAndroid Build Coastguard Worker     Entity* childEntity = FindEntity(relationship.m_TailGuid);
192*89c4ff92SAndroid Build Coastguard Worker     if (childEntity == nullptr)
193*89c4ff92SAndroid Build Coastguard Worker     {
194*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
195*89c4ff92SAndroid Build Coastguard Worker         ss << "could not find child entity [" << relationship.m_TailGuid << "]";
196*89c4ff92SAndroid Build Coastguard Worker         ss << " of child relationship [" << relationship.m_Guid << "]";
197*89c4ff92SAndroid Build Coastguard Worker         m_Errors.push_back(arm::pipe::ProfilingException(ss.str()));
198*89c4ff92SAndroid Build Coastguard Worker         return;
199*89c4ff92SAndroid Build Coastguard Worker     }
200*89c4ff92SAndroid Build Coastguard Worker     parentEntity->AddChild(childEntity);
201*89c4ff92SAndroid Build Coastguard Worker }
202*89c4ff92SAndroid Build Coastguard Worker 
HandleExecutionOf(const arm::pipe::ITimelineDecoder::Relationship & relationship)203*89c4ff92SAndroid Build Coastguard Worker void TimelineModel::HandleExecutionOf(const arm::pipe::ITimelineDecoder::Relationship& relationship)
204*89c4ff92SAndroid Build Coastguard Worker {
205*89c4ff92SAndroid Build Coastguard Worker     Entity* parentEntity = FindEntity(relationship.m_HeadGuid);
206*89c4ff92SAndroid Build Coastguard Worker     if (parentEntity == nullptr)
207*89c4ff92SAndroid Build Coastguard Worker     {
208*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
209*89c4ff92SAndroid Build Coastguard Worker         ss << "could not find parent entity [" << relationship.m_HeadGuid << "]";
210*89c4ff92SAndroid Build Coastguard Worker         ss << " of execution relationship [" << relationship.m_Guid << "]";
211*89c4ff92SAndroid Build Coastguard Worker         m_Errors.push_back(arm::pipe::ProfilingException(ss.str()));
212*89c4ff92SAndroid Build Coastguard Worker         return;
213*89c4ff92SAndroid Build Coastguard Worker     }
214*89c4ff92SAndroid Build Coastguard Worker     Entity* executedEntity = FindEntity(relationship.m_TailGuid);
215*89c4ff92SAndroid Build Coastguard Worker     if (executedEntity == nullptr)
216*89c4ff92SAndroid Build Coastguard Worker     {
217*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
218*89c4ff92SAndroid Build Coastguard Worker         ss << "could not find executed entity [" << relationship.m_TailGuid << "]";
219*89c4ff92SAndroid Build Coastguard Worker         ss << " of execution relationship [" << relationship.m_Guid << "]";
220*89c4ff92SAndroid Build Coastguard Worker         m_Errors.push_back(arm::pipe::ProfilingException(ss.str()));
221*89c4ff92SAndroid Build Coastguard Worker         return;
222*89c4ff92SAndroid Build Coastguard Worker     }
223*89c4ff92SAndroid Build Coastguard Worker     parentEntity->AddExecution(executedEntity);
224*89c4ff92SAndroid Build Coastguard Worker }
225*89c4ff92SAndroid Build Coastguard Worker 
HandleExecutionLink(const arm::pipe::ITimelineDecoder::Relationship & relationship)226*89c4ff92SAndroid Build Coastguard Worker void TimelineModel::HandleExecutionLink(const arm::pipe::ITimelineDecoder::Relationship& relationship)
227*89c4ff92SAndroid Build Coastguard Worker {
228*89c4ff92SAndroid Build Coastguard Worker     // entityGuid,
229*89c4ff92SAndroid Build Coastguard Worker     Entity* parentEntity = FindEntity(relationship.m_HeadGuid);
230*89c4ff92SAndroid Build Coastguard Worker     if (parentEntity == nullptr)
231*89c4ff92SAndroid Build Coastguard Worker     {
232*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
233*89c4ff92SAndroid Build Coastguard Worker         ss << "could not find entity [" << relationship.m_HeadGuid << "]";
234*89c4ff92SAndroid Build Coastguard Worker         ss << " of ExecutionLink [" << relationship.m_Guid << "]";
235*89c4ff92SAndroid Build Coastguard Worker         m_Errors.push_back(arm::pipe::ProfilingException(ss.str()));
236*89c4ff92SAndroid Build Coastguard Worker         return;
237*89c4ff92SAndroid Build Coastguard Worker     }
238*89c4ff92SAndroid Build Coastguard Worker     // eventGuid,
239*89c4ff92SAndroid Build Coastguard Worker     EventObj* eventObj = FindEvent(relationship.m_TailGuid);
240*89c4ff92SAndroid Build Coastguard Worker     if (eventObj == nullptr)
241*89c4ff92SAndroid Build Coastguard Worker     {
242*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
243*89c4ff92SAndroid Build Coastguard Worker         ss << "could not find event [" << relationship.m_TailGuid << "]";
244*89c4ff92SAndroid Build Coastguard Worker         ss << " of ExecutionLink [" << relationship.m_Guid << "]";
245*89c4ff92SAndroid Build Coastguard Worker         m_Errors.push_back(arm::pipe::ProfilingException(ss.str()));
246*89c4ff92SAndroid Build Coastguard Worker         return;
247*89c4ff92SAndroid Build Coastguard Worker     }
248*89c4ff92SAndroid Build Coastguard Worker     // eventClassGuid
249*89c4ff92SAndroid Build Coastguard Worker     EventClassObj* eventClassObj = FindEventClass(relationship.m_AttributeGuid);
250*89c4ff92SAndroid Build Coastguard Worker     if (eventClassObj == nullptr)
251*89c4ff92SAndroid Build Coastguard Worker     {
252*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
253*89c4ff92SAndroid Build Coastguard Worker         ss << "could not find event class [" << relationship.m_TailGuid << "]";
254*89c4ff92SAndroid Build Coastguard Worker         ss << " of ExecutionLink [" << relationship.m_Guid << "]";
255*89c4ff92SAndroid Build Coastguard Worker         m_Errors.push_back(arm::pipe::ProfilingException(ss.str()));
256*89c4ff92SAndroid Build Coastguard Worker         return;
257*89c4ff92SAndroid Build Coastguard Worker     }
258*89c4ff92SAndroid Build Coastguard Worker     eventObj->SetEventClass(eventClassObj);
259*89c4ff92SAndroid Build Coastguard Worker     parentEntity->AddEvent(eventObj);
260*89c4ff92SAndroid Build Coastguard Worker }
261*89c4ff92SAndroid Build Coastguard Worker 
FindRelationship(uint64_t id)262*89c4ff92SAndroid Build Coastguard Worker ModelRelationship* TimelineModel::FindRelationship(uint64_t id)
263*89c4ff92SAndroid Build Coastguard Worker {
264*89c4ff92SAndroid Build Coastguard Worker     auto iter = m_Relationships.find(id);
265*89c4ff92SAndroid Build Coastguard Worker     if (iter != m_Relationships.end())
266*89c4ff92SAndroid Build Coastguard Worker     {
267*89c4ff92SAndroid Build Coastguard Worker         return &(iter->second);
268*89c4ff92SAndroid Build Coastguard Worker     }
269*89c4ff92SAndroid Build Coastguard Worker     else
270*89c4ff92SAndroid Build Coastguard Worker     {
271*89c4ff92SAndroid Build Coastguard Worker         return nullptr;
272*89c4ff92SAndroid Build Coastguard Worker     }
273*89c4ff92SAndroid Build Coastguard Worker }
274*89c4ff92SAndroid Build Coastguard Worker 
IsInferenceGuid(uint64_t guid) const275*89c4ff92SAndroid Build Coastguard Worker bool TimelineModel::IsInferenceGuid(uint64_t guid) const
276*89c4ff92SAndroid Build Coastguard Worker {
277*89c4ff92SAndroid Build Coastguard Worker     auto it = std::find(m_InferenceGuids.begin(), m_InferenceGuids.end(), guid);
278*89c4ff92SAndroid Build Coastguard Worker     return it != m_InferenceGuids.end();
279*89c4ff92SAndroid Build Coastguard Worker }
280*89c4ff92SAndroid Build Coastguard Worker 
AddEventClass(const arm::pipe::ITimelineDecoder::EventClass & eventClass)281*89c4ff92SAndroid Build Coastguard Worker void TimelineModel::AddEventClass(const arm::pipe::ITimelineDecoder::EventClass& eventClass)
282*89c4ff92SAndroid Build Coastguard Worker {
283*89c4ff92SAndroid Build Coastguard Worker     std::string* eventClassName = FindLabel(eventClass.m_NameGuid);
284*89c4ff92SAndroid Build Coastguard Worker     if (eventClassName != nullptr)
285*89c4ff92SAndroid Build Coastguard Worker     {
286*89c4ff92SAndroid Build Coastguard Worker         EventClassObj eventClassObj(eventClass.m_Guid, *eventClassName);
287*89c4ff92SAndroid Build Coastguard Worker         m_EventClasses.emplace(eventClassObj.GetGuid(), eventClassObj);
288*89c4ff92SAndroid Build Coastguard Worker     }
289*89c4ff92SAndroid Build Coastguard Worker     else
290*89c4ff92SAndroid Build Coastguard Worker     {
291*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
292*89c4ff92SAndroid Build Coastguard Worker         ss << "could not find name [" << eventClass.m_NameGuid << "]";
293*89c4ff92SAndroid Build Coastguard Worker         ss << " of of event class  [" << eventClass.m_Guid << "]";
294*89c4ff92SAndroid Build Coastguard Worker         m_Errors.push_back(arm::pipe::ProfilingException(ss.str()));
295*89c4ff92SAndroid Build Coastguard Worker     }
296*89c4ff92SAndroid Build Coastguard Worker }
297*89c4ff92SAndroid Build Coastguard Worker 
FindEventClass(uint64_t id)298*89c4ff92SAndroid Build Coastguard Worker EventClassObj* TimelineModel::FindEventClass(uint64_t id)
299*89c4ff92SAndroid Build Coastguard Worker {
300*89c4ff92SAndroid Build Coastguard Worker     auto iter = m_EventClasses.find(id);
301*89c4ff92SAndroid Build Coastguard Worker     if (iter != m_EventClasses.end())
302*89c4ff92SAndroid Build Coastguard Worker     {
303*89c4ff92SAndroid Build Coastguard Worker         return &(iter->second);
304*89c4ff92SAndroid Build Coastguard Worker     }
305*89c4ff92SAndroid Build Coastguard Worker     else
306*89c4ff92SAndroid Build Coastguard Worker     {
307*89c4ff92SAndroid Build Coastguard Worker         return nullptr;
308*89c4ff92SAndroid Build Coastguard Worker     }
309*89c4ff92SAndroid Build Coastguard Worker }
310*89c4ff92SAndroid Build Coastguard Worker 
AddEvent(const arm::pipe::ITimelineDecoder::Event & event)311*89c4ff92SAndroid Build Coastguard Worker void TimelineModel::AddEvent(const arm::pipe::ITimelineDecoder::Event& event)
312*89c4ff92SAndroid Build Coastguard Worker {
313*89c4ff92SAndroid Build Coastguard Worker     EventObj evt(event.m_Guid, event.m_TimeStamp, event.m_ThreadId);
314*89c4ff92SAndroid Build Coastguard Worker     m_Events.emplace(event.m_Guid, evt);
315*89c4ff92SAndroid Build Coastguard Worker }
316*89c4ff92SAndroid Build Coastguard Worker 
FindEvent(uint64_t id)317*89c4ff92SAndroid Build Coastguard Worker EventObj* TimelineModel::FindEvent(uint64_t id)
318*89c4ff92SAndroid Build Coastguard Worker {
319*89c4ff92SAndroid Build Coastguard Worker     auto iter = m_Events.find(id);
320*89c4ff92SAndroid Build Coastguard Worker     if (iter != m_Events.end())
321*89c4ff92SAndroid Build Coastguard Worker     {
322*89c4ff92SAndroid Build Coastguard Worker         return &(iter->second);
323*89c4ff92SAndroid Build Coastguard Worker     }
324*89c4ff92SAndroid Build Coastguard Worker     else
325*89c4ff92SAndroid Build Coastguard Worker     {
326*89c4ff92SAndroid Build Coastguard Worker         return nullptr;
327*89c4ff92SAndroid Build Coastguard Worker     }
328*89c4ff92SAndroid Build Coastguard Worker }
329*89c4ff92SAndroid Build Coastguard Worker 
GetModelDescription(const TimelineModel & model)330*89c4ff92SAndroid Build Coastguard Worker std::vector<std::string> GetModelDescription(const TimelineModel& model)
331*89c4ff92SAndroid Build Coastguard Worker {
332*89c4ff92SAndroid Build Coastguard Worker     std::vector<std::string> desc;
333*89c4ff92SAndroid Build Coastguard Worker     for (auto& entry : model.GetEntities())
334*89c4ff92SAndroid Build Coastguard Worker     {
335*89c4ff92SAndroid Build Coastguard Worker         auto& entity = entry.second;
336*89c4ff92SAndroid Build Coastguard Worker         desc.push_back(GetEntityDescription(entity));
337*89c4ff92SAndroid Build Coastguard Worker         for (auto& connection : entity.GetConnections())
338*89c4ff92SAndroid Build Coastguard Worker         {
339*89c4ff92SAndroid Build Coastguard Worker             desc.push_back(GetConnectionDescription(connection));
340*89c4ff92SAndroid Build Coastguard Worker         }
341*89c4ff92SAndroid Build Coastguard Worker         for (auto child : entity.GetChildren())
342*89c4ff92SAndroid Build Coastguard Worker         {
343*89c4ff92SAndroid Build Coastguard Worker             desc.push_back(GetChildDescription(child));
344*89c4ff92SAndroid Build Coastguard Worker         }
345*89c4ff92SAndroid Build Coastguard Worker         for (auto execution : entity.GetExecutions())
346*89c4ff92SAndroid Build Coastguard Worker         {
347*89c4ff92SAndroid Build Coastguard Worker             desc.push_back(GetExecutionDescription(execution));
348*89c4ff92SAndroid Build Coastguard Worker         }
349*89c4ff92SAndroid Build Coastguard Worker         for (auto event : entity.GetEvents())
350*89c4ff92SAndroid Build Coastguard Worker         {
351*89c4ff92SAndroid Build Coastguard Worker             desc.push_back(GetEventDescription(event));
352*89c4ff92SAndroid Build Coastguard Worker         }
353*89c4ff92SAndroid Build Coastguard Worker     }
354*89c4ff92SAndroid Build Coastguard Worker     return desc;
355*89c4ff92SAndroid Build Coastguard Worker }
356*89c4ff92SAndroid Build Coastguard Worker 
GetEntityDescription(const Entity & entity)357*89c4ff92SAndroid Build Coastguard Worker std::string GetEntityDescription(const Entity& entity)
358*89c4ff92SAndroid Build Coastguard Worker {
359*89c4ff92SAndroid Build Coastguard Worker     std::stringstream ss;
360*89c4ff92SAndroid Build Coastguard Worker     ss << "Entity [" << entity.GetGuid() << "]";
361*89c4ff92SAndroid Build Coastguard Worker     for (auto& attributeEntry : entity.GetAttributes())
362*89c4ff92SAndroid Build Coastguard Worker     {
363*89c4ff92SAndroid Build Coastguard Worker         if (LabelsAndEventClasses::PROCESS_ID_LABEL == attributeEntry.second.first)
364*89c4ff92SAndroid Build Coastguard Worker         {
365*89c4ff92SAndroid Build Coastguard Worker             ss << " " << attributeEntry.second.first << " = [processId]";
366*89c4ff92SAndroid Build Coastguard Worker         }
367*89c4ff92SAndroid Build Coastguard Worker         else {
368*89c4ff92SAndroid Build Coastguard Worker             ss << " " << attributeEntry.second.first << " = " << attributeEntry.second.second;
369*89c4ff92SAndroid Build Coastguard Worker         }
370*89c4ff92SAndroid Build Coastguard Worker     }
371*89c4ff92SAndroid Build Coastguard Worker     return ss.str();
372*89c4ff92SAndroid Build Coastguard Worker }
373*89c4ff92SAndroid Build Coastguard Worker 
GetChildDescription(Entity * entity)374*89c4ff92SAndroid Build Coastguard Worker std::string GetChildDescription(Entity* entity)
375*89c4ff92SAndroid Build Coastguard Worker {
376*89c4ff92SAndroid Build Coastguard Worker     std::stringstream ss;
377*89c4ff92SAndroid Build Coastguard Worker     ss << "   child: " << GetEntityDescription(*entity);
378*89c4ff92SAndroid Build Coastguard Worker     return ss.str();
379*89c4ff92SAndroid Build Coastguard Worker }
380*89c4ff92SAndroid Build Coastguard Worker 
GetConnectionDescription(const Connection & connection)381*89c4ff92SAndroid Build Coastguard Worker std::string GetConnectionDescription(const Connection& connection)
382*89c4ff92SAndroid Build Coastguard Worker {
383*89c4ff92SAndroid Build Coastguard Worker     std::stringstream ss;
384*89c4ff92SAndroid Build Coastguard Worker     ss << "   connection [" << connection.GetGuid() << "] from entity [";
385*89c4ff92SAndroid Build Coastguard Worker     ss << connection.GetHead()->GetGuid() << "] to entity [" << connection.GetTail()->GetGuid() << "]";
386*89c4ff92SAndroid Build Coastguard Worker     return ss.str();
387*89c4ff92SAndroid Build Coastguard Worker }
388*89c4ff92SAndroid Build Coastguard Worker 
GetExecutionDescription(Entity * execution)389*89c4ff92SAndroid Build Coastguard Worker std::string GetExecutionDescription(Entity* execution)
390*89c4ff92SAndroid Build Coastguard Worker {
391*89c4ff92SAndroid Build Coastguard Worker     std::stringstream ss;
392*89c4ff92SAndroid Build Coastguard Worker     ss << "   execution: " << GetEntityDescription(*execution);
393*89c4ff92SAndroid Build Coastguard Worker     return ss.str();
394*89c4ff92SAndroid Build Coastguard Worker }
395*89c4ff92SAndroid Build Coastguard Worker 
GetEventDescription(EventObj * event)396*89c4ff92SAndroid Build Coastguard Worker std::string GetEventDescription(EventObj* event)
397*89c4ff92SAndroid Build Coastguard Worker {
398*89c4ff92SAndroid Build Coastguard Worker     std::stringstream ss;
399*89c4ff92SAndroid Build Coastguard Worker     ss << "   event: [" << event->GetGuid() << "] class [" << event->GetEventClass() << "]";
400*89c4ff92SAndroid Build Coastguard Worker     return ss.str();
401*89c4ff92SAndroid Build Coastguard Worker }
402*89c4ff92SAndroid Build Coastguard Worker 
403*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe
404*89c4ff92SAndroid Build Coastguard Worker 
405*89c4ff92SAndroid Build Coastguard Worker } // namespace arm