From a52d2271b325966d6be724718f8398fa71110e56 Mon Sep 17 00:00:00 2001 From: Nav Date: Fri, 27 Aug 2021 23:51:21 +0100 Subject: [PATCH] Corrected register group extraction from AVR8 TDFs --- .../TargetDescriptionFile.cpp | 45 +++++++++++-------- .../TargetDescriptionFile.cpp | 11 +++-- .../TargetDescriptionFile.hpp | 1 + 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/Targets/Microchip/AVR/AVR8/TargetDescription/TargetDescriptionFile.cpp b/src/Targets/Microchip/AVR/AVR8/TargetDescription/TargetDescriptionFile.cpp index fdd8a664..aa5696e2 100644 --- a/src/Targets/Microchip/AVR/AVR8/TargetDescription/TargetDescriptionFile.cpp +++ b/src/Targets/Microchip/AVR/AVR8/TargetDescription/TargetDescriptionFile.cpp @@ -1,11 +1,12 @@ +#include "TargetDescriptionFile.hpp" + #include #include -#include "TargetDescriptionFile.hpp" +#include "src/Helpers/Paths.hpp" #include "src/Exceptions/Exception.hpp" #include "src/Targets/TargetDescription/Exceptions/TargetDescriptionParsingFailureException.hpp" #include "src/Logger/Logger.hpp" -#include "src/Helpers/Paths.hpp" using namespace Bloom::Targets::Microchip::Avr::Avr8Bit::TargetDescription; using namespace Bloom::Targets::Microchip::Avr::Avr8Bit; @@ -467,25 +468,31 @@ void TargetDescriptionFile::loadTargetRegisterDescriptors() { auto& peripheralModulesByName = this->peripheralModulesMappedByName; for (const auto& [moduleName, module] : modulesByName) { - auto moduleRegisterAddressOffset = this->getRegisterAddressOffsetByModuleName(moduleName); for (const auto& [registerGroupName, registerGroup] : module.registerGroupsMappedByName) { - for (const auto& [moduleRegisterName, moduleRegister] : registerGroup.registersMappedByName) { - if (moduleRegister.size < 1) { - continue; + if (this->peripheralRegisterGroupsMappedByModuleRegisterGroupName.contains(registerGroupName)) { + auto& peripheralRegisterGroups = this->peripheralRegisterGroupsMappedByModuleRegisterGroupName + .at(registerGroupName); + for (const auto& peripheralRegisterGroup : peripheralRegisterGroups) { + for (const auto& [moduleRegisterName, moduleRegister] : registerGroup.registersMappedByName) { + if (moduleRegister.size < 1) { + continue; + } + + auto registerDescriptor = TargetRegisterDescriptor(); + registerDescriptor.type = TargetRegisterType::OTHER; + registerDescriptor.name = moduleRegisterName; + registerDescriptor.groupName = peripheralRegisterGroup.name; + registerDescriptor.size = moduleRegister.size; + registerDescriptor.startAddress = moduleRegister.offset + + peripheralRegisterGroup.offset.value_or(0); + + if (moduleRegister.caption.has_value() && !moduleRegister.caption->empty()) { + registerDescriptor.description = moduleRegister.caption; + } + + this->targetRegisterDescriptorsByType[registerDescriptor.type].emplace_back(registerDescriptor); + } } - - auto registerDescriptor = TargetRegisterDescriptor(); - registerDescriptor.type = TargetRegisterType::OTHER; - registerDescriptor.name = moduleRegisterName; - registerDescriptor.groupName = registerGroupName; - registerDescriptor.size = moduleRegister.size; - registerDescriptor.startAddress = moduleRegister.offset + moduleRegisterAddressOffset; - - if (moduleRegister.caption.has_value() && !moduleRegister.caption->empty()) { - registerDescriptor.description = moduleRegister.caption; - } - - this->targetRegisterDescriptorsByType[registerDescriptor.type].emplace_back(registerDescriptor); } } } diff --git a/src/Targets/TargetDescription/TargetDescriptionFile.cpp b/src/Targets/TargetDescription/TargetDescriptionFile.cpp index f0622c45..bfe7498f 100644 --- a/src/Targets/TargetDescription/TargetDescriptionFile.cpp +++ b/src/Targets/TargetDescription/TargetDescriptionFile.cpp @@ -169,9 +169,9 @@ RegisterGroup TargetDescriptionFile::generateRegisterGroupFromXml(const QDomElem throw Exception("Empty register group name"); } - registerGroup.moduleName = xmlElement.hasAttribute("name-in-module") - ? xmlElement.attribute("name-in-module").toLower().toStdString() - : registerGroup.name; + if (xmlElement.hasAttribute("name-in-module")) { + registerGroup.moduleName = xmlElement.attribute("name-in-module").toLower().toStdString(); + } if (xmlElement.hasAttribute("offset")) { registerGroup.offset = xmlElement.attribute("offset").toInt(nullptr, 16); @@ -315,6 +315,11 @@ void TargetDescriptionFile::loadPeripheralModules() { ); module.registerGroupsMappedByName.insert(std::pair(registerGroup.name, registerGroup)); + + if (registerGroup.moduleName.has_value()) { + this->peripheralRegisterGroupsMappedByModuleRegisterGroupName[registerGroup.moduleName.value()] + .emplace_back(registerGroup); + } } auto instanceNodes = moduleElement.elementsByTagName("instance"); diff --git a/src/Targets/TargetDescription/TargetDescriptionFile.hpp b/src/Targets/TargetDescription/TargetDescriptionFile.hpp index 707caa54..f4afcd38 100644 --- a/src/Targets/TargetDescription/TargetDescriptionFile.hpp +++ b/src/Targets/TargetDescription/TargetDescriptionFile.hpp @@ -43,6 +43,7 @@ namespace Bloom::Targets::TargetDescription std::map propertyGroupsMappedByName; std::map modulesMappedByName; std::map peripheralModulesMappedByName; + std::map> peripheralRegisterGroupsMappedByModuleRegisterGroupName; std::vector variants; std::map pinoutsMappedByName; std::map interfacesByName;