aboutsummaryrefslogtreecommitdiff
path: root/21.02/_profiling_utils_8cpp_source.xhtml
blob: 731bd6cfcce08656db5b2fac0d4ae50d06f1b12f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
<!-- Copyright (c) 2020 ARM Limited. -->
<!--                                 -->
<!-- SPDX-License-Identifier: MIT    -->
<!--                                 -->
<!-- HTML header for doxygen 1.8.13-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="robots" content="NOINDEX, NOFOLLOW" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>ArmNN: src/profiling/ProfilingUtils.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
</script><script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="stylesheet.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <img alt="ArmNN" src="Arm_NN_horizontal_blue.png" style="max-width: 10rem; margin-top: .5rem; margin-left 10px"/>
  <td style="padding-left: 0.5em;">
   <div id="projectname">
   &#160;<span id="projectnumber">21.02</span>
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('_profiling_utils_8cpp_source.xhtml','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">ProfilingUtils.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_profiling_utils_8cpp.xhtml">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">// SPDX-License-Identifier: MIT</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;</div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_profiling_utils_8hpp.xhtml">ProfilingUtils.hpp</a>&quot;</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="preprocessor">#include &lt;common/include/CommonProfilingUtils.hpp&gt;</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="preprocessor">#include &lt;common/include/ProfilingException.hpp&gt;</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="preprocessor">#include &lt;common/include/SwTrace.hpp&gt;</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;</div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="include_2armnn_2_version_8hpp.xhtml">armnn/Version.hpp</a>&gt;</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;</div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_wall_clock_timer_8hpp.xhtml">WallClockTimer.hpp</a>&gt;</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;</div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_assert_8hpp.xhtml">armnn/utility/Assert.hpp</a>&gt;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="preprocessor">#include &lt;fstream&gt;</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="preprocessor">#include &lt;limits&gt;</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;</div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacearmnn.xhtml">armnn</a></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;{</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;</div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="keyword">namespace </span>profiling</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;{</div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="keyword">namespace</span></div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;{</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="keywordtype">void</span> ThrowIfCantGenerateNextUid(uint16_t uid, uint16_t cores = 0)</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;{</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;    <span class="comment">// Check that it is possible to generate the next UID without causing an overflow</span></div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;    <span class="keywordflow">switch</span> (cores)</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;    {</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;    <span class="keywordflow">case</span> 0:</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;    <span class="keywordflow">case</span> 1:</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;        <span class="comment">// Number of cores not specified or set to 1 (a value of zero indicates the device is not capable of</span></div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;        <span class="comment">// running multiple parallel workloads and will not provide multiple streams of data for each event)</span></div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;        <span class="keywordflow">if</span> (uid == std::numeric_limits&lt;uint16_t&gt;::max())</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;        {</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;            <span class="keywordflow">throw</span> RuntimeException(<span class="stringliteral">&quot;Generating the next UID for profiling would result in an overflow&quot;</span>);</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;        }</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;    <span class="keywordflow">default</span>: <span class="comment">// cores &gt; 1</span></div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;        <span class="comment">// Multiple cores available, as max_counter_uid has to be set to: counter_uid + cores - 1, the maximum</span></div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;        <span class="comment">// allowed value for a counter UID is consequently: uint16_t_max - cores + 1</span></div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;        <span class="keywordflow">if</span> (uid &gt;= std::numeric_limits&lt;uint16_t&gt;::max() - cores + 1)</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;        {</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;            <span class="keywordflow">throw</span> RuntimeException(<span class="stringliteral">&quot;Generating the next UID for profiling would result in an overflow&quot;</span>);</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;        }</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;    }</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;}</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;} <span class="comment">// Anonymous namespace</span></div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;</div><div class="line"><a name="l00058"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a982b094fe2faa67a3560cdaf3901d0f8">   58</a></span>&#160;uint16_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#a982b094fe2faa67a3560cdaf3901d0f8">GetNextUid</a>(<span class="keywordtype">bool</span> peekOnly)</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;{</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;    <span class="comment">// The UID used for profiling objects and events. The first valid UID is 1, as 0 is a reserved value</span></div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;    <span class="keyword">static</span> uint16_t uid = 1;</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;    <span class="comment">// Check that it is possible to generate the next UID without causing an overflow (throws in case of error)</span></div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;    ThrowIfCantGenerateNextUid(uid);</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;    <span class="keywordflow">if</span> (peekOnly)</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;    {</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;        <span class="comment">// Peek only</span></div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;        <span class="keywordflow">return</span> uid;</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;    }</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;    {</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;        <span class="comment">// Get the next UID</span></div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;        <span class="keywordflow">return</span> uid++;</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;    }</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;}</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;</div><div class="line"><a name="l00078"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a6605c82bc625fbd40f24d35edee15fe3">   78</a></span>&#160;std::vector&lt;uint16_t&gt; <a class="code" href="namespacearmnn_1_1profiling.xhtml#a6605c82bc625fbd40f24d35edee15fe3">GetNextCounterUids</a>(uint16_t firstUid, uint16_t cores)</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;{</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;    <span class="comment">// Check that it is possible to generate the next counter UID without causing an overflow (throws in case of error)</span></div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;    ThrowIfCantGenerateNextUid(firstUid, cores);</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;    <span class="comment">// Get the next counter UIDs</span></div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;    <span class="keywordtype">size_t</span> counterUidsSize = cores == 0 ? 1 : cores;</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;    std::vector&lt;uint16_t&gt; counterUids(counterUidsSize, 0);</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; counterUidsSize; i++)</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;    {</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;        counterUids[i] = firstUid++;</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;    }</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;    <span class="keywordflow">return</span> counterUids;</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;}</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;</div><div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#af0cddaa4e116d294dacaaced90ca341c">   93</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#af0cddaa4e116d294dacaaced90ca341c">WriteBytes</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">IPacketBufferPtr</a>&amp; packetBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset,  <span class="keyword">const</span> <span class="keywordtype">void</span>* value, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> valueSize)</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;{</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(packetBuffer);</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#af0cddaa4e116d294dacaaced90ca341c">WriteBytes</a>(packetBuffer-&gt;GetWritableData(), offset, value, valueSize);</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;}</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;</div><div class="line"><a name="l00100"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">  100</a></span>&#160;uint32_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">ConstructHeader</a>(uint32_t packetFamily,</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;                         uint32_t packetId)</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;{</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;    <span class="keywordflow">return</span> (( packetFamily &amp; 0x0000003F ) &lt;&lt; 26 )|</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;           (( packetId     &amp; 0x000003FF ) &lt;&lt; 16 );</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;}</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;</div><div class="line"><a name="l00107"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a59d5594b6e4e7d3fe9dbde5febd8da81">  107</a></span>&#160;uint32_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">ConstructHeader</a>(uint32_t packetFamily, uint32_t packetClass, uint32_t packetType)</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;{</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;    <span class="keywordflow">return</span> ((packetFamily &amp; 0x0000003F) &lt;&lt; 26) |</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;           ((packetClass  &amp; 0x0000007F) &lt;&lt; 19) |</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;           ((packetType   &amp; 0x00000007) &lt;&lt; 16);</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;}</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">  114</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">WriteUint64</a>(<span class="keyword">const</span> std::unique_ptr&lt;IPacketBuffer&gt;&amp; packetBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset, uint64_t value)</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;{</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(packetBuffer);</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">WriteUint64</a>(packetBuffer-&gt;GetWritableData(), offset, value);</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;}</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">  121</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">IPacketBufferPtr</a>&amp; packetBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset, uint32_t value)</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;{</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(packetBuffer);</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(packetBuffer-&gt;GetWritableData(), offset, value);</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;}</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;</div><div class="line"><a name="l00128"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#ae5ace88c65e65ab7cf5572613601a60d">  128</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#ae5ace88c65e65ab7cf5572613601a60d">WriteUint16</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">IPacketBufferPtr</a>&amp; packetBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset, uint16_t value)</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;{</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(packetBuffer);</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#ae5ace88c65e65ab7cf5572613601a60d">WriteUint16</a>(packetBuffer-&gt;GetWritableData(), offset, value);</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;}</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;</div><div class="line"><a name="l00135"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#af63b6e5ffc769286c32d55a090b1602a">  135</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#af63b6e5ffc769286c32d55a090b1602a">WriteUint8</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">IPacketBufferPtr</a>&amp; packetBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset, uint8_t value)</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;{</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(packetBuffer);</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#af63b6e5ffc769286c32d55a090b1602a">WriteUint8</a>(packetBuffer-&gt;GetWritableData(), offset, value);</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;}</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;</div><div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a1c81dacff6eb2062571f7f4db1cb7617">  142</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#af0cddaa4e116d294dacaaced90ca341c">WriteBytes</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset, <span class="keyword">const</span> <span class="keywordtype">void</span>* value, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> valueSize)</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;{</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a1c81dacff6eb2062571f7f4db1cb7617">arm::pipe::WriteBytes</a>(buffer, offset, value, valueSize);</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;}</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;</div><div class="line"><a name="l00147"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#af2bb4db604c56391c1361b32402c65a7">  147</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">WriteUint64</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset, uint64_t value)</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;{</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#af2bb4db604c56391c1361b32402c65a7">arm::pipe::WriteUint64</a>(buffer, offset, value);</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;}</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;</div><div class="line"><a name="l00152"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#aa3e447531d9bdaad3da25f23edf18fb4">  152</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset, uint32_t value)</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;{</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#aa3e447531d9bdaad3da25f23edf18fb4">arm::pipe::WriteUint32</a>(buffer, offset, value);</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;}</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;</div><div class="line"><a name="l00157"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a0cf33f59f4e39a415e08497644b0b6f8">  157</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#ae5ace88c65e65ab7cf5572613601a60d">WriteUint16</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset, uint16_t value)</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;{</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a0cf33f59f4e39a415e08497644b0b6f8">arm::pipe::WriteUint16</a>(buffer, offset, value);</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;}</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;</div><div class="line"><a name="l00162"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#ae00e76f4552e2dad3bdcf1dd72100b4f">  162</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#af63b6e5ffc769286c32d55a090b1602a">WriteUint8</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset, uint8_t value)</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;{</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#ae00e76f4552e2dad3bdcf1dd72100b4f">arm::pipe::WriteUint8</a>(buffer, offset, value);</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;}</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;</div><div class="line"><a name="l00167"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a097646e1b460c992b553061a3436fb47">  167</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a097646e1b460c992b553061a3436fb47">ReadBytes</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">IPacketBufferPtr</a>&amp; packetBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> valueSize, uint8_t outValue[])</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;{</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(packetBuffer);</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a097646e1b460c992b553061a3436fb47">ReadBytes</a>(packetBuffer-&gt;GetReadableData(), offset, valueSize, outValue);</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;}</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;</div><div class="line"><a name="l00174"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#aa4de2b511faa41accc2c35cadf051124">  174</a></span>&#160;uint64_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#aa4de2b511faa41accc2c35cadf051124">ReadUint64</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">IPacketBufferPtr</a>&amp; packetBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset)</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;{</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(packetBuffer);</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#aa4de2b511faa41accc2c35cadf051124">ReadUint64</a>(packetBuffer-&gt;GetReadableData(), offset);</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;}</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;</div><div class="line"><a name="l00181"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#ad56f4c3ea5e88279bb6ef1f31d9dc6df">  181</a></span>&#160;uint32_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#ad56f4c3ea5e88279bb6ef1f31d9dc6df">ReadUint32</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">IPacketBufferPtr</a>&amp; packetBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset)</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;{</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(packetBuffer);</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#ad56f4c3ea5e88279bb6ef1f31d9dc6df">ReadUint32</a>(packetBuffer-&gt;GetReadableData(), offset);</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;}</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;</div><div class="line"><a name="l00188"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a0ffb94cb0085a54a92f1c4eeaa6cf772">  188</a></span>&#160;uint16_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#a0ffb94cb0085a54a92f1c4eeaa6cf772">ReadUint16</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">IPacketBufferPtr</a>&amp; packetBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset)</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;{</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(packetBuffer);</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a0ffb94cb0085a54a92f1c4eeaa6cf772">ReadUint16</a>(packetBuffer-&gt;GetReadableData(), offset);</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;}</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;</div><div class="line"><a name="l00195"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a74b483b652cc32f03151b10a1366d607">  195</a></span>&#160;uint8_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#a74b483b652cc32f03151b10a1366d607">ReadUint8</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">IPacketBufferPtr</a>&amp; packetBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset)</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;{</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(packetBuffer);</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a74b483b652cc32f03151b10a1366d607">ReadUint8</a>(packetBuffer-&gt;GetReadableData(), offset);</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;}</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;</div><div class="line"><a name="l00202"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#aaeaa3d9d5e1f03bc8966f1428e1cb672">  202</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a097646e1b460c992b553061a3436fb47">ReadBytes</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> valueSize, uint8_t outValue[])</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;{</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#aaeaa3d9d5e1f03bc8966f1428e1cb672">arm::pipe::ReadBytes</a>(buffer, offset, valueSize, outValue);</div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;}</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;</div><div class="line"><a name="l00207"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a6226b639a80d73acb1e66c622beed309">  207</a></span>&#160;uint64_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#aa4de2b511faa41accc2c35cadf051124">ReadUint64</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset)</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;{</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a6226b639a80d73acb1e66c622beed309">arm::pipe::ReadUint64</a>(buffer, offset);</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;}</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;</div><div class="line"><a name="l00212"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a100e71143e7c9abe8fb6f3ec9a810c63">  212</a></span>&#160;uint32_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#ad56f4c3ea5e88279bb6ef1f31d9dc6df">ReadUint32</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset)</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;{</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a100e71143e7c9abe8fb6f3ec9a810c63">arm::pipe::ReadUint32</a>(buffer, offset);</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;}</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;</div><div class="line"><a name="l00217"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a727b3d8a62d5910f2d2efe321748ee15">  217</a></span>&#160;uint16_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#a0ffb94cb0085a54a92f1c4eeaa6cf772">ReadUint16</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset)</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;{</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a727b3d8a62d5910f2d2efe321748ee15">arm::pipe::ReadUint16</a>(buffer, offset);</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;}</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;</div><div class="line"><a name="l00222"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a4f91fd7ff84cd6bbfbc8dd065bf493dd">  222</a></span>&#160;uint8_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#a74b483b652cc32f03151b10a1366d607">ReadUint8</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset)</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;{</div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a4f91fd7ff84cd6bbfbc8dd065bf493dd">arm::pipe::ReadUint8</a>(buffer, offset);</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;}</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;</div><div class="line"><a name="l00227"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#af38e9c5d82c9317255665a6315842166">  227</a></span>&#160;std::string <a class="code" href="namespacearmnn_1_1profiling.xhtml#af38e9c5d82c9317255665a6315842166">GetSoftwareInfo</a>()</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;{</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;    <span class="keywordflow">return</span> std::string(<span class="stringliteral">&quot;ArmNN&quot;</span>);</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;}</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;</div><div class="line"><a name="l00232"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a66ccd202fa7bf1e52476e61d49a45ee6">  232</a></span>&#160;std::string <a class="code" href="namespacearmnn_1_1profiling.xhtml#a66ccd202fa7bf1e52476e61d49a45ee6">GetHardwareVersion</a>()</div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;{</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;    <span class="keywordflow">return</span> std::string();</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;}</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;</div><div class="line"><a name="l00237"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a1a90cae723e311b3b71272a7f5ecccbb">  237</a></span>&#160;std::string <a class="code" href="namespacearmnn_1_1profiling.xhtml#a1a90cae723e311b3b71272a7f5ecccbb">GetSoftwareVersion</a>()</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;{</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;    std::string result = <span class="stringliteral">&quot;Armnn &quot;</span> + std::to_string(<a class="code" href="include_2armnn_2_version_8hpp.xhtml#a16c0008e2647e2f123165ce5cf18a6fa">ARMNN_MAJOR_VERSION</a>) + <span class="stringliteral">&quot;.&quot;</span> + std::to_string(<a class="code" href="include_2armnn_2_version_8hpp.xhtml#ad26f5c26e73f264b0e343babd0bb5d37">ARMNN_MINOR_VERSION</a>);</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;}</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;</div><div class="line"><a name="l00243"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a52fbcd350a9f12a385a7c5562c1efd9a">  243</a></span>&#160;std::string <a class="code" href="namespacearmnn_1_1profiling.xhtml#a52fbcd350a9f12a385a7c5562c1efd9a">GetProcessName</a>()</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;{</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;    std::ifstream comm(<span class="stringliteral">&quot;/proc/self/comm&quot;</span>);</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;    std::string name;</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;    getline(comm, name);</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;    <span class="keywordflow">return</span> name;</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;}</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;<span class="comment">/// Creates a timeline packet header</span></div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;<span class="comment">///</span></div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;<span class="comment">/// \params</span></div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;<span class="comment">///   packetFamiliy     Timeline Packet Family</span></div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;<span class="comment">///   packetClass       Timeline Packet Class</span></div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;<span class="comment">///   packetType        Timeline Packet Type</span></div><div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;<span class="comment">///   streamId          Stream identifier</span></div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;<span class="comment">///   seqeunceNumbered  When non-zero the 4 bytes following the header is a u32 sequence number</span></div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;<span class="comment">///   dataLength        Unsigned 24-bit integer. Length of data, in bytes. Zero is permitted</span></div><div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;<span class="comment">///</span></div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;<span class="comment">/// \returns</span></div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;<span class="comment">///   Pair of uint32_t containing word0 and word1 of the header</span></div><div class="line"><a name="l00263"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#aca8b4bad45009e1d42dc8de69a0b7e2c">  263</a></span>&#160;<span class="comment"></span>std::pair&lt;uint32_t, uint32_t&gt; <a class="code" href="namespacearmnn_1_1profiling.xhtml#aca8b4bad45009e1d42dc8de69a0b7e2c">CreateTimelinePacketHeader</a>(uint32_t packetFamily,</div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;                                                         uint32_t packetClass,</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;                                                         uint32_t packetType,</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;                                                         uint32_t streamId,</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;                                                         uint32_t sequenceNumbered,</div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;                                                         uint32_t dataLength)</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;{</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;    <span class="comment">// Packet header word 0:</span></div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;    <span class="comment">// 26:31 [6] packet_family: timeline Packet Family, value 0b000001</span></div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;    <span class="comment">// 19:25 [7] packet_class: packet class</span></div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;    <span class="comment">// 16:18 [3] packet_type: packet type</span></div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;    <span class="comment">// 8:15  [8] reserved: all zeros</span></div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;    <span class="comment">// 0:7   [8] stream_id: stream identifier</span></div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;    uint32_t packetHeaderWord0 = ((packetFamily &amp; 0x0000003F) &lt;&lt; 26) |</div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;                                 ((packetClass  &amp; 0x0000007F) &lt;&lt; 19) |</div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;                                 ((packetType   &amp; 0x00000007) &lt;&lt; 16) |</div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;                                 ((streamId     &amp; 0x00000007) &lt;&lt;  0);</div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;</div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;    <span class="comment">// Packet header word 1:</span></div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;    <span class="comment">// 25:31 [7]  reserved: all zeros</span></div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;    <span class="comment">// 24    [1]  sequence_numbered: when non-zero the 4 bytes following the header is a u32 sequence number</span></div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;    <span class="comment">// 0:23  [24] data_length: unsigned 24-bit integer. Length of data, in bytes. Zero is permitted</span></div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;    uint32_t packetHeaderWord1 = ((sequenceNumbered &amp; 0x00000001) &lt;&lt; 24) |</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;                                 ((dataLength       &amp; 0x00FFFFFF) &lt;&lt;  0);</div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;</div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;    <span class="keywordflow">return</span> std::make_pair(packetHeaderWord0, packetHeaderWord1);</div><div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;}</div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;<span class="comment">/// Creates a packet header for the timeline messages:</span></div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;<span class="comment">/// * declareLabel</span></div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;<span class="comment">/// * declareEntity</span></div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;<span class="comment">/// * declareEventClass</span></div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;<span class="comment">/// * declareRelationship</span></div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;<span class="comment">/// * declareEvent</span></div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;<span class="comment">///</span></div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;<span class="comment">/// \param</span></div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;<span class="comment">///   dataLength The length of the message body in bytes</span></div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;<span class="comment">///</span></div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;<span class="comment">/// \returns</span></div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;<span class="comment">///   Pair of uint32_t containing word0 and word1 of the header</span></div><div class="line"><a name="l00303"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a4295e2d34b34c57b2065b80fcad431c9">  303</a></span>&#160;<span class="comment"></span>std::pair&lt;uint32_t, uint32_t&gt; <a class="code" href="namespacearmnn_1_1profiling.xhtml#a4295e2d34b34c57b2065b80fcad431c9">CreateTimelineMessagePacketHeader</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dataLength)</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;{</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#aca8b4bad45009e1d42dc8de69a0b7e2c">CreateTimelinePacketHeader</a>(1,           <span class="comment">// Packet family</span></div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;                                      0,           <span class="comment">// Packet class</span></div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;                                      1,           <span class="comment">// Packet type</span></div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;                                      0,           <span class="comment">// Stream id</span></div><div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;                                      0,           <span class="comment">// Sequence number</span></div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;                                      dataLength); <span class="comment">// Data length</span></div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;}</div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;</div><div class="line"><a name="l00313"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a3583b5fbfe555acc552a63458e665939">  313</a></span>&#160;<a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0">TimelinePacketStatus</a> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3583b5fbfe555acc552a63458e665939">WriteTimelineLabelBinaryPacket</a>(uint64_t profilingGuid,</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;                                                    <span class="keyword">const</span> std::string&amp; label,</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;                                                    <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer,</div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;                                                    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> remainingBufferSize,</div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;                                                    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&amp; numberOfBytesWritten)</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;{</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;    <span class="comment">// Initialize the output value</span></div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;    numberOfBytesWritten = 0;</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;</div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;    <span class="comment">// Check that the given buffer is valid</span></div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;    <span class="keywordflow">if</span> (buffer == <span class="keyword">nullptr</span> || remainingBufferSize == 0)</div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;    {</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0ad0863d6c0a071cb52079344e64425773">TimelinePacketStatus::BufferExhaustion</a>;</div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;    }</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;</div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;    <span class="comment">// Utils</span></div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a> = <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> uint64_t_size = <span class="keyword">sizeof</span>(uint64_t);</div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;</div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;    <span class="comment">// Convert the label into a SWTrace string</span></div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;    std::vector&lt;uint32_t&gt; swTraceLabel;</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;    <span class="keywordtype">bool</span> result = arm::pipe::StringToSwTraceString&lt;arm::pipe::SwTraceCharPolicy&gt;(label, swTraceLabel);</div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;    <span class="keywordflow">if</span> (!result)</div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;    {</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0a902b0d55fddef6f8d651fe1035b7d4bd">TimelinePacketStatus::Error</a>;</div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;    }</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;    <span class="comment">// Calculate the size of the SWTrace string label (in bytes)</span></div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> swTraceLabelSize = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&gt;(swTraceLabel.size()) * uint32_t_size;</div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;    <span class="comment">// Calculate the length of the data (in bytes)</span></div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> timelineLabelPacketDataLength = uint32_t_size +   <span class="comment">// decl_Id</span></div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;                                                 uint64_t_size +   <span class="comment">// Profiling GUID</span></div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;                                                 swTraceLabelSize; <span class="comment">// Label</span></div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;    <span class="comment">// Check whether the timeline binary packet fits in the given buffer</span></div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;    <span class="keywordflow">if</span> (timelineLabelPacketDataLength &gt; remainingBufferSize)</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;    {</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0ad0863d6c0a071cb52079344e64425773">TimelinePacketStatus::BufferExhaustion</a>;</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;    }</div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;</div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;    <span class="comment">// Initialize the offset for writing in the buffer</span></div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset = 0;</div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;</div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;    <span class="comment">// Write decl_Id to the buffer</span></div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(buffer, offset, 0u);</div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;    offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;</div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;    <span class="comment">// Write the timeline binary packet payload to the buffer</span></div><div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">WriteUint64</a>(buffer, offset, profilingGuid); <span class="comment">// Profiling GUID</span></div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;    offset += uint64_t_size;</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;    <span class="keywordflow">for</span> (uint32_t swTraceLabelWord : swTraceLabel)</div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;    {</div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(buffer, offset, swTraceLabelWord); <span class="comment">// Label</span></div><div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;        offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;    }</div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;</div><div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;    <span class="comment">// Update the number of bytes written</span></div><div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;    numberOfBytesWritten = timelineLabelPacketDataLength;</div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;</div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0aa60852f204ed8028c1c58808b746d115">TimelinePacketStatus::Ok</a>;</div><div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;}</div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;</div><div class="line"><a name="l00376"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a27d1c992711722739250e2bbd9ce7ede">  376</a></span>&#160;<a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0">TimelinePacketStatus</a> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a27d1c992711722739250e2bbd9ce7ede">WriteTimelineEntityBinary</a>(uint64_t profilingGuid,</div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;                                               <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer,</div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;                                               <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> remainingBufferSize,</div><div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;                                               <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&amp; numberOfBytesWritten)</div><div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;{</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;    <span class="comment">// Initialize the output value</span></div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;    numberOfBytesWritten = 0;</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;</div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;    <span class="comment">// Check that the given buffer is valid</span></div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;    <span class="keywordflow">if</span> (buffer == <span class="keyword">nullptr</span> || remainingBufferSize == 0)</div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;    {</div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0ad0863d6c0a071cb52079344e64425773">TimelinePacketStatus::BufferExhaustion</a>;</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;    }</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;    <span class="comment">// Utils</span></div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a> = <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> uint64_t_size = <span class="keyword">sizeof</span>(uint64_t);</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;    <span class="comment">// Calculate the length of the data (in bytes)</span></div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> timelineEntityDataLength = uint32_t_size + uint64_t_size;  <span class="comment">// decl_id + Profiling GUID</span></div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;    <span class="comment">// Check whether the timeline binary packet fits in the given buffer</span></div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;    <span class="keywordflow">if</span> (timelineEntityDataLength &gt; remainingBufferSize)</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;    {</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0ad0863d6c0a071cb52079344e64425773">TimelinePacketStatus::BufferExhaustion</a>;</div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;    }</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;</div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;    <span class="comment">// Initialize the offset for writing in the buffer</span></div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset = 0;</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;    <span class="comment">// Write the decl_Id to the buffer</span></div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(buffer, offset, 1u);</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;    offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;    <span class="comment">// Write the timeline binary packet payload to the buffer</span></div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">WriteUint64</a>(buffer, offset, profilingGuid); <span class="comment">// Profiling GUID</span></div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;</div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;    <span class="comment">// Update the number of bytes written</span></div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;    numberOfBytesWritten = timelineEntityDataLength;</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;</div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0aa60852f204ed8028c1c58808b746d115">TimelinePacketStatus::Ok</a>;</div><div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;}</div><div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;</div><div class="line"><a name="l00419"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a9314a87188b8a4ad89e2e39b57f672c1">  419</a></span>&#160;<a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0">TimelinePacketStatus</a> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a9314a87188b8a4ad89e2e39b57f672c1">WriteTimelineRelationshipBinary</a>(<a class="code" href="namespacearmnn_1_1profiling.xhtml#ab805f5aa9f101e7f6d971daba044c3c2">ProfilingRelationshipType</a> relationshipType,</div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;                                                     uint64_t relationshipGuid,</div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;                                                     uint64_t headGuid,</div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;                                                     uint64_t tailGuid,</div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;                                                     uint64_t attributeGuid,</div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;                                                     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer,</div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;                                                     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> remainingBufferSize,</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;                                                     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&amp; numberOfBytesWritten)</div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;{</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;    <span class="comment">// Initialize the output value</span></div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;    numberOfBytesWritten = 0;</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;</div><div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;    <span class="comment">// Check that the given buffer is valid</span></div><div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;    <span class="keywordflow">if</span> (buffer == <span class="keyword">nullptr</span> || remainingBufferSize == 0)</div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;    {</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0ad0863d6c0a071cb52079344e64425773">TimelinePacketStatus::BufferExhaustion</a>;</div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;    }</div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;</div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;    <span class="comment">// Utils</span></div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a> = <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> uint64_t_size = <span class="keyword">sizeof</span>(uint64_t);</div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;</div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;    <span class="comment">// Calculate the length of the data (in bytes)</span></div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> timelineRelationshipDataLength = uint32_t_size * 2 + <span class="comment">// decl_id + Relationship Type</span></div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;                                                  uint64_t_size * 4;  <span class="comment">// Relationship GUID + Head GUID +</span></div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;                                                                      <span class="comment">// tail GUID + attributeGuid</span></div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;    <span class="comment">// Check whether the timeline binary fits in the given buffer</span></div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;    <span class="keywordflow">if</span> (timelineRelationshipDataLength &gt; remainingBufferSize)</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;    {</div><div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0ad0863d6c0a071cb52079344e64425773">TimelinePacketStatus::BufferExhaustion</a>;</div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;    }</div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;    <span class="comment">// Initialize the offset for writing in the buffer</span></div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset = 0;</div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;    uint32_t relationshipTypeUint = 0;</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;    <span class="keywordflow">switch</span> (relationshipType)</div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;    {</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#ab805f5aa9f101e7f6d971daba044c3c2afc04d023850b425f3b9c62b3a55dc110">ProfilingRelationshipType::RetentionLink</a>:</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;            relationshipTypeUint = 0;</div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#ab805f5aa9f101e7f6d971daba044c3c2a5265db1a79410fbe447a3faa98e7b914">ProfilingRelationshipType::ExecutionLink</a>:</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;            relationshipTypeUint = 1;</div><div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#ab805f5aa9f101e7f6d971daba044c3c2a77ac530ff577e3b84e0761fa02b2520b">ProfilingRelationshipType::DataLink</a>:</div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;            relationshipTypeUint = 2;</div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#ab805f5aa9f101e7f6d971daba044c3c2a47d6c060a0aa40c6fd018f12b7c96f1f">ProfilingRelationshipType::LabelLink</a>:</div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;            relationshipTypeUint = 3;</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;Unknown relationship type given.&quot;</span>);</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;    }</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;    <span class="comment">// Write the timeline binary payload to the buffer</span></div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;    <span class="comment">// decl_id of the timeline message</span></div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;    uint32_t declId = 3;</div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(buffer, offset, declId); <span class="comment">// decl_id</span></div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;    offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(buffer, offset, relationshipTypeUint); <span class="comment">// Relationship Type</span></div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;    offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">WriteUint64</a>(buffer, offset, relationshipGuid); <span class="comment">// GUID of this relationship</span></div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;    offset += uint64_t_size;</div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">WriteUint64</a>(buffer, offset, headGuid); <span class="comment">// head of relationship GUID</span></div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;    offset += uint64_t_size;</div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">WriteUint64</a>(buffer, offset, tailGuid); <span class="comment">// tail of relationship GUID</span></div><div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;    offset += uint64_t_size;</div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">WriteUint64</a>(buffer, offset, attributeGuid); <span class="comment">// attribute of relationship GUID</span></div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;</div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;    <span class="comment">// Update the number of bytes written</span></div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;    numberOfBytesWritten = timelineRelationshipDataLength;</div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;</div><div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0aa60852f204ed8028c1c58808b746d115">TimelinePacketStatus::Ok</a>;</div><div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;}</div><div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;</div><div class="line"><a name="l00497"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#aecc8787efb41f033785074f2d362895a">  497</a></span>&#160;<a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0">TimelinePacketStatus</a> <a class="code" href="namespacearmnn_1_1profiling.xhtml#aecc8787efb41f033785074f2d362895a">WriteTimelineMessageDirectoryPackage</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer,</div><div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;                                                          <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> remainingBufferSize,</div><div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;                                                          <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&amp; numberOfBytesWritten)</div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;{</div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;    <span class="comment">// Initialize the output value</span></div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;    numberOfBytesWritten = 0;</div><div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;</div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;    <span class="comment">// Check that the given buffer is valid</span></div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;    <span class="keywordflow">if</span> (buffer == <span class="keyword">nullptr</span> || remainingBufferSize == 0)</div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;    {</div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0ad0863d6c0a071cb52079344e64425773">TimelinePacketStatus::BufferExhaustion</a>;</div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;    }</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;</div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;    <span class="comment">// Utils</span></div><div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> uint8_t_size  = <span class="keyword">sizeof</span>(uint8_t);</div><div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a> = <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> uint64_t_size = <span class="keyword">sizeof</span>(uint64_t);</div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;</div><div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;    <span class="comment">// The payload/data of the packet consists of swtrace event definitions encoded according</span></div><div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;    <span class="comment">// to the swtrace directory specification. The messages being the five defined below:</span></div><div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;    <span class="comment">//</span></div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;    <span class="comment">// |  decl_id  |     decl_name       |      ui_name          |  arg_types  |            arg_names                |</span></div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;    <span class="comment">// |-----------|---------------------|-----------------------|-------------|-------------------------------------|</span></div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;    <span class="comment">// |    0      |   declareLabel      |   declare label       |    ps       |  guid,value                         |</span></div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;    <span class="comment">// |    1      |   declareEntity     |   declare entity      |    p        |  guid                               |</span></div><div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;    <span class="comment">// |    2      | declareEventClass   |  declare event class  |    pp       |  guid,nameGuid                      |</span></div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;    <span class="comment">// |    3      | declareRelationship | declare relationship  |    Ipppp    |  relationshipType,relationshipGuid, |</span></div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;    <span class="comment">// |           |                     |                       |             |  headGuid,tailGuid,attributeGuid    |</span></div><div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;    <span class="comment">// |    4      |   declareEvent      |   declare event       |    @tp      |  timestamp,threadId,eventGuid       |</span></div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;    std::vector&lt;std::vector&lt;std::string&gt;&gt; timelineDirectoryMessages</div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;    {</div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;        { <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;declareLabel&quot;</span>, <span class="stringliteral">&quot;declare label&quot;</span>, <span class="stringliteral">&quot;ps&quot;</span>, <span class="stringliteral">&quot;guid,value&quot;</span> },</div><div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;        { <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;declareEntity&quot;</span>, <span class="stringliteral">&quot;declare entity&quot;</span>, <span class="stringliteral">&quot;p&quot;</span>, <span class="stringliteral">&quot;guid&quot;</span> },</div><div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;        { <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;declareEventClass&quot;</span>, <span class="stringliteral">&quot;declare event class&quot;</span>, <span class="stringliteral">&quot;pp&quot;</span>, <span class="stringliteral">&quot;guid,nameGuid&quot;</span> },</div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;        { <span class="stringliteral">&quot;3&quot;</span>, <span class="stringliteral">&quot;declareRelationship&quot;</span>, <span class="stringliteral">&quot;declare relationship&quot;</span>, <span class="stringliteral">&quot;Ipppp&quot;</span>,</div><div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;          <span class="stringliteral">&quot;relationshipType,relationshipGuid,headGuid,tailGuid,attributeGuid&quot;</span> },</div><div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;        { <span class="stringliteral">&quot;4&quot;</span>, <span class="stringliteral">&quot;declareEvent&quot;</span>, <span class="stringliteral">&quot;declare event&quot;</span>, <span class="stringliteral">&quot;@tp&quot;</span>, <span class="stringliteral">&quot;timestamp,threadId,eventGuid&quot;</span> }</div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;    };</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;</div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;    <span class="comment">// Build the message declarations</span></div><div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;    std::vector&lt;uint32_t&gt; swTraceBuffer;</div><div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; directoryComponent : timelineDirectoryMessages)</div><div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;    {</div><div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;        <span class="comment">// decl_id</span></div><div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;        uint32_t declId = 0;</div><div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;        <span class="keywordflow">try</span></div><div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;        {</div><div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;            declId = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(std::stoul(directoryComponent[0]));</div><div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;        }</div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;        <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception&amp;)</div><div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;        {</div><div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;            <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0a902b0d55fddef6f8d651fe1035b7d4bd">TimelinePacketStatus::Error</a>;</div><div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;        }</div><div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;        swTraceBuffer.push_back(declId);</div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;</div><div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;        <span class="keywordtype">bool</span> result = <span class="keyword">true</span>;</div><div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;        result &amp;= arm::pipe::ConvertDirectoryComponent&lt;arm::pipe::SwTraceNameCharPolicy&gt;(</div><div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;                      directoryComponent[1], swTraceBuffer); <span class="comment">// decl_name</span></div><div class="line"><a name="l00555"></a><span class="lineno">  555</span>&#160;        result &amp;= arm::pipe::ConvertDirectoryComponent&lt;arm::pipe::SwTraceCharPolicy&gt;    (</div><div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;                      directoryComponent[2], swTraceBuffer); <span class="comment">// ui_name</span></div><div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;        result &amp;= arm::pipe::ConvertDirectoryComponent&lt;arm::pipe::SwTraceTypeCharPolicy&gt;(</div><div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;                      directoryComponent[3], swTraceBuffer); <span class="comment">// arg_types</span></div><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;        result &amp;= arm::pipe::ConvertDirectoryComponent&lt;arm::pipe::SwTraceCharPolicy&gt;    (</div><div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;                      directoryComponent[4], swTraceBuffer); <span class="comment">// arg_names</span></div><div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;        <span class="keywordflow">if</span> (!result)</div><div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;        {</div><div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;            <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0a902b0d55fddef6f8d651fe1035b7d4bd">TimelinePacketStatus::Error</a>;</div><div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;        }</div><div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;    }</div><div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;</div><div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dataLength = 3 * uint8_t_size +  <span class="comment">// Stream header (3 bytes)</span></div><div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;                              <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&gt;(swTraceBuffer.size()) *</div><div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;                                  uint32_t_size; <span class="comment">// Trace directory (5 messages)</span></div><div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;</div><div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;    <span class="comment">// Calculate the timeline directory binary packet size (in bytes)</span></div><div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> timelineDirectoryPacketSize = 2 * uint32_t_size + <span class="comment">// Header (2 words)</span></div><div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;                                               dataLength;         <span class="comment">// Payload</span></div><div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;</div><div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;    <span class="comment">// Check whether the timeline directory binary packet fits in the given buffer</span></div><div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;    <span class="keywordflow">if</span> (timelineDirectoryPacketSize &gt; remainingBufferSize)</div><div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;    {</div><div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0ad0863d6c0a071cb52079344e64425773">TimelinePacketStatus::BufferExhaustion</a>;</div><div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;    }</div><div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;</div><div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;    <span class="comment">// Create packet header</span></div><div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;    <span class="keyword">auto</span> packetHeader = <a class="code" href="namespacearmnn_1_1profiling.xhtml#aca8b4bad45009e1d42dc8de69a0b7e2c">CreateTimelinePacketHeader</a>(1, 0, 0, 0, 0, armnn::numeric_cast&lt;uint32_t&gt;(dataLength));</div><div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;</div><div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;    <span class="comment">// Initialize the offset for writing in the buffer</span></div><div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset = 0;</div><div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;</div><div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;    <span class="comment">// Write the timeline binary packet header to the buffer</span></div><div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(buffer, offset, packetHeader.first);</div><div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;    offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(buffer, offset, packetHeader.second);</div><div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;    offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;</div><div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;    <span class="comment">// Write the stream header</span></div><div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;    uint8_t streamVersion = 4;</div><div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;    uint8_t pointerBytes  = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint8_t&gt;(uint64_t_size); <span class="comment">// All GUIDs are uint64_t</span></div><div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;    uint8_t threadIdBytes = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint8_t&gt;(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6272d5d5e3a8afa0a402e9aafd19aedf">ThreadIdSize</a>);</div><div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;    <span class="keywordflow">switch</span> (threadIdBytes)</div><div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;    {</div><div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;    <span class="keywordflow">case</span> 4: <span class="comment">// Typically Windows and Android</span></div><div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;    <span class="keywordflow">case</span> 8: <span class="comment">// Typically Linux</span></div><div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;        <span class="keywordflow">break</span>; <span class="comment">// Valid values</span></div><div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0a902b0d55fddef6f8d651fe1035b7d4bd">TimelinePacketStatus::Error</a>; <span class="comment">// Invalid value</span></div><div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;    }</div><div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#af63b6e5ffc769286c32d55a090b1602a">WriteUint8</a>(buffer, offset, streamVersion);</div><div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;    offset += uint8_t_size;</div><div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#af63b6e5ffc769286c32d55a090b1602a">WriteUint8</a>(buffer, offset, pointerBytes);</div><div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;    offset += uint8_t_size;</div><div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#af63b6e5ffc769286c32d55a090b1602a">WriteUint8</a>(buffer, offset, threadIdBytes);</div><div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;    offset += uint8_t_size;</div><div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;</div><div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;    <span class="comment">// Write the SWTrace directory</span></div><div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;    uint32_t numberOfDeclarations = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(timelineDirectoryMessages.size());</div><div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(buffer, offset, numberOfDeclarations); <span class="comment">// Number of declarations</span></div><div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;    offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;    <span class="keywordflow">for</span> (uint32_t i : swTraceBuffer)</div><div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;    {</div><div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(buffer, offset, i); <span class="comment">// Message declarations</span></div><div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;        offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;    }</div><div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;</div><div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;    <span class="comment">// Update the number of bytes written</span></div><div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;    numberOfBytesWritten = timelineDirectoryPacketSize;</div><div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;</div><div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0aa60852f204ed8028c1c58808b746d115">TimelinePacketStatus::Ok</a>;</div><div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;}</div><div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;</div><div class="line"><a name="l00628"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#aaa1dfefc0a6a75d79dad86151fc2ce41">  628</a></span>&#160;<a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0">TimelinePacketStatus</a> <a class="code" href="namespacearmnn_1_1profiling.xhtml#aaa1dfefc0a6a75d79dad86151fc2ce41">WriteTimelineEventClassBinary</a>(uint64_t profilingGuid,</div><div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;                                                   uint64_t nameGuid,</div><div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;                                                   <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer,</div><div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;                                                   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> remainingBufferSize,</div><div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;                                                   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&amp; numberOfBytesWritten)</div><div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;{</div><div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;    <span class="comment">// Initialize the output value</span></div><div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;    numberOfBytesWritten = 0;</div><div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;</div><div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;    <span class="comment">// Check that the given buffer is valid</span></div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;    <span class="keywordflow">if</span> (buffer == <span class="keyword">nullptr</span> || remainingBufferSize == 0)</div><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;    {</div><div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0ad0863d6c0a071cb52079344e64425773">TimelinePacketStatus::BufferExhaustion</a>;</div><div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;    }</div><div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;    <span class="comment">// Utils</span></div><div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a> = <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> uint64_t_size = <span class="keyword">sizeof</span>(uint64_t);</div><div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;</div><div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;    <span class="comment">// decl_id of the timeline message</span></div><div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;    uint32_t declId = 2;</div><div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;</div><div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;    <span class="comment">// Calculate the length of the data (in bytes)</span></div><div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dataSize = uint32_t_size + (uint64_t_size * 2); <span class="comment">// decl_id + Profiling GUID + Name GUID</span></div><div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;</div><div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;    <span class="comment">// Check whether the timeline binary fits in the given buffer</span></div><div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;    <span class="keywordflow">if</span> (dataSize &gt; remainingBufferSize)</div><div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;    {</div><div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0ad0863d6c0a071cb52079344e64425773">TimelinePacketStatus::BufferExhaustion</a>;</div><div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;    }</div><div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;</div><div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;    <span class="comment">// Initialize the offset for writing in the buffer</span></div><div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset = 0;</div><div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;</div><div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;    <span class="comment">// Write the timeline binary payload to the buffer</span></div><div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(buffer, offset, declId);        <span class="comment">// decl_id</span></div><div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;    offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">WriteUint64</a>(buffer, offset, profilingGuid); <span class="comment">// Profiling GUID</span></div><div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;    offset += uint64_t_size;</div><div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">WriteUint64</a>(buffer, offset, nameGuid); <span class="comment">// Name GUID</span></div><div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;</div><div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;    <span class="comment">// Update the number of bytes written</span></div><div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;    numberOfBytesWritten = dataSize;</div><div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;</div><div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0aa60852f204ed8028c1c58808b746d115">TimelinePacketStatus::Ok</a>;</div><div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;}</div><div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;</div><div class="line"><a name="l00675"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a0211123136217f6dfe15b39f5a58690d">  675</a></span>&#160;<a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0">TimelinePacketStatus</a> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a0211123136217f6dfe15b39f5a58690d">WriteTimelineEventBinary</a>(uint64_t timestamp,</div><div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;                                              <span class="keywordtype">int</span> threadId,</div><div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;                                              uint64_t profilingGuid,</div><div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;                                              <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer,</div><div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;                                              <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> remainingBufferSize,</div><div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;                                              <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&amp; numberOfBytesWritten)</div><div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;{</div><div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;    <span class="comment">// Initialize the output value</span></div><div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;    numberOfBytesWritten = 0;</div><div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;    <span class="comment">// Check that the given buffer is valid</span></div><div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;    <span class="keywordflow">if</span> (buffer == <span class="keyword">nullptr</span> || remainingBufferSize == 0)</div><div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;    {</div><div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0ad0863d6c0a071cb52079344e64425773">TimelinePacketStatus::BufferExhaustion</a>;</div><div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;    }</div><div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;</div><div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;    <span class="comment">// Utils</span></div><div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a> = <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> uint64_t_size = <span class="keyword">sizeof</span>(uint64_t);</div><div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;</div><div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;    <span class="comment">// decl_id of the timeline message</span></div><div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;    uint32_t declId = 4;</div><div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;</div><div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;    <span class="comment">// Calculate the length of the data (in bytes)</span></div><div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> timelineEventDataLength = uint32_t_size + <span class="comment">// decl_id</span></div><div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;                                           uint64_t_size + <span class="comment">// Timestamp</span></div><div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;                                           <a class="code" href="namespacearmnn_1_1profiling.xhtml#a6272d5d5e3a8afa0a402e9aafd19aedf">ThreadIdSize</a> +  <span class="comment">// Thread id</span></div><div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;                                           uint64_t_size;  <span class="comment">// Profiling GUID</span></div><div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;</div><div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;    <span class="comment">// Check whether the timeline binary packet fits in the given buffer</span></div><div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;    <span class="keywordflow">if</span> (timelineEventDataLength &gt; remainingBufferSize)</div><div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;    {</div><div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0ad0863d6c0a071cb52079344e64425773">TimelinePacketStatus::BufferExhaustion</a>;</div><div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;    }</div><div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;</div><div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;    <span class="comment">// Initialize the offset for writing in the buffer</span></div><div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset = 0;</div><div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;</div><div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;    <span class="comment">// Write the timeline binary payload to the buffer</span></div><div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(buffer, offset, declId); <span class="comment">// decl_id</span></div><div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;    offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">WriteUint64</a>(buffer, offset, timestamp); <span class="comment">// Timestamp</span></div><div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;    offset += uint64_t_size;</div><div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#af0cddaa4e116d294dacaaced90ca341c">WriteBytes</a>(buffer, offset, &amp;threadId, <a class="code" href="namespacearmnn_1_1profiling.xhtml#a6272d5d5e3a8afa0a402e9aafd19aedf">ThreadIdSize</a>); <span class="comment">// Thread id</span></div><div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;    offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#a6272d5d5e3a8afa0a402e9aafd19aedf">ThreadIdSize</a>;</div><div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">WriteUint64</a>(buffer, offset, profilingGuid); <span class="comment">// Profiling GUID</span></div><div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;    offset += uint64_t_size;</div><div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;    <span class="comment">// Update the number of bytes written</span></div><div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;    numberOfBytesWritten = timelineEventDataLength;</div><div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;</div><div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0aa60852f204ed8028c1c58808b746d115">TimelinePacketStatus::Ok</a>;</div><div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;}</div><div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;</div><div class="line"><a name="l00727"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">  727</a></span>&#160;std::string <a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="keyword">const</span> std::string&amp; stringToPass, <span class="keyword">const</span> <span class="keywordtype">int</span> spacingWidth)</div><div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;{</div><div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">arm::pipe::CentreAlignFormatting</a>(stringToPass, spacingWidth);</div><div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;}</div><div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;</div><div class="line"><a name="l00732"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#aea08b4cb21e58d159630a6929c90bf64">  732</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#aea08b4cb21e58d159630a6929c90bf64">PrintDeviceDetails</a>(<span class="keyword">const</span> std::pair&lt;<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span>, std::unique_ptr&lt;Device&gt;&gt;&amp; devicePair)</div><div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;{</div><div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;    std::string body;</div><div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;</div><div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(devicePair.second-&gt;m_Name, 20));</div><div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;    body.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(std::to_string(devicePair.first), 13));</div><div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;    body.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(std::to_string(devicePair.second-&gt;m_Cores), 10));</div><div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;    body.append(<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;</div><div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;    std::cout &lt;&lt; std::string(body.size(), <span class="charliteral">&#39;-&#39;</span>) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;    std::cout&lt;&lt; body;</div><div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;}</div><div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;</div><div class="line"><a name="l00747"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#abd2137ee62a2c96882f3d8d9e665ed09">  747</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#abd2137ee62a2c96882f3d8d9e665ed09">PrintCounterSetDetails</a>(<span class="keyword">const</span> std::pair&lt;<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span>, std::unique_ptr&lt;CounterSet&gt;&gt;&amp; counterSetPair)</div><div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;{</div><div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;    std::string body;</div><div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;</div><div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(counterSetPair.second-&gt;m_Name, 20));</div><div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;    body.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(std::to_string(counterSetPair.first), 13));</div><div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;    body.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(std::to_string(counterSetPair.second-&gt;m_Count), 10));</div><div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;    body.append(<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;</div><div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;    std::cout &lt;&lt; std::string(body.size(), <span class="charliteral">&#39;-&#39;</span>) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;</div><div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;    std::cout&lt;&lt; body;</div><div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;}</div><div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;</div><div class="line"><a name="l00763"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a3e7c9cd02bf5ed5b588b24b0a8b8a2b1">  763</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e7c9cd02bf5ed5b588b24b0a8b8a2b1">PrintCounterDetails</a>(std::shared_ptr&lt;Counter&gt;&amp; counter)</div><div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;{</div><div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;    std::string body;</div><div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;</div><div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(counter-&gt;m_Name, 20));</div><div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;    body.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(counter-&gt;m_Description, 50));</div><div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;    body.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(counter-&gt;m_Units, 14));</div><div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;    body.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(std::to_string(counter-&gt;m_Uid), 6));</div><div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;    body.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(std::to_string(counter-&gt;m_MaxCounterUid), 10));</div><div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;    body.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(std::to_string(counter-&gt;m_Class), 8));</div><div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;    body.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(std::to_string(counter-&gt;m_Interpolation), 14));</div><div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;    body.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(std::to_string(counter-&gt;m_Multiplier), 20));</div><div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;    body.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(std::to_string(counter-&gt;m_CounterSetUid), 16));</div><div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;    body.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;    body.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(std::to_string(counter-&gt;m_DeviceUid), 14));</div><div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;</div><div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;    body.append(<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;</div><div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;    std::cout &lt;&lt; std::string(body.size(), <span class="charliteral">&#39;-&#39;</span>) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;</div><div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;    std::cout &lt;&lt; body;</div><div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;}</div><div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;</div><div class="line"><a name="l00794"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#af33888588c5afaab1eb0d0bfbed2f6ee">  794</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#af33888588c5afaab1eb0d0bfbed2f6ee">PrintCategoryDetails</a>(<span class="keyword">const</span> std::unique_ptr&lt;Category&gt;&amp; category,</div><div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;                          std::unordered_map&lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span>, std::shared_ptr&lt;Counter&gt;&gt; counterMap)</div><div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;{</div><div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;    std::string categoryBody;</div><div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;    std::string categoryHeader;</div><div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;</div><div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;    categoryHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;Name&quot;</span>, 20));</div><div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;    categoryHeader.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;    categoryHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;Event Count&quot;</span>, 14));</div><div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;    categoryHeader.append(<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;</div><div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;    categoryBody.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(category-&gt;m_Name, 20));</div><div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160;    categoryBody.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;    categoryBody.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(std::to_string(category-&gt;m_Counters.size()), 14));</div><div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;</div><div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;    std::cout &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;    std::cout &lt;&lt; <a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;CATEGORY&quot;</span>, static_cast&lt;int&gt;(categoryHeader.size()));</div><div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;    std::cout &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;    std::cout &lt;&lt; std::string(categoryHeader.size(), <span class="charliteral">&#39;=&#39;</span>) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;</div><div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;    std::cout &lt;&lt; categoryHeader;</div><div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;</div><div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;    std::cout &lt;&lt; std::string(categoryBody.size(), <span class="charliteral">&#39;-&#39;</span>) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;</div><div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;    std::cout &lt;&lt; categoryBody;</div><div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;</div><div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;    std::string counterHeader;</div><div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;</div><div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;    counterHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;Counter Name&quot;</span>, 20));</div><div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;    counterHeader.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00824"></a><span class="lineno">  824</span>&#160;    counterHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;Description&quot;</span>, 50));</div><div class="line"><a name="l00825"></a><span class="lineno">  825</span>&#160;    counterHeader.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;    counterHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;Units&quot;</span>, 14));</div><div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;    counterHeader.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;    counterHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;UID&quot;</span>, 6));</div><div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;    counterHeader.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;    counterHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;Max UID&quot;</span>, 10));</div><div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;    counterHeader.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;    counterHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;Class&quot;</span>, 8));</div><div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;    counterHeader.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;    counterHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;Interpolation&quot;</span>, 14));</div><div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;    counterHeader.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;    counterHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;Multiplier&quot;</span>, 20));</div><div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;    counterHeader.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;    counterHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;Counter set UID&quot;</span>, 16));</div><div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;    counterHeader.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;    counterHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;Device UID&quot;</span>, 14));</div><div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;    counterHeader.append(<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;</div><div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;    std::cout &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;    std::cout &lt;&lt; <a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;EVENTS IN CATEGORY: &quot;</span> + category-&gt;m_Name,</div><div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;                                       static_cast&lt;int&gt;(counterHeader.size()));</div><div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;    std::cout &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;    std::cout &lt;&lt; std::string(counterHeader.size(), <span class="charliteral">&#39;=&#39;</span>) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;    std::cout &lt;&lt; counterHeader;</div><div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; it: category-&gt;m_Counters) {</div><div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;        <span class="keyword">auto</span> search = counterMap.find(it);</div><div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;        <span class="keywordflow">if</span>(search != counterMap.end()) {</div><div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;            <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e7c9cd02bf5ed5b588b24b0a8b8a2b1">PrintCounterDetails</a>(search-&gt;second);</div><div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;        }</div><div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;    }</div><div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;}</div><div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;</div><div class="line"><a name="l00857"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a02f98a63d0ef3a10bb359c3ac525f330">  857</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a02f98a63d0ef3a10bb359c3ac525f330">PrintCounterDirectory</a>(<a class="code" href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml">ICounterDirectory</a>&amp; counterDirectory)</div><div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;{</div><div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;    std::string devicesHeader;</div><div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160;</div><div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;    devicesHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;Device name&quot;</span>, 20));</div><div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;    devicesHeader.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;    devicesHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;UID&quot;</span>, 13));</div><div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;    devicesHeader.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;    devicesHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;Cores&quot;</span>, 10));</div><div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;    devicesHeader.append(<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;</div><div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;    std::cout &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;    std::cout &lt;&lt; <a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;DEVICES&quot;</span>, static_cast&lt;int&gt;(devicesHeader.size()));</div><div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;    std::cout &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;    std::cout &lt;&lt; std::string(devicesHeader.size(), <span class="charliteral">&#39;=&#39;</span>) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;    std::cout &lt;&lt; devicesHeader;</div><div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; it: counterDirectory.<a class="code" href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#a98e6769cb933d30bfd3ca25f61bd8438">GetDevices</a>()) {</div><div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#aea08b4cb21e58d159630a6929c90bf64">PrintDeviceDetails</a>(it);</div><div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;    }</div><div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;</div><div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;    std::string counterSetHeader;</div><div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;</div><div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;    counterSetHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;Counter set name&quot;</span>, 20));</div><div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160;    counterSetHeader.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;    counterSetHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;UID&quot;</span>, 13));</div><div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;    counterSetHeader.append(<span class="stringliteral">&quot; | &quot;</span>);</div><div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;    counterSetHeader.append(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;Count&quot;</span>, 10));</div><div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;    counterSetHeader.append(<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160;</div><div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;    std::cout &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;    std::cout &lt;&lt; <a class="code" href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">CentreAlignFormatting</a>(<span class="stringliteral">&quot;COUNTER SETS&quot;</span>, static_cast&lt;int&gt;(counterSetHeader.size()));</div><div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;    std::cout &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00889"></a><span class="lineno">  889</span>&#160;    std::cout &lt;&lt; std::string(counterSetHeader.size(), <span class="charliteral">&#39;=&#39;</span>) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00890"></a><span class="lineno">  890</span>&#160;</div><div class="line"><a name="l00891"></a><span class="lineno">  891</span>&#160;    std::cout &lt;&lt; counterSetHeader;</div><div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;</div><div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; it: counterDirectory.<a class="code" href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#a8908490db3b8a0003a639ac56b956cee">GetCounterSets</a>()) {</div><div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#abd2137ee62a2c96882f3d8d9e665ed09">PrintCounterSetDetails</a>(it);</div><div class="line"><a name="l00895"></a><span class="lineno">  895</span>&#160;    }</div><div class="line"><a name="l00896"></a><span class="lineno">  896</span>&#160;</div><div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;    <span class="keyword">auto</span> counters = counterDirectory.<a class="code" href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#ad9fa9b8364fcaa2c940ef8e78eff8df2">GetCounters</a>();</div><div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; it: counterDirectory.<a class="code" href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#a718a75d4c178cf3f687b3f27b8f55091">GetCategories</a>()) {</div><div class="line"><a name="l00899"></a><span class="lineno">  899</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#af33888588c5afaab1eb0d0bfbed2f6ee">PrintCategoryDetails</a>(it, counters);</div><div class="line"><a name="l00900"></a><span class="lineno">  900</span>&#160;    }</div><div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;    std::cout &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;}</div><div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;</div><div class="line"><a name="l00904"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a77a41a7625d3134c0cccdf11d169acb4">  904</a></span>&#160;uint64_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#a77a41a7625d3134c0cccdf11d169acb4">GetTimestamp</a>()</div><div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;{</div><div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;<span class="preprocessor">#if USE_CLOCK_MONOTONIC_RAW</span></div><div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;    <span class="keyword">using</span> clock = MonotonicClockRaw;</div><div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;    <span class="keyword">using</span> clock = std::chrono::steady_clock;</div><div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;</div><div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;    <span class="comment">// Take a timestamp</span></div><div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;    <span class="keyword">auto</span> timestamp = std::chrono::duration_cast&lt;std::chrono::nanoseconds&gt;(clock::now().time_since_epoch());</div><div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;</div><div class="line"><a name="l00915"></a><span class="lineno">  915</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>uint64_t<span class="keyword">&gt;</span>(timestamp.count());</div><div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;}</div><div class="line"><a name="l00917"></a><span class="lineno">  917</span>&#160;</div><div class="line"><a name="l00918"></a><span class="lineno"><a class="line" href="namespacearmnn_1_1profiling.xhtml#a68dc7d3158eb3d4ed9cade6b8893d7c0">  918</a></span>&#160;arm::pipe::Packet <a class="code" href="namespacearmnn_1_1profiling.xhtml#a68dc7d3158eb3d4ed9cade6b8893d7c0">ReceivePacket</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, uint32_t length)</div><div class="line"><a name="l00919"></a><span class="lineno">  919</span>&#160;{</div><div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;    <span class="keywordflow">if</span> (buffer == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;    {</div><div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;        <span class="keywordflow">throw</span> arm::pipe::ProfilingException(<span class="stringliteral">&quot;data buffer is nullptr&quot;</span>);</div><div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;    }</div><div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;    <span class="keywordflow">if</span> (length &lt; 8)</div><div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;    {</div><div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;        <span class="keywordflow">throw</span> arm::pipe::ProfilingException(<span class="stringliteral">&quot;length of data buffer is less than 8&quot;</span>);</div><div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;    }</div><div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;</div><div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;    uint32_t metadataIdentifier = 0;</div><div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;    std::memcpy(&amp;metadataIdentifier, buffer, <span class="keyword">sizeof</span>(metadataIdentifier));</div><div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;</div><div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;    uint32_t dataLength = 0;</div><div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;    std::memcpy(&amp;dataLength, buffer + 4u, <span class="keyword">sizeof</span>(dataLength));</div><div class="line"><a name="l00934"></a><span class="lineno">  934</span>&#160;</div><div class="line"><a name="l00935"></a><span class="lineno">  935</span>&#160;    std::unique_ptr&lt;unsigned char[]&gt; packetData;</div><div class="line"><a name="l00936"></a><span class="lineno">  936</span>&#160;    <span class="keywordflow">if</span> (dataLength &gt; 0)</div><div class="line"><a name="l00937"></a><span class="lineno">  937</span>&#160;    {</div><div class="line"><a name="l00938"></a><span class="lineno">  938</span>&#160;        packetData = std::make_unique&lt;unsigned char[]&gt;(dataLength);</div><div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;        std::memcpy(packetData.get(), buffer + 8u, dataLength);</div><div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160;    }</div><div class="line"><a name="l00941"></a><span class="lineno">  941</span>&#160;</div><div class="line"><a name="l00942"></a><span class="lineno">  942</span>&#160;    <span class="keywordflow">return</span> arm::pipe::Packet(metadataIdentifier, dataLength, packetData);</div><div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;}</div><div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;</div><div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;} <span class="comment">// namespace profiling</span></div><div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;</div><div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;} <span class="comment">// namespace armnn</span></div><div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;</div><div class="line"><a name="l00949"></a><span class="lineno">  949</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacestd.xhtml">std</a></div><div class="line"><a name="l00950"></a><span class="lineno">  950</span>&#160;{</div><div class="line"><a name="l00951"></a><span class="lineno">  951</span>&#160;</div><div class="line"><a name="l00952"></a><span class="lineno"><a class="line" href="namespacestd.xhtml#af1429cfb9f824ec191b3ed9307747c58">  952</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespacestd.xhtml#af1429cfb9f824ec191b3ed9307747c58">operator==</a>(<span class="keyword">const</span> std::vector&lt;uint8_t&gt;&amp; left, <span class="keywordtype">int</span> right)</div><div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;{</div><div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;    <span class="keywordflow">return</span> std::memcmp(left.data(), &amp;right, left.size()) == 0;</div><div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160;}</div><div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;</div><div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;} <span class="comment">// namespace std</span></div><div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a1c81dacff6eb2062571f7f4db1cb7617"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a1c81dacff6eb2062571f7f4db1cb7617">armnn::profiling::WriteBytes</a></div><div class="ttdeci">void WriteBytes(unsigned char *buffer, unsigned int offset, const void *value, unsigned int valueSize)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00142">ProfilingUtils.cpp:142</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a4f91fd7ff84cd6bbfbc8dd065bf493dd"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a4f91fd7ff84cd6bbfbc8dd065bf493dd">armnn::profiling::ReadUint8</a></div><div class="ttdeci">uint8_t ReadUint8(const unsigned char *buffer, unsigned int offset)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00222">ProfilingUtils.cpp:222</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_aa3e447531d9bdaad3da25f23edf18fb4"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#aa3e447531d9bdaad3da25f23edf18fb4">armnn::profiling::WriteUint32</a></div><div class="ttdeci">void WriteUint32(unsigned char *buffer, unsigned int offset, uint32_t value)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00152">ProfilingUtils.cpp:152</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_aaeaa3d9d5e1f03bc8966f1428e1cb672"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#aaeaa3d9d5e1f03bc8966f1428e1cb672">armnn::profiling::ReadBytes</a></div><div class="ttdeci">void ReadBytes(const unsigned char *buffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[])</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00202">ProfilingUtils.cpp:202</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a100e71143e7c9abe8fb6f3ec9a810c63"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a100e71143e7c9abe8fb6f3ec9a810c63">armnn::profiling::ReadUint32</a></div><div class="ttdeci">uint32_t ReadUint32(const unsigned char *buffer, unsigned int offset)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00212">ProfilingUtils.cpp:212</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_aecc8787efb41f033785074f2d362895a"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#aecc8787efb41f033785074f2d362895a">armnn::profiling::WriteTimelineMessageDirectoryPackage</a></div><div class="ttdeci">TimelinePacketStatus WriteTimelineMessageDirectoryPackage(unsigned char *buffer, unsigned int remainingBufferSize, unsigned int &amp;numberOfBytesWritten)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00497">ProfilingUtils.cpp:497</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a66ccd202fa7bf1e52476e61d49a45ee6"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a66ccd202fa7bf1e52476e61d49a45ee6">armnn::profiling::GetHardwareVersion</a></div><div class="ttdeci">std::string GetHardwareVersion()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00232">ProfilingUtils.cpp:232</a></div></div>
<div class="ttc" id="namespacestd_xhtml_af1429cfb9f824ec191b3ed9307747c58"><div class="ttname"><a href="namespacestd.xhtml#af1429cfb9f824ec191b3ed9307747c58">std::operator==</a></div><div class="ttdeci">bool operator==(const std::vector&lt; uint8_t &gt; &amp;left, int right)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00952">ProfilingUtils.cpp:952</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_ae5ace88c65e65ab7cf5572613601a60d"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#ae5ace88c65e65ab7cf5572613601a60d">armnn::profiling::WriteUint16</a></div><div class="ttdeci">void WriteUint16(const IPacketBufferPtr &amp;packetBuffer, unsigned int offset, uint16_t value)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00128">ProfilingUtils.cpp:128</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a097646e1b460c992b553061a3436fb47"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a097646e1b460c992b553061a3436fb47">armnn::profiling::ReadBytes</a></div><div class="ttdeci">void ReadBytes(const IPacketBufferPtr &amp;packetBuffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[])</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00167">ProfilingUtils.cpp:167</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a3e638748a39d46e2943dfcef94dcb828"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">armnn::profiling::WriteUint32</a></div><div class="ttdeci">void WriteUint32(const IPacketBufferPtr &amp;packetBuffer, unsigned int offset, uint32_t value)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00121">ProfilingUtils.cpp:121</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_aa4de2b511faa41accc2c35cadf051124"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#aa4de2b511faa41accc2c35cadf051124">armnn::profiling::ReadUint64</a></div><div class="ttdeci">uint64_t ReadUint64(const IPacketBufferPtr &amp;packetBuffer, unsigned int offset)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00174">ProfilingUtils.cpp:174</a></div></div>
<div class="ttc" id="_wall_clock_timer_8hpp_xhtml"><div class="ttname"><a href="_wall_clock_timer_8hpp.xhtml">WallClockTimer.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_aca8b4bad45009e1d42dc8de69a0b7e2c"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#aca8b4bad45009e1d42dc8de69a0b7e2c">armnn::profiling::CreateTimelinePacketHeader</a></div><div class="ttdeci">std::pair&lt; uint32_t, uint32_t &gt; CreateTimelinePacketHeader(uint32_t packetFamily, uint32_t packetClass, uint32_t packetType, uint32_t streamId, uint32_t sequenceNumbered, uint32_t dataLength)</div><div class="ttdoc">Creates a timeline packet header. </div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00263">ProfilingUtils.cpp:263</a></div></div>
<div class="ttc" id="include_2armnn_2_version_8hpp_xhtml_ad26f5c26e73f264b0e343babd0bb5d37"><div class="ttname"><a href="include_2armnn_2_version_8hpp.xhtml#ad26f5c26e73f264b0e343babd0bb5d37">ARMNN_MINOR_VERSION</a></div><div class="ttdeci">#define ARMNN_MINOR_VERSION</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2_version_8hpp_source.xhtml#l00014">Version.hpp:14</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a52fbcd350a9f12a385a7c5562c1efd9a"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a52fbcd350a9f12a385a7c5562c1efd9a">armnn::profiling::GetProcessName</a></div><div class="ttdeci">std::string GetProcessName()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00243">ProfilingUtils.cpp:243</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a9314a87188b8a4ad89e2e39b57f672c1"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a9314a87188b8a4ad89e2e39b57f672c1">armnn::profiling::WriteTimelineRelationshipBinary</a></div><div class="ttdeci">TimelinePacketStatus WriteTimelineRelationshipBinary(ProfilingRelationshipType relationshipType, uint64_t relationshipGuid, uint64_t headGuid, uint64_t tailGuid, uint64_t attributeGuid, unsigned char *buffer, unsigned int remainingBufferSize, unsigned int &amp;numberOfBytesWritten)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00419">ProfilingUtils.cpp:419</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_ab805f5aa9f101e7f6d971daba044c3c2a5265db1a79410fbe447a3faa98e7b914"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#ab805f5aa9f101e7f6d971daba044c3c2a5265db1a79410fbe447a3faa98e7b914">armnn::profiling::ProfilingRelationshipType::ExecutionLink</a></div><div class="ttdoc">Head retains(parents) Tail. </div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a0ffb94cb0085a54a92f1c4eeaa6cf772"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a0ffb94cb0085a54a92f1c4eeaa6cf772">armnn::profiling::ReadUint16</a></div><div class="ttdeci">uint16_t ReadUint16(const IPacketBufferPtr &amp;packetBuffer, unsigned int offset)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00188">ProfilingUtils.cpp:188</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a74b483b652cc32f03151b10a1366d607"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a74b483b652cc32f03151b10a1366d607">armnn::profiling::ReadUint8</a></div><div class="ttdeci">uint8_t ReadUint8(const IPacketBufferPtr &amp;packetBuffer, unsigned int offset)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00195">ProfilingUtils.cpp:195</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml"><div class="ttname"><a href="namespacearmnn.xhtml">armnn</a></div><div class="ttdoc">Copyright (c) 2021 ARM Limited and Contributors. </div><div class="ttdef"><b>Definition:</b> <a href="01__00__software__tools_8dox_source.xhtml#l00006">01_00_software_tools.dox:6</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_ab805f5aa9f101e7f6d971daba044c3c2a77ac530ff577e3b84e0761fa02b2520b"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#ab805f5aa9f101e7f6d971daba044c3c2a77ac530ff577e3b84e0761fa02b2520b">armnn::profiling::ProfilingRelationshipType::DataLink</a></div><div class="ttdoc">Head execution start depends on Tail execution completion. </div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_aea08b4cb21e58d159630a6929c90bf64"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#aea08b4cb21e58d159630a6929c90bf64">armnn::profiling::PrintDeviceDetails</a></div><div class="ttdeci">void PrintDeviceDetails(const std::pair&lt; const unsigned short, std::unique_ptr&lt; Device &gt;&gt; &amp;devicePair)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00732">ProfilingUtils.cpp:732</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_counter_directory_xhtml_a8908490db3b8a0003a639ac56b956cee"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#a8908490db3b8a0003a639ac56b956cee">armnn::profiling::ICounterDirectory::GetCounterSets</a></div><div class="ttdeci">virtual const CounterSets &amp; GetCounterSets() const =0</div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_af38e9c5d82c9317255665a6315842166"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#af38e9c5d82c9317255665a6315842166">armnn::profiling::GetSoftwareInfo</a></div><div class="ttdeci">std::string GetSoftwareInfo()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00227">ProfilingUtils.cpp:227</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_ab805f5aa9f101e7f6d971daba044c3c2a47d6c060a0aa40c6fd018f12b7c96f1f"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#ab805f5aa9f101e7f6d971daba044c3c2a47d6c060a0aa40c6fd018f12b7c96f1f">armnn::profiling::ProfilingRelationshipType::LabelLink</a></div><div class="ttdoc">Head uses data of Tail. </div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a68dc7d3158eb3d4ed9cade6b8893d7c0"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a68dc7d3158eb3d4ed9cade6b8893d7c0">armnn::profiling::ReceivePacket</a></div><div class="ttdeci">arm::pipe::Packet ReceivePacket(const unsigned char *buffer, uint32_t length)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00918">ProfilingUtils.cpp:918</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a0cf33f59f4e39a415e08497644b0b6f8"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a0cf33f59f4e39a415e08497644b0b6f8">armnn::profiling::WriteUint16</a></div><div class="ttdeci">void WriteUint16(unsigned char *buffer, unsigned int offset, uint16_t value)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00157">ProfilingUtils.cpp:157</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a727b3d8a62d5910f2d2efe321748ee15"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a727b3d8a62d5910f2d2efe321748ee15">armnn::profiling::ReadUint16</a></div><div class="ttdeci">uint16_t ReadUint16(const unsigned char *buffer, unsigned int offset)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00217">ProfilingUtils.cpp:217</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_counter_directory_xhtml_a718a75d4c178cf3f687b3f27b8f55091"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#a718a75d4c178cf3f687b3f27b8f55091">armnn::profiling::ICounterDirectory::GetCategories</a></div><div class="ttdeci">virtual const Categories &amp; GetCategories() const =0</div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a982b094fe2faa67a3560cdaf3901d0f8"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a982b094fe2faa67a3560cdaf3901d0f8">armnn::profiling::GetNextUid</a></div><div class="ttdeci">uint16_t GetNextUid(bool peekOnly)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00058">ProfilingUtils.cpp:58</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_ae00e76f4552e2dad3bdcf1dd72100b4f"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#ae00e76f4552e2dad3bdcf1dd72100b4f">armnn::profiling::WriteUint8</a></div><div class="ttdeci">void WriteUint8(unsigned char *buffer, unsigned int offset, uint8_t value)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00162">ProfilingUtils.cpp:162</a></div></div>
<div class="ttc" id="namespacestd_xhtml"><div class="ttname"><a href="namespacestd.xhtml">std</a></div><div class="ttdef"><b>Definition:</b> <a href="_backend_id_8hpp_source.xhtml#l00147">BackendId.hpp:147</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_counter_directory_xhtml_a98e6769cb933d30bfd3ca25f61bd8438"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#a98e6769cb933d30bfd3ca25f61bd8438">armnn::profiling::ICounterDirectory::GetDevices</a></div><div class="ttdeci">virtual const Devices &amp; GetDevices() const =0</div></div>
<div class="ttc" id="include_2armnn_2_version_8hpp_xhtml"><div class="ttname"><a href="include_2armnn_2_version_8hpp.xhtml">Version.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a0211123136217f6dfe15b39f5a58690d"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a0211123136217f6dfe15b39f5a58690d">armnn::profiling::WriteTimelineEventBinary</a></div><div class="ttdeci">TimelinePacketStatus WriteTimelineEventBinary(uint64_t timestamp, int threadId, uint64_t profilingGuid, unsigned char *buffer, unsigned int remainingBufferSize, unsigned int &amp;numberOfBytesWritten)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00675">ProfilingUtils.cpp:675</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a6605c82bc625fbd40f24d35edee15fe3"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a6605c82bc625fbd40f24d35edee15fe3">armnn::profiling::GetNextCounterUids</a></div><div class="ttdeci">std::vector&lt; uint16_t &gt; GetNextCounterUids(uint16_t firstUid, uint16_t cores)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00078">ProfilingUtils.cpp:78</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_af0cddaa4e116d294dacaaced90ca341c"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#af0cddaa4e116d294dacaaced90ca341c">armnn::profiling::WriteBytes</a></div><div class="ttdeci">void WriteBytes(const IPacketBufferPtr &amp;packetBuffer, unsigned int offset, const void *value, unsigned int valueSize)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00093">ProfilingUtils.cpp:93</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_af33888588c5afaab1eb0d0bfbed2f6ee"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#af33888588c5afaab1eb0d0bfbed2f6ee">armnn::profiling::PrintCategoryDetails</a></div><div class="ttdeci">void PrintCategoryDetails(const std::unique_ptr&lt; Category &gt; &amp;category, std::unordered_map&lt; unsigned short, std::shared_ptr&lt; Counter &gt;&gt; counterMap)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00794">ProfilingUtils.cpp:794</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a750935094e7dc62a6ce69be8688ee9fc"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">armnn::profiling::ConstructHeader</a></div><div class="ttdeci">uint32_t ConstructHeader(uint32_t packetFamily, uint32_t packetId)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00100">ProfilingUtils.cpp:100</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_ab805f5aa9f101e7f6d971daba044c3c2"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#ab805f5aa9f101e7f6d971daba044c3c2">armnn::profiling::ProfilingRelationshipType</a></div><div class="ttdeci">ProfilingRelationshipType</div><div class="ttdef"><b>Definition:</b> <a href="_i_send_timeline_packet_8hpp_source.xhtml#l00018">ISendTimelinePacket.hpp:18</a></div></div>
<div class="ttc" id="_assert_8hpp_xhtml_a5698be69cbd5dfe6c28fcd9867e8cbed"><div class="ttname"><a href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a></div><div class="ttdeci">#define ARMNN_ASSERT(COND)</div><div class="ttdef"><b>Definition:</b> <a href="_assert_8hpp_source.xhtml#l00014">Assert.hpp:14</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a6272d5d5e3a8afa0a402e9aafd19aedf"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a6272d5d5e3a8afa0a402e9aafd19aedf">armnn::profiling::ThreadIdSize</a></div><div class="ttdeci">constexpr unsigned int ThreadIdSize</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8hpp_source.xhtml#l00031">ProfilingUtils.hpp:31</a></div></div>
<div class="ttc" id="classarmnn_1_1_invalid_argument_exception_xhtml"><div class="ttname"><a href="classarmnn_1_1_invalid_argument_exception.xhtml">armnn::InvalidArgumentException</a></div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00080">Exceptions.hpp:80</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_aaa1dfefc0a6a75d79dad86151fc2ce41"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#aaa1dfefc0a6a75d79dad86151fc2ce41">armnn::profiling::WriteTimelineEventClassBinary</a></div><div class="ttdeci">TimelinePacketStatus WriteTimelineEventClassBinary(uint64_t profilingGuid, uint64_t nameGuid, unsigned char *buffer, unsigned int remainingBufferSize, unsigned int &amp;numberOfBytesWritten)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00628">ProfilingUtils.cpp:628</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_ab805f5aa9f101e7f6d971daba044c3c2afc04d023850b425f3b9c62b3a55dc110"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#ab805f5aa9f101e7f6d971daba044c3c2afc04d023850b425f3b9c62b3a55dc110">armnn::profiling::ProfilingRelationshipType::RetentionLink</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_af63b6e5ffc769286c32d55a090b1602a"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#af63b6e5ffc769286c32d55a090b1602a">armnn::profiling::WriteUint8</a></div><div class="ttdeci">void WriteUint8(const IPacketBufferPtr &amp;packetBuffer, unsigned int offset, uint8_t value)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00135">ProfilingUtils.cpp:135</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a6226b639a80d73acb1e66c622beed309"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a6226b639a80d73acb1e66c622beed309">armnn::profiling::ReadUint64</a></div><div class="ttdeci">uint64_t ReadUint64(const unsigned char *buffer, unsigned int offset)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00207">ProfilingUtils.cpp:207</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a79be042e55fdf16ca562f14cd15d9aa6"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">armnn::profiling::WriteUint64</a></div><div class="ttdeci">void WriteUint64(const std::unique_ptr&lt; IPacketBuffer &gt; &amp;packetBuffer, unsigned int offset, uint64_t value)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00114">ProfilingUtils.cpp:114</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_ad56f4c3ea5e88279bb6ef1f31d9dc6df"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#ad56f4c3ea5e88279bb6ef1f31d9dc6df">armnn::profiling::ReadUint32</a></div><div class="ttdeci">uint32_t ReadUint32(const IPacketBufferPtr &amp;packetBuffer, unsigned int offset)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00181">ProfilingUtils.cpp:181</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_abd2137ee62a2c96882f3d8d9e665ed09"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#abd2137ee62a2c96882f3d8d9e665ed09">armnn::profiling::PrintCounterSetDetails</a></div><div class="ttdeci">void PrintCounterSetDetails(const std::pair&lt; const unsigned short, std::unique_ptr&lt; CounterSet &gt;&gt; &amp;counterSetPair)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00747">ProfilingUtils.cpp:747</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a1a90cae723e311b3b71272a7f5ecccbb"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a1a90cae723e311b3b71272a7f5ecccbb">armnn::profiling::GetSoftwareVersion</a></div><div class="ttdeci">std::string GetSoftwareVersion()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00237">ProfilingUtils.cpp:237</a></div></div>
<div class="ttc" id="_assert_8hpp_xhtml"><div class="ttname"><a href="_assert_8hpp.xhtml">Assert.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_aabcf5c25522e8a0542c95174056cfcac"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">armnn::profiling::uint32_t_size</a></div><div class="ttdeci">uint32_t uint32_t_size</div><div class="ttdef"><b>Definition:</b> <a href="_directory_capture_command_handler_8cpp_source.xhtml#l00022">DirectoryCaptureCommandHandler.cpp:22</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a4295e2d34b34c57b2065b80fcad431c9"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a4295e2d34b34c57b2065b80fcad431c9">armnn::profiling::CreateTimelineMessagePacketHeader</a></div><div class="ttdeci">std::pair&lt; uint32_t, uint32_t &gt; CreateTimelineMessagePacketHeader(unsigned int dataLength)</div><div class="ttdoc">Creates a packet header for the timeline messages: </div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00303">ProfilingUtils.cpp:303</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_acdfc0158f71b04526602ef51444da4c0aa60852f204ed8028c1c58808b746d115"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0aa60852f204ed8028c1c58808b746d115">armnn::profiling::TimelinePacketStatus::Ok</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a3583b5fbfe555acc552a63458e665939"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a3583b5fbfe555acc552a63458e665939">armnn::profiling::WriteTimelineLabelBinaryPacket</a></div><div class="ttdeci">TimelinePacketStatus WriteTimelineLabelBinaryPacket(uint64_t profilingGuid, const std::string &amp;label, unsigned char *buffer, unsigned int remainingBufferSize, unsigned int &amp;numberOfBytesWritten)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00313">ProfilingUtils.cpp:313</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a375ca3cff9f1b005d1412dc5f3cf5b6e"><div class="ttname"><a href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a></div><div class="ttdeci">std::enable_if_t&lt; std::is_unsigned&lt; Source &gt;::value &amp;&amp;std::is_unsigned&lt; Dest &gt;::value, Dest &gt; numeric_cast(Source source)</div><div class="ttdef"><b>Definition:</b> <a href="_numeric_cast_8hpp_source.xhtml#l00035">NumericCast.hpp:35</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a3e7c9cd02bf5ed5b588b24b0a8b8a2b1"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a3e7c9cd02bf5ed5b588b24b0a8b8a2b1">armnn::profiling::PrintCounterDetails</a></div><div class="ttdeci">void PrintCounterDetails(std::shared_ptr&lt; Counter &gt; &amp;counter)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00763">ProfilingUtils.cpp:763</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_counter_directory_xhtml_ad9fa9b8364fcaa2c940ef8e78eff8df2"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#ad9fa9b8364fcaa2c940ef8e78eff8df2">armnn::profiling::ICounterDirectory::GetCounters</a></div><div class="ttdeci">virtual const Counters &amp; GetCounters() const =0</div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a6c000fcf0c62f7bc417fef72be783129"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a6c000fcf0c62f7bc417fef72be783129">armnn::profiling::CentreAlignFormatting</a></div><div class="ttdeci">std::string CentreAlignFormatting(const std::string &amp;stringToPass, const int spacingWidth)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00727">ProfilingUtils.cpp:727</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_af2bb4db604c56391c1361b32402c65a7"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#af2bb4db604c56391c1361b32402c65a7">armnn::profiling::WriteUint64</a></div><div class="ttdeci">void WriteUint64(unsigned char *buffer, unsigned int offset, uint64_t value)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00147">ProfilingUtils.cpp:147</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_acdfc0158f71b04526602ef51444da4c0ad0863d6c0a071cb52079344e64425773"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0ad0863d6c0a071cb52079344e64425773">armnn::profiling::TimelinePacketStatus::BufferExhaustion</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a27d1c992711722739250e2bbd9ce7ede"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a27d1c992711722739250e2bbd9ce7ede">armnn::profiling::WriteTimelineEntityBinary</a></div><div class="ttdeci">TimelinePacketStatus WriteTimelineEntityBinary(uint64_t profilingGuid, unsigned char *buffer, unsigned int remainingBufferSize, unsigned int &amp;numberOfBytesWritten)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00376">ProfilingUtils.cpp:376</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_counter_directory_xhtml"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml">armnn::profiling::ICounterDirectory</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_counter_directory_8hpp_source.xhtml#l00137">ICounterDirectory.hpp:137</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a02f98a63d0ef3a10bb359c3ac525f330"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a02f98a63d0ef3a10bb359c3ac525f330">armnn::profiling::PrintCounterDirectory</a></div><div class="ttdeci">void PrintCounterDirectory(ICounterDirectory &amp;counterDirectory)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00857">ProfilingUtils.cpp:857</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_acdfc0158f71b04526602ef51444da4c0"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0">armnn::profiling::TimelinePacketStatus</a></div><div class="ttdeci">TimelinePacketStatus</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8hpp_source.xhtml#l00096">ProfilingUtils.hpp:96</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_acdfc0158f71b04526602ef51444da4c0a902b0d55fddef6f8d651fe1035b7d4bd"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#acdfc0158f71b04526602ef51444da4c0a902b0d55fddef6f8d651fe1035b7d4bd">armnn::profiling::TimelinePacketStatus::Error</a></div></div>
<div class="ttc" id="include_2armnn_2_version_8hpp_xhtml_a16c0008e2647e2f123165ce5cf18a6fa"><div class="ttname"><a href="include_2armnn_2_version_8hpp.xhtml#a16c0008e2647e2f123165ce5cf18a6fa">ARMNN_MAJOR_VERSION</a></div><div class="ttdeci">#define ARMNN_MAJOR_VERSION</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2_version_8hpp_source.xhtml#l00013">Version.hpp:13</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a14328d977cec3abadcfd5935f04f3409"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">armnn::profiling::IPacketBufferPtr</a></div><div class="ttdeci">std::unique_ptr&lt; IPacketBuffer &gt; IPacketBufferPtr</div><div class="ttdef"><b>Definition:</b> <a href="_i_packet_buffer_8hpp_source.xhtml#l00044">IPacketBuffer.hpp:44</a></div></div>
<div class="ttc" id="_profiling_utils_8hpp_xhtml"><div class="ttname"><a href="_profiling_utils_8hpp.xhtml">ProfilingUtils.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a77a41a7625d3134c0cccdf11d169acb4"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a77a41a7625d3134c0cccdf11d169acb4">armnn::profiling::GetTimestamp</a></div><div class="ttdeci">uint64_t GetTimestamp()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00904">ProfilingUtils.cpp:904</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.xhtml">src</a></li><li class="navelem"><a class="el" href="dir_637c692f14729569dd2eac0c18e2a54a.xhtml">profiling</a></li><li class="navelem"><a class="el" href="_profiling_utils_8cpp.xhtml">ProfilingUtils.cpp</a></li>
    <li class="footer">Generated on Thu Feb 25 2021 17:27:53 for ArmNN by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
  </ul>
</div>
</body>
</html>