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 #pragma once 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Worker #include <common/include/ProfilingException.hpp> 9*89c4ff92SAndroid Build Coastguard Worker #include <server/include/timelineDecoder/ITimelineDecoder.hpp> 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker #include <map> 12*89c4ff92SAndroid Build Coastguard Worker #include <sstream> 13*89c4ff92SAndroid Build Coastguard Worker #include <vector> 14*89c4ff92SAndroid Build Coastguard Worker 15*89c4ff92SAndroid Build Coastguard Worker namespace arm 16*89c4ff92SAndroid Build Coastguard Worker { 17*89c4ff92SAndroid Build Coastguard Worker 18*89c4ff92SAndroid Build Coastguard Worker namespace pipe 19*89c4ff92SAndroid Build Coastguard Worker { 20*89c4ff92SAndroid Build Coastguard Worker using LabelMap = std::map<uint64_t, arm::pipe::ITimelineDecoder::Label>; 21*89c4ff92SAndroid Build Coastguard Worker using Attribute = std::pair<std::string, std::string>; 22*89c4ff92SAndroid Build Coastguard Worker using Attributes = std::map<std::string, Attribute>; 23*89c4ff92SAndroid Build Coastguard Worker class Entity; 24*89c4ff92SAndroid Build Coastguard Worker class Connection 25*89c4ff92SAndroid Build Coastguard Worker { 26*89c4ff92SAndroid Build Coastguard Worker public: Connection(uint64_t guid,Entity * head,Entity * tail)27*89c4ff92SAndroid Build Coastguard Worker Connection(uint64_t guid, Entity* head, Entity* tail) : 28*89c4ff92SAndroid Build Coastguard Worker m_Guid(guid), m_HeadEntity(head), m_TailEntity(tail) 29*89c4ff92SAndroid Build Coastguard Worker { 30*89c4ff92SAndroid Build Coastguard Worker if (head == nullptr) 31*89c4ff92SAndroid Build Coastguard Worker { 32*89c4ff92SAndroid Build Coastguard Worker std::stringstream ss; 33*89c4ff92SAndroid Build Coastguard Worker ss << "connection [" << guid << "] head cannot be null"; 34*89c4ff92SAndroid Build Coastguard Worker throw arm::pipe::ProfilingException(ss.str()); 35*89c4ff92SAndroid Build Coastguard Worker } 36*89c4ff92SAndroid Build Coastguard Worker if (tail == nullptr) 37*89c4ff92SAndroid Build Coastguard Worker { 38*89c4ff92SAndroid Build Coastguard Worker std::stringstream ss; 39*89c4ff92SAndroid Build Coastguard Worker ss << "connection [" << guid << "] tail cannot be null"; 40*89c4ff92SAndroid Build Coastguard Worker throw arm::pipe::ProfilingException(ss.str()); 41*89c4ff92SAndroid Build Coastguard Worker } 42*89c4ff92SAndroid Build Coastguard Worker } 43*89c4ff92SAndroid Build Coastguard Worker GetGuid() const44*89c4ff92SAndroid Build Coastguard Worker uint64_t GetGuid() const {return m_Guid;} GetHead() const45*89c4ff92SAndroid Build Coastguard Worker const Entity* GetHead() const {return m_HeadEntity;} GetTail() const46*89c4ff92SAndroid Build Coastguard Worker const Entity* GetTail() const {return m_TailEntity;} 47*89c4ff92SAndroid Build Coastguard Worker private: 48*89c4ff92SAndroid Build Coastguard Worker uint64_t m_Guid; 49*89c4ff92SAndroid Build Coastguard Worker Entity* m_HeadEntity; 50*89c4ff92SAndroid Build Coastguard Worker Entity* m_TailEntity; 51*89c4ff92SAndroid Build Coastguard Worker }; 52*89c4ff92SAndroid Build Coastguard Worker class EventClassObj 53*89c4ff92SAndroid Build Coastguard Worker { 54*89c4ff92SAndroid Build Coastguard Worker public: EventClassObj(uint64_t guid,const std::string & name)55*89c4ff92SAndroid Build Coastguard Worker EventClassObj(uint64_t guid, const std::string& name) : m_Guid(guid), m_Name(name) {} GetGuid() const56*89c4ff92SAndroid Build Coastguard Worker uint64_t GetGuid() const {return m_Guid;} GetName() const57*89c4ff92SAndroid Build Coastguard Worker const std::string& GetName() const {return m_Name;} 58*89c4ff92SAndroid Build Coastguard Worker private: 59*89c4ff92SAndroid Build Coastguard Worker uint64_t m_Guid; 60*89c4ff92SAndroid Build Coastguard Worker std::string m_Name; 61*89c4ff92SAndroid Build Coastguard Worker }; 62*89c4ff92SAndroid Build Coastguard Worker class EventObj 63*89c4ff92SAndroid Build Coastguard Worker { 64*89c4ff92SAndroid Build Coastguard Worker public: EventObj(uint64_t guid,uint64_t timestamp,uint64_t threadId)65*89c4ff92SAndroid Build Coastguard Worker EventObj(uint64_t guid, uint64_t timestamp, uint64_t threadId) : 66*89c4ff92SAndroid Build Coastguard Worker m_Guid(guid), m_TimeStamp(timestamp), m_ThreadId(threadId) {} GetGuid() const67*89c4ff92SAndroid Build Coastguard Worker uint64_t GetGuid() const {return m_Guid;} GetTimeStamp() const68*89c4ff92SAndroid Build Coastguard Worker uint64_t GetTimeStamp() const {return m_TimeStamp;} GetThreadId() const69*89c4ff92SAndroid Build Coastguard Worker uint64_t GetThreadId() const {return m_ThreadId;} SetEventClass(EventClassObj * evtClass)70*89c4ff92SAndroid Build Coastguard Worker void SetEventClass(EventClassObj* evtClass) {m_EventClass = evtClass;} GetEventClass()71*89c4ff92SAndroid Build Coastguard Worker std::string GetEventClass() 72*89c4ff92SAndroid Build Coastguard Worker { 73*89c4ff92SAndroid Build Coastguard Worker if (m_EventClass == nullptr) 74*89c4ff92SAndroid Build Coastguard Worker { 75*89c4ff92SAndroid Build Coastguard Worker return ""; 76*89c4ff92SAndroid Build Coastguard Worker } 77*89c4ff92SAndroid Build Coastguard Worker else 78*89c4ff92SAndroid Build Coastguard Worker { 79*89c4ff92SAndroid Build Coastguard Worker return m_EventClass->GetName(); 80*89c4ff92SAndroid Build Coastguard Worker } 81*89c4ff92SAndroid Build Coastguard Worker } 82*89c4ff92SAndroid Build Coastguard Worker private: 83*89c4ff92SAndroid Build Coastguard Worker uint64_t m_Guid; 84*89c4ff92SAndroid Build Coastguard Worker uint64_t m_TimeStamp; 85*89c4ff92SAndroid Build Coastguard Worker uint64_t m_ThreadId; 86*89c4ff92SAndroid Build Coastguard Worker EventClassObj* m_EventClass; 87*89c4ff92SAndroid Build Coastguard Worker }; 88*89c4ff92SAndroid Build Coastguard Worker class Entity 89*89c4ff92SAndroid Build Coastguard Worker { 90*89c4ff92SAndroid Build Coastguard Worker public: Entity(uint64_t guid)91*89c4ff92SAndroid Build Coastguard Worker Entity(uint64_t guid) : m_Guid(guid) {} GetGuid() const92*89c4ff92SAndroid Build Coastguard Worker uint64_t GetGuid() const {return m_Guid;} AddChild(Entity * child)93*89c4ff92SAndroid Build Coastguard Worker void AddChild(Entity* child) 94*89c4ff92SAndroid Build Coastguard Worker { 95*89c4ff92SAndroid Build Coastguard Worker if (child != nullptr) 96*89c4ff92SAndroid Build Coastguard Worker { 97*89c4ff92SAndroid Build Coastguard Worker m_Children.push_back(child); 98*89c4ff92SAndroid Build Coastguard Worker } 99*89c4ff92SAndroid Build Coastguard Worker } AddAttribute(const std::string & type,const std::string & value)100*89c4ff92SAndroid Build Coastguard Worker void AddAttribute(const std::string& type, const std::string& value) 101*89c4ff92SAndroid Build Coastguard Worker { 102*89c4ff92SAndroid Build Coastguard Worker Attribute attr(type, value); 103*89c4ff92SAndroid Build Coastguard Worker m_Attributes.emplace(type, attr); 104*89c4ff92SAndroid Build Coastguard Worker } AddConnection(const Connection & connection)105*89c4ff92SAndroid Build Coastguard Worker void AddConnection(const Connection& connection) 106*89c4ff92SAndroid Build Coastguard Worker { 107*89c4ff92SAndroid Build Coastguard Worker m_Connections.push_back(connection); 108*89c4ff92SAndroid Build Coastguard Worker } AddExecution(Entity * execution)109*89c4ff92SAndroid Build Coastguard Worker void AddExecution(Entity* execution) 110*89c4ff92SAndroid Build Coastguard Worker { 111*89c4ff92SAndroid Build Coastguard Worker if (execution != nullptr) 112*89c4ff92SAndroid Build Coastguard Worker { 113*89c4ff92SAndroid Build Coastguard Worker m_Executions.push_back(execution); 114*89c4ff92SAndroid Build Coastguard Worker } 115*89c4ff92SAndroid Build Coastguard Worker } AddEvent(EventObj * event)116*89c4ff92SAndroid Build Coastguard Worker void AddEvent(EventObj* event) 117*89c4ff92SAndroid Build Coastguard Worker { 118*89c4ff92SAndroid Build Coastguard Worker if (event != nullptr) 119*89c4ff92SAndroid Build Coastguard Worker { 120*89c4ff92SAndroid Build Coastguard Worker m_Events.push_back(event); 121*89c4ff92SAndroid Build Coastguard Worker } 122*89c4ff92SAndroid Build Coastguard Worker } GetAttributes() const123*89c4ff92SAndroid Build Coastguard Worker const Attributes& GetAttributes() const {return m_Attributes;} GetChildren() const124*89c4ff92SAndroid Build Coastguard Worker const std::vector<Entity*>& GetChildren() const {return m_Children;} GetConnections() const125*89c4ff92SAndroid Build Coastguard Worker const std::vector<Connection>& GetConnections() const {return m_Connections;} GetExecutions() const126*89c4ff92SAndroid Build Coastguard Worker const std::vector<Entity*>& GetExecutions() const {return m_Executions;} GetEvents() const127*89c4ff92SAndroid Build Coastguard Worker const std::vector<EventObj*>& GetEvents() const {return m_Events;} 128*89c4ff92SAndroid Build Coastguard Worker private: 129*89c4ff92SAndroid Build Coastguard Worker uint64_t m_Guid; 130*89c4ff92SAndroid Build Coastguard Worker Attributes m_Attributes; 131*89c4ff92SAndroid Build Coastguard Worker std::vector<Entity*> m_Children; 132*89c4ff92SAndroid Build Coastguard Worker std::vector<Connection> m_Connections; 133*89c4ff92SAndroid Build Coastguard Worker std::vector<Entity*> m_Executions; 134*89c4ff92SAndroid Build Coastguard Worker std::vector<EventObj*> m_Events; 135*89c4ff92SAndroid Build Coastguard Worker }; 136*89c4ff92SAndroid Build Coastguard Worker using Entities = std::map<uint64_t, Entity>; 137*89c4ff92SAndroid Build Coastguard Worker struct ModelRelationship 138*89c4ff92SAndroid Build Coastguard Worker { ModelRelationshiparm::pipe::ModelRelationship139*89c4ff92SAndroid Build Coastguard Worker ModelRelationship(const arm::pipe::ITimelineDecoder::Relationship& relationship) : m_Relationship(relationship) {} 140*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ITimelineDecoder::Relationship m_Relationship; 141*89c4ff92SAndroid Build Coastguard Worker std::vector<Entity*> m_RelatedEntities; 142*89c4ff92SAndroid Build Coastguard Worker }; 143*89c4ff92SAndroid Build Coastguard Worker using Relationships = std::map<uint64_t, ModelRelationship>; 144*89c4ff92SAndroid Build Coastguard Worker using EventClasses = std::map<uint64_t, EventClassObj>; 145*89c4ff92SAndroid Build Coastguard Worker using Events = std::map<uint64_t, EventObj>; 146*89c4ff92SAndroid Build Coastguard Worker class TimelineModel 147*89c4ff92SAndroid Build Coastguard Worker { 148*89c4ff92SAndroid Build Coastguard Worker public: 149*89c4ff92SAndroid Build Coastguard Worker void AddLabel(const arm::pipe::ITimelineDecoder::Label& label); 150*89c4ff92SAndroid Build Coastguard Worker std::string* FindLabel(uint64_t guid); 151*89c4ff92SAndroid Build Coastguard Worker void AddEntity(uint64_t guid); 152*89c4ff92SAndroid Build Coastguard Worker Entity* FindEntity(uint64_t id); 153*89c4ff92SAndroid Build Coastguard Worker void AddRelationship(const arm::pipe::ITimelineDecoder::Relationship& relationship); 154*89c4ff92SAndroid Build Coastguard Worker ModelRelationship* FindRelationship(uint64_t id); GetLabelMap() const155*89c4ff92SAndroid Build Coastguard Worker const LabelMap& GetLabelMap() const {return m_LabelMap;} GetEntities() const156*89c4ff92SAndroid Build Coastguard Worker const Entities& GetEntities() const {return m_Entities;} GetErrors() const157*89c4ff92SAndroid Build Coastguard Worker const std::vector<arm::pipe::ProfilingException>& GetErrors() const {return m_Errors;} 158*89c4ff92SAndroid Build Coastguard Worker bool IsInferenceGuid(uint64_t guid) const; 159*89c4ff92SAndroid Build Coastguard Worker void AddEventClass(const arm::pipe::ITimelineDecoder::EventClass& eventClass); GetEventClasses() const160*89c4ff92SAndroid Build Coastguard Worker const EventClasses& GetEventClasses() const {return m_EventClasses;} 161*89c4ff92SAndroid Build Coastguard Worker EventClassObj* FindEventClass(uint64_t id); 162*89c4ff92SAndroid Build Coastguard Worker void AddEvent(const arm::pipe::ITimelineDecoder::Event& event); 163*89c4ff92SAndroid Build Coastguard Worker EventObj* FindEvent(uint64_t id); 164*89c4ff92SAndroid Build Coastguard Worker private: 165*89c4ff92SAndroid Build Coastguard Worker LabelMap m_LabelMap; 166*89c4ff92SAndroid Build Coastguard Worker Entities m_Entities; 167*89c4ff92SAndroid Build Coastguard Worker Relationships m_Relationships; 168*89c4ff92SAndroid Build Coastguard Worker std::vector<arm::pipe::ProfilingException> m_Errors; 169*89c4ff92SAndroid Build Coastguard Worker std::vector<uint64_t> m_InferenceGuids; 170*89c4ff92SAndroid Build Coastguard Worker EventClasses m_EventClasses; 171*89c4ff92SAndroid Build Coastguard Worker Events m_Events; 172*89c4ff92SAndroid Build Coastguard Worker 173*89c4ff92SAndroid Build Coastguard Worker void HandleLabelLink(const arm::pipe::ITimelineDecoder::Relationship& relationship); 174*89c4ff92SAndroid Build Coastguard Worker void HandleConnection(const arm::pipe::ITimelineDecoder::Relationship& relationship); 175*89c4ff92SAndroid Build Coastguard Worker void HandleChild(const arm::pipe::ITimelineDecoder::Relationship& relationship); 176*89c4ff92SAndroid Build Coastguard Worker void HandleExecutionOf(const arm::pipe::ITimelineDecoder::Relationship& relationship); 177*89c4ff92SAndroid Build Coastguard Worker void HandleExecutionLink(const arm::pipe::ITimelineDecoder::Relationship& relationship); 178*89c4ff92SAndroid Build Coastguard Worker }; 179*89c4ff92SAndroid Build Coastguard Worker 180*89c4ff92SAndroid Build Coastguard Worker std::vector<std::string> GetModelDescription(const TimelineModel& model); 181*89c4ff92SAndroid Build Coastguard Worker std::string GetEntityDescription(const Entity& entity); 182*89c4ff92SAndroid Build Coastguard Worker std::string GetChildDescription(Entity* entity); 183*89c4ff92SAndroid Build Coastguard Worker std::string GetConnectionDescription(const Connection& connection); 184*89c4ff92SAndroid Build Coastguard Worker std::string GetExecutionDescription(Entity* execution); 185*89c4ff92SAndroid Build Coastguard Worker std::string GetEventDescription(EventObj* event); 186*89c4ff92SAndroid Build Coastguard Worker 187*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe 188*89c4ff92SAndroid Build Coastguard Worker 189*89c4ff92SAndroid Build Coastguard Worker } // namespace arm