diff --git a/IPXACTmodels/Component/Field.cpp b/IPXACTmodels/Component/Field.cpp index 5a050223a..2fa120019 100644 --- a/IPXACTmodels/Component/Field.cpp +++ b/IPXACTmodels/Component/Field.cpp @@ -14,6 +14,7 @@ #include #include #include +#include //----------------------------------------------------------------------------- // Function: Field::Field() @@ -154,6 +155,22 @@ void Field::setIsPresent(QString const& newIsPresent) isPresent_ = newIsPresent; } +//----------------------------------------------------------------------------- +// Function: Field::getMemoryArray() +//----------------------------------------------------------------------------- +QSharedPointer Field::getMemoryArray() const +{ + return memoryArray_; +} + +//----------------------------------------------------------------------------- +// Function: Field::setMemoryArray() +//----------------------------------------------------------------------------- +void Field::setMemoryArray(QSharedPointer memArray) +{ + memoryArray_ = memArray; +} + //----------------------------------------------------------------------------- // Function: Field::getBitOffset() //----------------------------------------------------------------------------- diff --git a/IPXACTmodels/Component/Field.h b/IPXACTmodels/Component/Field.h index f819f1447..d278f2b3e 100644 --- a/IPXACTmodels/Component/Field.h +++ b/IPXACTmodels/Component/Field.h @@ -30,6 +30,7 @@ class Parameter; class EnumeratedValue; class WriteValueConstraint; +class MemoryArray; //----------------------------------------------------------------------------- //! Describes the ipxact:field element. @@ -91,6 +92,20 @@ class IPXACTMODELS_EXPORT Field : public NameGroup, public Extendable */ void setIsPresent(QString const& newIsPresent); + /*! + * Get the memory array of the field. + * + * @return The field's memory array. + */ + QSharedPointer getMemoryArray() const; + + /*! + * Set the field's memory array. + * + * @param [in] memArray Description + */ + void setMemoryArray(QSharedPointer memArray); + /*! * Get the bit offset. * @@ -366,6 +381,9 @@ class IPXACTMODELS_EXPORT Field : public NameGroup, public Extendable //! The presence of the field. QString isPresent_; + //! The field's memory array. + QSharedPointer memoryArray_; + //! Describes the offset where this bit field starts. QString bitOffset_; diff --git a/IPXACTmodels/Component/FieldReader.cpp b/IPXACTmodels/Component/FieldReader.cpp index db8324a8f..46b58e440 100644 --- a/IPXACTmodels/Component/FieldReader.cpp +++ b/IPXACTmodels/Component/FieldReader.cpp @@ -14,75 +14,66 @@ #include "EnumeratedValueReader.h" #include "EnumeratedValue.h" #include "WriteValueConstraint.h" +#include "MemoryArrayReader.h" #include -//----------------------------------------------------------------------------- -// Function: FieldReader::FieldReader() -//----------------------------------------------------------------------------- -FieldReader::FieldReader() : CommonItemsReader() -{ - -} - -//----------------------------------------------------------------------------- -// Function: FieldReader::~FieldReader() -//----------------------------------------------------------------------------- -FieldReader::~FieldReader() -{ - -} - //----------------------------------------------------------------------------- // Function: FieldReader::createFieldFrom() //----------------------------------------------------------------------------- -QSharedPointer FieldReader::createFieldFrom(QDomNode const& fieldNode) const +QSharedPointer FieldReader::createFieldFrom(QDomNode const& fieldNode, Document::Revision docRevision) { QDomElement fieldElement = fieldNode.toElement(); QSharedPointer newField (new Field()); - parseID(fieldElement, newField); + Details::parseID(fieldElement, newField); - parseNameGroup(fieldNode, newField); - - parsePresence(fieldElement, newField); + NameGroupReader::parseNameGroup(fieldNode, newField); + if (docRevision == Document::Revision::Std14) + { + Details::parsePresence(fieldElement, newField); + } + else if (docRevision == Document::Revision::Std22) + { + Details::parseMemoryArray(fieldElement, newField); + } - parseBitOffset(fieldElement, newField); + Details::parseBitOffset(fieldElement, newField); - parseResets(fieldElement, newField); + Details::parseResets(fieldElement, newField); - parseTypeIdentifier(fieldElement, newField); + Details::parseTypeIdentifier(fieldElement, newField); - parseBitWidth(fieldElement, newField); + Details::parseBitWidth(fieldElement, newField); - parseVolatile(fieldElement, newField); + Details::parseVolatile(fieldElement, newField); - parseAccess(fieldElement, newField); + Details::parseAccess(fieldElement, newField); - parseEnumeratedValues(fieldElement, newField); + Details::parseEnumeratedValues(fieldElement, newField); - parseModifiedWriteValue(fieldElement, newField); + Details::parseModifiedWriteValue(fieldElement, newField); - parseWriteValueConstraint(fieldElement, newField); + Details::parseWriteValueConstraint(fieldElement, newField); - parseReadAction(fieldElement, newField); + Details::parseReadAction(fieldElement, newField); - parseTestable(fieldElement, newField); + Details::parseTestable(fieldElement, newField); - parseReserved(fieldElement, newField); + Details::parseReserved(fieldElement, newField); - parseParameters(fieldElement, newField); + Details::parseParameters(fieldElement, newField); - parseVendorExtensions(fieldNode, newField); + CommonItemsReader::parseVendorExtensions(fieldNode, newField); return newField; } //----------------------------------------------------------------------------- -// Function: FieldReader::parseID() +// Function: FieldReader::Details::parseID() //----------------------------------------------------------------------------- -void FieldReader::parseID(QDomElement const& fieldElement, QSharedPointer newField) const +void FieldReader::Details::parseID(QDomElement const& fieldElement, QSharedPointer newField) { if (fieldElement.hasAttribute(QStringLiteral("fieldID"))) { @@ -92,19 +83,11 @@ void FieldReader::parseID(QDomElement const& fieldElement, QSharedPointer } //----------------------------------------------------------------------------- -// Function: FieldReader::parseNameGroup() +// Function: FieldReader::Details::parsePresence() //----------------------------------------------------------------------------- -void FieldReader::parseNameGroup(QDomNode const& fieldNode, QSharedPointer newField) const +void FieldReader::Details::parsePresence(QDomElement const& fieldElement, QSharedPointer newField) { - NameGroupReader::parseNameGroup(fieldNode, newField); -} - -//----------------------------------------------------------------------------- -// Function: FieldReader::parsePresence() -//----------------------------------------------------------------------------- -void FieldReader::parsePresence(QDomElement const& fieldElement, QSharedPointer newField) const -{ - QString newIsPresent = parseIsPresent(fieldElement.firstChildElement(QStringLiteral("ipxact:isPresent"))); + QString newIsPresent = CommonItemsReader::parseIsPresent(fieldElement.firstChildElement(QStringLiteral("ipxact:isPresent"))); if (!newIsPresent.isEmpty()) { newField->setIsPresent(newIsPresent); @@ -112,9 +95,9 @@ void FieldReader::parsePresence(QDomElement const& fieldElement, QSharedPointer< } //----------------------------------------------------------------------------- -// Function: FieldReader::parseBitOffset() +// Function: FieldReader::Details::parseBitOffset() //----------------------------------------------------------------------------- -void FieldReader::parseBitOffset(QDomElement const& fieldElement, QSharedPointer newField) const +void FieldReader::Details::parseBitOffset(QDomElement const& fieldElement, QSharedPointer newField) { QDomElement bitOffsetElement = fieldElement.firstChildElement(QStringLiteral("ipxact:bitOffset")); QString bitOffset = bitOffsetElement.firstChild().nodeValue(); @@ -122,9 +105,20 @@ void FieldReader::parseBitOffset(QDomElement const& fieldElement, QSharedPointer } //----------------------------------------------------------------------------- -// Function: FieldReader::parseResets() +// Function: FieldReader::Details::parseMemoryArray() +//----------------------------------------------------------------------------- +void FieldReader::Details::parseMemoryArray(QDomElement const& fieldElement, QSharedPointer newField) +{ + auto newArray = MemoryArrayReader::createMemoryArrayFrom( + fieldElement.firstChildElement(QStringLiteral("ipxact:array")), true); + + newField->setMemoryArray(newArray); +} + +//----------------------------------------------------------------------------- +// Function: FieldReader::Details::parseResets() //----------------------------------------------------------------------------- -void FieldReader::parseResets(QDomElement const& fieldElement, QSharedPointer newField) const +void FieldReader::Details::parseResets(QDomElement const& fieldElement, QSharedPointer newField) { QDomElement resetsElement = fieldElement.firstChildElement(QStringLiteral("ipxact:resets")); if (!resetsElement.isNull()) @@ -147,9 +141,9 @@ void FieldReader::parseResets(QDomElement const& fieldElement, QSharedPointer fieldReset) const +void FieldReader::Details::parseResetTypeRef(QDomElement const& resetElement, QSharedPointer fieldReset) { if (resetElement.hasAttribute(QStringLiteral("resetTypeRef"))) { @@ -158,18 +152,18 @@ void FieldReader::parseResetTypeRef(QDomElement const& resetElement, QSharedPoin } //----------------------------------------------------------------------------- -// Function: FieldReader::parseResetValue() +// Function: FieldReader::Details::parseResetValue() //----------------------------------------------------------------------------- -void FieldReader::parseResetValue(QDomElement const& resetElement, QSharedPointer fieldReset) const +void FieldReader::Details::parseResetValue(QDomElement const& resetElement, QSharedPointer fieldReset) { QString resetValue = resetElement.firstChildElement(QStringLiteral("ipxact:value")).firstChild().nodeValue(); fieldReset->setResetValue(resetValue); } //----------------------------------------------------------------------------- -// Function: FieldReader::parseResetMask() +// Function: FieldReader::Details::parseResetMask() //----------------------------------------------------------------------------- -void FieldReader::parseResetMask(QDomElement const& resetElement, QSharedPointer fieldReset) const +void FieldReader::Details::parseResetMask(QDomElement const& resetElement, QSharedPointer fieldReset) { QDomElement resetMaskElement = resetElement.firstChildElement(QStringLiteral("ipxact:mask")); if (!resetMaskElement.isNull()) @@ -181,9 +175,9 @@ void FieldReader::parseResetMask(QDomElement const& resetElement, QSharedPointer //----------------------------------------------------------------------------- -// Function: FieldReader::parseTypeIdentifier() +// Function: FieldReader::Details::parseTypeIdentifier() //----------------------------------------------------------------------------- -void FieldReader::parseTypeIdentifier(QDomElement const& fieldElement, QSharedPointer newField) const +void FieldReader::Details::parseTypeIdentifier(QDomElement const& fieldElement, QSharedPointer newField) { QDomElement typeIdentifierElement = fieldElement.firstChildElement(QStringLiteral("ipxact:typeIdentifier")); if (!typeIdentifierElement.isNull()) @@ -194,9 +188,9 @@ void FieldReader::parseTypeIdentifier(QDomElement const& fieldElement, QSharedPo } //----------------------------------------------------------------------------- -// Function: FieldReader::parseBitWidth() +// Function: FieldReader::Details::parseBitWidth() //----------------------------------------------------------------------------- -void FieldReader::parseBitWidth(QDomElement const& fieldElement, QSharedPointer newField) const +void FieldReader::Details::parseBitWidth(QDomElement const& fieldElement, QSharedPointer newField) { QDomElement bitWidthElement = fieldElement.firstChildElement(QStringLiteral("ipxact:bitWidth")); QString bitWidth = bitWidthElement.firstChild().nodeValue(); @@ -204,9 +198,9 @@ void FieldReader::parseBitWidth(QDomElement const& fieldElement, QSharedPointer< } //----------------------------------------------------------------------------- -// Function: FieldReader::parseVolatile() +// Function: FieldReader::Details::parseVolatile() //----------------------------------------------------------------------------- -void FieldReader::parseVolatile(QDomElement const& fieldElement, QSharedPointer newField) const +void FieldReader::Details::parseVolatile(QDomElement const& fieldElement, QSharedPointer newField) { QDomElement volatileElement = fieldElement.firstChildElement(QStringLiteral("ipxact:volatile")); if (!volatileElement.isNull()) @@ -223,9 +217,9 @@ void FieldReader::parseVolatile(QDomElement const& fieldElement, QSharedPointer< } //----------------------------------------------------------------------------- -// Function: FieldReader::parseAccess() +// Function: FieldReader::Details::parseAccess() //----------------------------------------------------------------------------- -void FieldReader::parseAccess(QDomElement const& fieldElement, QSharedPointer newField) const +void FieldReader::Details::parseAccess(QDomElement const& fieldElement, QSharedPointer newField) { QDomElement accessElement = fieldElement.firstChildElement(QStringLiteral("ipxact:access")); if (!accessElement.isNull()) @@ -237,9 +231,9 @@ void FieldReader::parseAccess(QDomElement const& fieldElement, QSharedPointer newField) const +void FieldReader::Details::parseEnumeratedValues(QDomElement const& fieldElement, QSharedPointer newField) { QDomElement enumeratedValuesElement = fieldElement.firstChildElement(QStringLiteral("ipxact:enumeratedValues")); if (!enumeratedValuesElement.isNull()) @@ -260,9 +254,9 @@ void FieldReader::parseEnumeratedValues(QDomElement const& fieldElement, QShared } //----------------------------------------------------------------------------- -// Function: FieldReader::parseModifiedWriteValue() +// Function: FieldReader::Details::parseModifiedWriteValue() //----------------------------------------------------------------------------- -void FieldReader::parseModifiedWriteValue(QDomElement const& fieldElement, QSharedPointer newField) const +void FieldReader::Details::parseModifiedWriteValue(QDomElement const& fieldElement, QSharedPointer newField) { QDomElement modifiedWriteElement = fieldElement.firstChildElement(QStringLiteral("ipxact:modifiedWriteValue")); if (!modifiedWriteElement.isNull()) @@ -279,9 +273,9 @@ void FieldReader::parseModifiedWriteValue(QDomElement const& fieldElement, QShar } //----------------------------------------------------------------------------- -// Function: FieldReader::parseWriteValueConstraint() +// Function: FieldReader::Details::parseWriteValueConstraint() //----------------------------------------------------------------------------- -void FieldReader::parseWriteValueConstraint(QDomElement const& fieldElement, QSharedPointer newField) const +void FieldReader::Details::parseWriteValueConstraint(QDomElement const& fieldElement, QSharedPointer newField) { QDomElement writeConstraintElement = fieldElement.firstChildElement(QStringLiteral("ipxact:writeValueConstraint")); if (!writeConstraintElement.isNull()) @@ -312,9 +306,9 @@ void FieldReader::parseWriteValueConstraint(QDomElement const& fieldElement, QSh } //----------------------------------------------------------------------------- -// Function: FieldReader::parseReadAction() +// Function: FieldReader::Details::parseReadAction() //----------------------------------------------------------------------------- -void FieldReader::parseReadAction(QDomElement const& fieldElement, QSharedPointer newField) const +void FieldReader::Details::parseReadAction(QDomElement const& fieldElement, QSharedPointer newField) { QDomElement readActionElement = fieldElement.firstChildElement(QStringLiteral("ipxact:readAction")); if (!readActionElement.isNull()) @@ -332,9 +326,9 @@ void FieldReader::parseReadAction(QDomElement const& fieldElement, QSharedPointe } //----------------------------------------------------------------------------- -// Function: FieldReader::parseTestable() +// Function: FieldReader::Details::parseTestable() //----------------------------------------------------------------------------- -void FieldReader::parseTestable(QDomElement const& fieldElement, QSharedPointer newField) const +void FieldReader::Details::parseTestable(QDomElement const& fieldElement, QSharedPointer newField) { QDomElement testableElement = fieldElement.firstChildElement(QStringLiteral("ipxact:testable")); if (!testableElement.isNull()) @@ -359,9 +353,9 @@ void FieldReader::parseTestable(QDomElement const& fieldElement, QSharedPointer< } //----------------------------------------------------------------------------- -// Function: FieldReader::parseReserved() +// Function: FieldReader::Details::parseReserved() //----------------------------------------------------------------------------- -void FieldReader::parseReserved(QDomElement const& fieldElement, QSharedPointer newField) const +void FieldReader::Details::parseReserved(QDomElement const& fieldElement, QSharedPointer newField) { QDomElement reservedElement = fieldElement.firstChildElement(QStringLiteral("ipxact:reserved")); if (!reservedElement.isNull()) @@ -372,15 +366,15 @@ void FieldReader::parseReserved(QDomElement const& fieldElement, QSharedPointer< } //----------------------------------------------------------------------------- -// Function: FieldReader::parseParameters() +// Function: FieldReader::Details::parseParameters() //----------------------------------------------------------------------------- -void FieldReader::parseParameters(QDomElement const& fieldElement, QSharedPointer newField) const +void FieldReader::Details::parseParameters(QDomElement const& fieldElement, QSharedPointer newField) { QDomElement parametersElement = fieldElement.firstChildElement(QStringLiteral("ipxact:parameters")); if (!parametersElement.isNull()) { - QSharedPointer > > newParameters = parseAndCreateParameters(fieldElement); - foreach (QSharedPointer parameter, *newParameters) + QSharedPointer > > newParameters = CommonItemsReader::parseAndCreateParameters(fieldElement); + for (auto parameter : *newParameters) { newField->getParameters()->append(parameter); } diff --git a/IPXACTmodels/Component/FieldReader.h b/IPXACTmodels/Component/FieldReader.h index e0fa0697f..8ff83e7e6 100644 --- a/IPXACTmodels/Component/FieldReader.h +++ b/IPXACTmodels/Component/FieldReader.h @@ -6,7 +6,7 @@ // Date: 25.09.2015 // // Description: -// Reader class for IP-XACT field element. +// Reader for IP-XACT field element. //----------------------------------------------------------------------------- #ifndef FIELDREADER_H @@ -23,19 +23,10 @@ class Field; class FieldReset; //----------------------------------------------------------------------------- -//! Reader class for IP-XACT field element. +//! Reader for IP-XACT field element. //----------------------------------------------------------------------------- -class IPXACTMODELS_EXPORT FieldReader : public CommonItemsReader +namespace FieldReader { -public: - - //! The constructor. - FieldReader(); - - /*! - * The destructor. - */ - ~FieldReader(); /*! * Creates a new field from a given field node. @@ -44,165 +35,163 @@ class IPXACTMODELS_EXPORT FieldReader : public CommonItemsReader * * @return The created field. */ - QSharedPointer createFieldFrom(QDomNode const& fieldNode) const; - -private: - - //! No copying allowed. - FieldReader(FieldReader const& rhs); - FieldReader& operator=(FieldReader const& rhs); - - /*! - * Reads the field ID. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parseID(QDomElement const& fieldElement, QSharedPointer newField) const; - - /*! - * Reads the name group. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parseNameGroup(QDomNode const& fieldNode, QSharedPointer newField) const; - - /*! - * Reads the is present value. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parsePresence(QDomElement const& fieldElement, QSharedPointer newField) const; - - /*! - * Reads the bit offset. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parseBitOffset(QDomElement const& fieldElement, QSharedPointer newField) const; - - /*! - * Reads the reset. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parseResets(QDomElement const& fieldElement, QSharedPointer newField) const; - - /*! - * Reads the reset type reference. - * - * @param [in] resetElement XML description of the reset. - * @param [in] fldReset The Reset Structure to parse into. - */ - void parseResetTypeRef(QDomElement const& resetElement, QSharedPointer fieldReset) const; - - /*! - * Reads the reset value. - * - * @param [in] resetElement XML description of the reset. - * @param [in] fldReset The Reset Structure to parse into. - */ - void parseResetValue(QDomElement const& resetElement, QSharedPointer fieldReset) const; - - /*! - * Reads the reset mask. - * - * @param [in] resetElement XML description of the reset. - * @param [in] fldReset The Reset Structure to parse into. - */ - void parseResetMask(QDomElement const& resetElement, QSharedPointer fieldReset) const; - - /*! - * Reads the type identifier. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parseTypeIdentifier(QDomElement const& fieldElement, QSharedPointer newField) const; - - /*! - * Reads the bit width. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parseBitWidth(QDomElement const& fieldElement, QSharedPointer newField) const; - - /*! - * Reads the volatile value. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parseVolatile(QDomElement const& fieldElement, QSharedPointer newField) const; - - /*! - * Reads the access value. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parseAccess(QDomElement const& fieldElement, QSharedPointer newField) const; - - /*! - * Reads the enumerated values. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parseEnumeratedValues(QDomElement const& fieldElement, QSharedPointer newField) const; - - /*! - * Reads the modified write value. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parseModifiedWriteValue(QDomElement const& fieldElement, QSharedPointer newField) const; - - /*! - * Reads the write value constraint. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parseWriteValueConstraint(QDomElement const& fieldElement, QSharedPointer newField) const; - - /*! - * Reads the read action value. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parseReadAction(QDomElement const& fieldElement, QSharedPointer newField) const; - - /*! - * Reads the testable value. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parseTestable(QDomElement const& fieldElement, QSharedPointer newField) const; - - /*! - * Reads the reserved value. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parseReserved(QDomElement const& fieldElement, QSharedPointer newField) const; - - /*! - * Reads the parameters. - * - * @param [in] fieldElement XML description of the field. - * @param [in] newField The new field item. - */ - void parseParameters(QDomElement const& fieldElement, QSharedPointer newField) const; + IPXACTMODELS_EXPORT QSharedPointer createFieldFrom(QDomNode const& fieldNode, Document::Revision docRevision = Document::Revision::Std14); + + namespace Details + { + + /*! + * Reads the field ID. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parseID(QDomElement const& fieldElement, QSharedPointer newField); + + /*! + * Reads the is present value. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parsePresence(QDomElement const& fieldElement, QSharedPointer newField); + + /*! + * Reads the bit offset. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parseBitOffset(QDomElement const& fieldElement, QSharedPointer newField); + + /*! + * Reads the field memory array. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parseMemoryArray(QDomElement const& fieldElement, QSharedPointer newField); + + /*! + * Reads the reset. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parseResets(QDomElement const& fieldElement, QSharedPointer newField); + + /*! + * Reads the reset type reference. + * + * @param [in] resetElement XML description of the reset. + * @param [in] fldReset The Reset Structure to parse into. + */ + void parseResetTypeRef(QDomElement const& resetElement, QSharedPointer fieldReset); + + /*! + * Reads the reset value. + * + * @param [in] resetElement XML description of the reset. + * @param [in] fldReset The Reset Structure to parse into. + */ + void parseResetValue(QDomElement const& resetElement, QSharedPointer fieldReset); + + /*! + * Reads the reset mask. + * + * @param [in] resetElement XML description of the reset. + * @param [in] fldReset The Reset Structure to parse into. + */ + void parseResetMask(QDomElement const& resetElement, QSharedPointer fieldReset); + + /*! + * Reads the type identifier. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parseTypeIdentifier(QDomElement const& fieldElement, QSharedPointer newField); + + /*! + * Reads the bit width. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parseBitWidth(QDomElement const& fieldElement, QSharedPointer newField); + + /*! + * Reads the volatile value. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parseVolatile(QDomElement const& fieldElement, QSharedPointer newField); + + /*! + * Reads the access value. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parseAccess(QDomElement const& fieldElement, QSharedPointer newField); + + /*! + * Reads the enumerated values. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parseEnumeratedValues(QDomElement const& fieldElement, QSharedPointer newField); + + /*! + * Reads the modified write value. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parseModifiedWriteValue(QDomElement const& fieldElement, QSharedPointer newField); + + /*! + * Reads the write value constraint. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parseWriteValueConstraint(QDomElement const& fieldElement, QSharedPointer newField); + + /*! + * Reads the read action value. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parseReadAction(QDomElement const& fieldElement, QSharedPointer newField); + + /*! + * Reads the testable value. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parseTestable(QDomElement const& fieldElement, QSharedPointer newField); + + /*! + * Reads the reserved value. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parseReserved(QDomElement const& fieldElement, QSharedPointer newField); + + /*! + * Reads the parameters. + * + * @param [in] fieldElement XML description of the field. + * @param [in] newField The new field item. + */ + void parseParameters(QDomElement const& fieldElement, QSharedPointer newField); + } }; #endif // FIELDREADER_H diff --git a/IPXACTmodels/Component/FieldWriter.cpp b/IPXACTmodels/Component/FieldWriter.cpp index b87cfcc72..a9cf55788 100644 --- a/IPXACTmodels/Component/FieldWriter.cpp +++ b/IPXACTmodels/Component/FieldWriter.cpp @@ -6,81 +6,73 @@ // Date: 24.09.2015 // // Description: -// Writer class for IP-XACT field element. +// Writer for IP-XACT field element. //----------------------------------------------------------------------------- #include "FieldWriter.h" #include "Field.h" #include "WriteValueConstraint.h" +#include "MemoryArrayWriter.h" #include #include #include -//----------------------------------------------------------------------------- -// Function: FieldWriter::FieldWriter() -//----------------------------------------------------------------------------- -FieldWriter::FieldWriter() : CommonItemsWriter() -{ - -} - -//----------------------------------------------------------------------------- -// Function: FieldWriter::~FieldWriter() -//----------------------------------------------------------------------------- -FieldWriter::~FieldWriter() -{ - -} - //----------------------------------------------------------------------------- // Function: FieldWriter::writeField() //----------------------------------------------------------------------------- -void FieldWriter::writeField(QXmlStreamWriter& writer, QSharedPointer field) const +void FieldWriter::writeField(QXmlStreamWriter& writer, QSharedPointer field, Document::Revision docRevision) { writer.writeStartElement(QStringLiteral("ipxact:field")); - writeID(writer, field->getId()); + Details::writeID(writer, field->getId()); - writeNameGroup(writer, field); + NameGroupWriter::writeNameGroup(writer, field, docRevision); - writeIsPresent(writer, field->getIsPresent()); + if (docRevision == Document::Revision::Std14) + { + CommonItemsWriter::writeIsPresent(writer, field->getIsPresent()); + } + else if (docRevision == Document::Revision::Std22) + { + Details::writeMemoryArray(writer, field); + } writer.writeTextElement(QStringLiteral("ipxact:bitOffset"), field->getBitOffset()); - writeResets(writer, field); + Details::writeResets(writer, field); - writeTypeIdentifier(writer, field); + Details::writeTypeIdentifier(writer, field); writer.writeTextElement(QStringLiteral("ipxact:bitWidth"), field->getBitWidth()); - writeVolatile(writer, field); + Details::writeVolatile(writer, field); - writeAccess(writer, field); + Details::writeAccess(writer, field); - writeEnumerations(writer, field); + Details::writeEnumerations(writer, field); - writeModifiedWriteValue(writer, field); + Details::writeModifiedWriteValue(writer, field); - writeWriteValueConstraint(writer, field->getWriteConstraint()); + Details::writeWriteValueConstraint(writer, field->getWriteConstraint()); - writeReadAction(writer, field); + Details::writeReadAction(writer, field); - writeTestable(writer, field); + Details::writeTestable(writer, field); - writeReserved(writer, field); + Details::writeReserved(writer, field); - writeParameters(writer, field->getParameters()); + CommonItemsWriter::writeParameters(writer, field->getParameters(), docRevision); - writeVendorExtensions(writer, field); + CommonItemsWriter::writeVendorExtensions(writer, field); writer.writeEndElement(); // ipxact:field } //----------------------------------------------------------------------------- -// Function: FieldWriter::writeID() +// Function: FieldWriter::Details::writeID() //----------------------------------------------------------------------------- -void FieldWriter::writeID(QXmlStreamWriter& writer, QString const& fieldID) const +void FieldWriter::Details::writeID(QXmlStreamWriter& writer, QString const& fieldID) { if (!fieldID.isEmpty()) { @@ -89,17 +81,20 @@ void FieldWriter::writeID(QXmlStreamWriter& writer, QString const& fieldID) cons } //----------------------------------------------------------------------------- -// Function: FieldWriter::writeField() +// Function: FieldWriter::Details::writeMemoryArray() //----------------------------------------------------------------------------- -void FieldWriter::writeNameGroup(QXmlStreamWriter& writer, QSharedPointer field) const +void FieldWriter::Details::writeMemoryArray(QXmlStreamWriter& writer, QSharedPointer field) { - NameGroupWriter::writeNameGroup(writer, field); + if (auto memArray = field->getMemoryArray(); memArray) + { + MemoryArrayWriter::writeMemoryArray(writer, memArray, true); + } } //----------------------------------------------------------------------------- -// Function: FieldWriter::writeResets() +// Function: FieldWriter::Details::writeResets() //----------------------------------------------------------------------------- -void FieldWriter::writeResets(QXmlStreamWriter& writer, QSharedPointer field) const +void FieldWriter::Details::writeResets(QXmlStreamWriter& writer, QSharedPointer field) { if(field->getResets() && !field->getResets()->isEmpty()) { @@ -133,9 +128,9 @@ void FieldWriter::writeResets(QXmlStreamWriter& writer, QSharedPointer fi } //----------------------------------------------------------------------------- -// Function: FieldWriter::writeTypeIdentifier() +// Function: FieldWriter::Details::writeTypeIdentifier() //----------------------------------------------------------------------------- -void FieldWriter::writeTypeIdentifier(QXmlStreamWriter& writer, QSharedPointer field) const +void FieldWriter::Details::writeTypeIdentifier(QXmlStreamWriter& writer, QSharedPointer field) { if (!field->getTypeIdentifier().isEmpty()) { @@ -144,9 +139,9 @@ void FieldWriter::writeTypeIdentifier(QXmlStreamWriter& writer, QSharedPointer field) const +void FieldWriter::Details::writeVolatile(QXmlStreamWriter& writer, QSharedPointer field) { if (!field->getVolatile().toString().isEmpty()) { @@ -155,9 +150,9 @@ void FieldWriter::writeVolatile(QXmlStreamWriter& writer, QSharedPointer } //----------------------------------------------------------------------------- -// Function: FieldWriter::writeAccess() +// Function: FieldWriter::Details::writeAccess() //----------------------------------------------------------------------------- -void FieldWriter::writeAccess(QXmlStreamWriter& writer, QSharedPointer field) const +void FieldWriter::Details::writeAccess(QXmlStreamWriter& writer, QSharedPointer field) { if (field->getAccess() != AccessTypes::ACCESS_COUNT) { @@ -167,9 +162,9 @@ void FieldWriter::writeAccess(QXmlStreamWriter& writer, QSharedPointer fi } //----------------------------------------------------------------------------- -// Function: FieldWriter::writeEnumerations() +// Function: FieldWriter::Details::writeEnumerations() //----------------------------------------------------------------------------- -void FieldWriter::writeEnumerations(QXmlStreamWriter& writer, QSharedPointer field) const +void FieldWriter::Details::writeEnumerations(QXmlStreamWriter& writer, QSharedPointer field) { if (!field->getEnumeratedValues()->isEmpty()) { @@ -186,9 +181,9 @@ void FieldWriter::writeEnumerations(QXmlStreamWriter& writer, QSharedPointer field) const +void FieldWriter::Details::writeModifiedWriteValue(QXmlStreamWriter& writer, QSharedPointer field) { if (field->getModifiedWrite() != General::MODIFIED_WRITE_COUNT) { @@ -207,10 +202,10 @@ void FieldWriter::writeModifiedWriteValue(QXmlStreamWriter& writer, QSharedPoint } //----------------------------------------------------------------------------- -// Function: FieldWriter::writeWriteValueConstraint() +// Function: FieldWriter::Details::writeWriteValueConstraint() //----------------------------------------------------------------------------- -void FieldWriter::writeWriteValueConstraint(QXmlStreamWriter& writer, - QSharedPointer writeConstraint) const +void FieldWriter::Details::writeWriteValueConstraint(QXmlStreamWriter& writer, + QSharedPointer writeConstraint) { if (!writeConstraint.isNull()) { @@ -235,9 +230,9 @@ void FieldWriter::writeWriteValueConstraint(QXmlStreamWriter& writer, } //----------------------------------------------------------------------------- -// Function: FieldWriter::writeReadAction() +// Function: FieldWriter::Details::writeReadAction() //----------------------------------------------------------------------------- -void FieldWriter::writeReadAction(QXmlStreamWriter& writer, QSharedPointer field) const +void FieldWriter::Details::writeReadAction(QXmlStreamWriter& writer, QSharedPointer field) { if (field->getReadAction() != General::READ_ACTION_COUNT) { @@ -256,9 +251,9 @@ void FieldWriter::writeReadAction(QXmlStreamWriter& writer, QSharedPointer field) const +void FieldWriter::Details::writeTestable(QXmlStreamWriter& writer, QSharedPointer field) { if (!field->getTestable().toString().isEmpty()) { @@ -277,9 +272,9 @@ void FieldWriter::writeTestable(QXmlStreamWriter& writer, QSharedPointer } //----------------------------------------------------------------------------- -// Function: FieldWriter::writeReserved() +// Function: FieldWriter::Details::writeReserved() //----------------------------------------------------------------------------- -void FieldWriter::writeReserved(QXmlStreamWriter& writer, QSharedPointer field) const +void FieldWriter::Details::writeReserved(QXmlStreamWriter& writer, QSharedPointer field) { if (!field->getReserved().isEmpty()) { diff --git a/IPXACTmodels/Component/FieldWriter.h b/IPXACTmodels/Component/FieldWriter.h index 956ee75bd..d5bbe4f7e 100644 --- a/IPXACTmodels/Component/FieldWriter.h +++ b/IPXACTmodels/Component/FieldWriter.h @@ -6,7 +6,7 @@ // Date: 24.09.2015 // // Description: -// Writer class for IP-XACT field element. +// Writer for IP-XACT field element. //----------------------------------------------------------------------------- #ifndef FIELDWRITER_H @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -22,21 +23,10 @@ class Field; class WriteValueConstraint; //----------------------------------------------------------------------------- -//! Writer class for IP-XACT field element. +//! Writer for IP-XACT field element. //----------------------------------------------------------------------------- -class IPXACTMODELS_EXPORT FieldWriter : public CommonItemsWriter +namespace FieldWriter { -public: - - /*! - * The constructor. - */ - FieldWriter(); - - /*! - * The destructor. - */ - ~FieldWriter(); /*! * Write a field to an XML file. @@ -44,110 +34,108 @@ class IPXACTMODELS_EXPORT FieldWriter : public CommonItemsWriter * @param [in] writer The used xml writer. * @param [in] field The field to be written. */ - void writeField(QXmlStreamWriter& writer, QSharedPointer field) const; - -private: - - //! No copying allowed. - FieldWriter(FieldWriter const& rhs); - FieldWriter& operator=(FieldWriter const& rhs); - - /*! - * Write the field id attribute. - * - * @param [in] writer Used XML writer. - * @param [in] fieldID The field id. - */ - void writeID(QXmlStreamWriter& writer, QString const& fieldID) const; - - /*! - * Write the name group. - * - * @param [in] writer Used XML writer. - * @param [in] field The selected field item. - */ - void writeNameGroup(QXmlStreamWriter& writer, QSharedPointer field) const; - - /*! - * Write the reset. - * - * @param [in] writer Used XML writer. - * @param [in] field The selected field item. - */ - void writeResets(QXmlStreamWriter& writer, QSharedPointer field) const; - - /*! - * Write the type identifier. - * - * @param [in] writer Used XML writer. - * @param [in] field The selected field item. - */ - void writeTypeIdentifier(QXmlStreamWriter& writer, QSharedPointer field) const; - - /*! - * Write the volatile value. - * - * @param [in] writer Used XML writer. - * @param [in] field The selected field item. - */ - void writeVolatile(QXmlStreamWriter& writer, QSharedPointer field) const; - - /*! - * Write the access value. - * - * @param [in] writer Used XML writer. - * @param [in] field The selected field item. - */ - void writeAccess(QXmlStreamWriter& writer, QSharedPointer field) const; - - /*! - * Write the enumerated values. - * - * @param [in] writer Used XML writer. - * @param [in] field The selected field item. - */ - void writeEnumerations(QXmlStreamWriter& writer, QSharedPointer field) const; - - /*! - * Write the modified write value. - * - * @param [in] writer Used XML writer. - * @param [in] field The selected field item. - */ - void writeModifiedWriteValue(QXmlStreamWriter& writer, QSharedPointer field) const; - - /*! - * Write the write value constraint. - * - * @param [in] writer Used XML writer. - * @param [in] writeConstaint The field write value constraint. - */ - void writeWriteValueConstraint(QXmlStreamWriter& writer, QSharedPointer writeConstraint) - const; - - /*! - * Write the read action. - * - * @param [in] writer Used XML writer. - * @param [in] field The selected field item. - */ - void writeReadAction(QXmlStreamWriter& writer, QSharedPointer field) const; - - /*! - * Write the testable element. - * - * @param [in] writer Used XML writer. - * @param [in] field The selected field item. - */ - void writeTestable(QXmlStreamWriter& writer, QSharedPointer field) const; - - /*! - * Write the reserved value. - * - * @param [in] writer Used XML writer. - * @param [in] field The selected field item. - */ - void writeReserved(QXmlStreamWriter& writer, QSharedPointer field) const; + IPXACTMODELS_EXPORT void writeField(QXmlStreamWriter& writer, QSharedPointer field, Document::Revision docRevision = Document::Revision::Std14); + + namespace Details + { + + /*! + * Write the field id attribute. + * + * @param [in] writer Used XML writer. + * @param [in] fieldID The field id. + */ + void writeID(QXmlStreamWriter& writer, QString const& fieldID); + + /*! + * Write the field memory array. + * + * @param [in] writer The used xml writer. + * @param [in] field The field to be written. + */ + void writeMemoryArray(QXmlStreamWriter& writer, QSharedPointer field); + + /*! + * Write the reset. + * + * @param [in] writer Used XML writer. + * @param [in] field The selected field item. + */ + void writeResets(QXmlStreamWriter& writer, QSharedPointer field); + + /*! + * Write the type identifier. + * + * @param [in] writer Used XML writer. + * @param [in] field The selected field item. + */ + void writeTypeIdentifier(QXmlStreamWriter& writer, QSharedPointer field); + + /*! + * Write the volatile value. + * + * @param [in] writer Used XML writer. + * @param [in] field The selected field item. + */ + void writeVolatile(QXmlStreamWriter& writer, QSharedPointer field); + + /*! + * Write the access value. + * + * @param [in] writer Used XML writer. + * @param [in] field The selected field item. + */ + void writeAccess(QXmlStreamWriter& writer, QSharedPointer field); + + /*! + * Write the enumerated values. + * + * @param [in] writer Used XML writer. + * @param [in] field The selected field item. + */ + void writeEnumerations(QXmlStreamWriter& writer, QSharedPointer field); + + /*! + * Write the modified write value. + * + * @param [in] writer Used XML writer. + * @param [in] field The selected field item. + */ + void writeModifiedWriteValue(QXmlStreamWriter& writer, QSharedPointer field); + + /*! + * Write the write value constraint. + * + * @param [in] writer Used XML writer. + * @param [in] writeConstaint The field write value constraint. + */ + void writeWriteValueConstraint(QXmlStreamWriter& writer, QSharedPointer writeConstraint) + ; + + /*! + * Write the read action. + * + * @param [in] writer Used XML writer. + * @param [in] field The selected field item. + */ + void writeReadAction(QXmlStreamWriter& writer, QSharedPointer field); + + /*! + * Write the testable element. + * + * @param [in] writer Used XML writer. + * @param [in] field The selected field item. + */ + void writeTestable(QXmlStreamWriter& writer, QSharedPointer field); + + /*! + * Write the reserved value. + * + * @param [in] writer Used XML writer. + * @param [in] field The selected field item. + */ + void writeReserved(QXmlStreamWriter& writer, QSharedPointer field); + } }; #endif // FIELDWRITER_H diff --git a/IPXACTmodels/Component/MemoryArray.h b/IPXACTmodels/Component/MemoryArray.h index a11dd59d4..b17e79fc2 100644 --- a/IPXACTmodels/Component/MemoryArray.h +++ b/IPXACTmodels/Component/MemoryArray.h @@ -26,7 +26,7 @@ class IPXACTMODELS_EXPORT MemoryArray // ipxact:dim struct Dimension { - QString dimension_; + QString value_; QString indexVar_; }; diff --git a/IPXACTmodels/Component/MemoryArrayReader.cpp b/IPXACTmodels/Component/MemoryArrayReader.cpp index c5251ce4b..54821a4c6 100644 --- a/IPXACTmodels/Component/MemoryArrayReader.cpp +++ b/IPXACTmodels/Component/MemoryArrayReader.cpp @@ -40,7 +40,7 @@ void MemoryArrayReader::Details::parseDimensions(QDomNode const& arrayNode, QSha auto dimensionNode = dimensionNodes.at(i); if (dimensionNode.nodeName() == QStringLiteral("ipxact:dim")) { - newDimension->dimension_ = dimensionNode.firstChild().nodeValue(); + newDimension->value_ = dimensionNode.firstChild().nodeValue(); newDimension->indexVar_ = dimensionNode.attributes().namedItem(QStringLiteral("indexVar")).nodeValue(); newArray->getDimensions()->append(newDimension); diff --git a/IPXACTmodels/Component/MemoryArrayValidator.cpp b/IPXACTmodels/Component/MemoryArrayValidator.cpp deleted file mode 100644 index eb5605f1c..000000000 --- a/IPXACTmodels/Component/MemoryArrayValidator.cpp +++ /dev/null @@ -1,41 +0,0 @@ -//----------------------------------------------------------------------------- -// File: MemoryArrayValidator.cpp -//----------------------------------------------------------------------------- -// Project: Kactus 2 -// Author: Anton Hagqvist -// Date: 21.7.2023 -// -// Description: -// Validator for ipxact:array memory array elements. -//----------------------------------------------------------------------------- - -#include "MemoryArrayValidator.h" -#include "MemoryArray.h" - -//----------------------------------------------------------------------------- -// Function: MemoryArrayValidator::validateMemoryArray() -//----------------------------------------------------------------------------- -bool MemoryArrayValidator::validateMemoryArray(QSharedPointer memoryArray) -{ - return Details::hasDimensions(memoryArray); -} - -//----------------------------------------------------------------------------- -// Function: MemoryArrayValidator::findErrorsInMemoryArray() -//----------------------------------------------------------------------------- -void MemoryArrayValidator::findErrorsInMemoryArray(QStringList& errorList, QSharedPointer memoryArray, - QString const& context) -{ - if (!Details::hasDimensions(memoryArray)) - { - errorList.append(QObject::tr("No dimensions defined for memory array in %1").arg(context)); - } -} - -//----------------------------------------------------------------------------- -// Function: MemoryArrayValidator::Details::hasDimensions() -//----------------------------------------------------------------------------- -bool MemoryArrayValidator::Details::hasDimensions(QSharedPointer memoryArray) -{ - return !memoryArray->getDimensions()->isEmpty(); -} diff --git a/IPXACTmodels/Component/MemoryArrayValidator.h b/IPXACTmodels/Component/MemoryArrayValidator.h deleted file mode 100644 index 01046270b..000000000 --- a/IPXACTmodels/Component/MemoryArrayValidator.h +++ /dev/null @@ -1,57 +0,0 @@ -//----------------------------------------------------------------------------- -// File: MemoryArrayValidator.h -//----------------------------------------------------------------------------- -// Project: Kactus 2 -// Author: Anton Hagqvist -// Date: 21.7.2023 -// -// Description: -// Validator for ipxact:array memory array elements. -//----------------------------------------------------------------------------- - -#ifndef MEMORYARRAYVALIDATOR_H -#define MEMORYARRAYVALIDATOR_H - -#include - -class MemoryArray; - -//----------------------------------------------------------------------------- -//! Writer for ipxact:array memory array elements. -//----------------------------------------------------------------------------- -namespace MemoryArrayValidator -{ - - /*! - * Validates the given memory array. - * - * @param [in] memoryArray The memory array to validate. - * - * @return True, if memory array is valid, otherwise false. - */ - IPXACTMODELS_EXPORT bool validateMemoryArray(QSharedPointer memoryArray); - - /*! - * Finds errors within a memory array. - * - * @param [in] errorList A list of found errors. - * @param [in] memoryArray The memory array to check. - * @param [in] context Context to help locate the error. - */ - IPXACTMODELS_EXPORT void findErrorsInMemoryArray(QStringList& errorList, QSharedPointer memoryArray, - QString const& context); - - namespace Details - { - /*! - * Checks if a given memory array has dimensions defined. - * - * @param [in] memoryArray The memory array to check. - * - * @return True, if at least one dimension is defined for the array. - */ - bool hasDimensions(QSharedPointer memoryArray); - } -}; - -#endif // MEMORYARRAYVALIDATOR_H diff --git a/IPXACTmodels/Component/MemoryArrayWriter.cpp b/IPXACTmodels/Component/MemoryArrayWriter.cpp index a1afa88b8..1b94295a5 100644 --- a/IPXACTmodels/Component/MemoryArrayWriter.cpp +++ b/IPXACTmodels/Component/MemoryArrayWriter.cpp @@ -40,7 +40,7 @@ void MemoryArrayWriter::Details::writeDimensions(QXmlStreamWriter& writer, QShar writer.writeAttribute(QStringLiteral("indexVar"), dimension->indexVar_); } - writer.writeCharacters(dimension->dimension_); + writer.writeCharacters(dimension->value_); writer.writeEndElement(); // ipxact:dim } } diff --git a/IPXACTmodels/Component/RegisterReader.cpp b/IPXACTmodels/Component/RegisterReader.cpp index 72125bf27..5f1556bfd 100644 --- a/IPXACTmodels/Component/RegisterReader.cpp +++ b/IPXACTmodels/Component/RegisterReader.cpp @@ -215,13 +215,11 @@ void RegisterReader::parseFields(QDomElement const& registerDefinitionElement, if (!fieldNodeList.isEmpty()) { - FieldReader fieldReader; - for (int fieldIndex = 0; fieldIndex < fieldNodeList.count(); ++fieldIndex) { if (fieldNodeList.at(fieldIndex).nodeName() == QLatin1String("ipxact:field")) { - QSharedPointer newField = fieldReader.createFieldFrom(fieldNodeList.at(fieldIndex)); + QSharedPointer newField = FieldReader::createFieldFrom(fieldNodeList.at(fieldIndex)); registerDefinition->getFields()->append(newField); } } diff --git a/IPXACTmodels/Component/RegisterWriter.cpp b/IPXACTmodels/Component/RegisterWriter.cpp index f54eda01b..7d8287c86 100644 --- a/IPXACTmodels/Component/RegisterWriter.cpp +++ b/IPXACTmodels/Component/RegisterWriter.cpp @@ -155,10 +155,9 @@ void RegisterWriter::writeAccess(QXmlStreamWriter& writer, QSharedPointer registerDefinition) const { - FieldWriter fieldWriter; - foreach (QSharedPointer field, *registerDefinition->getFields()) + for (auto const& field : *registerDefinition->getFields()) { - fieldWriter.writeField(writer, field); + FieldWriter::writeField(writer, field); } } diff --git a/IPXACTmodels/Component/validators/FieldValidator.cpp b/IPXACTmodels/Component/validators/FieldValidator.cpp index 32e59041b..99cac4ce2 100644 --- a/IPXACTmodels/Component/validators/FieldValidator.cpp +++ b/IPXACTmodels/Component/validators/FieldValidator.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -64,8 +65,8 @@ QSharedPointer FieldValidator::getEnumeratedValueValid //----------------------------------------------------------------------------- bool FieldValidator::validate(QSharedPointer field) const { - return hasValidName(field) && hasValidIsPresent(field) && hasValidBitOffset(field) && - hasValidResets(field) && hasValidWriteValueConstraint(field) && + return hasValidName(field) && hasValidIsPresent(field) && hasValidMemoryArray(field) && + hasValidBitOffset(field) && hasValidResets(field) && hasValidWriteValueConstraint(field) && hasValidWriteValueConstraint(field) && hasValidReserved(field) && hasValidBitWidth(field) && hasValidEnumeratedValues(field) && hasValidParameters(field) && hasValidAccess(field); } @@ -108,6 +109,20 @@ bool FieldValidator::hasValidIsPresent(QSharedPointer field) const return true; } +//----------------------------------------------------------------------------- +// Function: FieldValidator::hasValidMemoryArray() +//----------------------------------------------------------------------------- +bool FieldValidator::hasValidMemoryArray(QSharedPointer field) const +{ + MemoryArrayValidator validator(expressionParser_); + if (auto memArray = field->getMemoryArray(); memArray) + { + return validator.validate(field->getMemoryArray()); + } + + return true; +} + //----------------------------------------------------------------------------- // Function: FieldValidator::hasValidBitOffset() //----------------------------------------------------------------------------- @@ -342,6 +357,7 @@ void FieldValidator::findErrorsIn(QVector& errors, QSharedPointer& errors, QSharedPoin } } +//----------------------------------------------------------------------------- +// Function: FieldValidator::findErrorsInMemoryArray() +//----------------------------------------------------------------------------- +void FieldValidator::findErrorsInMemoryArray(QVector& errors, QSharedPointer field, + QString const& context) const +{ + MemoryArrayValidator validator(expressionParser_); + if (auto memArray = field->getMemoryArray(); memArray) + { + validator.findErrorsIn(errors, field->getMemoryArray(), context); + } +} + //----------------------------------------------------------------------------- // Function: FieldValidator::findErrorsInBitOffset() //----------------------------------------------------------------------------- diff --git a/IPXACTmodels/Component/validators/FieldValidator.h b/IPXACTmodels/Component/validators/FieldValidator.h index b6f282554..f4d51d917 100644 --- a/IPXACTmodels/Component/validators/FieldValidator.h +++ b/IPXACTmodels/Component/validators/FieldValidator.h @@ -91,6 +91,15 @@ class IPXACTMODELS_EXPORT FieldValidator */ bool hasValidIsPresent(QSharedPointer field) const; + /*! + * Check if the field has a valid memory array. + * + * @param [in] field The selected field. + * + * @return True, if the memory array is valid, otherwise false. + */ + bool hasValidMemoryArray(QSharedPointer field) const; + /*! * Check if the field has a valid bit offset. * @@ -232,6 +241,15 @@ class IPXACTMODELS_EXPORT FieldValidator */ void findErrorsInIsPresent(QVector& errors, QSharedPointer field, QString const& context) const; + /*! + * Find errors within the memory array of the field. + * + * @param [in] errors List of found errors. + * @param [in] field The selected field. + * @param [in] context Context to help locate the error. + */ + void findErrorsInMemoryArray(QVector& errors, QSharedPointer field, QString const& context) const; + /*! * Find errors within field bit offset. * diff --git a/IPXACTmodels/Component/validators/MemoryArrayValidator.cpp b/IPXACTmodels/Component/validators/MemoryArrayValidator.cpp new file mode 100644 index 000000000..9ed30862b --- /dev/null +++ b/IPXACTmodels/Component/validators/MemoryArrayValidator.cpp @@ -0,0 +1,122 @@ +//----------------------------------------------------------------------------- +// File: MemoryArrayValidator.cpp +//----------------------------------------------------------------------------- +// Project: Kactus 2 +// Author: Anton Hagqvist +// Date: 21.7.2023 +// +// Description: +// Validator for ipxact:array memory array elements. +//----------------------------------------------------------------------------- + +#include "MemoryArrayValidator.h" +#include + +//----------------------------------------------------------------------------- +// Function: MemoryArrayValidator::MemoryArrayValidator() +//----------------------------------------------------------------------------- +MemoryArrayValidator::MemoryArrayValidator(QSharedPointer expressionParser): + expressionParser_(expressionParser) +{ + +} + +//----------------------------------------------------------------------------- +// Function: MemoryArrayValidator::validate() +//----------------------------------------------------------------------------- +bool MemoryArrayValidator::validate(QSharedPointer memoryArray) const +{ + return hasValidDimensions(memoryArray) && hasValidStride(memoryArray); +} + +//----------------------------------------------------------------------------- +// Function: MemoryArrayValidator::findErrorsIn() +//----------------------------------------------------------------------------- +void MemoryArrayValidator::findErrorsIn(QStringList& errorList, QSharedPointer memoryArray, + QString const& context) const +{ + if (memoryArray->getDimensions()->isEmpty()) + { + errorList.append(QObject::tr("No dimensions defined for memory array in %1").arg(context)); + } + + bool invalidDim = false; + for (auto const& dim : *memoryArray->getDimensions()) + { + if (!hasValidElementValue(dim->value_)) + { + invalidDim = true; + break; + } + } + + if (invalidDim && !memoryArray->getDimensions()->isEmpty()) + { + errorList.append(QObject::tr("One or more dimensions of the memory array in %1 have an invalid value.") + .arg(context)); + } + + if (!hasValidStride(memoryArray)) + { + errorList.append(QObject::tr("Memory array in %1 has invalid stride value.").arg(context)); + } +} + +//----------------------------------------------------------------------------- +// Function: MemoryArrayValidator::hasDimensions() +//----------------------------------------------------------------------------- +bool MemoryArrayValidator::hasValidDimensions(QSharedPointer memoryArray) const +{ + if (!memoryArray) + { + return true; + } + + if (memoryArray->getDimensions()->isEmpty()) + { + return false; + } + + for (auto const& dim : *memoryArray->getDimensions()) + { + if (!hasValidElementValue(dim->value_)) + { + return false; + } + } + + return true; +} + +//----------------------------------------------------------------------------- +// Function: MemoryArrayValidator::hasValidStride() +//----------------------------------------------------------------------------- +bool MemoryArrayValidator::hasValidStride(QSharedPointer memoryArray) const +{ + return hasValidElementValue(memoryArray->getStride()); +} + +//----------------------------------------------------------------------------- +// Function: MemoryArrayValidator::hasValidElementValue() +//----------------------------------------------------------------------------- +bool MemoryArrayValidator::hasValidElementValue(QString const& value) const +{ + if (!value.isEmpty()) + { + bool validValue = false; + auto solvedValue = expressionParser_->parseExpression(value, &validValue); + + if (!validValue) + { + return false; + } + + auto castedValue = solvedValue.toULong(&validValue); + if (!validValue || castedValue == 0) + { + return false; + } + } + + return true; +} diff --git a/IPXACTmodels/Component/validators/MemoryArrayValidator.h b/IPXACTmodels/Component/validators/MemoryArrayValidator.h new file mode 100644 index 000000000..13176fd0f --- /dev/null +++ b/IPXACTmodels/Component/validators/MemoryArrayValidator.h @@ -0,0 +1,88 @@ +//----------------------------------------------------------------------------- +// File: MemoryArrayValidator.h +//----------------------------------------------------------------------------- +// Project: Kactus 2 +// Author: Anton Hagqvist +// Date: 21.7.2023 +// +// Description: +// Validator for ipxact:array memory array elements. +//----------------------------------------------------------------------------- + +#ifndef MEMORYARRAYVALIDATOR_H +#define MEMORYARRAYVALIDATOR_H + +#include + +#include + +class MemoryArray; + +class IPXACTMODELS_EXPORT MemoryArrayValidator +{ +public: + + /*! + * The constructor. + * + * @param [in] expressionParser The expression parser to use. + */ + MemoryArrayValidator(QSharedPointer expressionParser); + + virtual ~MemoryArrayValidator() = default; + + MemoryArrayValidator(MemoryArrayValidator const& other) = delete; + MemoryArrayValidator& operator=(MemoryArrayValidator const& other) = delete; + + /*! + * Validates the given memory array. + * + * @param [in] memoryArray The memory array to validate. + * + * @return True, if memory array is valid, otherwise false. + */ + bool validate(QSharedPointer memoryArray) const; + + /*! + * Finds errors within a memory array. + * + * @param [in] errorList A list of found errors. + * @param [in] memoryArray The memory array to check. + * @param [in] context Context to help locate the error. + */ + void findErrorsIn(QStringList& errorList, QSharedPointer memoryArray, + QString const& context) const; +private: + + /*! + * Checks if a given memory array has dimensions defined. + * + * @param [in] memoryArray The memory array to check. + * + * @return True, if at least one dimension is defined for the array. + */ + bool hasValidDimensions(QSharedPointer memoryArray) const; + + /*! + * Validate the (bit)stride of the array. + * + * @param [in] memoryArray The memory array to check. + * + * @return True, if the stride can be evaluated or is empty, false otherwise. + */ + bool hasValidStride(QSharedPointer memoryArray) const; + + /*! + * Validates a given value as an unsigned, nonzero long int. + * + * @param [in] value Description + * + * @return True, if the given value is valid, false otherwise. + */ + bool hasValidElementValue(QString const& value) const; + + //! The expression parser to use. + QSharedPointer expressionParser_; +}; + +#endif // MEMORYARRAYVALIDATOR_H diff --git a/IPXACTmodels/IPXACTmodels.pri b/IPXACTmodels/IPXACTmodels.pri index f3e247c6b..d6aecb1fc 100644 --- a/IPXACTmodels/IPXACTmodels.pri +++ b/IPXACTmodels/IPXACTmodels.pri @@ -275,7 +275,7 @@ HEADERS += ./generaldeclarations.h \ ./Component/MemoryArray.h \ ./Component/MemoryArrayReader.h \ ./Component/MemoryArrayWriter.h \ - ./Component/MemoryArrayValidator.h + ./Component/validators/MemoryArrayValidator.h SOURCES += ./generaldeclarations.cpp \ ./kactusExtensions/ApiDefinition.cpp \ ./kactusExtensions/ApiDefinitionReader.cpp \ @@ -545,4 +545,4 @@ SOURCES += ./generaldeclarations.cpp \ ./Component/MemoryArray.cpp \ ./Component/MemoryArrayReader.cpp \ ./Component/MemoryArrayWriter.cpp \ - ./Component/MemoryArrayValidator.cpp + ./Component/validators/MemoryArrayValidator.cpp diff --git a/IPXACTmodels/IPXACTmodels.vcxproj b/IPXACTmodels/IPXACTmodels.vcxproj index 48dbb50d1..3c5737005 100644 --- a/IPXACTmodels/IPXACTmodels.vcxproj +++ b/IPXACTmodels/IPXACTmodels.vcxproj @@ -249,7 +249,6 @@ - @@ -304,6 +303,7 @@ + @@ -403,7 +403,6 @@ - @@ -411,6 +410,7 @@ + diff --git a/IPXACTmodels/IPXACTmodels.vcxproj.filters b/IPXACTmodels/IPXACTmodels.vcxproj.filters index 644494c9f..51e430f93 100644 --- a/IPXACTmodels/IPXACTmodels.vcxproj.filters +++ b/IPXACTmodels/IPXACTmodels.vcxproj.filters @@ -947,8 +947,8 @@ Source Files\Component - - Source Files\Component + + Source Files\Component\validators @@ -1594,8 +1594,8 @@ Header Files\Component - - Header Files\Component + + Header Files\Component\validators diff --git a/tests/IPXACTmodels/Component/tst_FieldReader.cpp b/tests/IPXACTmodels/Component/tst_FieldReader.cpp index 6ed2424d9..015a259f9 100644 --- a/tests/IPXACTmodels/Component/tst_FieldReader.cpp +++ b/tests/IPXACTmodels/Component/tst_FieldReader.cpp @@ -10,8 +10,11 @@ //----------------------------------------------------------------------------- #include +#include + #include #include +#include #include #include #include @@ -30,6 +33,7 @@ private slots: void readSimpleField(); void readFieldID(); void readIsPresent(); + void readMemoryArray2022(); void readResets(); void readTypeIdentifier(); @@ -75,8 +79,7 @@ void tst_FieldReader::readSimpleField() QDomNode fieldNode = document.firstChildElement("ipxact:field"); - FieldReader fieldReader; - QSharedPointer testField = fieldReader.createFieldFrom(fieldNode); + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->name(), QString("testField")); QCOMPARE(testField->displayName(), QString("testDisplay")); @@ -103,8 +106,7 @@ void tst_FieldReader::readFieldID() QDomNode fieldNode = document.firstChildElement("ipxact:field"); - FieldReader fieldReader; - QSharedPointer testField = fieldReader.createFieldFrom(fieldNode); + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->name(), QString("testField")); QCOMPARE(testField->getBitOffset(), QString("Baldur's")); @@ -131,12 +133,44 @@ void tst_FieldReader::readIsPresent() QDomNode fieldNode = document.firstChildElement("ipxact:field"); - FieldReader fieldReader; - QSharedPointer testField = fieldReader.createFieldFrom(fieldNode); + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getIsPresent(), QString("presence*2")); } +//----------------------------------------------------------------------------- +// Function: tst_FieldReader::readMemoryArray2022() +//----------------------------------------------------------------------------- +void tst_FieldReader::readMemoryArray2022() +{ + QString documentContent( + "" + "testField" + "Baldur's" + "" + "8" + "8" + "" + "Gate" + "" + ); + + QDomDocument document; + document.setContent(documentContent); + + QDomNode fieldNode = document.firstChildElement("ipxact:field"); + + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std22); + + auto memArray = testField->getMemoryArray(); + auto dimension = memArray->getDimensions()->first(); + auto bitStride = memArray->getStride(); + + QCOMPARE(dimension->value_, QString("8")); + QCOMPARE(dimension->indexVar_, QString("i")); + QCOMPARE(bitStride, QString("8")); +} + //----------------------------------------------------------------------------- // Function: tst_FieldReader::readResets() //----------------------------------------------------------------------------- @@ -161,8 +195,7 @@ void tst_FieldReader::readResets() QDomNode fieldNode = document.firstChildElement("ipxact:field"); - FieldReader fieldReader; - QSharedPointer testField = fieldReader.createFieldFrom(fieldNode); + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getResets()->count(), 1); @@ -190,7 +223,7 @@ void tst_FieldReader::readResets() document.setContent(documentContent); fieldNode = document.firstChildElement("ipxact:field"); - testField = fieldReader.createFieldFrom(fieldNode); + testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getResets()->count(), 2); @@ -225,8 +258,7 @@ void tst_FieldReader::readTypeIdentifier() QDomNode fieldNode = document.firstChildElement("ipxact:field"); - FieldReader fieldReader; - QSharedPointer testField = fieldReader.createFieldFrom(fieldNode); + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getTypeIdentifier(), QString("testTypeIdentifier")); } @@ -250,8 +282,7 @@ void tst_FieldReader::readVolatile() QDomNode fieldNode = document.firstChildElement("ipxact:field"); - FieldReader fieldReader; - QSharedPointer testField = fieldReader.createFieldFrom(fieldNode); + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getVolatile().toString(), QString("true")); } @@ -275,8 +306,7 @@ void tst_FieldReader::readAccess() QDomNode fieldNode = document.firstChildElement("ipxact:field"); - FieldReader fieldReader; - QSharedPointer testField = fieldReader.createFieldFrom(fieldNode); + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getAccess(), AccessTypes::READ_WRITE); } @@ -305,8 +335,7 @@ void tst_FieldReader::readEnumeratedValues() QDomNode fieldNode = document.firstChildElement("ipxact:field"); - FieldReader fieldReader; - QSharedPointer testField = fieldReader.createFieldFrom(fieldNode); + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getEnumeratedValues()->size(), 1); @@ -334,8 +363,7 @@ void tst_FieldReader::readModifiedWritevalue() QDomNode fieldNode = document.firstChildElement("ipxact:field"); - FieldReader fieldReader; - QSharedPointer testField = fieldReader.createFieldFrom(fieldNode); + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getModifiedWrite(), General::ZERO_TO_CLEAR); @@ -350,7 +378,7 @@ void tst_FieldReader::readModifiedWritevalue() document.setContent(documentContent); fieldNode = document.firstChildElement("ipxact:field"); - testField = fieldReader.createFieldFrom(fieldNode); + testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getModifiedWrite(), General::ONE_TO_TOGGLE); QCOMPARE(testField->getModifiedWriteModify(), QString("modifier")); @@ -377,8 +405,7 @@ void tst_FieldReader::readWriteValueConstraint() QDomNode fieldNode = document.firstChildElement("ipxact:field"); - FieldReader fieldReader; - QSharedPointer testField = fieldReader.createFieldFrom(fieldNode); + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getWriteConstraint().isNull(), false); QCOMPARE(testField->getWriteConstraint()->getType(), WriteValueConstraint::WRITE_AS_READ); @@ -396,7 +423,7 @@ void tst_FieldReader::readWriteValueConstraint() document.setContent(documentContent); fieldNode = document.firstChildElement("ipxact:field"); - testField = fieldReader.createFieldFrom(fieldNode); + testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getWriteConstraint().isNull(), false); QCOMPARE(testField->getWriteConstraint()->getType(), WriteValueConstraint::USE_ENUM); @@ -415,7 +442,7 @@ void tst_FieldReader::readWriteValueConstraint() document.setContent(documentContent); fieldNode = document.firstChildElement("ipxact:field"); - testField = fieldReader.createFieldFrom(fieldNode); + testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getWriteConstraint().isNull(), false); QCOMPARE(testField->getWriteConstraint()->getType(), WriteValueConstraint::MIN_MAX); @@ -442,8 +469,7 @@ void tst_FieldReader::readReadAction() QDomNode fieldNode = document.firstChildElement("ipxact:field"); - FieldReader fieldReader; - QSharedPointer testField = fieldReader.createFieldFrom(fieldNode); + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getReadAction(), General::READ_SET); @@ -458,7 +484,7 @@ void tst_FieldReader::readReadAction() document.setContent(documentContent); fieldNode = document.firstChildElement("ipxact:field"); - testField = fieldReader.createFieldFrom(fieldNode); + testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getReadAction(), General::READ_CLEAR); QCOMPARE(testField->getReadActionModify(), QString("modifier")); @@ -483,8 +509,7 @@ void tst_FieldReader::readTestable() QDomNode fieldNode = document.firstChildElement("ipxact:field"); - FieldReader fieldReader; - QSharedPointer testField = fieldReader.createFieldFrom(fieldNode); + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getTestable().toString(), QString("false")); @@ -499,7 +524,7 @@ void tst_FieldReader::readTestable() document.setContent(documentContent); fieldNode = document.firstChildElement("ipxact:field"); - testField = fieldReader.createFieldFrom(fieldNode); + testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getTestable().toString(), QString("true")); QCOMPARE(testField->getTestConstraint(), General::TEST_RESTORE); @@ -524,8 +549,7 @@ void tst_FieldReader::readReserved() QDomNode fieldNode = document.firstChildElement("ipxact:field"); - FieldReader fieldReader; - QSharedPointer testField = fieldReader.createFieldFrom(fieldNode); + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getReserved(), QString("reserveWarning")); } @@ -554,8 +578,7 @@ void tst_FieldReader::readParameters() QDomNode fieldNode = document.firstChildElement("ipxact:field"); - FieldReader fieldReader; - QSharedPointer testField = fieldReader.createFieldFrom(fieldNode); + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getParameters()->size(), 1); QCOMPARE(testField->getParameters()->first()->name(), QString("testParameter")); @@ -583,8 +606,7 @@ void tst_FieldReader::readVendorExtensions() QDomNode fieldNode = document.firstChildElement("ipxact:field"); - FieldReader fieldReader; - QSharedPointer testField = fieldReader.createFieldFrom(fieldNode); + QSharedPointer testField = FieldReader::createFieldFrom(fieldNode, Document::Revision::Std14); QCOMPARE(testField->getVendorExtensions()->size(), 1); QCOMPARE(testField->getVendorExtensions()->first()->type(), QString("testExtension")); diff --git a/tests/IPXACTmodels/Component/tst_FieldReader.pro b/tests/IPXACTmodels/Component/tst_FieldReader.pro index 64b0ff28d..157d14b63 100644 --- a/tests/IPXACTmodels/Component/tst_FieldReader.pro +++ b/tests/IPXACTmodels/Component/tst_FieldReader.pro @@ -24,7 +24,7 @@ linux-g++ | linux-g++-64 | linux-g++-32 { } win64 | win32 { - LIBS += -L../../../x64/executable \ + LIBS += -L../../../executable \ -lIPXACTmodelsd } diff --git a/tests/IPXACTmodels/Component/tst_FieldValidator.cpp b/tests/IPXACTmodels/Component/tst_FieldValidator.cpp index e969421d4..1db18eaed 100644 --- a/tests/IPXACTmodels/Component/tst_FieldValidator.cpp +++ b/tests/IPXACTmodels/Component/tst_FieldValidator.cpp @@ -10,6 +10,8 @@ //----------------------------------------------------------------------------- #include +#include +#include #include #include #include @@ -21,7 +23,7 @@ #include #include -#include +#include #include @@ -40,6 +42,9 @@ private slots: void testIsPresentIsValid(); void testIsPresentIsValid_data(); + void testMemoryArrayIsValid(); + void testMemoryArrayIsValid_data(); + void testBitOffsetIsValid(); void testBitOffsetIsValid_data(); @@ -174,6 +179,64 @@ void tst_FieldValidator::testIsPresentIsValid_data() QTest::newRow("String as isPresent is invalid") << "\"test\"" << false; } +//----------------------------------------------------------------------------- +// Function: tst_FieldValidator::testMemoryArrayIsValid() +//----------------------------------------------------------------------------- +void tst_FieldValidator::testMemoryArrayIsValid() +{ + QFETCH(QString, dimValue); + QFETCH(QString, indexVar); + QFETCH(QString, bitStride); + QFETCH(bool, isValid); + + QSharedPointer testField(new Field()); + testField->setName("testField"); + + QSharedPointer memArray(new MemoryArray()); + QSharedPointer dim(new MemoryArray::Dimension({ dimValue, indexVar })); + if (dimValue.isEmpty() == false) + { + memArray->getDimensions()->append(dim); + } + memArray->setStride(bitStride); + + testField->setMemoryArray(memArray); + + QSharedPointer parser(new SystemVerilogExpressionParser()); + QSharedPointer enumeratedValueValidator(new EnumeratedValueValidator(parser)); + QSharedPointer parameterValidator( + new ParameterValidator(parser, QSharedPointer > >())); + FieldValidator validator(parser, enumeratedValueValidator, parameterValidator); + + QCOMPARE(validator.hasValidMemoryArray(testField), isValid); + + if (!isValid) + { + QList foundErrors; + validator.findErrorsIn(foundErrors, testField, "test"); + + QString expectedError = QObject::tr("No dimensions defined for memory array in test"); + if (errorIsNotFoundInErrorList(expectedError, foundErrors)) + { + QFAIL("No error message found"); + } + } +} + +//----------------------------------------------------------------------------- +// Function: tst_FieldValidator::testMemoryArrayIsValid_data() +//----------------------------------------------------------------------------- +void tst_FieldValidator::testMemoryArrayIsValid_data() +{ + QTest::addColumn("dimValue"); + QTest::addColumn("indexVar"); + QTest::addColumn("bitStride"); + QTest::addColumn("isValid"); + + QTest::newRow("Dimension exists is valid") << "8" << "i" << "8" << true; + QTest::newRow("Dimension doesn't exist is invalid") << "" << "" << "" << false; +} + //----------------------------------------------------------------------------- // Function: tst_FieldValidator::testBitOffsetIsValid() //----------------------------------------------------------------------------- @@ -334,7 +397,11 @@ void tst_FieldValidator::testResetTypeRefIsValid() QSharedPointer > > componentResets(new QList >()); componentResets->append(testReset); - validator.componentChange(componentResets); + + QSharedPointer newComponent(new Component(VLNV(), Document::Revision::Std14)); + newComponent->setResetTypes(componentResets); + + validator.componentChange(newComponent); } bool resetValueIsValid = validator.hasValidResetValue(testField->getResets()->first()); @@ -422,7 +489,10 @@ void tst_FieldValidator::testMultipleResetTypeRefIsValid() new ParameterValidator(parser, QSharedPointer > >())); FieldValidator validator(parser, enumeratedValueValidator, parameterValidator); - validator.componentChange(availableResetTypes); + QSharedPointer dummyComponent(new Component(VLNV(), Document::Revision::Std14)); + dummyComponent->setResetTypes(availableResetTypes); + + validator.componentChange(dummyComponent); QCOMPARE(validator.hasValidResets(testField), isValid); if (!isValid) @@ -874,7 +944,7 @@ bool tst_FieldValidator::errorIsNotFoundInErrorList(QString const& expectedError { if (!errorList.contains(expectedError)) { - qDebug() << "The following error:" << endl << expectedError << endl << "was not found in errorlist:"; + qDebug() << "The following error:" << Qt::endl << expectedError << Qt::endl << "was not found in errorlist:"; foreach(QString error, errorList) { qDebug() << error; diff --git a/tests/IPXACTmodels/Component/tst_FieldValidator.pri b/tests/IPXACTmodels/Component/tst_FieldValidator.pri index 106d59c7e..2d585221e 100644 --- a/tests/IPXACTmodels/Component/tst_FieldValidator.pri +++ b/tests/IPXACTmodels/Component/tst_FieldValidator.pri @@ -1,9 +1,5 @@ # ---------------------------------------------------- # This file is generated by the Qt Visual Studio Tools. # ------------------------------------------------------ - -HEADERS += ../../../editors/ComponentEditor/common/ComponentParameterFinder.h \ - ../../../editors/ComponentEditor/common/SystemVerilogExpressionParser.h -SOURCES += ../../../editors/ComponentEditor/common/SystemVerilogExpressionParser.cpp \ - ./tst_FieldValidator.cpp \ No newline at end of file +SOURCES += ./tst_FieldValidator.cpp \ No newline at end of file diff --git a/tests/IPXACTmodels/Component/tst_FieldValidator.pro b/tests/IPXACTmodels/Component/tst_FieldValidator.pro index 5c8222608..a004ad542 100644 --- a/tests/IPXACTmodels/Component/tst_FieldValidator.pro +++ b/tests/IPXACTmodels/Component/tst_FieldValidator.pro @@ -19,16 +19,19 @@ CONFIG += c++11 testcase console linux-g++ | linux-g++-64 | linux-g++-32 { LIBS += -L../../../executable \ - -lIPXACTmodels + -lIPXACTmodels \ + -lKactusAPI } win64 | win32 { - LIBS += -L../../../x64/executable \ - -lIPXACTmodelsd + LIBS += -L../../../executable \ + -lIPXACTmodelsd \ + -lKactusAPId } INCLUDEPATH += $$DESTDIR INCLUDEPATH += ../../../ +INCLUDEPATH += ../../../KactusAPI/include DEPENDPATH += . DEPENDPATH += ../../../ diff --git a/tests/IPXACTmodels/Component/tst_FieldWriter.cpp b/tests/IPXACTmodels/Component/tst_FieldWriter.cpp index 1a1ff5efa..bc7829bfc 100644 --- a/tests/IPXACTmodels/Component/tst_FieldWriter.cpp +++ b/tests/IPXACTmodels/Component/tst_FieldWriter.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include @@ -37,6 +38,7 @@ private slots: void writeSimpleField(); void writeFieldID(); void writeIsPresent(); + void writeMemoryArray2022(); void writeResets(); void writeTypeIdentifier(); @@ -116,8 +118,7 @@ void tst_FieldWriter::writeSimpleField() "" ); - FieldWriter fieldWriter; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); output.clear(); @@ -135,7 +136,7 @@ void tst_FieldWriter::writeSimpleField() "" ; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); } @@ -157,8 +158,7 @@ void tst_FieldWriter::writeFieldID() "" ); - FieldWriter fieldWriter; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); } @@ -181,8 +181,37 @@ void tst_FieldWriter::writeIsPresent() "" ); - FieldWriter fieldWriter; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); + QCOMPARE(output, expectedOutput); +} + +//----------------------------------------------------------------------------- +// Function: tst_FieldWriter::writeMemoryArray2022() +//----------------------------------------------------------------------------- +void tst_FieldWriter::writeMemoryArray2022() +{ + QString output; + QXmlStreamWriter xmlStreamWriter(&output); + + QSharedPointer memArray(new MemoryArray()); + QSharedPointer dim(new MemoryArray::Dimension({ QString("8"), QString("i") })); + memArray->getDimensions()->append(dim); + memArray->setStride("16"); + testField_->setMemoryArray(memArray); + + QString expectedOutput( + "" + "testField" + "" + "8" + "16" + "" + "Baldur's" + "Gate" + "" + ); + + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std22); QCOMPARE(output, expectedOutput); } @@ -224,8 +253,7 @@ void tst_FieldWriter::writeResets() "" ); - FieldWriter fieldWriter; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); } @@ -248,8 +276,7 @@ void tst_FieldWriter::writeTypeIdentifier() "" ); - FieldWriter fieldWriter; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); } @@ -272,8 +299,7 @@ void tst_FieldWriter::writeVolatile() "" ); - FieldWriter fieldWriter; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); } @@ -296,8 +322,7 @@ void tst_FieldWriter::writeAccess() "" ); - FieldWriter fieldWriter; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); } @@ -326,8 +351,7 @@ void tst_FieldWriter::writeEnumeratedValues() "" ); - FieldWriter fieldWriter; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); } @@ -350,8 +374,7 @@ void tst_FieldWriter::writeModifiedWriteValue() "" ); - FieldWriter fieldWriter; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); output.clear(); @@ -366,7 +389,7 @@ void tst_FieldWriter::writeModifiedWriteValue() "" ; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); } @@ -394,8 +417,7 @@ void tst_FieldWriter::writeWriteValueConstraint() "" ); - FieldWriter fieldWriter; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); output.clear(); @@ -412,7 +434,7 @@ void tst_FieldWriter::writeWriteValueConstraint() "" ; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); output.clear(); @@ -431,7 +453,7 @@ void tst_FieldWriter::writeWriteValueConstraint() "" ; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); } @@ -454,8 +476,7 @@ void tst_FieldWriter::writeReadAction() "" ); - FieldWriter fieldWriter; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); output.clear(); @@ -472,7 +493,7 @@ void tst_FieldWriter::writeReadAction() "" ; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); } @@ -496,8 +517,7 @@ void tst_FieldWriter::writeTestable() "" ); - FieldWriter fieldWriter; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); output.clear(); @@ -514,7 +534,7 @@ void tst_FieldWriter::writeTestable() "" ; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); } @@ -537,8 +557,7 @@ void tst_FieldWriter::writeReserved() "" ); - FieldWriter fieldWriter; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); } @@ -571,8 +590,7 @@ void tst_FieldWriter::writeParameters() "" ); - FieldWriter fieldWriter; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); } @@ -604,8 +622,7 @@ void tst_FieldWriter::writeVendorExtensions() "" ); - FieldWriter fieldWriter; - fieldWriter.writeField(xmlStreamWriter, testField_); + FieldWriter::writeField(xmlStreamWriter, testField_, Document::Revision::Std14); QCOMPARE(output, expectedOutput); } diff --git a/tests/IPXACTmodels/Component/tst_FieldWriter.pro b/tests/IPXACTmodels/Component/tst_FieldWriter.pro index b625fa57f..5a5631e61 100644 --- a/tests/IPXACTmodels/Component/tst_FieldWriter.pro +++ b/tests/IPXACTmodels/Component/tst_FieldWriter.pro @@ -24,7 +24,7 @@ linux-g++ | linux-g++-64 | linux-g++-32 { } win64 | win32 { - LIBS += -L../../../x64/executable \ + LIBS += -L../../../executable \ -lIPXACTmodelsd } diff --git a/tests/IPXACTmodels/Component/tst_MemoryArrayValidator.cpp b/tests/IPXACTmodels/Component/tst_MemoryArrayValidator.cpp index 873244a8f..41109873f 100644 --- a/tests/IPXACTmodels/Component/tst_MemoryArrayValidator.cpp +++ b/tests/IPXACTmodels/Component/tst_MemoryArrayValidator.cpp @@ -9,7 +9,7 @@ // Unit test for class MemoryArrayValidator. //----------------------------------------------------------------------------- -#include +#include #include #include @@ -25,7 +25,18 @@ class tst_MemoryArrayValidator : public QObject private slots: + void init(); + void cleanup(); + void testArrayHasDimension(); + void testDimensionAndStrideValue(); + +private: + QSharedPointer memArray_; + QList errorList_; + + QSharedPointer expressionParser_; + QSharedPointer validator_; }; //----------------------------------------------------------------------------- @@ -36,39 +47,70 @@ tst_MemoryArrayValidator::tst_MemoryArrayValidator() } +//----------------------------------------------------------------------------- +// Function: tst_MemoryArrayValidator::init() +//----------------------------------------------------------------------------- +void tst_MemoryArrayValidator::init() +{ + memArray_ = QSharedPointer(new MemoryArray()); + expressionParser_ = QSharedPointer(new SystemVerilogExpressionParser()); + validator_ = QSharedPointer(new MemoryArrayValidator(expressionParser_)); +} + +//----------------------------------------------------------------------------- +// Function: tst_MemoryArrayValidator::cleanup() +//----------------------------------------------------------------------------- +void tst_MemoryArrayValidator::cleanup() +{ + memArray_.clear(); + errorList_.clear(); +} + //----------------------------------------------------------------------------- // Function: tst_MemoryArrayValidator::testArrayHasDimension() //----------------------------------------------------------------------------- void tst_MemoryArrayValidator::testArrayHasDimension() { - QSharedPointer memoryArray(new MemoryArray()); - - QList errorList; - MemoryArrayValidator::findErrorsInMemoryArray(errorList, memoryArray, "test"); + validator_->findErrorsIn(errorList_, memArray_, "test"); - QCOMPARE(errorList.size(), 1); - QVERIFY(!MemoryArrayValidator::validateMemoryArray(memoryArray)); + QCOMPARE(errorList_.size(), 1); + QVERIFY(!validator_->validate(memArray_)); - errorList.clear(); + errorList_.clear(); - memoryArray->setStride("16"); - - MemoryArrayValidator::findErrorsInMemoryArray(errorList, memoryArray, "test"); + QSharedPointer dim(new MemoryArray::Dimension); + dim->value_ = QString("8"); - QCOMPARE(errorList.size(), 1); - QVERIFY(!MemoryArrayValidator::validateMemoryArray(memoryArray)); + memArray_->getDimensions()->append(dim); - errorList.clear(); + validator_->findErrorsIn(errorList_, memArray_, "test"); + + QCOMPARE(errorList_.size(), 0); + QVERIFY(validator_->validate(memArray_)); +} +//----------------------------------------------------------------------------- +// Function: tst_MemoryArrayValidator::testDimensionAndStrideValue() +//----------------------------------------------------------------------------- +void tst_MemoryArrayValidator::testDimensionAndStrideValue() +{ QSharedPointer dim(new MemoryArray::Dimension); - dim->dimension_ = QString("8"); + dim->value_ = QString("invalidValue"); + + memArray_->getDimensions()->append(dim); + memArray_->setStride("invalid"); + + validator_->findErrorsIn(errorList_, memArray_, "test"); - memoryArray->getDimensions()->append(dim); + QCOMPARE(errorList_.size(), 2); + QVERIFY(!validator_->validate(memArray_)); - MemoryArrayValidator::findErrorsInMemoryArray(errorList, memoryArray, "test"); + errorList_.clear(); + dim->value_ = QString("16"); + memArray_->setStride("8"); - QCOMPARE(errorList.size(), 0); - QVERIFY(MemoryArrayValidator::validateMemoryArray(memoryArray)); + QCOMPARE(errorList_.size(), 0); + QVERIFY(validator_->validate(memArray_)); } QTEST_APPLESS_MAIN(tst_MemoryArrayValidator) diff --git a/tests/IPXACTmodels/Component/tst_MemoryArrayValidator.pro b/tests/IPXACTmodels/Component/tst_MemoryArrayValidator.pro index c21a70caa..dceb9e4dc 100644 --- a/tests/IPXACTmodels/Component/tst_MemoryArrayValidator.pro +++ b/tests/IPXACTmodels/Component/tst_MemoryArrayValidator.pro @@ -20,12 +20,14 @@ CONFIG += c++11 testcase console linux-g++ | linux-g++-64 | linux-g++-32 { LIBS += -L../../../executable \ - -lIPXACTmodels + -lIPXACTmodels \ + -lKactusAPI } win64 | win32 { LIBS += -L../../../executable \ - -lIPXACTmodelsd + -lIPXACTmodelsd \ + -lKactusAPId } INCLUDEPATH += $$DESTDIR