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 &parameterAccessContext) 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 &parameterAccessContext) 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 &parameterAccessContext) 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