Retrieving AVR8 target registers and including them in the TargetDescriptor

This commit is contained in:
Nav
2021-08-07 17:15:48 +01:00
parent fd719f1cda
commit d709c8aac9
8 changed files with 205 additions and 12 deletions

View File

@@ -17,6 +17,7 @@ using Bloom::Targets::TargetDescription::MemorySegment;
using Bloom::Targets::TargetDescription::MemorySegmentType;
using Bloom::Targets::TargetDescription::Register;
using Bloom::Targets::TargetVariant;
using Bloom::Targets::TargetRegisterDescriptor;
TargetDescriptionFile::TargetDescriptionFile(
const TargetSignature& targetSignature,
@@ -93,6 +94,7 @@ void TargetDescriptionFile::init(const QDomDocument& xml) {
this->loadDebugPhysicalInterfaces();
this->loadPadDescriptors();
this->loadTargetVariants();
this->loadTargetRegisterDescriptors();
}
QJsonObject TargetDescriptionFile::getTargetDescriptionMapping() {
@@ -460,6 +462,34 @@ void TargetDescriptionFile::loadTargetVariants() {
}
}
void TargetDescriptionFile::loadTargetRegisterDescriptors() {
auto& modulesByName = this->modulesMappedByName;
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;
}
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);
}
}
}
}
std::optional<MemorySegment> TargetDescriptionFile::getFlashMemorySegment() const {
auto& addressMapping = this->addressSpacesMappedById;
@@ -1068,3 +1098,36 @@ void TargetDescriptionFile::loadUpdiTargetParameters(TargetParameters& targetPar
targetParameters.lockbitsSegmentStartAddress = lockbitsMemorySegment->startAddress;
}
}
std::uint32_t TargetDescriptionFile::getRegisterAddressOffsetByModuleName(const std::string& moduleName) const {
if (this->peripheralModulesMappedByName.contains(moduleName)) {
auto& peripheralModule = this->peripheralModulesMappedByName.at(moduleName);
if (peripheralModule.instancesMappedByName.contains(moduleName)) {
auto& moduleInstance = peripheralModule.instancesMappedByName.at(moduleName);
if (moduleInstance.registerGroupsMappedByName.contains(moduleName)) {
auto& registerGroup = moduleInstance.registerGroupsMappedByName.at(moduleName);
if (!registerGroup.moduleName.has_value() || registerGroup.moduleName.value() == moduleName) {
return registerGroup.offset.value_or(0);
}
}
/*
* If we get here, that means we couldn't find the right register group by module name. This will happen
* if the register group name doesn't match the module name attribute ("name-in-module") against the
* register group node, in the TDF.
*
* As a final attempt, we'll brute force search all register groups in the module instance.
*/
for (const auto& [registerGroupName, registerGroup] : moduleInstance.registerGroupsMappedByName) {
if (registerGroup.moduleName.has_value() && registerGroup.moduleName.value() == moduleName) {
return registerGroup.offset.value_or(0);
}
}
}
}
return 0;
}