1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2 <html xmlns="http://www.w3.org/1999/xhtml">
4 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
5 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
6 <meta name="generator" content="Doxygen 1.8.13"/>
7 <meta name="viewport" content="width=device-width, initial-scale=1"/>
8 <title>o-du/phy: xran_compression.cpp File Reference</title>
9 <link href="tabs.css" rel="stylesheet" type="text/css"/>
10 <script type="text/javascript" src="jquery.js"></script>
11 <script type="text/javascript" src="dynsections.js"></script>
12 <link href="search/search.css" rel="stylesheet" type="text/css"/>
13 <script type="text/javascript" src="search/searchdata.js"></script>
14 <script type="text/javascript" src="search/search.js"></script>
15 <link href="doxygen.css" rel="stylesheet" type="text/css" />
18 <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
20 <table cellspacing="0" cellpadding="0">
22 <tr style="height: 56px;">
23 <td id="projectalign" style="padding-left: 0.5em;">
24 <div id="projectname">o-du/phy
26 <div id="projectbrief">Intel O-RAN/X-RAN Generated Doxygen Documentation</div>
32 <!-- end header part -->
33 <!-- Generated by Doxygen 1.8.13 -->
34 <script type="text/javascript">
35 var searchBox = new SearchBox("searchBox", "search",false,'Search');
37 <script type="text/javascript" src="menudata.js"></script>
38 <script type="text/javascript" src="menu.js"></script>
39 <script type="text/javascript">
41 initMenu('',true,false,'search.php','Search');
42 $(document).ready(function() { init_search(); });
45 <div id="main-nav"></div>
46 <!-- window showing the filter options -->
47 <div id="MSearchSelectWindow"
48 onmouseover="return searchBox.OnSearchSelectShow()"
49 onmouseout="return searchBox.OnSearchSelectHide()"
50 onkeydown="return searchBox.OnSearchSelectKey(event)">
53 <!-- iframe showing the search results (closed by default) -->
54 <div id="MSearchResultsWindow">
55 <iframe src="javascript:void(0)" frameborder="0"
56 name="MSearchResults" id="MSearchResults">
60 <div id="nav-path" class="navpath">
62 <li class="navelem"><a class="el" href="dir_a4c74d6baed87eba72f3b201b7b4b8f2.html">fhi_lib</a></li><li class="navelem"><a class="el" href="dir_5cc0cc0264b57168b75ca56bde6cc403.html">lib</a></li><li class="navelem"><a class="el" href="dir_9fc50806095da30fbd4a2dbe2e456ff5.html">src</a></li> </ul>
67 <a href="#define-members">Macros</a> |
68 <a href="#typedef-members">Typedefs</a> |
69 <a href="#func-members">Functions</a> </div>
70 <div class="headertitle">
71 <div class="title">xran_compression.cpp File Reference</div> </div>
73 <div class="contents">
74 <div class="textblock"><code>#include "<a class="el" href="xran__compression_8hpp_source.html">xran_compression.hpp</a>"</code><br />
75 <code>#include "<a class="el" href="xran__compression_8h_source.html">xran_compression.h</a>"</code><br />
76 <code>#include <complex></code><br />
77 <code>#include <algorithm></code><br />
78 <code>#include <immintrin.h></code><br />
79 <code>#include <limits.h></code><br />
80 <code>#include <cstring></code><br />
81 </div><div class="textblock"><div class="dynheader">
82 Include dependency graph for xran_compression.cpp:</div>
83 <div class="dyncontent">
84 <div class="center"><img src="xran__compression_8cpp__incl.png" border="0" usemap="#xran__compression_8cpp" alt=""/></div>
85 <map name="xran__compression_8cpp" id="xran__compression_8cpp">
86 <area shape="rect" id="node2" href="xran__compression_8hpp.html" title="xran_compression.hpp" alt="" coords="5,80,159,107"/>
87 <area shape="rect" id="node4" href="xran__compression_8h.html" title="External API for compading with the use BFP algorithm. " alt="" coords="183,80,322,107"/>
91 <p><a href="xran__compression_8cpp_source.html">Go to the source code of this file.</a></p>
92 <table class="memberdecls">
93 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
95 <tr class="memitem:a8e2efc093002a3f4ed586a274dac0814"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="xran__compression_8cpp.html#a8e2efc093002a3f4ed586a274dac0814">RB_NUM_ROUNDUP</a>(<a class="el" href="xran__pkt__cp_8h.html#affa3adbd50cd4af2018ba1fc0e8c3e31">rb</a>)   (BlockFloatCompander::k_numRB * ((<a class="el" href="xran__pkt__cp_8h.html#affa3adbd50cd4af2018ba1fc0e8c3e31">rb</a> + BlockFloatCompander::k_numRB - 1) / BlockFloatCompander::k_numRB))</td></tr>
96 <tr class="separator:a8e2efc093002a3f4ed586a274dac0814"><td class="memSeparator" colspan="2"> </td></tr>
97 </table><table class="memberdecls">
98 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
99 Typedefs</h2></td></tr>
100 <tr class="memitem:a509c43699fac542bbef8d2be5ee693e2"><td class="memItemLeft" align="right" valign="top">typedef void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="xran__compression_8cpp.html#a509c43699fac542bbef8d2be5ee693e2">xran_bfp_compress_fn</a>) (const <a class="el" href="struct_block_float_compander_1_1_expanded_data.html">BlockFloatCompander::ExpandedData</a> &dataIn, <a class="el" href="struct_block_float_compander_1_1_compressed_data.html">BlockFloatCompander::CompressedData</a> *dataOut)</td></tr>
101 <tr class="separator:a509c43699fac542bbef8d2be5ee693e2"><td class="memSeparator" colspan="2"> </td></tr>
102 <tr class="memitem:a0f2b928dc9ee0b4a12e23b1eb42ec790"><td class="memItemLeft" align="right" valign="top">typedef void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="xran__compression_8cpp.html#a0f2b928dc9ee0b4a12e23b1eb42ec790">xran_bfp_compress_bfw_fn</a>) (const <a class="el" href="struct_block_float_compander_b_f_w_1_1_expanded_data.html">BlockFloatCompanderBFW::ExpandedData</a> &dataIn, <a class="el" href="struct_block_float_compander_b_f_w_1_1_compressed_data.html">BlockFloatCompanderBFW::CompressedData</a> *dataOut)</td></tr>
103 <tr class="separator:a0f2b928dc9ee0b4a12e23b1eb42ec790"><td class="memSeparator" colspan="2"> </td></tr>
104 <tr class="memitem:a798850dcd04a495f0e6fb9dc80b74299"><td class="memItemLeft" align="right" valign="top">typedef void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="xran__compression_8cpp.html#a798850dcd04a495f0e6fb9dc80b74299">xran_bfp_decompress_fn</a>) (const <a class="el" href="struct_block_float_compander_1_1_compressed_data.html">BlockFloatCompander::CompressedData</a> &dataIn, <a class="el" href="struct_block_float_compander_1_1_expanded_data.html">BlockFloatCompander::ExpandedData</a> *dataOut)</td></tr>
105 <tr class="separator:a798850dcd04a495f0e6fb9dc80b74299"><td class="memSeparator" colspan="2"> </td></tr>
106 </table><table class="memberdecls">
107 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
108 Functions</h2></td></tr>
109 <tr class="memitem:a74512492194fcab6a55f769e02aa37b4"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="xran__compression_8cpp.html#a74512492194fcab6a55f769e02aa37b4">computeExponent</a> (const <a class="el" href="struct_block_float_compander_1_1_expanded_data.html">BlockFloatCompander::ExpandedData</a> &dataIn, int8_t *expStore)</td></tr>
110 <tr class="memdesc:a74512492194fcab6a55f769e02aa37b4"><td class="mdescLeft"> </td><td class="mdescRight">Compute exponent value for a set of RB from the maximum absolute value. <a href="#a74512492194fcab6a55f769e02aa37b4">More...</a><br /></td></tr>
111 <tr class="separator:a74512492194fcab6a55f769e02aa37b4"><td class="memSeparator" colspan="2"> </td></tr>
112 <tr class="memitem:acb87fe08d3492b251e7a2561488064fa"><td class="memItemLeft" align="right" valign="top">__m512i </td><td class="memItemRight" valign="bottom"><a class="el" href="xran__compression_8cpp.html#acb87fe08d3492b251e7a2561488064fa">networkBytePack9b</a> (const __m512i compData)</td></tr>
113 <tr class="separator:acb87fe08d3492b251e7a2561488064fa"><td class="memSeparator" colspan="2"> </td></tr>
114 <tr class="memitem:a4a2767bece9b74bb6348b416af70a3de"><td class="memItemLeft" align="right" valign="top">__m512i </td><td class="memItemRight" valign="bottom"><a class="el" href="xran__compression_8cpp.html#a4a2767bece9b74bb6348b416af70a3de">networkBytePack10b</a> (const __m512i compData)</td></tr>
115 <tr class="separator:a4a2767bece9b74bb6348b416af70a3de"><td class="memSeparator" colspan="2"> </td></tr>
116 <tr class="memitem:aafe7eae735c4ebf8f028e7baa6783c22"><td class="memItemLeft" align="right" valign="top">__m512i </td><td class="memItemRight" valign="bottom"><a class="el" href="xran__compression_8cpp.html#aafe7eae735c4ebf8f028e7baa6783c22">networkBytePack12b</a> (const __m512i compData)</td></tr>
117 <tr class="separator:aafe7eae735c4ebf8f028e7baa6783c22"><td class="memSeparator" colspan="2"> </td></tr>
118 <tr class="memitem:afb29866152e84d42cd2e3bc116454493"><td class="memItemLeft" align="right" valign="top">__m512i </td><td class="memItemRight" valign="bottom"><a class="el" href="xran__compression_8cpp.html#afb29866152e84d42cd2e3bc116454493">networkByteUnpack9b</a> (const uint8_t *inData)</td></tr>
119 <tr class="separator:afb29866152e84d42cd2e3bc116454493"><td class="memSeparator" colspan="2"> </td></tr>
120 <tr class="memitem:a27043376e22397cc933d3c4d9450677b"><td class="memItemLeft" align="right" valign="top">__m512i </td><td class="memItemRight" valign="bottom"><a class="el" href="xran__compression_8cpp.html#a27043376e22397cc933d3c4d9450677b">networkByteUnpack10b</a> (const uint8_t *inData)</td></tr>
121 <tr class="separator:a27043376e22397cc933d3c4d9450677b"><td class="memSeparator" colspan="2"> </td></tr>
122 <tr class="memitem:a91aa9bdb6901711b43d848a4a5a94d2f"><td class="memItemLeft" align="right" valign="top">__m512i </td><td class="memItemRight" valign="bottom"><a class="el" href="xran__compression_8cpp.html#a91aa9bdb6901711b43d848a4a5a94d2f">networkByteUnpack12b</a> (const uint8_t *inData)</td></tr>
123 <tr class="separator:a91aa9bdb6901711b43d848a4a5a94d2f"><td class="memSeparator" colspan="2"> </td></tr>
124 <tr class="memitem:a0651de68e87558106615163f96b3e599"><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="xran__compression_8cpp.html#a0651de68e87558106615163f96b3e599">xranlib_compress_avx512</a> (const struct <a class="el" href="structxranlib__compress__request.html">xranlib_compress_request</a> *request, struct <a class="el" href="structxranlib__compress__response.html">xranlib_compress_response</a> *response)</td></tr>
125 <tr class="separator:a0651de68e87558106615163f96b3e599"><td class="memSeparator" colspan="2"> </td></tr>
126 <tr class="memitem:aa027200fc051c80b515ee8aeadf44a0e"><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="xran__compression_8cpp.html#aa027200fc051c80b515ee8aeadf44a0e">xranlib_compress_avx512_bfw</a> (const struct <a class="el" href="structxranlib__compress__request.html">xranlib_compress_request</a> *request, struct <a class="el" href="structxranlib__compress__response.html">xranlib_compress_response</a> *response)</td></tr>
127 <tr class="separator:aa027200fc051c80b515ee8aeadf44a0e"><td class="memSeparator" colspan="2"> </td></tr>
128 <tr class="memitem:a2bd6ebeefb6ca9674598d443e697918c"><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="xran__compression_8cpp.html#a2bd6ebeefb6ca9674598d443e697918c">xranlib_decompress_avx512</a> (const struct <a class="el" href="structxranlib__decompress__request.html">xranlib_decompress_request</a> *request, struct <a class="el" href="structxranlib__decompress__response.html">xranlib_decompress_response</a> *response)</td></tr>
129 <tr class="separator:a2bd6ebeefb6ca9674598d443e697918c"><td class="memSeparator" colspan="2"> </td></tr>
131 <h2 class="groupheader">Macro Definition Documentation</h2>
132 <a id="a8e2efc093002a3f4ed586a274dac0814"></a>
133 <h2 class="memtitle"><span class="permalink"><a href="#a8e2efc093002a3f4ed586a274dac0814">◆ </a></span>RB_NUM_ROUNDUP</h2>
135 <div class="memitem">
136 <div class="memproto">
137 <table class="memname">
139 <td class="memname">#define RB_NUM_ROUNDUP</td>
141 <td class="paramtype"> </td>
142 <td class="paramname"><a class="el" href="xran__pkt__cp_8h.html#affa3adbd50cd4af2018ba1fc0e8c3e31">rb</a></td><td>)</td>
143 <td>   (BlockFloatCompander::k_numRB * ((<a class="el" href="xran__pkt__cp_8h.html#affa3adbd50cd4af2018ba1fc0e8c3e31">rb</a> + BlockFloatCompander::k_numRB - 1) / BlockFloatCompander::k_numRB))</td>
146 </div><div class="memdoc">
148 <p class="definition">Definition at line <a class="el" href="xran__compression_8cpp_source.html#l00720">720</a> of file <a class="el" href="xran__compression_8cpp_source.html">xran_compression.cpp</a>.</p>
152 <h2 class="groupheader">Typedef Documentation</h2>
153 <a id="a0f2b928dc9ee0b4a12e23b1eb42ec790"></a>
154 <h2 class="memtitle"><span class="permalink"><a href="#a0f2b928dc9ee0b4a12e23b1eb42ec790">◆ </a></span>xran_bfp_compress_bfw_fn</h2>
156 <div class="memitem">
157 <div class="memproto">
158 <table class="memname">
160 <td class="memname">typedef void(* xran_bfp_compress_bfw_fn) (const <a class="el" href="struct_block_float_compander_b_f_w_1_1_expanded_data.html">BlockFloatCompanderBFW::ExpandedData</a> &dataIn, <a class="el" href="struct_block_float_compander_b_f_w_1_1_compressed_data.html">BlockFloatCompanderBFW::CompressedData</a> *dataOut)</td>
163 </div><div class="memdoc">
164 <p>callback function type for Symbol packet </p>
166 <p class="definition">Definition at line <a class="el" href="xran__compression_8cpp_source.html#l00780">780</a> of file <a class="el" href="xran__compression_8cpp_source.html">xran_compression.cpp</a>.</p>
170 <a id="a509c43699fac542bbef8d2be5ee693e2"></a>
171 <h2 class="memtitle"><span class="permalink"><a href="#a509c43699fac542bbef8d2be5ee693e2">◆ </a></span>xran_bfp_compress_fn</h2>
173 <div class="memitem">
174 <div class="memproto">
175 <table class="memname">
177 <td class="memname">typedef void(* xran_bfp_compress_fn) (const <a class="el" href="struct_block_float_compander_1_1_expanded_data.html">BlockFloatCompander::ExpandedData</a> &dataIn, <a class="el" href="struct_block_float_compander_1_1_compressed_data.html">BlockFloatCompander::CompressedData</a> *dataOut)</td>
180 </div><div class="memdoc">
181 <p>callback function type for Symbol packet </p>
183 <p class="definition">Definition at line <a class="el" href="xran__compression_8cpp_source.html#l00725">725</a> of file <a class="el" href="xran__compression_8cpp_source.html">xran_compression.cpp</a>.</p>
187 <a id="a798850dcd04a495f0e6fb9dc80b74299"></a>
188 <h2 class="memtitle"><span class="permalink"><a href="#a798850dcd04a495f0e6fb9dc80b74299">◆ </a></span>xran_bfp_decompress_fn</h2>
190 <div class="memitem">
191 <div class="memproto">
192 <table class="memname">
194 <td class="memname">typedef void(* xran_bfp_decompress_fn) (const <a class="el" href="struct_block_float_compander_1_1_compressed_data.html">BlockFloatCompander::CompressedData</a> &dataIn, <a class="el" href="struct_block_float_compander_1_1_expanded_data.html">BlockFloatCompander::ExpandedData</a> *dataOut)</td>
197 </div><div class="memdoc">
198 <p>callback function type for Symbol packet </p>
200 <p class="definition">Definition at line <a class="el" href="xran__compression_8cpp_source.html#l00830">830</a> of file <a class="el" href="xran__compression_8cpp_source.html">xran_compression.cpp</a>.</p>
204 <h2 class="groupheader">Function Documentation</h2>
205 <a id="a74512492194fcab6a55f769e02aa37b4"></a>
206 <h2 class="memtitle"><span class="permalink"><a href="#a74512492194fcab6a55f769e02aa37b4">◆ </a></span>computeExponent()</h2>
208 <div class="memitem">
209 <div class="memproto">
210 <table class="memname">
212 <td class="memname">void computeExponent </td>
214 <td class="paramtype">const <a class="el" href="struct_block_float_compander_1_1_expanded_data.html">BlockFloatCompander::ExpandedData</a> & </td>
215 <td class="paramname"><em>dataIn</em>, </td>
218 <td class="paramkey"></td>
220 <td class="paramtype">int8_t * </td>
221 <td class="paramname"><em>expStore</em> </td>
229 </div><div class="memdoc">
231 <p>Compute exponent value for a set of RB from the maximum absolute value. </p>
232 <p>Load data and find max(abs(RB))</p>
233 <p>Re-order the next 4RB in input data into 3 registers Input SIMD vectors are: [A A A A A A A A A A A A B B B B] [B B B B B B B B C C C C C C C C] [C C C C D D D D D D D D D D D D] Re-ordered SIMD vectors are: [A A A A B B B B C C C C D D D D] [A A A A B B B B C C C C D D D D] [A A A A B B B B C C C C D D D D]</p>
234 <p>Perform max abs on these 3 registers</p>
235 <p>Perform horizontal max over each lane Swap 64b in each lane and compute max</p>
236 <p>Swap each pair of 32b in each lane and compute max</p>
237 <p>Swap each IQ pair in each lane (via 32b rotation) and compute max</p>
238 <p>Insert values into maxAbs Use sliding mask to insert wanted values into maxAbs Pairs of values will be inserted and corrected outside of loop</p>
239 <p>Convert to 32b by removing repeated values in maxAbs</p>
240 <p>Compute and store exponent </p>
242 <p class="definition">Definition at line <a class="el" href="xran__compression_8cpp_source.html#l00044">44</a> of file <a class="el" href="xran__compression_8cpp_source.html">xran_compression.cpp</a>.</p>
243 <div class="dynheader">
244 Here is the caller graph for this function:</div>
245 <div class="dyncontent">
246 <div class="center"><img src="xran__compression_8cpp_a74512492194fcab6a55f769e02aa37b4_icgraph.png" border="0" usemap="#xran__compression_8cpp_a74512492194fcab6a55f769e02aa37b4_icgraph" alt=""/></div>
247 <map name="xran__compression_8cpp_a74512492194fcab6a55f769e02aa37b4_icgraph" id="xran__compression_8cpp_a74512492194fcab6a55f769e02aa37b4_icgraph">
248 <area shape="rect" id="node2" href="namespace_block_float_compander.html#a5b3ddd524752c8f556bc4c654e392321" title="8 bit compression " alt="" coords="180,5,332,61"/>
249 <area shape="rect" id="node6" href="namespace_block_float_compander.html#a2356f186e264c7cea4e3c26d448bb1d5" title="9 bit compression " alt="" coords="180,85,332,141"/>
250 <area shape="rect" id="node8" href="namespace_block_float_compander.html#ae525362ca026142cab4ac983e29ad0ff" title="10 bit compression " alt="" coords="180,165,332,221"/>
251 <area shape="rect" id="node10" href="namespace_block_float_compander.html#a2a8db4c5039bc3d5237b31ca2a129815" title="12 bit compression " alt="" coords="180,245,332,301"/>
252 <area shape="rect" id="node3" href="compander__functional_8cc.html#af62cc2e23934ba7efa6a132a26a339fe" title="TEST_P" alt="" coords="431,20,503,47"/>
253 <area shape="rect" id="node4" href="xran__compression_8cpp.html#a0651de68e87558106615163f96b3e599" title="xranlib_compress_avx512" alt="" coords="380,140,553,167"/>
254 <area shape="rect" id="node5" href="compander__functional_8cc.html#a45d64e11a1ecc040577b7f22b27dde51" title="TEST_P" alt="" coords="601,140,673,167"/>
255 <area shape="rect" id="node7" href="compander__functional_8cc.html#a05f3cac0967e0fc77f7c8e0a1f05ba82" title="TEST_P" alt="" coords="431,89,503,116"/>
256 <area shape="rect" id="node9" href="compander__functional_8cc.html#a3351c323474adfa4b66c985141776b2f" title="TEST_P" alt="" coords="431,191,503,217"/>
257 <area shape="rect" id="node11" href="compander__functional_8cc.html#a53f55fd621ce0edd0b50933321ae7ade" title="TEST_P" alt="" coords="431,260,503,287"/>
263 <a id="a4a2767bece9b74bb6348b416af70a3de"></a>
264 <h2 class="memtitle"><span class="permalink"><a href="#a4a2767bece9b74bb6348b416af70a3de">◆ </a></span>networkBytePack10b()</h2>
266 <div class="memitem">
267 <div class="memproto">
268 <table class="memname">
270 <td class="memname">__m512i networkBytePack10b </td>
272 <td class="paramtype">const __m512i </td>
273 <td class="paramname"><em>compData</em></td><td>)</td>
277 </div><div class="memdoc">
278 <p>Pack compressed 10 bit data in network byte order See <a href="https://soco.intel.com/docs/DOC-2665619">https://soco.intel.com/docs/DOC-2665619</a> </p>
279 <p>Logical shift left to align network order byte parts</p>
280 <p>First epi8 shuffle of even indexed samples</p>
281 <p>Second epi8 shuffle of odd indexed samples</p>
282 <p>Ternary blend of the two shuffled results </p>
284 <p class="definition">Definition at line <a class="el" href="xran__compression_8cpp_source.html#l00164">164</a> of file <a class="el" href="xran__compression_8cpp_source.html">xran_compression.cpp</a>.</p>
285 <div class="dynheader">
286 Here is the caller graph for this function:</div>
287 <div class="dyncontent">
288 <div class="center"><img src="xran__compression_8cpp_a4a2767bece9b74bb6348b416af70a3de_icgraph.png" border="0" usemap="#xran__compression_8cpp_a4a2767bece9b74bb6348b416af70a3de_icgraph" alt=""/></div>
289 <map name="xran__compression_8cpp_a4a2767bece9b74bb6348b416af70a3de_icgraph" id="xran__compression_8cpp_a4a2767bece9b74bb6348b416af70a3de_icgraph">
290 <area shape="rect" id="node2" href="namespace_block_float_compander.html#ae525362ca026142cab4ac983e29ad0ff" title="10 bit compression " alt="" coords="200,16,352,72"/>
291 <area shape="rect" id="node3" href="compander__functional_8cc.html#a3351c323474adfa4b66c985141776b2f" title="TEST_P" alt="" coords="451,5,523,32"/>
292 <area shape="rect" id="node4" href="xran__compression_8cpp.html#a0651de68e87558106615163f96b3e599" title="xranlib_compress_avx512" alt="" coords="400,56,573,83"/>
293 <area shape="rect" id="node5" href="compander__functional_8cc.html#a45d64e11a1ecc040577b7f22b27dde51" title="TEST_P" alt="" coords="621,56,693,83"/>
299 <a id="aafe7eae735c4ebf8f028e7baa6783c22"></a>
300 <h2 class="memtitle"><span class="permalink"><a href="#aafe7eae735c4ebf8f028e7baa6783c22">◆ </a></span>networkBytePack12b()</h2>
302 <div class="memitem">
303 <div class="memproto">
304 <table class="memname">
306 <td class="memname">__m512i networkBytePack12b </td>
308 <td class="paramtype">const __m512i </td>
309 <td class="paramname"><em>compData</em></td><td>)</td>
313 </div><div class="memdoc">
314 <p>Pack compressed 12 bit data in network byte order See <a href="https://soco.intel.com/docs/DOC-2665619">https://soco.intel.com/docs/DOC-2665619</a> </p>
315 <p>Logical shift left to align network order byte parts</p>
316 <p>First epi8 shuffle of even indexed samples</p>
317 <p>Second epi8 shuffle of odd indexed samples</p>
318 <p>Ternary blend of the two shuffled results </p>
320 <p class="definition">Definition at line <a class="el" href="xran__compression_8cpp_source.html#l00201">201</a> of file <a class="el" href="xran__compression_8cpp_source.html">xran_compression.cpp</a>.</p>
321 <div class="dynheader">
322 Here is the caller graph for this function:</div>
323 <div class="dyncontent">
324 <div class="center"><img src="xran__compression_8cpp_aafe7eae735c4ebf8f028e7baa6783c22_icgraph.png" border="0" usemap="#xran__compression_8cpp_aafe7eae735c4ebf8f028e7baa6783c22_icgraph" alt=""/></div>
325 <map name="xran__compression_8cpp_aafe7eae735c4ebf8f028e7baa6783c22_icgraph" id="xran__compression_8cpp_aafe7eae735c4ebf8f028e7baa6783c22_icgraph">
326 <area shape="rect" id="node2" href="namespace_block_float_compander.html#a2a8db4c5039bc3d5237b31ca2a129815" title="12 bit compression " alt="" coords="200,16,352,72"/>
327 <area shape="rect" id="node3" href="compander__functional_8cc.html#a53f55fd621ce0edd0b50933321ae7ade" title="TEST_P" alt="" coords="451,5,523,32"/>
328 <area shape="rect" id="node4" href="xran__compression_8cpp.html#a0651de68e87558106615163f96b3e599" title="xranlib_compress_avx512" alt="" coords="400,56,573,83"/>
329 <area shape="rect" id="node5" href="compander__functional_8cc.html#a45d64e11a1ecc040577b7f22b27dde51" title="TEST_P" alt="" coords="621,56,693,83"/>
335 <a id="acb87fe08d3492b251e7a2561488064fa"></a>
336 <h2 class="memtitle"><span class="permalink"><a href="#acb87fe08d3492b251e7a2561488064fa">◆ </a></span>networkBytePack9b()</h2>
338 <div class="memitem">
339 <div class="memproto">
340 <table class="memname">
342 <td class="memname">__m512i networkBytePack9b </td>
344 <td class="paramtype">const __m512i </td>
345 <td class="paramname"><em>compData</em></td><td>)</td>
349 </div><div class="memdoc">
350 <p>Pack compressed 9 bit data in network byte order See <a href="https://soco.intel.com/docs/DOC-2665619">https://soco.intel.com/docs/DOC-2665619</a> </p>
351 <p>Logical shift left to align network order byte parts</p>
352 <p>First epi8 shuffle of even indexed samples</p>
353 <p>Second epi8 shuffle of odd indexed samples</p>
354 <p>Ternary blend of the two shuffled results </p>
356 <p class="definition">Definition at line <a class="el" href="xran__compression_8cpp_source.html#l00127">127</a> of file <a class="el" href="xran__compression_8cpp_source.html">xran_compression.cpp</a>.</p>
357 <div class="dynheader">
358 Here is the caller graph for this function:</div>
359 <div class="dyncontent">
360 <div class="center"><img src="xran__compression_8cpp_acb87fe08d3492b251e7a2561488064fa_icgraph.png" border="0" usemap="#xran__compression_8cpp_acb87fe08d3492b251e7a2561488064fa_icgraph" alt=""/></div>
361 <map name="xran__compression_8cpp_acb87fe08d3492b251e7a2561488064fa_icgraph" id="xran__compression_8cpp_acb87fe08d3492b251e7a2561488064fa_icgraph">
362 <area shape="rect" id="node2" href="namespace_block_float_compander.html#a2356f186e264c7cea4e3c26d448bb1d5" title="9 bit compression " alt="" coords="192,16,344,72"/>
363 <area shape="rect" id="node3" href="compander__functional_8cc.html#a05f3cac0967e0fc77f7c8e0a1f05ba82" title="TEST_P" alt="" coords="443,5,515,32"/>
364 <area shape="rect" id="node4" href="xran__compression_8cpp.html#a0651de68e87558106615163f96b3e599" title="xranlib_compress_avx512" alt="" coords="392,56,565,83"/>
365 <area shape="rect" id="node5" href="compander__functional_8cc.html#a45d64e11a1ecc040577b7f22b27dde51" title="TEST_P" alt="" coords="613,56,685,83"/>
371 <a id="a27043376e22397cc933d3c4d9450677b"></a>
372 <h2 class="memtitle"><span class="permalink"><a href="#a27043376e22397cc933d3c4d9450677b">◆ </a></span>networkByteUnpack10b()</h2>
374 <div class="memitem">
375 <div class="memproto">
376 <table class="memname">
378 <td class="memname">__m512i networkByteUnpack10b </td>
380 <td class="paramtype">const uint8_t * </td>
381 <td class="paramname"><em>inData</em></td><td>)</td>
385 </div><div class="memdoc">
386 <p>Unpack compressed 10 bit data in network byte order See <a href="https://soco.intel.com/docs/DOC-2665619">https://soco.intel.com/docs/DOC-2665619</a> </p>
387 <p>Align chunks of compressed bytes into lanes to allow for expansion</p>
388 <p>Byte shuffle to get all bits for each sample into 16b chunks Due to previous permute to get chunks of bytes into each lane, lanes 0 and 2 happen to be aligned, but lane 1 is offset by 2 bytes</p>
389 <p>Logical shift left to set sign bit</p>
390 <p>Mask to zero unwanted bits </p>
392 <p class="definition">Definition at line <a class="el" href="xran__compression_8cpp_source.html#l00271">271</a> of file <a class="el" href="xran__compression_8cpp_source.html">xran_compression.cpp</a>.</p>
393 <div class="dynheader">
394 Here is the caller graph for this function:</div>
395 <div class="dyncontent">
396 <div class="center"><img src="xran__compression_8cpp_a27043376e22397cc933d3c4d9450677b_icgraph.png" border="0" usemap="#xran__compression_8cpp_a27043376e22397cc933d3c4d9450677b_icgraph" alt=""/></div>
397 <map name="xran__compression_8cpp_a27043376e22397cc933d3c4d9450677b_icgraph" id="xran__compression_8cpp_a27043376e22397cc933d3c4d9450677b_icgraph">
398 <area shape="rect" id="node2" href="namespace_block_float_compander.html#a8fae7506e2b9c9f9365b306375ab6eff" title="10 bit expansion " alt="" coords="215,20,379,76"/>
399 <area shape="rect" id="node3" href="compander__functional_8cc.html#a3351c323474adfa4b66c985141776b2f" title="TEST_P" alt="" coords="460,5,532,32"/>
400 <area shape="rect" id="node4" href="xran__compression_8cpp.html#a2bd6ebeefb6ca9674598d443e697918c" title="xranlib_decompress\l_avx512" alt="" coords="427,57,565,98"/>
401 <area shape="rect" id="node5" href="compander__functional_8cc.html#a45d64e11a1ecc040577b7f22b27dde51" title="TEST_P" alt="" coords="613,64,685,91"/>
407 <a id="a91aa9bdb6901711b43d848a4a5a94d2f"></a>
408 <h2 class="memtitle"><span class="permalink"><a href="#a91aa9bdb6901711b43d848a4a5a94d2f">◆ </a></span>networkByteUnpack12b()</h2>
410 <div class="memitem">
411 <div class="memproto">
412 <table class="memname">
414 <td class="memname">__m512i networkByteUnpack12b </td>
416 <td class="paramtype">const uint8_t * </td>
417 <td class="paramname"><em>inData</em></td><td>)</td>
421 </div><div class="memdoc">
422 <p>Unpack compressed 12 bit data in network byte order See <a href="https://soco.intel.com/docs/DOC-2665619">https://soco.intel.com/docs/DOC-2665619</a> </p>
423 <p>Align chunks of compressed bytes into lanes to allow for expansion</p>
424 <p>Byte shuffle to get all bits for each sample into 16b chunks For 12b mantissa all lanes post-permute are aligned and require same shuffle offset</p>
425 <p>Logical shift left to set sign bit</p>
426 <p>Mask to zero unwanted bits </p>
428 <p class="definition">Definition at line <a class="el" href="xran__compression_8cpp_source.html#l00304">304</a> of file <a class="el" href="xran__compression_8cpp_source.html">xran_compression.cpp</a>.</p>
429 <div class="dynheader">
430 Here is the caller graph for this function:</div>
431 <div class="dyncontent">
432 <div class="center"><img src="xran__compression_8cpp_a91aa9bdb6901711b43d848a4a5a94d2f_icgraph.png" border="0" usemap="#xran__compression_8cpp_a91aa9bdb6901711b43d848a4a5a94d2f_icgraph" alt=""/></div>
433 <map name="xran__compression_8cpp_a91aa9bdb6901711b43d848a4a5a94d2f_icgraph" id="xran__compression_8cpp_a91aa9bdb6901711b43d848a4a5a94d2f_icgraph">
434 <area shape="rect" id="node2" href="namespace_block_float_compander.html#a65b09b78fac0c8dcfc9edd5091b728dd" title="12 bit expansion " alt="" coords="215,20,379,76"/>
435 <area shape="rect" id="node3" href="compander__functional_8cc.html#a53f55fd621ce0edd0b50933321ae7ade" title="TEST_P" alt="" coords="460,5,532,32"/>
436 <area shape="rect" id="node4" href="xran__compression_8cpp.html#a2bd6ebeefb6ca9674598d443e697918c" title="xranlib_decompress\l_avx512" alt="" coords="427,57,565,98"/>
437 <area shape="rect" id="node5" href="compander__functional_8cc.html#a45d64e11a1ecc040577b7f22b27dde51" title="TEST_P" alt="" coords="613,64,685,91"/>
443 <a id="afb29866152e84d42cd2e3bc116454493"></a>
444 <h2 class="memtitle"><span class="permalink"><a href="#afb29866152e84d42cd2e3bc116454493">◆ </a></span>networkByteUnpack9b()</h2>
446 <div class="memitem">
447 <div class="memproto">
448 <table class="memname">
450 <td class="memname">__m512i networkByteUnpack9b </td>
452 <td class="paramtype">const uint8_t * </td>
453 <td class="paramname"><em>inData</em></td><td>)</td>
457 </div><div class="memdoc">
458 <p>Unpack compressed 9 bit data in network byte order See <a href="https://soco.intel.com/docs/DOC-2665619">https://soco.intel.com/docs/DOC-2665619</a> </p>
459 <p>Align chunks of compressed bytes into lanes to allow for expansion</p>
460 <p>Byte shuffle to get all bits for each sample into 16b chunks Due to previous permute to get chunks of bytes into each lane, there is a different shuffle offset in each lane</p>
461 <p>Logical shift left to set sign bit</p>
462 <p>Mask to zero unwanted bits </p>
464 <p class="definition">Definition at line <a class="el" href="xran__compression_8cpp_source.html#l00238">238</a> of file <a class="el" href="xran__compression_8cpp_source.html">xran_compression.cpp</a>.</p>
465 <div class="dynheader">
466 Here is the caller graph for this function:</div>
467 <div class="dyncontent">
468 <div class="center"><img src="xran__compression_8cpp_afb29866152e84d42cd2e3bc116454493_icgraph.png" border="0" usemap="#xran__compression_8cpp_afb29866152e84d42cd2e3bc116454493_icgraph" alt=""/></div>
469 <map name="xran__compression_8cpp_afb29866152e84d42cd2e3bc116454493_icgraph" id="xran__compression_8cpp_afb29866152e84d42cd2e3bc116454493_icgraph">
470 <area shape="rect" id="node2" href="namespace_block_float_compander.html#a32917a78ac1596d9aa95e4089ec88ba9" title="9 bit expansion " alt="" coords="208,20,365,76"/>
471 <area shape="rect" id="node3" href="compander__functional_8cc.html#a05f3cac0967e0fc77f7c8e0a1f05ba82" title="TEST_P" alt="" coords="447,5,519,32"/>
472 <area shape="rect" id="node4" href="xran__compression_8cpp.html#a2bd6ebeefb6ca9674598d443e697918c" title="xranlib_decompress\l_avx512" alt="" coords="413,57,552,98"/>
473 <area shape="rect" id="node5" href="compander__functional_8cc.html#a45d64e11a1ecc040577b7f22b27dde51" title="TEST_P" alt="" coords="600,64,672,91"/>
479 <a id="a0651de68e87558106615163f96b3e599"></a>
480 <h2 class="memtitle"><span class="permalink"><a href="#a0651de68e87558106615163f96b3e599">◆ </a></span>xranlib_compress_avx512()</h2>
482 <div class="memitem">
483 <div class="memproto">
484 <table class="memname">
486 <td class="memname">int32_t xranlib_compress_avx512 </td>
488 <td class="paramtype">const struct <a class="el" href="structxranlib__compress__request.html">xranlib_compress_request</a> * </td>
489 <td class="paramname"><em>request</em>, </td>
492 <td class="paramkey"></td>
494 <td class="paramtype">struct <a class="el" href="structxranlib__compress__response.html">xranlib_compress_response</a> * </td>
495 <td class="paramname"><em>response</em> </td>
503 </div><div class="memdoc">
505 <p class="definition">Definition at line <a class="el" href="xran__compression_8cpp_source.html#l00729">729</a> of file <a class="el" href="xran__compression_8cpp_source.html">xran_compression.cpp</a>.</p>
506 <div class="dynheader">
507 Here is the call graph for this function:</div>
508 <div class="dyncontent">
509 <div class="center"><img src="xran__compression_8cpp_a0651de68e87558106615163f96b3e599_cgraph.png" border="0" usemap="#xran__compression_8cpp_a0651de68e87558106615163f96b3e599_cgraph" alt=""/></div>
510 <map name="xran__compression_8cpp_a0651de68e87558106615163f96b3e599_cgraph" id="xran__compression_8cpp_a0651de68e87558106615163f96b3e599_cgraph">
511 <area shape="rect" id="node2" href="namespace_block_float_compander.html#a5b3ddd524752c8f556bc4c654e392321" title="8 bit compression " alt="" coords="247,85,399,141"/>
512 <area shape="rect" id="node4" href="namespace_block_float_compander.html#a2356f186e264c7cea4e3c26d448bb1d5" title="9 bit compression " alt="" coords="247,5,399,61"/>
513 <area shape="rect" id="node6" href="namespace_block_float_compander.html#ae525362ca026142cab4ac983e29ad0ff" title="10 bit compression " alt="" coords="247,165,399,221"/>
514 <area shape="rect" id="node8" href="namespace_block_float_compander.html#a2a8db4c5039bc3d5237b31ca2a129815" title="12 bit compression " alt="" coords="247,245,399,301"/>
515 <area shape="rect" id="node10" href="namespace_block_float_compander.html#a45cc83687ca392534168cb8f4d64182f" title="Reference compression. " alt="" coords="227,326,419,367"/>
516 <area shape="rect" id="node3" href="xran__compression_8cpp.html#a74512492194fcab6a55f769e02aa37b4" title="Compute exponent value for a set of RB from the maximum absolute value. " alt="" coords="477,115,603,141"/>
517 <area shape="rect" id="node5" href="xran__compression_8cpp.html#acb87fe08d3492b251e7a2561488064fa" title="networkBytePack9b" alt="" coords="471,20,609,47"/>
518 <area shape="rect" id="node7" href="xran__compression_8cpp.html#a4a2767bece9b74bb6348b416af70a3de" title="networkBytePack10b" alt="" coords="467,180,613,207"/>
519 <area shape="rect" id="node9" href="xran__compression_8cpp.html#aafe7eae735c4ebf8f028e7baa6783c22" title="networkBytePack12b" alt="" coords="467,260,613,287"/>
522 <div class="dynheader">
523 Here is the caller graph for this function:</div>
524 <div class="dyncontent">
525 <div class="center"><img src="xran__compression_8cpp_a0651de68e87558106615163f96b3e599_icgraph.png" border="0" usemap="#xran__compression_8cpp_a0651de68e87558106615163f96b3e599_icgraph" alt=""/></div>
526 <map name="xran__compression_8cpp_a0651de68e87558106615163f96b3e599_icgraph" id="xran__compression_8cpp_a0651de68e87558106615163f96b3e599_icgraph">
527 <area shape="rect" id="node2" href="compander__functional_8cc.html#a45d64e11a1ecc040577b7f22b27dde51" title="TEST_P" alt="" coords="227,5,299,32"/>
533 <a id="aa027200fc051c80b515ee8aeadf44a0e"></a>
534 <h2 class="memtitle"><span class="permalink"><a href="#aa027200fc051c80b515ee8aeadf44a0e">◆ </a></span>xranlib_compress_avx512_bfw()</h2>
536 <div class="memitem">
537 <div class="memproto">
538 <table class="memname">
540 <td class="memname">int32_t xranlib_compress_avx512_bfw </td>
542 <td class="paramtype">const struct <a class="el" href="structxranlib__compress__request.html">xranlib_compress_request</a> * </td>
543 <td class="paramname"><em>request</em>, </td>
546 <td class="paramkey"></td>
548 <td class="paramtype">struct <a class="el" href="structxranlib__compress__response.html">xranlib_compress_response</a> * </td>
549 <td class="paramname"><em>response</em> </td>
557 </div><div class="memdoc">
559 <p class="definition">Definition at line <a class="el" href="xran__compression_8cpp_source.html#l00783">783</a> of file <a class="el" href="xran__compression_8cpp_source.html">xran_compression.cpp</a>.</p>
560 <div class="dynheader">
561 Here is the call graph for this function:</div>
562 <div class="dyncontent">
563 <div class="center"><img src="xran__compression_8cpp_aa027200fc051c80b515ee8aeadf44a0e_cgraph.png" border="0" usemap="#xran__compression_8cpp_aa027200fc051c80b515ee8aeadf44a0e_cgraph" alt=""/></div>
564 <map name="xran__compression_8cpp_aa027200fc051c80b515ee8aeadf44a0e_cgraph" id="xran__compression_8cpp_aa027200fc051c80b515ee8aeadf44a0e_cgraph">
565 <area shape="rect" id="node2" href="namespace_block_float_compander_b_f_w.html#a45cc83687ca392534168cb8f4d64182f" title="Reference compression. " alt="" coords="255,5,447,47"/>
566 <area shape="rect" id="node3" href="gen__test_8m.html#ae7c338f9b485676bfc0ee154384d8676" title="switch" alt="" coords="321,71,381,98"/>
569 <div class="dynheader">
570 Here is the caller graph for this function:</div>
571 <div class="dyncontent">
572 <div class="center"><img src="xran__compression_8cpp_aa027200fc051c80b515ee8aeadf44a0e_icgraph.png" border="0" usemap="#xran__compression_8cpp_aa027200fc051c80b515ee8aeadf44a0e_icgraph" alt=""/></div>
573 <map name="xran__compression_8cpp_aa027200fc051c80b515ee8aeadf44a0e_icgraph" id="xran__compression_8cpp_aa027200fc051c80b515ee8aeadf44a0e_icgraph">
574 <area shape="rect" id="node2" href="xran__cp__api_8c.html#a848d22f9f7e5f493782bf8a9bfdb8f3a" title="xran_cp_populate_section\l_ext_1" alt="" coords="255,5,428,47"/>
575 <area shape="rect" id="node3" href="c__plane__tests_8cc.html#a11a0b914a08e5375cae792dc6db08c7a" title="TEST_P" alt="" coords="476,13,548,39"/>
581 <a id="a2bd6ebeefb6ca9674598d443e697918c"></a>
582 <h2 class="memtitle"><span class="permalink"><a href="#a2bd6ebeefb6ca9674598d443e697918c">◆ </a></span>xranlib_decompress_avx512()</h2>
584 <div class="memitem">
585 <div class="memproto">
586 <table class="memname">
588 <td class="memname">int32_t xranlib_decompress_avx512 </td>
590 <td class="paramtype">const struct <a class="el" href="structxranlib__decompress__request.html">xranlib_decompress_request</a> * </td>
591 <td class="paramname"><em>request</em>, </td>
594 <td class="paramkey"></td>
596 <td class="paramtype">struct <a class="el" href="structxranlib__decompress__response.html">xranlib_decompress_response</a> * </td>
597 <td class="paramname"><em>response</em> </td>
605 </div><div class="memdoc">
607 <p class="definition">Definition at line <a class="el" href="xran__compression_8cpp_source.html#l00834">834</a> of file <a class="el" href="xran__compression_8cpp_source.html">xran_compression.cpp</a>.</p>
608 <div class="dynheader">
609 Here is the call graph for this function:</div>
610 <div class="dyncontent">
611 <div class="center"><img src="xran__compression_8cpp_a2bd6ebeefb6ca9674598d443e697918c_cgraph.png" border="0" usemap="#xran__compression_8cpp_a2bd6ebeefb6ca9674598d443e697918c_cgraph" alt=""/></div>
612 <map name="xran__compression_8cpp_a2bd6ebeefb6ca9674598d443e697918c_cgraph" id="xran__compression_8cpp_a2bd6ebeefb6ca9674598d443e697918c_cgraph">
613 <area shape="rect" id="node2" href="namespace_block_float_compander.html#ae4ad42b117d59e2e7ff8fad2d5da506e" title="8 bit expansion " alt="" coords="201,5,359,61"/>
614 <area shape="rect" id="node3" href="namespace_block_float_compander.html#a32917a78ac1596d9aa95e4089ec88ba9" title="9 bit expansion " alt="" coords="201,85,359,141"/>
615 <area shape="rect" id="node5" href="namespace_block_float_compander.html#a8fae7506e2b9c9f9365b306375ab6eff" title="10 bit expansion " alt="" coords="198,165,362,221"/>
616 <area shape="rect" id="node7" href="namespace_block_float_compander.html#a65b09b78fac0c8dcfc9edd5091b728dd" title="12 bit expansion " alt="" coords="198,245,362,301"/>
617 <area shape="rect" id="node9" href="namespace_block_float_compander.html#a5f4776cd07aac0ae2d9dbd02aaba3435" title="Reference expansion. " alt="" coords="192,326,368,367"/>
618 <area shape="rect" id="node4" href="xran__compression_8cpp.html#afb29866152e84d42cd2e3bc116454493" title="networkByteUnpack9b" alt="" coords="419,100,574,127"/>
619 <area shape="rect" id="node6" href="xran__compression_8cpp.html#a27043376e22397cc933d3c4d9450677b" title="networkByteUnpack10b" alt="" coords="416,180,577,207"/>
620 <area shape="rect" id="node8" href="xran__compression_8cpp.html#a91aa9bdb6901711b43d848a4a5a94d2f" title="networkByteUnpack12b" alt="" coords="416,260,577,287"/>
623 <div class="dynheader">
624 Here is the caller graph for this function:</div>
625 <div class="dyncontent">
626 <div class="center"><img src="xran__compression_8cpp_a2bd6ebeefb6ca9674598d443e697918c_icgraph.png" border="0" usemap="#xran__compression_8cpp_a2bd6ebeefb6ca9674598d443e697918c_icgraph" alt=""/></div>
627 <map name="xran__compression_8cpp_a2bd6ebeefb6ca9674598d443e697918c_icgraph" id="xran__compression_8cpp_a2bd6ebeefb6ca9674598d443e697918c_icgraph">
628 <area shape="rect" id="node2" href="compander__functional_8cc.html#a45d64e11a1ecc040577b7f22b27dde51" title="TEST_P" alt="" coords="192,13,264,39"/>
634 </div><!-- contents -->
635 <!-- start footer part -->
636 <hr class="footer"/><address class="footer"><small>
637 Generated by  <a href="http://www.doxygen.org/index.html">
638 <img class="footer" src="doxygen.png" alt="doxygen"/>