From 07019fb3582f929bbf47016a6ce783a49181742d Mon Sep 17 00:00:00 2001 From: Nav Date: Thu, 21 Mar 2024 15:04:09 +0000 Subject: [PATCH] Generate target descriptor from TDF --- .../TargetDescriptionFile.cpp | 144 ++++++++++++++++++ .../TargetDescriptionFile.hpp | 23 +++ 2 files changed, 167 insertions(+) diff --git a/src/Targets/TargetDescription/TargetDescriptionFile.cpp b/src/Targets/TargetDescription/TargetDescriptionFile.cpp index 6fd04568..948d4672 100644 --- a/src/Targets/TargetDescription/TargetDescriptionFile.cpp +++ b/src/Targets/TargetDescription/TargetDescriptionFile.cpp @@ -159,6 +159,64 @@ namespace Targets::TargetDescription return peripheral->get(); } + TargetDescriptor TargetDescriptionFile::targetDescriptor() const { + const auto targetFamily = this->getFamily(); + const auto vendor = this->tryGetDeviceAttribute("vendor"); + + auto output = TargetDescriptor( + this->getDeviceAttribute("name"), + targetFamily, + "", + vendor.has_value() + ? vendor->get() + : targetFamily == TargetFamily::AVR_8 + ? "Microchip" + : "Unknown", + {}, + {}, + {}, + BreakpointResources(std::nullopt, std::nullopt, 0) + ); + + for (const auto& [key, addressSpace] : this->addressSpacesByKey) { + auto descriptor = this->targetAddressSpaceDescriptorFromAddressSpace(addressSpace); + output.addressSpaceDescriptorsByKey.emplace(descriptor.key, std::move(descriptor)); + } + + for (const auto& [key, peripheral] : this->peripheralsByKey) { + const auto& peripheralModule = this->getModule(peripheral.moduleKey); + + auto descriptor = TargetPeripheralDescriptor( + peripheral.key, + peripheral.name, + {} + ); + + for (const auto& [key, registerGroupInstance] : peripheral.registerGroupInstancesByKey) { + const auto& addressSpaceDescriptor = output.getAddressSpaceDescriptor( + registerGroupInstance.addressSpaceKey + ); + descriptor.registerGroupDescriptorsByKey.emplace( + key, + TargetDescriptionFile::targetRegisterGroupDescriptorFromRegisterGroup( + peripheralModule.getRegisterGroup(registerGroupInstance.registerGroupKey), + peripheralModule, + registerGroupInstance.offset, + addressSpaceDescriptor.key, + addressSpaceDescriptor.id, + registerGroupInstance.key, + registerGroupInstance.name, + registerGroupInstance.description + ) + ); + } + + output.peripheralDescriptorsByKey.emplace(descriptor.key, std::move(descriptor)); + } + + return output; + } + std::map< TargetAddressSpaceDescriptorId, TargetAddressSpaceDescriptor @@ -747,4 +805,90 @@ namespace Targets::TargetDescription memorySegment.pageSize ); } + + TargetRegisterGroupDescriptor TargetDescriptionFile::targetRegisterGroupDescriptorFromRegisterGroup( + const RegisterGroup& registerGroup, + const Module& peripheralModule, + TargetMemoryAddress baseAddress, + const std::string& addressSpaceKey, + TargetAddressSpaceDescriptorId addressSpaceDescriptorId, + const std::string& key, + const std::string& name, + const std::optional& description + ) { + auto output = TargetRegisterGroupDescriptor( + key, + name, + addressSpaceKey, + addressSpaceDescriptorId, + description, + {}, + {} + ); + + for (const auto& [key, subgroup] : registerGroup.subgroupsByKey) { + output.subgroupDescriptorsByKey.emplace( + key, + TargetDescriptionFile::targetRegisterGroupDescriptorFromRegisterGroup( + registerGroup, + peripheralModule, + baseAddress + registerGroup.offset.value_or(0), + addressSpaceKey, + addressSpaceDescriptorId, + subgroup.key, + subgroup.name, + std::nullopt + ) + ); + } + + for (const auto& [key, subgroupReference] : registerGroup.subgroupReferencesByKey) { + const auto& registerGroup = peripheralModule.getRegisterGroup(subgroupReference.registerGroupKey); + output.subgroupDescriptorsByKey.emplace( + key, + TargetDescriptionFile::targetRegisterGroupDescriptorFromRegisterGroup( + registerGroup, + peripheralModule, + baseAddress + subgroupReference.offset + registerGroup.offset.value_or(0), + addressSpaceKey, + addressSpaceDescriptorId, + subgroupReference.key, + subgroupReference.name, + subgroupReference.description + ) + ); + } + + for (const auto& [key, reg] : registerGroup.registersByKey) { + output.registerDescriptorsByKey.emplace( + key, + TargetDescriptionFile::targetRegisterDescriptorFromRegister( + reg, + addressSpaceKey, + addressSpaceDescriptorId, + baseAddress + registerGroup.offset.value_or(0) + ) + ); + } + + return output; + } + + TargetRegisterDescriptor TargetDescriptionFile::targetRegisterDescriptorFromRegister( + const Register& reg, + const std::string& addressSpaceKey, + TargetAddressSpaceDescriptorId addressSpaceDescriptorId, + TargetMemoryAddress baseAddress + ) { + return TargetRegisterDescriptor( + reg.key, + reg.name, + addressSpaceKey, + addressSpaceDescriptorId, + baseAddress + reg.offset, + reg.size, + reg.access.value_or(TargetRegisterAccess(true, true)), + reg.description + ); + } } diff --git a/src/Targets/TargetDescription/TargetDescriptionFile.hpp b/src/Targets/TargetDescription/TargetDescriptionFile.hpp index 93ff4ca1..8c0a18c5 100644 --- a/src/Targets/TargetDescription/TargetDescriptionFile.hpp +++ b/src/Targets/TargetDescription/TargetDescriptionFile.hpp @@ -26,8 +26,12 @@ #include "Variant.hpp" #include "src/Targets/TargetFamily.hpp" +#include "src/Targets/TargetDescriptor.hpp" #include "src/Targets/TargetAddressSpaceDescriptor.hpp" #include "src/Targets/TargetMemorySegmentDescriptor.hpp" +#include "src/Targets/TargetPeripheralDescriptor.hpp" +#include "src/Targets/TargetRegisterGroupDescriptor.hpp" +#include "src/Targets/TargetRegisterDescriptor.hpp" #include "src/Targets/TargetPhysicalInterface.hpp" namespace Targets::TargetDescription @@ -105,6 +109,7 @@ namespace Targets::TargetDescription ) const; [[nodiscard]] const Peripheral& getPeripheral(std::string_view key) const; + TargetDescriptor targetDescriptor() const; std::map targetAddressSpaceDescriptorsById() const; protected: @@ -162,5 +167,23 @@ namespace Targets::TargetDescription static TargetMemorySegmentDescriptor targetMemorySegmentDescriptorFromMemorySegment( const MemorySegment& memorySegment ); + + static TargetRegisterGroupDescriptor targetRegisterGroupDescriptorFromRegisterGroup( + const RegisterGroup& registerGroup, + const Module& peripheralModule, + TargetMemoryAddress baseAddress, + const std::string& addressSpaceKey, + TargetAddressSpaceDescriptorId addressSpaceDescriptorId, + const std::string& key, + const std::string& name, + const std::optional& description + ); + + static TargetRegisterDescriptor targetRegisterDescriptorFromRegister( + const Register& reg, + const std::string& addressSpaceKey, + TargetAddressSpaceDescriptorId addressSpaceDescriptorId, + TargetMemoryAddress baseAddress + ); }; }