1b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner/* 2a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi * Copyright (c) 2011-2015, Intel Corporation 3b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * All rights reserved. 4b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 5b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * Redistribution and use in source and binary forms, with or without modification, 6b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * are permitted provided that the following conditions are met: 7b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 8b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 1. Redistributions of source code must retain the above copyright notice, this 9b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * list of conditions and the following disclaimer. 10b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 11b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 2. Redistributions in binary form must reproduce the above copyright notice, 12b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * this list of conditions and the following disclaimer in the documentation and/or 13b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * other materials provided with the distribution. 14b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 15b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 3. Neither the name of the copyright holder nor the names of its contributors 16b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * may be used to endorse or promote products derived from this software without 17b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * specific prior written permission. 18b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 19b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 23b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 26b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2968a912857707864bbaaff9808717813105072a6ePatrick Benavoli */ 3068a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "BitParameterType.h" 3168a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "BitParameter.h" 3268a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <stdlib.h> 3368a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <sstream> 3468a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ParameterAccessContext.h" 3568a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "BitParameterBlockType.h" 36a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi#include "Utility.h" 3768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3868a912857707864bbaaff9808717813105072a6ePatrick Benavoli#define base CTypeElement 3968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 40d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalveusing std::string; 41d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve 429368eea42a1afb01dd44110582f997115b50e742François GaffieCBitParameterType::CBitParameterType(const string &strName) : base(strName) 4368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 4468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 4568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4668a912857707864bbaaff9808717813105072a6ePatrick Benavoli// CElement 4768a912857707864bbaaff9808717813105072a6ePatrick Benavolistring CBitParameterType::getKind() const 4868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 4968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return "BitParameter"; 5068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 512ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli 522ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli// Element properties 539368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CBitParameterType::showProperties(string &strResult) const 542ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli{ 552ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli base::showProperties(strResult); 562ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli 572ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli // Bit Pos 582ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli strResult += "Bit pos: "; 599368eea42a1afb01dd44110582f997115b50e742François Gaffie strResult += std::to_string(_bitPos); 602ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli strResult += "\n"; 612ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli 622ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli // Bit size 632ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli strResult += "Bit size: "; 649368eea42a1afb01dd44110582f997115b50e742François Gaffie strResult += std::to_string(_uiBitSize); 652ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli strResult += "\n"; 6679f16cc91351951a39ad3019a7dc9e4dea532551Patrick Benavoli 6779f16cc91351951a39ad3019a7dc9e4dea532551Patrick Benavoli // Max 6879f16cc91351951a39ad3019a7dc9e4dea532551Patrick Benavoli strResult += "Max: "; 699368eea42a1afb01dd44110582f997115b50e742François Gaffie strResult += std::to_string(_uiMax); 7079f16cc91351951a39ad3019a7dc9e4dea532551Patrick Benavoli strResult += "\n"; 712ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli} 7268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7368a912857707864bbaaff9808717813105072a6ePatrick Benavoli// From IXmlSink 749368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CBitParameterType::fromXml(const CXmlElement &xmlElement, 759368eea42a1afb01dd44110582f997115b50e742François Gaffie CXmlSerializingContext &serializingContext) 7668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 7768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Pos 789368eea42a1afb01dd44110582f997115b50e742François Gaffie xmlElement.getAttribute("Pos", _bitPos); 7968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 8068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Size 819368eea42a1afb01dd44110582f997115b50e742François Gaffie xmlElement.getAttribute("Size", _uiBitSize); 8268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 8311e6498a4fa3b27ca34d2fcb76bd6365da9d5c1bPatrick Benavoli // Validate bit pos and size still fit into parent type 849368eea42a1afb01dd44110582f997115b50e742François Gaffie const CBitParameterBlockType *pBitParameterBlockType = 859368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<const CBitParameterBlockType *>(getParent()); 8668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 879368eea42a1afb01dd44110582f997115b50e742François Gaffie size_t uiParentBlockBitSize = pBitParameterBlockType->getSize() * 8; 8868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 899368eea42a1afb01dd44110582f997115b50e742François Gaffie if (_bitPos + _uiBitSize > uiParentBlockBitSize) { 9068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Range exceeded 929368eea42a1afb01dd44110582f997115b50e742François Gaffie std::ostringstream strStream; 9368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 949368eea42a1afb01dd44110582f997115b50e742François Gaffie strStream << "Pos and Size attributes inconsistent with maximum container element size (" 959368eea42a1afb01dd44110582f997115b50e742François Gaffie << uiParentBlockBitSize << " bits) for " + getKind(); 9668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9768a912857707864bbaaff9808717813105072a6ePatrick Benavoli serializingContext.setError(strStream.str()); 9868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 10068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 10168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10279f16cc91351951a39ad3019a7dc9e4dea532551Patrick Benavoli // Max 1039368eea42a1afb01dd44110582f997115b50e742François Gaffie _uiMax = getMaxEncodableValue(); 1049368eea42a1afb01dd44110582f997115b50e742François Gaffie if (xmlElement.getAttribute("Max", _uiMax) && (_uiMax > getMaxEncodableValue())) { 10579f16cc91351951a39ad3019a7dc9e4dea532551Patrick Benavoli 1069368eea42a1afb01dd44110582f997115b50e742François Gaffie // Max value exceeded 1079368eea42a1afb01dd44110582f997115b50e742François Gaffie std::ostringstream strStream; 10879f16cc91351951a39ad3019a7dc9e4dea532551Patrick Benavoli 1099368eea42a1afb01dd44110582f997115b50e742François Gaffie strStream << "Max attribute inconsistent with maximum encodable size (" 1109368eea42a1afb01dd44110582f997115b50e742François Gaffie << getMaxEncodableValue() << ") for " + getKind(); 11179f16cc91351951a39ad3019a7dc9e4dea532551Patrick Benavoli 1129368eea42a1afb01dd44110582f997115b50e742François Gaffie serializingContext.setError(strStream.str()); 11379f16cc91351951a39ad3019a7dc9e4dea532551Patrick Benavoli 1149368eea42a1afb01dd44110582f997115b50e742François Gaffie return false; 11579f16cc91351951a39ad3019a7dc9e4dea532551Patrick Benavoli } 11679f16cc91351951a39ad3019a7dc9e4dea532551Patrick Benavoli 11768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Base 11868a912857707864bbaaff9808717813105072a6ePatrick Benavoli return base::fromXml(xmlElement, serializingContext); 11968a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 12068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 12168a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Conversion 1229368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CBitParameterType::toBlackboard(const string &strValue, uint64_t &uiValue, 1239368eea42a1afb01dd44110582f997115b50e742François Gaffie CParameterAccessContext ¶meterAccessContext) const 12468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 1256ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli // Get value 1269533156ebad9b5989703db70be3f6bd22c9811c4Guillaume Denneulin uint64_t uiConvertedValue = strtoull(strValue.c_str(), NULL, 0); 12768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 12879f16cc91351951a39ad3019a7dc9e4dea532551Patrick Benavoli if (uiConvertedValue > _uiMax) { 12968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 13068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Range exceeded 1319368eea42a1afb01dd44110582f997115b50e742François Gaffie std::ostringstream strStream; 13268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 1336ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli strStream << "Value " << strValue << " standing out of admitted range ["; 1346ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 1359368eea42a1afb01dd44110582f997115b50e742François Gaffie if (utility::isHexadecimal(strValue)) { 1366ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 1379368eea42a1afb01dd44110582f997115b50e742François Gaffie strStream << "0x0, " 1389368eea42a1afb01dd44110582f997115b50e742François Gaffie << "0x" << std::hex << std::uppercase; 1396ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli } else { 1406ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 1416ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli strStream << "0, "; 1426ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli } 14379f16cc91351951a39ad3019a7dc9e4dea532551Patrick Benavoli strStream << _uiMax << "] for " + getKind(); 14468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 14568a912857707864bbaaff9808717813105072a6ePatrick Benavoli parameterAccessContext.setError(strStream.str()); 14668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 14768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 14868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 14968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 1506ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli // Do bitwise RMW operation 1519368eea42a1afb01dd44110582f997115b50e742François Gaffie uiValue = (uiValue & ~getMask()) | (uiConvertedValue << _bitPos); 15268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 15468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 15568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 1569368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CBitParameterType::fromBlackboard(string &strValue, const uint64_t &uiValue, 1579368eea42a1afb01dd44110582f997115b50e742François Gaffie CParameterAccessContext ¶meterAccessContext) const 15868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 1599368eea42a1afb01dd44110582f997115b50e742François Gaffie uint64_t uiConvertedValue = (uiValue & getMask()) >> _bitPos; 16068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 16168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Format 162d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve std::ostringstream strStream; 16368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 1646ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli // Take care of format 1656ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli if (parameterAccessContext.valueSpaceIsRaw() && parameterAccessContext.outputRawFormatIsHex()) { 1666ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 167d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve strStream << "0x" << std::hex << std::uppercase; 1686ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli } 1696ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 17068a912857707864bbaaff9808717813105072a6ePatrick Benavoli strStream << uiConvertedValue; 17168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 17268a912857707864bbaaff9808717813105072a6ePatrick Benavoli strValue = strStream.str(); 17368a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 17468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 175065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli// Value access 176065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli// Integer 1779368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CBitParameterType::toBlackboard(uint64_t uiUserValue, uint64_t &uiValue, 1789368eea42a1afb01dd44110582f997115b50e742François Gaffie CParameterAccessContext ¶meterAccessContext) const 179065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli{ 18079f16cc91351951a39ad3019a7dc9e4dea532551Patrick Benavoli if (uiUserValue > _uiMax) { 181065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli 182065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli parameterAccessContext.setError("Value out of range"); 183065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli 184065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli return false; 185065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli } 186065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli 187065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli // Do bitwise RMW operation 1889368eea42a1afb01dd44110582f997115b50e742François Gaffie uiValue = (uiValue & ~getMask()) | (uiUserValue << _bitPos); 189065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli 190065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli return true; 191065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli} 192065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli 1939368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CBitParameterType::fromBlackboard(uint32_t &userValue, uint64_t value, 1949368eea42a1afb01dd44110582f997115b50e742François Gaffie CParameterAccessContext & /*ctx*/) const 195065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli{ 1969368eea42a1afb01dd44110582f997115b50e742François Gaffie userValue = static_cast<uint32_t>((value & getMask()) >> _bitPos); 197065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli} 198065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli 1999620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard// Access from area configuration 2009533156ebad9b5989703db70be3f6bd22c9811c4Guillaume Denneulinuint64_t CBitParameterType::merge(uint64_t uiOriginData, uint64_t uiNewData) const 2019620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard{ 2029620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard return (uiOriginData & ~getMask()) | (uiNewData & getMask()); 2039620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard} 2049620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard 20568a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Bit Size 2069368eea42a1afb01dd44110582f997115b50e742François Gaffiesize_t CBitParameterType::getBitSize() const 20768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 20868a912857707864bbaaff9808717813105072a6ePatrick Benavoli return _uiBitSize; 20968a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 21068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 2119368eea42a1afb01dd44110582f997115b50e742François GaffieCInstanceConfigurableElement *CBitParameterType::doInstantiate() const 21268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 21368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return new CBitParameter(getName(), this); 21468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 21568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 21668a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Max value 2179533156ebad9b5989703db70be3f6bd22c9811c4Guillaume Denneulinuint64_t CBitParameterType::getMaxEncodableValue() const 21868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 2199533156ebad9b5989703db70be3f6bd22c9811c4Guillaume Denneulin return (uint64_t)-1L >> (8 * sizeof(uint64_t) - _uiBitSize); 22068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 22168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 22268a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Biwise mask 2239533156ebad9b5989703db70be3f6bd22c9811c4Guillaume Denneulinuint64_t CBitParameterType::getMask() const 22468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 2259368eea42a1afb01dd44110582f997115b50e742François Gaffie return getMaxEncodableValue() << _bitPos; 22668a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 2276ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 2286ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli// Check data has no bit set outside available range 2299533156ebad9b5989703db70be3f6bd22c9811c4Guillaume Denneulinbool CBitParameterType::isEncodable(uint64_t uiData) const 2306ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli{ 2319368eea42a1afb01dd44110582f997115b50e742François Gaffie size_t uiShift = 8 * sizeof(uiData) - _uiBitSize; 2326ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 2336ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli if (uiShift) { 2346ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 2356ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli // Check high bits are clean 2366ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli return !(uiData >> uiShift); 2376ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli } 2386ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 2396ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli return true; 2406ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli} 241326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron 242326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron// From IXmlSource 2439368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CBitParameterType::toXml(CXmlElement &xmlElement, 2449368eea42a1afb01dd44110582f997115b50e742François Gaffie CXmlSerializingContext &serializingContext) const 245326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron{ 246326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron // Position 2479368eea42a1afb01dd44110582f997115b50e742François Gaffie xmlElement.setAttribute("Pos", _bitPos); 248326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron 249326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron // Size 2509368eea42a1afb01dd44110582f997115b50e742François Gaffie xmlElement.setAttribute("Size", _uiBitSize); 251326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron 252326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron // Maximum 2539368eea42a1afb01dd44110582f997115b50e742François Gaffie xmlElement.setAttribute("Max", _uiMax); 254326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron 255326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron base::toXml(xmlElement, serializingContext); 256326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron} 257