117f65170SRuslan Bukin /* 217f65170SRuslan Bukin * \file trc_printable_elem.cpp 317f65170SRuslan Bukin * \brief OpenCSD : 417f65170SRuslan Bukin * 517f65170SRuslan Bukin * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved. 617f65170SRuslan Bukin */ 717f65170SRuslan Bukin 817f65170SRuslan Bukin /* 917f65170SRuslan Bukin * Redistribution and use in source and binary forms, with or without modification, 1017f65170SRuslan Bukin * are permitted provided that the following conditions are met: 1117f65170SRuslan Bukin * 1217f65170SRuslan Bukin * 1. Redistributions of source code must retain the above copyright notice, 1317f65170SRuslan Bukin * this list of conditions and the following disclaimer. 1417f65170SRuslan Bukin * 1517f65170SRuslan Bukin * 2. Redistributions in binary form must reproduce the above copyright notice, 1617f65170SRuslan Bukin * this list of conditions and the following disclaimer in the documentation 1717f65170SRuslan Bukin * and/or other materials provided with the distribution. 1817f65170SRuslan Bukin * 1917f65170SRuslan Bukin * 3. Neither the name of the copyright holder nor the names of its contributors 2017f65170SRuslan Bukin * may be used to endorse or promote products derived from this software without 2117f65170SRuslan Bukin * specific prior written permission. 2217f65170SRuslan Bukin * 2317f65170SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND 2417f65170SRuslan Bukin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 2517f65170SRuslan Bukin * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2617f65170SRuslan Bukin * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 2717f65170SRuslan Bukin * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 2817f65170SRuslan Bukin * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 2917f65170SRuslan Bukin * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 3017f65170SRuslan Bukin * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3117f65170SRuslan Bukin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3217f65170SRuslan Bukin * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3317f65170SRuslan Bukin */ 3417f65170SRuslan Bukin 3517f65170SRuslan Bukin #include "common/trc_printable_elem.h" 3617f65170SRuslan Bukin #include <cassert> 3717f65170SRuslan Bukin #include <cstring> 3817f65170SRuslan Bukin #if defined(_MSC_VER) && (_MSC_VER < 1900) 3917f65170SRuslan Bukin /** VS2010 does not support inttypes - remove when VS2010 support is dropped */ 4017f65170SRuslan Bukin #define __PRI64_PREFIX "ll" 4117f65170SRuslan Bukin #define PRIX64 __PRI64_PREFIX "X" 4217f65170SRuslan Bukin #define PRIu64 __PRI64_PREFIX "u" 4317f65170SRuslan Bukin #define PRIu32 "u" 4417f65170SRuslan Bukin #else 4517f65170SRuslan Bukin #include <cinttypes> 4617f65170SRuslan Bukin #endif 4717f65170SRuslan Bukin 4817f65170SRuslan 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*/) 4917f65170SRuslan Bukin { 5017f65170SRuslan Bukin static char szStrBuffer[128]; 5117f65170SRuslan Bukin static char szFormatBuffer[32]; 5217f65170SRuslan Bukin 5317f65170SRuslan Bukin assert((valTotalBitSize >= 4) && (valTotalBitSize <= 64)); 5417f65170SRuslan Bukin 5517f65170SRuslan Bukin uint64_t LimitMask = ~0ULL; 5617f65170SRuslan Bukin LimitMask >>= 64-valTotalBitSize; 5717f65170SRuslan Bukin valStr = "0x"; 5817f65170SRuslan Bukin 5917f65170SRuslan Bukin if(asHex) 6017f65170SRuslan Bukin { 6117f65170SRuslan Bukin int numHexChars = valTotalBitSize / 4; 6217f65170SRuslan Bukin numHexChars += ((valTotalBitSize % 4) > 0) ? 1 : 0; 6317f65170SRuslan Bukin 6417f65170SRuslan Bukin int validChars = valValidBits / 4; 6517f65170SRuslan Bukin if((valValidBits % 4) > 0) validChars++; 6617f65170SRuslan Bukin int QM = numHexChars - validChars; 6717f65170SRuslan Bukin while(QM) 6817f65170SRuslan Bukin { 6917f65170SRuslan Bukin QM--; 7017f65170SRuslan Bukin valStr += "?"; 7117f65170SRuslan Bukin } 7217f65170SRuslan Bukin if(valValidBits > 32) 7317f65170SRuslan Bukin { 7417f65170SRuslan Bukin sprintf(szFormatBuffer,"%%0%dllX",validChars); // create the format 7517f65170SRuslan Bukin sprintf(szStrBuffer,szFormatBuffer,value); // fill the buffer 7617f65170SRuslan Bukin } 7717f65170SRuslan Bukin else 7817f65170SRuslan Bukin { 7917f65170SRuslan Bukin sprintf(szFormatBuffer,"%%0%dlX",validChars); // create the format 8017f65170SRuslan Bukin sprintf(szStrBuffer,szFormatBuffer,(uint32_t)value); // fill the buffer 8117f65170SRuslan Bukin } 8217f65170SRuslan Bukin valStr+=szStrBuffer; 8317f65170SRuslan Bukin if(valValidBits < valTotalBitSize) 8417f65170SRuslan Bukin { 8517f65170SRuslan Bukin sprintf(szStrBuffer," (%d:0)", valValidBits-1); 8617f65170SRuslan Bukin valStr+=szStrBuffer; 8717f65170SRuslan Bukin } 8817f65170SRuslan Bukin 8917f65170SRuslan Bukin if(updateBits) 9017f65170SRuslan Bukin { 9117f65170SRuslan Bukin uint64_t updateMask = ~0ULL; 9217f65170SRuslan Bukin updateMask >>= 64-updateBits; 9317f65170SRuslan Bukin sprintf(szStrBuffer," ~[0x%" PRIX64 "]",value & updateMask); 9417f65170SRuslan Bukin valStr+=szStrBuffer; 9517f65170SRuslan Bukin } 9617f65170SRuslan Bukin } 9717f65170SRuslan Bukin else 9817f65170SRuslan Bukin { 9917f65170SRuslan Bukin valStr = ""; 10017f65170SRuslan Bukin if(valValidBits < valTotalBitSize) 10117f65170SRuslan Bukin valStr += "??"; 10217f65170SRuslan Bukin if(valValidBits > 32) 10317f65170SRuslan Bukin { 10417f65170SRuslan Bukin sprintf(szStrBuffer,"%" PRIu64 ,value); 10517f65170SRuslan Bukin } 10617f65170SRuslan Bukin else 10717f65170SRuslan Bukin { 10817f65170SRuslan Bukin sprintf(szStrBuffer,"%" PRIu32 ,(uint32_t)value); 10917f65170SRuslan Bukin } 11017f65170SRuslan Bukin valStr += szStrBuffer; 11117f65170SRuslan Bukin if(valValidBits < valTotalBitSize) 11217f65170SRuslan Bukin { 11317f65170SRuslan Bukin sprintf(szStrBuffer," (%d:0)", valValidBits-1); 11417f65170SRuslan Bukin valStr+=szStrBuffer; 11517f65170SRuslan Bukin } 11617f65170SRuslan Bukin } 11717f65170SRuslan Bukin } 11817f65170SRuslan Bukin 11917f65170SRuslan Bukin 12017f65170SRuslan Bukin /* End of File trc_printable_elem.cpp */ 121