1*17f65170SRuslan Bukin /*
2*17f65170SRuslan Bukin  * \file       trc_printable_elem.cpp
3*17f65170SRuslan Bukin  * \brief      OpenCSD :
4*17f65170SRuslan Bukin  *
5*17f65170SRuslan Bukin  * \copyright  Copyright (c) 2015, ARM Limited. All Rights Reserved.
6*17f65170SRuslan Bukin  */
7*17f65170SRuslan Bukin 
8*17f65170SRuslan Bukin /*
9*17f65170SRuslan Bukin  * Redistribution and use in source and binary forms, with or without modification,
10*17f65170SRuslan Bukin  * are permitted provided that the following conditions are met:
11*17f65170SRuslan Bukin  *
12*17f65170SRuslan Bukin  * 1. Redistributions of source code must retain the above copyright notice,
13*17f65170SRuslan Bukin  * this list of conditions and the following disclaimer.
14*17f65170SRuslan Bukin  *
15*17f65170SRuslan Bukin  * 2. Redistributions in binary form must reproduce the above copyright notice,
16*17f65170SRuslan Bukin  * this list of conditions and the following disclaimer in the documentation
17*17f65170SRuslan Bukin  * and/or other materials provided with the distribution.
18*17f65170SRuslan Bukin  *
19*17f65170SRuslan Bukin  * 3. Neither the name of the copyright holder nor the names of its contributors
20*17f65170SRuslan Bukin  * may be used to endorse or promote products derived from this software without
21*17f65170SRuslan Bukin  * specific prior written permission.
22*17f65170SRuslan Bukin  *
23*17f65170SRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
24*17f65170SRuslan Bukin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25*17f65170SRuslan Bukin  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26*17f65170SRuslan Bukin  * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27*17f65170SRuslan Bukin  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28*17f65170SRuslan Bukin  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29*17f65170SRuslan Bukin  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30*17f65170SRuslan Bukin  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31*17f65170SRuslan Bukin  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32*17f65170SRuslan Bukin  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33*17f65170SRuslan Bukin  */
34*17f65170SRuslan Bukin 
35*17f65170SRuslan Bukin #include "common/trc_printable_elem.h"
36*17f65170SRuslan Bukin #include <cassert>
37*17f65170SRuslan Bukin #include <cstring>
38*17f65170SRuslan Bukin #if defined(_MSC_VER) && (_MSC_VER < 1900)
39*17f65170SRuslan Bukin  /** VS2010 does not support inttypes - remove when VS2010 support is dropped */
40*17f65170SRuslan Bukin #define __PRI64_PREFIX "ll"
41*17f65170SRuslan Bukin #define PRIX64 __PRI64_PREFIX "X"
42*17f65170SRuslan Bukin #define PRIu64 __PRI64_PREFIX "u"
43*17f65170SRuslan Bukin #define PRIu32 "u"
44*17f65170SRuslan Bukin #else
45*17f65170SRuslan Bukin #include <cinttypes>
46*17f65170SRuslan Bukin #endif
47*17f65170SRuslan Bukin 
getValStr(std::string & valStr,const int valTotalBitSize,const int valValidBits,const uint64_t value,const bool asHex,const int updateBits)48*17f65170SRuslan Bukin void trcPrintableElem::getValStr(std::string &valStr, const int valTotalBitSize, const int valValidBits, const uint64_t value, const bool asHex /* = true*/, const int updateBits /* = 0*/)
49*17f65170SRuslan Bukin {
50*17f65170SRuslan Bukin     static char szStrBuffer[128];
51*17f65170SRuslan Bukin     static char szFormatBuffer[32];
52*17f65170SRuslan Bukin 
53*17f65170SRuslan Bukin     assert((valTotalBitSize >= 4) && (valTotalBitSize <= 64));
54*17f65170SRuslan Bukin 
55*17f65170SRuslan Bukin     uint64_t LimitMask = ~0ULL;
56*17f65170SRuslan Bukin     LimitMask >>= 64-valTotalBitSize;
57*17f65170SRuslan Bukin     valStr = "0x";
58*17f65170SRuslan Bukin 
59*17f65170SRuslan Bukin     if(asHex)
60*17f65170SRuslan Bukin     {
61*17f65170SRuslan Bukin         int numHexChars = valTotalBitSize / 4;
62*17f65170SRuslan Bukin         numHexChars += ((valTotalBitSize % 4) > 0) ? 1 : 0;
63*17f65170SRuslan Bukin 
64*17f65170SRuslan Bukin         int validChars = valValidBits / 4;
65*17f65170SRuslan Bukin         if((valValidBits % 4) > 0) validChars++;
66*17f65170SRuslan Bukin         int QM = numHexChars - validChars;
67*17f65170SRuslan Bukin         while(QM)
68*17f65170SRuslan Bukin         {
69*17f65170SRuslan Bukin             QM--;
70*17f65170SRuslan Bukin             valStr += "?";
71*17f65170SRuslan Bukin         }
72*17f65170SRuslan Bukin         if(valValidBits > 32)
73*17f65170SRuslan Bukin         {
74*17f65170SRuslan Bukin             sprintf(szFormatBuffer,"%%0%dllX",validChars);  // create the format
75*17f65170SRuslan Bukin             sprintf(szStrBuffer,szFormatBuffer,value); // fill the buffer
76*17f65170SRuslan Bukin         }
77*17f65170SRuslan Bukin         else
78*17f65170SRuslan Bukin         {
79*17f65170SRuslan Bukin             sprintf(szFormatBuffer,"%%0%dlX",validChars);  // create the format
80*17f65170SRuslan Bukin             sprintf(szStrBuffer,szFormatBuffer,(uint32_t)value); // fill the buffer
81*17f65170SRuslan Bukin         }
82*17f65170SRuslan Bukin         valStr+=szStrBuffer;
83*17f65170SRuslan Bukin         if(valValidBits < valTotalBitSize)
84*17f65170SRuslan Bukin         {
85*17f65170SRuslan Bukin             sprintf(szStrBuffer," (%d:0)", valValidBits-1);
86*17f65170SRuslan Bukin             valStr+=szStrBuffer;
87*17f65170SRuslan Bukin         }
88*17f65170SRuslan Bukin 
89*17f65170SRuslan Bukin         if(updateBits)
90*17f65170SRuslan Bukin         {
91*17f65170SRuslan Bukin             uint64_t updateMask = ~0ULL;
92*17f65170SRuslan Bukin             updateMask >>= 64-updateBits;
93*17f65170SRuslan Bukin             sprintf(szStrBuffer," ~[0x%" PRIX64 "]",value & updateMask);
94*17f65170SRuslan Bukin             valStr+=szStrBuffer;
95*17f65170SRuslan Bukin         }
96*17f65170SRuslan Bukin     }
97*17f65170SRuslan Bukin     else
98*17f65170SRuslan Bukin     {
99*17f65170SRuslan Bukin         valStr = "";
100*17f65170SRuslan Bukin         if(valValidBits < valTotalBitSize)
101*17f65170SRuslan Bukin             valStr += "??";
102*17f65170SRuslan Bukin         if(valValidBits > 32)
103*17f65170SRuslan Bukin         {
104*17f65170SRuslan Bukin             sprintf(szStrBuffer,"%" PRIu64 ,value);
105*17f65170SRuslan Bukin         }
106*17f65170SRuslan Bukin         else
107*17f65170SRuslan Bukin         {
108*17f65170SRuslan Bukin             sprintf(szStrBuffer,"%" PRIu32 ,(uint32_t)value);
109*17f65170SRuslan Bukin         }
110*17f65170SRuslan Bukin         valStr +=  szStrBuffer;
111*17f65170SRuslan Bukin         if(valValidBits < valTotalBitSize)
112*17f65170SRuslan Bukin         {
113*17f65170SRuslan Bukin             sprintf(szStrBuffer," (%d:0)", valValidBits-1);
114*17f65170SRuslan Bukin             valStr+=szStrBuffer;
115*17f65170SRuslan Bukin         }
116*17f65170SRuslan Bukin     }
117*17f65170SRuslan Bukin }
118*17f65170SRuslan Bukin 
119*17f65170SRuslan Bukin 
120*17f65170SRuslan Bukin /* End of File trc_printable_elem.cpp */
121