Generate target descriptor from TDF

This commit is contained in:
Nav
2024-03-21 15:04:09 +00:00
parent 5d63b629e0
commit 07019fb358
2 changed files with 167 additions and 0 deletions

View File

@@ -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<std::string>& 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
);
}
}

View File

@@ -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<TargetAddressSpaceDescriptorId, TargetAddressSpaceDescriptor> 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<std::string>& description
);
static TargetRegisterDescriptor targetRegisterDescriptorFromRegister(
const Register& reg,
const std::string& addressSpaceKey,
TargetAddressSpaceDescriptorId addressSpaceDescriptorId,
TargetMemoryAddress baseAddress
);
};
}