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