xref: /aosp_15_r20/external/armnn/profiling/common/src/CommonProfilingUtils.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 <common/include/Assert.hpp>
7*89c4ff92SAndroid Build Coastguard Worker #include <common/include/CommonProfilingUtils.hpp>
8*89c4ff92SAndroid Build Coastguard Worker #include <common/include/ProfilingException.hpp>
9*89c4ff92SAndroid Build Coastguard Worker 
10*89c4ff92SAndroid Build Coastguard Worker #include <iostream>
11*89c4ff92SAndroid Build Coastguard Worker #include <limits>
12*89c4ff92SAndroid Build Coastguard Worker #include <sstream>
13*89c4ff92SAndroid Build Coastguard Worker 
14*89c4ff92SAndroid Build Coastguard Worker namespace arm
15*89c4ff92SAndroid Build Coastguard Worker {
16*89c4ff92SAndroid Build Coastguard Worker 
17*89c4ff92SAndroid Build Coastguard Worker namespace pipe
18*89c4ff92SAndroid Build Coastguard Worker {
ReadBytes(const unsigned char * buffer,unsigned int offset,unsigned int valueSize,uint8_t outValue[])19*89c4ff92SAndroid Build Coastguard Worker void ReadBytes(const unsigned char* buffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[])
20*89c4ff92SAndroid Build Coastguard Worker {
21*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(buffer);
22*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(outValue);
23*89c4ff92SAndroid Build Coastguard Worker 
24*89c4ff92SAndroid Build Coastguard Worker     for (unsigned int i = 0; i < valueSize; i++, offset++)
25*89c4ff92SAndroid Build Coastguard Worker     {
26*89c4ff92SAndroid Build Coastguard Worker         outValue[i] = static_cast<uint8_t>(buffer[offset]);
27*89c4ff92SAndroid Build Coastguard Worker     }
28*89c4ff92SAndroid Build Coastguard Worker }
29*89c4ff92SAndroid Build Coastguard Worker 
ReadUint64(const unsigned char * buffer,unsigned int offset)30*89c4ff92SAndroid Build Coastguard Worker uint64_t ReadUint64(const unsigned char* buffer, unsigned int offset)
31*89c4ff92SAndroid Build Coastguard Worker {
32*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(buffer);
33*89c4ff92SAndroid Build Coastguard Worker 
34*89c4ff92SAndroid Build Coastguard Worker     uint64_t value = 0;
35*89c4ff92SAndroid Build Coastguard Worker     value  = static_cast<uint64_t>(buffer[offset]);
36*89c4ff92SAndroid Build Coastguard Worker     value |= static_cast<uint64_t>(buffer[offset + 1]) << 8;
37*89c4ff92SAndroid Build Coastguard Worker     value |= static_cast<uint64_t>(buffer[offset + 2]) << 16;
38*89c4ff92SAndroid Build Coastguard Worker     value |= static_cast<uint64_t>(buffer[offset + 3]) << 24;
39*89c4ff92SAndroid Build Coastguard Worker     value |= static_cast<uint64_t>(buffer[offset + 4]) << 32;
40*89c4ff92SAndroid Build Coastguard Worker     value |= static_cast<uint64_t>(buffer[offset + 5]) << 40;
41*89c4ff92SAndroid Build Coastguard Worker     value |= static_cast<uint64_t>(buffer[offset + 6]) << 48;
42*89c4ff92SAndroid Build Coastguard Worker     value |= static_cast<uint64_t>(buffer[offset + 7]) << 56;
43*89c4ff92SAndroid Build Coastguard Worker 
44*89c4ff92SAndroid Build Coastguard Worker     return value;
45*89c4ff92SAndroid Build Coastguard Worker }
46*89c4ff92SAndroid Build Coastguard Worker 
ReadUint32(const unsigned char * buffer,unsigned int offset)47*89c4ff92SAndroid Build Coastguard Worker uint32_t ReadUint32(const unsigned char* buffer, unsigned int offset)
48*89c4ff92SAndroid Build Coastguard Worker {
49*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(buffer);
50*89c4ff92SAndroid Build Coastguard Worker 
51*89c4ff92SAndroid Build Coastguard Worker     uint32_t value = 0;
52*89c4ff92SAndroid Build Coastguard Worker     value  = static_cast<uint32_t>(buffer[offset]);
53*89c4ff92SAndroid Build Coastguard Worker     value |= static_cast<uint32_t>(buffer[offset + 1]) << 8;
54*89c4ff92SAndroid Build Coastguard Worker     value |= static_cast<uint32_t>(buffer[offset + 2]) << 16;
55*89c4ff92SAndroid Build Coastguard Worker     value |= static_cast<uint32_t>(buffer[offset + 3]) << 24;
56*89c4ff92SAndroid Build Coastguard Worker     return value;
57*89c4ff92SAndroid Build Coastguard Worker }
58*89c4ff92SAndroid Build Coastguard Worker 
ReadUint16(const unsigned char * buffer,unsigned int offset)59*89c4ff92SAndroid Build Coastguard Worker uint16_t ReadUint16(const unsigned char* buffer, unsigned int offset)
60*89c4ff92SAndroid Build Coastguard Worker {
61*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(buffer);
62*89c4ff92SAndroid Build Coastguard Worker 
63*89c4ff92SAndroid Build Coastguard Worker     uint32_t value = 0;
64*89c4ff92SAndroid Build Coastguard Worker     value  = static_cast<uint32_t>(buffer[offset]);
65*89c4ff92SAndroid Build Coastguard Worker     value |= static_cast<uint32_t>(buffer[offset + 1]) << 8;
66*89c4ff92SAndroid Build Coastguard Worker     return static_cast<uint16_t>(value);
67*89c4ff92SAndroid Build Coastguard Worker }
68*89c4ff92SAndroid Build Coastguard Worker 
ReadUint8(const unsigned char * buffer,unsigned int offset)69*89c4ff92SAndroid Build Coastguard Worker uint8_t ReadUint8(const unsigned char* buffer, unsigned int offset)
70*89c4ff92SAndroid Build Coastguard Worker {
71*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(buffer);
72*89c4ff92SAndroid Build Coastguard Worker 
73*89c4ff92SAndroid Build Coastguard Worker     return buffer[offset];
74*89c4ff92SAndroid Build Coastguard Worker }
75*89c4ff92SAndroid Build Coastguard Worker 
WriteBytes(unsigned char * buffer,unsigned int offset,const void * value,unsigned int valueSize)76*89c4ff92SAndroid Build Coastguard Worker void WriteBytes(unsigned char* buffer, unsigned int offset, const void* value, unsigned int valueSize)
77*89c4ff92SAndroid Build Coastguard Worker {
78*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(buffer);
79*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(value);
80*89c4ff92SAndroid Build Coastguard Worker 
81*89c4ff92SAndroid Build Coastguard Worker     for (unsigned int i = 0; i < valueSize; i++, offset++)
82*89c4ff92SAndroid Build Coastguard Worker     {
83*89c4ff92SAndroid Build Coastguard Worker         buffer[offset] = *(reinterpret_cast<const unsigned char*>(value) + i);
84*89c4ff92SAndroid Build Coastguard Worker     }
85*89c4ff92SAndroid Build Coastguard Worker }
86*89c4ff92SAndroid Build Coastguard Worker 
WriteUint64(unsigned char * buffer,unsigned int offset,uint64_t value)87*89c4ff92SAndroid Build Coastguard Worker void WriteUint64(unsigned char* buffer, unsigned int offset, uint64_t value)
88*89c4ff92SAndroid Build Coastguard Worker {
89*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(buffer);
90*89c4ff92SAndroid Build Coastguard Worker 
91*89c4ff92SAndroid Build Coastguard Worker     buffer[offset]     = static_cast<unsigned char>(value & 0xFF);
92*89c4ff92SAndroid Build Coastguard Worker     buffer[offset + 1] = static_cast<unsigned char>((value >> 8) & 0xFF);
93*89c4ff92SAndroid Build Coastguard Worker     buffer[offset + 2] = static_cast<unsigned char>((value >> 16) & 0xFF);
94*89c4ff92SAndroid Build Coastguard Worker     buffer[offset + 3] = static_cast<unsigned char>((value >> 24) & 0xFF);
95*89c4ff92SAndroid Build Coastguard Worker     buffer[offset + 4] = static_cast<unsigned char>((value >> 32) & 0xFF);
96*89c4ff92SAndroid Build Coastguard Worker     buffer[offset + 5] = static_cast<unsigned char>((value >> 40) & 0xFF);
97*89c4ff92SAndroid Build Coastguard Worker     buffer[offset + 6] = static_cast<unsigned char>((value >> 48) & 0xFF);
98*89c4ff92SAndroid Build Coastguard Worker     buffer[offset + 7] = static_cast<unsigned char>((value >> 56) & 0xFF);
99*89c4ff92SAndroid Build Coastguard Worker }
100*89c4ff92SAndroid Build Coastguard Worker 
WriteUint32(unsigned char * buffer,unsigned int offset,uint32_t value)101*89c4ff92SAndroid Build Coastguard Worker void WriteUint32(unsigned char* buffer, unsigned int offset, uint32_t value)
102*89c4ff92SAndroid Build Coastguard Worker {
103*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(buffer);
104*89c4ff92SAndroid Build Coastguard Worker 
105*89c4ff92SAndroid Build Coastguard Worker     buffer[offset]     = static_cast<unsigned char>(value & 0xFF);
106*89c4ff92SAndroid Build Coastguard Worker     buffer[offset + 1] = static_cast<unsigned char>((value >> 8) & 0xFF);
107*89c4ff92SAndroid Build Coastguard Worker     buffer[offset + 2] = static_cast<unsigned char>((value >> 16) & 0xFF);
108*89c4ff92SAndroid Build Coastguard Worker     buffer[offset + 3] = static_cast<unsigned char>((value >> 24) & 0xFF);
109*89c4ff92SAndroid Build Coastguard Worker }
110*89c4ff92SAndroid Build Coastguard Worker 
WriteUint16(unsigned char * buffer,unsigned int offset,uint16_t value)111*89c4ff92SAndroid Build Coastguard Worker void WriteUint16(unsigned char* buffer, unsigned int offset, uint16_t value)
112*89c4ff92SAndroid Build Coastguard Worker {
113*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(buffer);
114*89c4ff92SAndroid Build Coastguard Worker 
115*89c4ff92SAndroid Build Coastguard Worker     buffer[offset]     = static_cast<unsigned char>(value & 0xFF);
116*89c4ff92SAndroid Build Coastguard Worker     buffer[offset + 1] = static_cast<unsigned char>((value >> 8) & 0xFF);
117*89c4ff92SAndroid Build Coastguard Worker }
118*89c4ff92SAndroid Build Coastguard Worker 
WriteUint8(unsigned char * buffer,unsigned int offset,uint8_t value)119*89c4ff92SAndroid Build Coastguard Worker void WriteUint8(unsigned char* buffer, unsigned int offset, uint8_t value)
120*89c4ff92SAndroid Build Coastguard Worker {
121*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(buffer);
122*89c4ff92SAndroid Build Coastguard Worker 
123*89c4ff92SAndroid Build Coastguard Worker     buffer[offset] = static_cast<unsigned char>(value);
124*89c4ff92SAndroid Build Coastguard Worker }
125*89c4ff92SAndroid Build Coastguard Worker 
CentreAlignFormatting(const std::string & stringToPass,const int spacingWidth)126*89c4ff92SAndroid Build Coastguard Worker std::string CentreAlignFormatting(const std::string& stringToPass, const int spacingWidth)
127*89c4ff92SAndroid Build Coastguard Worker {
128*89c4ff92SAndroid Build Coastguard Worker     std::stringstream outputStream, centrePadding;
129*89c4ff92SAndroid Build Coastguard Worker     int padding = spacingWidth - static_cast<int>(stringToPass.size());
130*89c4ff92SAndroid Build Coastguard Worker 
131*89c4ff92SAndroid Build Coastguard Worker     for (int i = 0; i < padding / 2; ++i)
132*89c4ff92SAndroid Build Coastguard Worker     {
133*89c4ff92SAndroid Build Coastguard Worker         centrePadding << " ";
134*89c4ff92SAndroid Build Coastguard Worker     }
135*89c4ff92SAndroid Build Coastguard Worker 
136*89c4ff92SAndroid Build Coastguard Worker     outputStream << centrePadding.str() << stringToPass << centrePadding.str();
137*89c4ff92SAndroid Build Coastguard Worker 
138*89c4ff92SAndroid Build Coastguard Worker     if (padding > 0 && padding %2 != 0)
139*89c4ff92SAndroid Build Coastguard Worker     {
140*89c4ff92SAndroid Build Coastguard Worker         outputStream << " ";
141*89c4ff92SAndroid Build Coastguard Worker     }
142*89c4ff92SAndroid Build Coastguard Worker 
143*89c4ff92SAndroid Build Coastguard Worker     return outputStream.str();
144*89c4ff92SAndroid Build Coastguard Worker }
145*89c4ff92SAndroid Build Coastguard Worker 
PrintDeviceDetails(const std::pair<const unsigned short,std::unique_ptr<Device>> & devicePair)146*89c4ff92SAndroid Build Coastguard Worker void PrintDeviceDetails(const std::pair<const unsigned short, std::unique_ptr<Device>>& devicePair)
147*89c4ff92SAndroid Build Coastguard Worker {
148*89c4ff92SAndroid Build Coastguard Worker     std::string body;
149*89c4ff92SAndroid Build Coastguard Worker 
150*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(devicePair.second->m_Name, 20));
151*89c4ff92SAndroid Build Coastguard Worker     body.append(" | ");
152*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(std::to_string(devicePair.first), 13));
153*89c4ff92SAndroid Build Coastguard Worker     body.append(" | ");
154*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(std::to_string(devicePair.second->m_Cores), 10));
155*89c4ff92SAndroid Build Coastguard Worker     body.append("\n");
156*89c4ff92SAndroid Build Coastguard Worker 
157*89c4ff92SAndroid Build Coastguard Worker     std::cout << std::string(body.size(), '-') << "\n";
158*89c4ff92SAndroid Build Coastguard Worker     std::cout<< body;
159*89c4ff92SAndroid Build Coastguard Worker }
160*89c4ff92SAndroid Build Coastguard Worker 
PrintCounterSetDetails(const std::pair<const unsigned short,std::unique_ptr<CounterSet>> & counterSetPair)161*89c4ff92SAndroid Build Coastguard Worker void PrintCounterSetDetails(const std::pair<const unsigned short, std::unique_ptr<CounterSet>>& counterSetPair)
162*89c4ff92SAndroid Build Coastguard Worker {
163*89c4ff92SAndroid Build Coastguard Worker     std::string body;
164*89c4ff92SAndroid Build Coastguard Worker 
165*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(counterSetPair.second->m_Name, 20));
166*89c4ff92SAndroid Build Coastguard Worker     body.append(" | ");
167*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(std::to_string(counterSetPair.first), 13));
168*89c4ff92SAndroid Build Coastguard Worker     body.append(" | ");
169*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(std::to_string(counterSetPair.second->m_Count), 10));
170*89c4ff92SAndroid Build Coastguard Worker     body.append("\n");
171*89c4ff92SAndroid Build Coastguard Worker 
172*89c4ff92SAndroid Build Coastguard Worker     std::cout << std::string(body.size(), '-') << "\n";
173*89c4ff92SAndroid Build Coastguard Worker 
174*89c4ff92SAndroid Build Coastguard Worker     std::cout<< body;
175*89c4ff92SAndroid Build Coastguard Worker }
176*89c4ff92SAndroid Build Coastguard Worker 
PrintCounterDetails(std::shared_ptr<Counter> & counter)177*89c4ff92SAndroid Build Coastguard Worker void PrintCounterDetails(std::shared_ptr<Counter>& counter)
178*89c4ff92SAndroid Build Coastguard Worker {
179*89c4ff92SAndroid Build Coastguard Worker     std::string body;
180*89c4ff92SAndroid Build Coastguard Worker 
181*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(counter->m_Name, 20));
182*89c4ff92SAndroid Build Coastguard Worker     body.append(" | ");
183*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(counter->m_Description, 50));
184*89c4ff92SAndroid Build Coastguard Worker     body.append(" | ");
185*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(counter->m_Units, 14));
186*89c4ff92SAndroid Build Coastguard Worker     body.append(" | ");
187*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(std::to_string(counter->m_Uid), 6));
188*89c4ff92SAndroid Build Coastguard Worker     body.append(" | ");
189*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(std::to_string(counter->m_MaxCounterUid), 10));
190*89c4ff92SAndroid Build Coastguard Worker     body.append(" | ");
191*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(std::to_string(counter->m_Class), 8));
192*89c4ff92SAndroid Build Coastguard Worker     body.append(" | ");
193*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(std::to_string(counter->m_Interpolation), 14));
194*89c4ff92SAndroid Build Coastguard Worker     body.append(" | ");
195*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(std::to_string(counter->m_Multiplier), 20));
196*89c4ff92SAndroid Build Coastguard Worker     body.append(" | ");
197*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(std::to_string(counter->m_CounterSetUid), 16));
198*89c4ff92SAndroid Build Coastguard Worker     body.append(" | ");
199*89c4ff92SAndroid Build Coastguard Worker     body.append(CentreAlignFormatting(std::to_string(counter->m_DeviceUid), 14));
200*89c4ff92SAndroid Build Coastguard Worker 
201*89c4ff92SAndroid Build Coastguard Worker     body.append("\n");
202*89c4ff92SAndroid Build Coastguard Worker 
203*89c4ff92SAndroid Build Coastguard Worker     std::cout << std::string(body.size(), '-') << "\n";
204*89c4ff92SAndroid Build Coastguard Worker 
205*89c4ff92SAndroid Build Coastguard Worker     std::cout << body;
206*89c4ff92SAndroid Build Coastguard Worker }
207*89c4ff92SAndroid Build Coastguard Worker 
PrintCategoryDetails(const std::unique_ptr<Category> & category,std::unordered_map<unsigned short,std::shared_ptr<Counter>> counterMap)208*89c4ff92SAndroid Build Coastguard Worker void PrintCategoryDetails(const std::unique_ptr<Category>& category,
209*89c4ff92SAndroid Build Coastguard Worker                           std::unordered_map<unsigned short, std::shared_ptr<Counter>> counterMap)
210*89c4ff92SAndroid Build Coastguard Worker {
211*89c4ff92SAndroid Build Coastguard Worker     std::string categoryBody;
212*89c4ff92SAndroid Build Coastguard Worker     std::string categoryHeader;
213*89c4ff92SAndroid Build Coastguard Worker 
214*89c4ff92SAndroid Build Coastguard Worker     categoryHeader.append(CentreAlignFormatting("Name", 20));
215*89c4ff92SAndroid Build Coastguard Worker     categoryHeader.append(" | ");
216*89c4ff92SAndroid Build Coastguard Worker     categoryHeader.append(CentreAlignFormatting("Event Count", 14));
217*89c4ff92SAndroid Build Coastguard Worker     categoryHeader.append("\n");
218*89c4ff92SAndroid Build Coastguard Worker 
219*89c4ff92SAndroid Build Coastguard Worker     categoryBody.append(CentreAlignFormatting(category->m_Name, 20));
220*89c4ff92SAndroid Build Coastguard Worker     categoryBody.append(" | ");
221*89c4ff92SAndroid Build Coastguard Worker     categoryBody.append(CentreAlignFormatting(std::to_string(category->m_Counters.size()), 14));
222*89c4ff92SAndroid Build Coastguard Worker 
223*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n" << "\n";
224*89c4ff92SAndroid Build Coastguard Worker     std::cout << CentreAlignFormatting("CATEGORY", static_cast<int>(categoryHeader.size()));
225*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n";
226*89c4ff92SAndroid Build Coastguard Worker     std::cout << std::string(categoryHeader.size(), '=') << "\n";
227*89c4ff92SAndroid Build Coastguard Worker 
228*89c4ff92SAndroid Build Coastguard Worker     std::cout << categoryHeader;
229*89c4ff92SAndroid Build Coastguard Worker 
230*89c4ff92SAndroid Build Coastguard Worker     std::cout << std::string(categoryBody.size(), '-') << "\n";
231*89c4ff92SAndroid Build Coastguard Worker 
232*89c4ff92SAndroid Build Coastguard Worker     std::cout << categoryBody;
233*89c4ff92SAndroid Build Coastguard Worker 
234*89c4ff92SAndroid Build Coastguard Worker     std::string counterHeader;
235*89c4ff92SAndroid Build Coastguard Worker 
236*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(CentreAlignFormatting("Counter Name", 20));
237*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(" | ");
238*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(CentreAlignFormatting("Description", 50));
239*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(" | ");
240*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(CentreAlignFormatting("Units", 14));
241*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(" | ");
242*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(CentreAlignFormatting("UID", 6));
243*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(" | ");
244*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(CentreAlignFormatting("Max UID", 10));
245*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(" | ");
246*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(CentreAlignFormatting("Class", 8));
247*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(" | ");
248*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(CentreAlignFormatting("Interpolation", 14));
249*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(" | ");
250*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(CentreAlignFormatting("Multiplier", 20));
251*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(" | ");
252*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(CentreAlignFormatting("Counter set UID", 16));
253*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(" | ");
254*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append(CentreAlignFormatting("Device UID", 14));
255*89c4ff92SAndroid Build Coastguard Worker     counterHeader.append("\n");
256*89c4ff92SAndroid Build Coastguard Worker 
257*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n" << "\n";
258*89c4ff92SAndroid Build Coastguard Worker     std::cout << CentreAlignFormatting("EVENTS IN CATEGORY: " + category->m_Name,
259*89c4ff92SAndroid Build Coastguard Worker                                        static_cast<int>(counterHeader.size()));
260*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n";
261*89c4ff92SAndroid Build Coastguard Worker     std::cout << std::string(counterHeader.size(), '=') << "\n";
262*89c4ff92SAndroid Build Coastguard Worker     std::cout << counterHeader;
263*89c4ff92SAndroid Build Coastguard Worker     for (auto& it: category->m_Counters) {
264*89c4ff92SAndroid Build Coastguard Worker         auto search = counterMap.find(it);
265*89c4ff92SAndroid Build Coastguard Worker         if(search != counterMap.end()) {
266*89c4ff92SAndroid Build Coastguard Worker             PrintCounterDetails(search->second);
267*89c4ff92SAndroid Build Coastguard Worker         }
268*89c4ff92SAndroid Build Coastguard Worker     }
269*89c4ff92SAndroid Build Coastguard Worker }
270*89c4ff92SAndroid Build Coastguard Worker 
PrintCounterDirectory(ICounterDirectory & counterDirectory)271*89c4ff92SAndroid Build Coastguard Worker void PrintCounterDirectory(ICounterDirectory& counterDirectory)
272*89c4ff92SAndroid Build Coastguard Worker {
273*89c4ff92SAndroid Build Coastguard Worker     std::string devicesHeader;
274*89c4ff92SAndroid Build Coastguard Worker 
275*89c4ff92SAndroid Build Coastguard Worker     devicesHeader.append(CentreAlignFormatting("Device name", 20));
276*89c4ff92SAndroid Build Coastguard Worker     devicesHeader.append(" | ");
277*89c4ff92SAndroid Build Coastguard Worker     devicesHeader.append(CentreAlignFormatting("UID", 13));
278*89c4ff92SAndroid Build Coastguard Worker     devicesHeader.append(" | ");
279*89c4ff92SAndroid Build Coastguard Worker     devicesHeader.append(CentreAlignFormatting("Cores", 10));
280*89c4ff92SAndroid Build Coastguard Worker     devicesHeader.append("\n");
281*89c4ff92SAndroid Build Coastguard Worker 
282*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n" << "\n";
283*89c4ff92SAndroid Build Coastguard Worker     std::cout << CentreAlignFormatting("DEVICES", static_cast<int>(devicesHeader.size()));
284*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n";
285*89c4ff92SAndroid Build Coastguard Worker     std::cout << std::string(devicesHeader.size(), '=') << "\n";
286*89c4ff92SAndroid Build Coastguard Worker     std::cout << devicesHeader;
287*89c4ff92SAndroid Build Coastguard Worker     for (auto& it: counterDirectory.GetDevices()) {
288*89c4ff92SAndroid Build Coastguard Worker         PrintDeviceDetails(it);
289*89c4ff92SAndroid Build Coastguard Worker     }
290*89c4ff92SAndroid Build Coastguard Worker 
291*89c4ff92SAndroid Build Coastguard Worker     std::string counterSetHeader;
292*89c4ff92SAndroid Build Coastguard Worker 
293*89c4ff92SAndroid Build Coastguard Worker     counterSetHeader.append(CentreAlignFormatting("Counter set name", 20));
294*89c4ff92SAndroid Build Coastguard Worker     counterSetHeader.append(" | ");
295*89c4ff92SAndroid Build Coastguard Worker     counterSetHeader.append(CentreAlignFormatting("UID", 13));
296*89c4ff92SAndroid Build Coastguard Worker     counterSetHeader.append(" | ");
297*89c4ff92SAndroid Build Coastguard Worker     counterSetHeader.append(CentreAlignFormatting("Count", 10));
298*89c4ff92SAndroid Build Coastguard Worker     counterSetHeader.append("\n");
299*89c4ff92SAndroid Build Coastguard Worker 
300*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n" << "\n";
301*89c4ff92SAndroid Build Coastguard Worker     std::cout << CentreAlignFormatting("COUNTER SETS", static_cast<int>(counterSetHeader.size()));
302*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n";
303*89c4ff92SAndroid Build Coastguard Worker     std::cout << std::string(counterSetHeader.size(), '=') << "\n";
304*89c4ff92SAndroid Build Coastguard Worker 
305*89c4ff92SAndroid Build Coastguard Worker     std::cout << counterSetHeader;
306*89c4ff92SAndroid Build Coastguard Worker 
307*89c4ff92SAndroid Build Coastguard Worker     for (auto& it: counterDirectory.GetCounterSets()) {
308*89c4ff92SAndroid Build Coastguard Worker         PrintCounterSetDetails(it);
309*89c4ff92SAndroid Build Coastguard Worker     }
310*89c4ff92SAndroid Build Coastguard Worker 
311*89c4ff92SAndroid Build Coastguard Worker     auto counters = counterDirectory.GetCounters();
312*89c4ff92SAndroid Build Coastguard Worker     for (auto& it: counterDirectory.GetCategories()) {
313*89c4ff92SAndroid Build Coastguard Worker         PrintCategoryDetails(it, counters);
314*89c4ff92SAndroid Build Coastguard Worker     }
315*89c4ff92SAndroid Build Coastguard Worker     std::cout << "\n";
316*89c4ff92SAndroid Build Coastguard Worker }
317*89c4ff92SAndroid Build Coastguard Worker 
318*89c4ff92SAndroid Build Coastguard Worker namespace
319*89c4ff92SAndroid Build Coastguard Worker {
320*89c4ff92SAndroid Build Coastguard Worker 
ThrowIfCantGenerateNextUid(uint16_t uid,uint16_t cores=0)321*89c4ff92SAndroid Build Coastguard Worker void ThrowIfCantGenerateNextUid(uint16_t uid, uint16_t cores = 0)
322*89c4ff92SAndroid Build Coastguard Worker {
323*89c4ff92SAndroid Build Coastguard Worker     // Check that it is possible to generate the next UID without causing an overflow
324*89c4ff92SAndroid Build Coastguard Worker     switch (cores)
325*89c4ff92SAndroid Build Coastguard Worker     {
326*89c4ff92SAndroid Build Coastguard Worker     case 0:
327*89c4ff92SAndroid Build Coastguard Worker     case 1:
328*89c4ff92SAndroid Build Coastguard Worker         // Number of cores not specified or set to 1 (a value of zero indicates the device is not capable of
329*89c4ff92SAndroid Build Coastguard Worker         // running multiple parallel workloads and will not provide multiple streams of data for each event)
330*89c4ff92SAndroid Build Coastguard Worker         if (uid == std::numeric_limits<uint16_t>::max())
331*89c4ff92SAndroid Build Coastguard Worker         {
332*89c4ff92SAndroid Build Coastguard Worker             throw arm::pipe::ProfilingException("Generating the next UID for profiling would result in an overflow");
333*89c4ff92SAndroid Build Coastguard Worker         }
334*89c4ff92SAndroid Build Coastguard Worker         break;
335*89c4ff92SAndroid Build Coastguard Worker     default: // cores > 1
336*89c4ff92SAndroid Build Coastguard Worker         // Multiple cores available, as max_counter_uid has to be set to: counter_uid + cores - 1, the maximum
337*89c4ff92SAndroid Build Coastguard Worker         // allowed value for a counter UID is consequently: uint16_t_max - cores + 1
338*89c4ff92SAndroid Build Coastguard Worker         if (uid >= std::numeric_limits<uint16_t>::max() - cores + 1)
339*89c4ff92SAndroid Build Coastguard Worker         {
340*89c4ff92SAndroid Build Coastguard Worker             throw arm::pipe::ProfilingException("Generating the next UID for profiling would result in an overflow");
341*89c4ff92SAndroid Build Coastguard Worker         }
342*89c4ff92SAndroid Build Coastguard Worker         break;
343*89c4ff92SAndroid Build Coastguard Worker     }
344*89c4ff92SAndroid Build Coastguard Worker }
345*89c4ff92SAndroid Build Coastguard Worker 
346*89c4ff92SAndroid Build Coastguard Worker } // Anonymous namespace
347*89c4ff92SAndroid Build Coastguard Worker 
GetNextUid(bool peekOnly)348*89c4ff92SAndroid Build Coastguard Worker uint16_t GetNextUid(bool peekOnly)
349*89c4ff92SAndroid Build Coastguard Worker {
350*89c4ff92SAndroid Build Coastguard Worker     // The UID used for profiling objects and events. The first valid UID is 1, as 0 is a reserved value
351*89c4ff92SAndroid Build Coastguard Worker     static uint16_t uid = 1;
352*89c4ff92SAndroid Build Coastguard Worker 
353*89c4ff92SAndroid Build Coastguard Worker     // Check that it is possible to generate the next UID without causing an overflow (throws in case of error)
354*89c4ff92SAndroid Build Coastguard Worker     ThrowIfCantGenerateNextUid(uid);
355*89c4ff92SAndroid Build Coastguard Worker 
356*89c4ff92SAndroid Build Coastguard Worker     if (peekOnly)
357*89c4ff92SAndroid Build Coastguard Worker     {
358*89c4ff92SAndroid Build Coastguard Worker         // Peek only
359*89c4ff92SAndroid Build Coastguard Worker         return uid;
360*89c4ff92SAndroid Build Coastguard Worker     }
361*89c4ff92SAndroid Build Coastguard Worker     else
362*89c4ff92SAndroid Build Coastguard Worker     {
363*89c4ff92SAndroid Build Coastguard Worker         // Get the next UID
364*89c4ff92SAndroid Build Coastguard Worker         return uid++;
365*89c4ff92SAndroid Build Coastguard Worker     }
366*89c4ff92SAndroid Build Coastguard Worker }
367*89c4ff92SAndroid Build Coastguard Worker 
GetNextCounterUids(uint16_t firstUid,uint16_t cores)368*89c4ff92SAndroid Build Coastguard Worker std::vector<uint16_t> GetNextCounterUids(uint16_t firstUid, uint16_t cores)
369*89c4ff92SAndroid Build Coastguard Worker {
370*89c4ff92SAndroid Build Coastguard Worker     // Check that it is possible to generate the next counter UID without causing an overflow (throws in case of error)
371*89c4ff92SAndroid Build Coastguard Worker     ThrowIfCantGenerateNextUid(firstUid, cores);
372*89c4ff92SAndroid Build Coastguard Worker 
373*89c4ff92SAndroid Build Coastguard Worker     // Get the next counter UIDs
374*89c4ff92SAndroid Build Coastguard Worker     size_t counterUidsSize = cores == 0 ? 1 : cores;
375*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint16_t> counterUids(counterUidsSize, 0);
376*89c4ff92SAndroid Build Coastguard Worker     for (size_t i = 0; i < counterUidsSize; i++)
377*89c4ff92SAndroid Build Coastguard Worker     {
378*89c4ff92SAndroid Build Coastguard Worker         counterUids[i] = firstUid++;
379*89c4ff92SAndroid Build Coastguard Worker     }
380*89c4ff92SAndroid Build Coastguard Worker     return counterUids;
381*89c4ff92SAndroid Build Coastguard Worker }
382*89c4ff92SAndroid Build Coastguard Worker 
383*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe
384*89c4ff92SAndroid Build Coastguard Worker } // namespace arm
385