From aa73b431aef68bf6e54fbc32c430e259129af30c Mon Sep 17 00:00:00 2001 From: Nav Date: Fri, 4 Mar 2022 15:33:31 +0000 Subject: [PATCH] Bit field struct and TDF extraction --- src/Targets/Microchip/AVR/Fuse.hpp | 2 + src/Targets/TargetDescription/BitField.hpp | 13 +++++++ .../TargetDescription/RegisterGroup.hpp | 3 ++ .../TargetDescriptionFile.cpp | 39 +++++++++++++++++++ .../TargetDescriptionFile.hpp | 8 ++++ 5 files changed, 65 insertions(+) create mode 100644 src/Targets/TargetDescription/BitField.hpp diff --git a/src/Targets/Microchip/AVR/Fuse.hpp b/src/Targets/Microchip/AVR/Fuse.hpp index b2ef56fd..83ebdf44 100644 --- a/src/Targets/Microchip/AVR/Fuse.hpp +++ b/src/Targets/Microchip/AVR/Fuse.hpp @@ -30,5 +30,7 @@ namespace Bloom::Targets::Microchip::Avr * Fuse bit mask */ std::uint8_t bitMask; + + FuseBitDescriptor(FuseType fuseType, std::uint8_t bitMask): fuseType(fuseType), bitMask(bitMask) {} }; } diff --git a/src/Targets/TargetDescription/BitField.hpp b/src/Targets/TargetDescription/BitField.hpp new file mode 100644 index 00000000..27e4de10 --- /dev/null +++ b/src/Targets/TargetDescription/BitField.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include +#include + +namespace Bloom::Targets::TargetDescription +{ + struct BitField + { + std::string name; + std::uint8_t mask; + }; +} diff --git a/src/Targets/TargetDescription/RegisterGroup.hpp b/src/Targets/TargetDescription/RegisterGroup.hpp index 1fdac665..0a99a3a0 100644 --- a/src/Targets/TargetDescription/RegisterGroup.hpp +++ b/src/Targets/TargetDescription/RegisterGroup.hpp @@ -5,6 +5,8 @@ #include #include +#include "BitField.hpp" + namespace Bloom::Targets::TargetDescription { struct Register @@ -14,6 +16,7 @@ namespace Bloom::Targets::TargetDescription std::uint16_t offset; std::uint16_t size; std::optional readWriteAccess; + std::map bitFieldsMappedByName; }; struct RegisterGroup diff --git a/src/Targets/TargetDescription/TargetDescriptionFile.cpp b/src/Targets/TargetDescription/TargetDescriptionFile.cpp index 34477dd6..71e53766 100644 --- a/src/Targets/TargetDescription/TargetDescriptionFile.cpp +++ b/src/Targets/TargetDescription/TargetDescriptionFile.cpp @@ -238,9 +238,48 @@ namespace Bloom::Targets::TargetDescription throw Exception("Invalid register offset"); } + auto& bitFields = reg.bitFieldsMappedByName; + auto bitFieldNodes = xmlElement.elementsByTagName("bitfield"); + for (int bitFieldIndex = 0; bitFieldIndex < bitFieldNodes.count(); bitFieldIndex++) { + try { + auto bitField = TargetDescriptionFile::generateBitFieldFromXml( + bitFieldNodes.item(bitFieldIndex).toElement() + ); + bitFields.insert(std::pair(bitField.name, bitField)); + + } catch (const Exception& exception) { + Logger::debug("Failed to extract bit field from register target description element - " + + exception.getMessage()); + } + } + return reg; } + BitField TargetDescriptionFile::generateBitFieldFromXml(const QDomElement& xmlElement) { + if (!xmlElement.hasAttribute("name") || !xmlElement.hasAttribute("mask")) { + throw Exception("Missing bit field name/mask attribute"); + } + + auto bitField = BitField(); + bitField.name = xmlElement.attribute("name").toLower().toStdString(); + + auto maskConversion = false; + bitField.mask = static_cast( + xmlElement.attribute("mask").toUShort(&maskConversion, 16) + ); + + if (!maskConversion) { + throw Exception("Failed to convert bit field mask to integer (from hex string)"); + } + + if (bitField.name.empty()) { + throw Exception("Empty bit field name"); + } + + return bitField; + } + void TargetDescriptionFile::loadAddressSpaces() { auto addressSpaceNodes = this->deviceElement.elementsByTagName("address-spaces").item(0).toElement() diff --git a/src/Targets/TargetDescription/TargetDescriptionFile.hpp b/src/Targets/TargetDescription/TargetDescriptionFile.hpp index 4857c789..4824d2cb 100644 --- a/src/Targets/TargetDescription/TargetDescriptionFile.hpp +++ b/src/Targets/TargetDescription/TargetDescriptionFile.hpp @@ -164,6 +164,14 @@ namespace Bloom::Targets::TargetDescription */ static Register generateRegisterFromXml(const QDomElement& xmlElement); + /** + * Consturcts a BitField object from an XML element. + * + * @param xmlElement + * @return + */ + static BitField generateBitFieldFromXml(const QDomElement& xmlElement); + /** * Extracts all address spaces and loads them into this->addressSpacesMappedById. */