diff --git a/src/Targets/Microchip/AVR/AVR8/TargetDescription/TargetDescriptionFile.cpp b/src/Targets/Microchip/AVR/AVR8/TargetDescription/TargetDescriptionFile.cpp index 488260ff..78d4ecde 100644 --- a/src/Targets/Microchip/AVR/AVR8/TargetDescription/TargetDescriptionFile.cpp +++ b/src/Targets/Microchip/AVR/AVR8/TargetDescription/TargetDescriptionFile.cpp @@ -150,9 +150,7 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit::TargetDescription Family TargetDescriptionFile::getFamily() const { static const auto targetFamiliesByName = TargetDescriptionFile::getFamilyNameToEnumMapping(); - const auto familyName = this->deviceElement.attributes().namedItem( - "family" - ).nodeValue().toLower().toStdString(); + const auto& familyName = this->getFamilyName(); if (familyName.empty()) { throw Exception("Could not find target family name in target description file."); diff --git a/src/Targets/TargetDescription/TargetDescriptionFile.cpp b/src/Targets/TargetDescription/TargetDescriptionFile.cpp index f81b208b..7d362eb0 100644 --- a/src/Targets/TargetDescription/TargetDescriptionFile.cpp +++ b/src/Targets/TargetDescription/TargetDescriptionFile.cpp @@ -11,8 +11,12 @@ namespace Bloom::Targets::TargetDescription { using namespace Bloom::Exceptions; - std::string TargetDescriptionFile::getTargetName() const { - return this->deviceElement.attributes().namedItem("name").nodeValue().toStdString(); + const std::string& TargetDescriptionFile::getTargetName() const { + return this->targetName; + } + + const std::string& TargetDescriptionFile::getFamilyName() const { + return this->familyName; } void TargetDescriptionFile::init(const QString& xmlFilePath) { @@ -23,32 +27,31 @@ namespace Bloom::Targets::TargetDescription } file.open(QIODevice::ReadOnly); - auto xml = QDomDocument(); - if (!xml.setContent(file.readAll())) { + auto document = QDomDocument(); + if (!document.setContent(file.readAll())) { throw Exception("Failed to parse target description file - please report this error " "to Bloom developers via " + Services::PathService::homeDomainName() + "/report-issue"); } - this->init(xml); + this->init(document); } - void TargetDescriptionFile::init(const QDomDocument& xml) { - this->xml = xml; - - auto device = xml.elementsByTagName("device").item(0).toElement(); + void TargetDescriptionFile::init(const QDomDocument& document) { + const auto device = document.elementsByTagName("device").item(0).toElement(); if (!device.isElement()) { throw TargetDescriptionParsingFailureException("Device element not found."); } - this->deviceElement = device; + this->targetName = device.attributes().namedItem("name").nodeValue().toStdString(); + this->familyName = device.attributes().namedItem("family").nodeValue().toLower().toStdString(); - this->loadAddressSpaces(); - this->loadPropertyGroups(); - this->loadModules(); - this->loadPeripheralModules(); - this->loadVariants(); - this->loadPinouts(); - this->loadInterfaces(); + this->loadAddressSpaces(document); + this->loadPropertyGroups(document); + this->loadModules(document); + this->loadPeripheralModules(document); + this->loadVariants(document); + this->loadPinouts(document); + this->loadInterfaces(document); } AddressSpace TargetDescriptionFile::generateAddressSpaceFromXml(const QDomElement& xmlElement) { @@ -280,9 +283,10 @@ namespace Bloom::Targets::TargetDescription return bitField; } - void TargetDescriptionFile::loadAddressSpaces() { + void TargetDescriptionFile::loadAddressSpaces(const QDomDocument& document) { + const auto deviceElement = document.elementsByTagName("device").item(0).toElement(); - auto addressSpaceNodes = this->deviceElement.elementsByTagName("address-spaces").item(0).toElement() + auto addressSpaceNodes = deviceElement.elementsByTagName("address-spaces").item(0).toElement() .elementsByTagName("address-space"); for (int addressSpaceIndex = 0; addressSpaceIndex < addressSpaceNodes.count(); addressSpaceIndex++) { @@ -301,12 +305,10 @@ namespace Bloom::Targets::TargetDescription } } - void TargetDescriptionFile::loadPropertyGroups() { - if (!this->deviceElement.isElement()) { - throw TargetDescriptionParsingFailureException("Device element not found."); - } + void TargetDescriptionFile::loadPropertyGroups(const QDomDocument& document) { + const auto deviceElement = document.elementsByTagName("device").item(0).toElement(); - auto propertyGroupNodes = this->deviceElement.elementsByTagName("property-groups").item(0).toElement() + auto propertyGroupNodes = deviceElement.elementsByTagName("property-groups").item(0).toElement() .elementsByTagName("property-group"); for (int propertyGroupIndex = 0; propertyGroupIndex < propertyGroupNodes.count(); propertyGroupIndex++) { @@ -335,8 +337,10 @@ namespace Bloom::Targets::TargetDescription } } - void TargetDescriptionFile::loadModules() { - auto moduleNodes = this->xml.elementsByTagName("modules").item(0).toElement() + void TargetDescriptionFile::loadModules(const QDomDocument& document) { + const auto deviceElement = document.elementsByTagName("device").item(0).toElement(); + + auto moduleNodes = document.elementsByTagName("modules").item(0).toElement() .elementsByTagName("module"); for (int moduleIndex = 0; moduleIndex < moduleNodes.count(); moduleIndex++) { @@ -358,8 +362,10 @@ namespace Bloom::Targets::TargetDescription } } - void TargetDescriptionFile::loadPeripheralModules() { - auto moduleNodes = this->deviceElement.elementsByTagName("peripherals").item(0).toElement() + void TargetDescriptionFile::loadPeripheralModules(const QDomDocument& document) { + const auto deviceElement = document.elementsByTagName("device").item(0).toElement(); + + auto moduleNodes = deviceElement.elementsByTagName("peripherals").item(0).toElement() .elementsByTagName("module"); for (int moduleIndex = 0; moduleIndex < moduleNodes.count(); moduleIndex++) { @@ -432,8 +438,10 @@ namespace Bloom::Targets::TargetDescription } } - void TargetDescriptionFile::loadVariants() { - auto variantNodes = this->xml.elementsByTagName("variants").item(0).toElement() + void TargetDescriptionFile::loadVariants(const QDomDocument& document) { + const auto deviceElement = document.elementsByTagName("device").item(0).toElement(); + + auto variantNodes = document.elementsByTagName("variants").item(0).toElement() .elementsByTagName("variant"); for (int variantIndex = 0; variantIndex < variantNodes.count(); variantIndex++) { @@ -471,8 +479,10 @@ namespace Bloom::Targets::TargetDescription } } - void TargetDescriptionFile::loadPinouts() { - auto pinoutNodes = this->xml.elementsByTagName("pinouts").item(0).toElement() + void TargetDescriptionFile::loadPinouts(const QDomDocument& document) { + const auto deviceElement = document.elementsByTagName("device").item(0).toElement(); + + auto pinoutNodes = document.elementsByTagName("pinouts").item(0).toElement() .elementsByTagName("pinout"); for (int pinoutIndex = 0; pinoutIndex < pinoutNodes.count(); pinoutIndex++) { @@ -524,8 +534,10 @@ namespace Bloom::Targets::TargetDescription } } - void TargetDescriptionFile::loadInterfaces() { - auto interfaceNodes = this->deviceElement.elementsByTagName("interfaces").item(0).toElement() + void TargetDescriptionFile::loadInterfaces(const QDomDocument& document) { + const auto deviceElement = document.elementsByTagName("device").item(0).toElement(); + + auto interfaceNodes = deviceElement.elementsByTagName("interfaces").item(0).toElement() .elementsByTagName("interface"); for (int interfaceIndex = 0; interfaceIndex < interfaceNodes.count(); interfaceIndex++) { diff --git a/src/Targets/TargetDescription/TargetDescriptionFile.hpp b/src/Targets/TargetDescription/TargetDescriptionFile.hpp index 4824d2cb..2f77544b 100644 --- a/src/Targets/TargetDescription/TargetDescriptionFile.hpp +++ b/src/Targets/TargetDescription/TargetDescriptionFile.hpp @@ -56,11 +56,18 @@ namespace Bloom::Targets::TargetDescription } /** - * Extracts target name. + * Returns the target name extracted from the TDF. * * @return */ - [[nodiscard]] std::string getTargetName() const; + [[nodiscard]] const std::string& getTargetName() const; + + /** + * Returns the target family name extracted from the TDF. + * + * @return + */ + [[nodiscard]] const std::string& getFamilyName() const; /** * Returns a mapping of all property groups, with the property group name being the key. @@ -108,8 +115,8 @@ namespace Bloom::Targets::TargetDescription } protected: - QDomDocument xml; - QDomElement deviceElement; + std::string targetName; + std::string familyName; std::map addressSpacesMappedById; std::map propertyGroupsMappedByName; @@ -129,7 +136,7 @@ namespace Bloom::Targets::TargetDescription TargetDescriptionFile& operator = (const TargetDescriptionFile& other) = default; TargetDescriptionFile& operator = (TargetDescriptionFile&& other) = default; - virtual void init(const QDomDocument& xml); + virtual void init(const QDomDocument& document); void init(const QString& xmlFilePath); /** @@ -175,36 +182,36 @@ namespace Bloom::Targets::TargetDescription /** * Extracts all address spaces and loads them into this->addressSpacesMappedById. */ - void loadAddressSpaces(); + void loadAddressSpaces(const QDomDocument& document); /** * Extracts all property groups and loads them into this->propertyGroupsMappedByName. */ - void loadPropertyGroups(); + void loadPropertyGroups(const QDomDocument& document); /** * Extracts all modules and loads them into this->modulesMappedByName. */ - void loadModules(); + void loadModules(const QDomDocument& document); /** * Extracts all peripheral modules and loads them into this->peripheralModulesMappedByName. */ - void loadPeripheralModules(); + void loadPeripheralModules(const QDomDocument& document); /** * Extracts all variants and loads them into this->variants. */ - void loadVariants(); + void loadVariants(const QDomDocument& document); /** * Extracts all pinouts and loads them into this->pinoutsMappedByName. */ - void loadPinouts(); + void loadPinouts(const QDomDocument& document); /** * Extracts all interfaces and loads them into this->interfacesByName */ - void loadInterfaces(); + void loadInterfaces(const QDomDocument& document); }; }