// // Copyright © 2019 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #include "TimelineCaptureCommandHandler.hpp" #include #include namespace armnn { namespace gatordmock { //Array of member functions, the array index matches the decl_id const TimelineCaptureCommandHandler::ReadFunction TimelineCaptureCommandHandler::m_ReadFunctions[5] { &TimelineCaptureCommandHandler::ReadLabel, // Label decl_id = 0 &TimelineCaptureCommandHandler::ReadEntity, // Entity decl_id = 1 &TimelineCaptureCommandHandler::ReadEventClass, // EventClass decl_id = 2 &TimelineCaptureCommandHandler::ReadRelationship, // Relationship decl_id = 3 &TimelineCaptureCommandHandler::ReadEvent // Event decl_id = 4 }; void TimelineCaptureCommandHandler::ParseData(const armnn::profiling::Packet& packet) { uint32_t offset = 0; if (packet.GetLength() < 8) { return; } const unsigned char* data = reinterpret_cast(packet.GetData()); uint32_t declId = 0; declId = profiling::ReadUint32(data, offset); offset += uint32_t_size; (this->*m_ReadFunctions[declId])(data, offset); } void TimelineCaptureCommandHandler::ReadLabel(const unsigned char* data, uint32_t offset) { Label label; label.m_Guid = profiling::ReadUint64(data, offset); offset += uint64_t_size; uint32_t nameLength = profiling::ReadUint32(data, offset); offset += uint32_t_size; label.m_Name = new char[nameLength]; for (uint32_t i = 0; i< nameLength; ++i) { label.m_Name[i] = static_cast(profiling::ReadUint8(data, offset + i)); } CreateLabel(label, m_Model); if (!m_QuietOperation) { printLabels(); } } void TimelineCaptureCommandHandler::ReadEntity(const unsigned char* data, uint32_t offset) { Entity entity; entity.m_Guid = profiling::ReadUint64(data, offset); CreateEntity(entity, m_Model); if (!m_QuietOperation) { printEntities(); } } void TimelineCaptureCommandHandler::ReadEventClass(const unsigned char* data, uint32_t offset) { EventClass eventClass; eventClass.m_Guid = profiling::ReadUint64(data, offset); CreateEventClass(eventClass, m_Model); if (!m_QuietOperation) { printEventClasses(); } } void TimelineCaptureCommandHandler::ReadRelationship(const unsigned char* data, uint32_t offset) { Relationship relationship; relationship.m_RelationshipType = static_cast(profiling::ReadUint32(data, offset)); offset += uint32_t_size; relationship.m_Guid = profiling::ReadUint64(data, offset); offset += uint64_t_size; relationship.m_HeadGuid = profiling::ReadUint64(data, offset); offset += uint64_t_size; relationship.m_TailGuid = profiling::ReadUint64(data, offset); CreateRelationship(relationship, m_Model); if (!m_QuietOperation) { printRelationships(); } } void TimelineCaptureCommandHandler::ReadEvent(const unsigned char* data, uint32_t offset) { Event event; event.m_TimeStamp = profiling::ReadUint64(data, offset); offset += uint64_t_size; event.m_ThreadId = new uint8_t[threadId_size]; profiling::ReadBytes(data, offset, threadId_size, event.m_ThreadId); offset += threadId_size; event.m_Guid = profiling::ReadUint64(data, offset); CreateEvent(event, m_Model); if (!m_QuietOperation) { printEvents(); } } void TimelineCaptureCommandHandler::operator()(const profiling::Packet& packet) { ParseData(packet); } void TimelineCaptureCommandHandler::printLabels() { std::string header; header.append(profiling::CentreAlignFormatting("guid", 12)); header.append(" | "); header.append(profiling::CentreAlignFormatting("value", 30)); header.append("\n"); std::cout << "\n" << "\n"; std::cout << profiling::CentreAlignFormatting("LABELS", static_cast(header.size())); std::cout << "\n"; std::cout << std::string(header.size(), '=') << "\n"; std::cout << header; for (uint32_t i = 0; i < m_Model->m_LabelCount; ++i) { std::string body; body.append(profiling::CentreAlignFormatting(std::to_string(m_Model->m_Labels[i]->m_Guid), 12)); body.append(" | "); body.append(profiling::CentreAlignFormatting(m_Model->m_Labels[i]->m_Name, 30)); body.append("\n"); std::cout << std::string(body.size(), '-') << "\n"; std::cout<< body; } } void TimelineCaptureCommandHandler::printEntities() { std::string header; header.append(profiling::CentreAlignFormatting("guid", 12)); header.append("\n"); std::cout << "\n" << "\n"; std::cout << profiling::CentreAlignFormatting("ENTITIES", static_cast(header.size())); std::cout << "\n"; std::cout << std::string(header.size(), '=') << "\n"; std::cout << header; for (uint32_t i = 0; i < m_Model->m_EntityCount; ++i) { std::string body; body.append(profiling::CentreAlignFormatting(std::to_string(m_Model->m_Entities[i]->m_Guid), 12)); body.append("\n"); std::cout << std::string(body.size(), '-') << "\n"; std::cout<< body; } } void TimelineCaptureCommandHandler::printEventClasses() { std::string header; header.append(profiling::CentreAlignFormatting("guid", 12)); header.append("\n"); std::cout << "\n" << "\n"; std::cout << profiling::CentreAlignFormatting("EVENT CLASSES", static_cast(header.size())); std::cout << "\n"; std::cout << std::string(header.size(), '=') << "\n"; std::cout << header; for (uint32_t i = 0; i < m_Model->m_EventClassCount; ++i) { std::string body; body.append(profiling::CentreAlignFormatting(std::to_string(m_Model->m_EventClasses[i]->m_Guid), 12)); body.append("\n"); std::cout << std::string(body.size(), '-') << "\n"; std::cout<< body; } } void TimelineCaptureCommandHandler::printRelationships() { std::string header; header.append(profiling::CentreAlignFormatting("relationshipType", 20)); header.append(" | "); header.append(profiling::CentreAlignFormatting("relationshipGuid", 20)); header.append(" | "); header.append(profiling::CentreAlignFormatting("headGuid", 12)); header.append(" | "); header.append(profiling::CentreAlignFormatting("tailGuid", 12)); header.append("\n"); std::cout << "\n" << "\n"; std::cout << profiling::CentreAlignFormatting("RELATIONSHIPS", static_cast(header.size())); std::cout << "\n"; std::cout << std::string(header.size(), '=') << "\n"; std::cout << header; for (uint32_t i = 0; i < m_Model->m_RelationshipCount; ++i) { std::string body; body.append( profiling::CentreAlignFormatting(std::to_string(m_Model->m_Relationships[i]->m_RelationshipType), 20)); body.append(" | "); body.append(profiling::CentreAlignFormatting(std::to_string(m_Model->m_Relationships[i]->m_Guid), 20)); body.append(" | "); body.append(profiling::CentreAlignFormatting(std::to_string(m_Model->m_Relationships[i]->m_HeadGuid), 12)); body.append(" | "); body.append(profiling::CentreAlignFormatting(std::to_string(m_Model->m_Relationships[i]->m_TailGuid), 12)); body.append(" | "); body.append("\n"); std::cout << std::string(body.size(), '-') << "\n"; std::cout<< body; } } void TimelineCaptureCommandHandler::printEvents() { std::string header; header.append(profiling::CentreAlignFormatting("timestamp", 12)); header.append(" | "); header.append(profiling::CentreAlignFormatting("threadId", 12)); header.append(" | "); header.append(profiling::CentreAlignFormatting("eventGuid", 12)); header.append("\n"); std::cout << "\n" << "\n"; std::cout << profiling::CentreAlignFormatting("EVENTS", static_cast(header.size())); std::cout << "\n"; std::cout << std::string(header.size(), '=') << "\n"; std::cout << header; for (uint32_t i = 0; i < m_Model->m_EventCount; ++i) { std::string body; body.append(profiling::CentreAlignFormatting(std::to_string(m_Model->m_Events[i]->m_TimeStamp), 12)); body.append(" | "); std::string threadId; for(uint32_t j =0; j< threadId_size; j++) { threadId += static_cast(m_Model->m_Events[i]->m_ThreadId[j]); } body.append(profiling::CentreAlignFormatting(threadId, 12)); body.append(" | "); body.append(profiling::CentreAlignFormatting(std::to_string(m_Model->m_Events[i]->m_Guid), 12)); body.append("\n"); std::cout << std::string(body.size(), '-') << "\n"; std::cout<< body; } } } //namespace gatordmock } //namespace armnn