From ce7e0147db2e7c15bf6c87eb7d5063780bdf3201 Mon Sep 17 00:00:00 2001 From: Nav Date: Thu, 3 Jun 2021 00:49:39 +0100 Subject: [PATCH] Refactoring AVR8 target variant & pin/pad loading --- src/Targets/Microchip/AVR/AVR8/Avr8.cpp | 121 +++++++++++------------- src/Targets/Microchip/AVR/AVR8/Avr8.hpp | 11 +-- 2 files changed, 56 insertions(+), 76 deletions(-) diff --git a/src/Targets/Microchip/AVR/AVR8/Avr8.cpp b/src/Targets/Microchip/AVR/AVR8/Avr8.cpp index cb12d0d0..0cdb46ad 100644 --- a/src/Targets/Microchip/AVR/AVR8/Avr8.cpp +++ b/src/Targets/Microchip/AVR/AVR8/Avr8.cpp @@ -62,8 +62,6 @@ void Avr8::postActivationConfigure() { void Avr8::postPromotionConfigure() { this->avr8Interface->setTargetParameters(this->getTargetParameters()); - this->loadPadDescriptors(); - this->loadTargetVariants(); } void Avr8::loadTargetDescriptionFile() { @@ -76,6 +74,9 @@ void Avr8::loadTargetDescriptionFile() { this->targetDescriptionFile = targetDescriptionFile; this->name = targetDescriptionFile.getTargetName(); this->family = targetDescriptionFile.getFamily(); + + this->loadPadDescriptors(); + this->loadTargetVariants(); } void Avr8::loadPadDescriptors() { @@ -202,6 +203,7 @@ void Avr8::loadPadDescriptors() { } } + // TODO: Move this into getTargetParameters() if (!portAddresses.empty()) { targetParameters.ioPortAddressRangeStart = *std::min_element(portAddresses.begin(), portAddresses.end()); targetParameters.ioPortAddressRangeEnd = *std::max_element(portAddresses.begin(), portAddresses.end()); @@ -209,16 +211,61 @@ void Avr8::loadPadDescriptors() { } void Avr8::loadTargetVariants() { - auto variants = this->generateVariantsFromTdf(); + auto tdVariants = this->targetDescriptionFile->getVariants(); + auto tdPinoutsByName = this->targetDescriptionFile->getPinoutsMappedByName(); + auto& modules = this->targetDescriptionFile->getModulesMappedByName(); - for (auto& targetVariant : variants) { - for (auto& [pinNumber, pinDescriptor] : targetVariant.pinDescriptorsByNumber) { - if (this->padDescriptorsByName.contains(pinDescriptor.padName)) { - auto& pad = this->padDescriptorsByName.at(pinDescriptor.padName); + for (const auto& tdVariant : tdVariants) { + if (tdVariant.disabled) { + continue; + } + + auto targetVariant = TargetVariant(); + targetVariant.id = static_cast(this->targetVariantsById.size()); + targetVariant.name = tdVariant.orderCode; + targetVariant.packageName = tdVariant.package; + + if (tdVariant.package.find("QFP") == 0 || tdVariant.package.find("TQFP") == 0) { + targetVariant.package = TargetPackage::QFP; + + } else if (tdVariant.package.find("PDIP") == 0 || tdVariant.package.find("DIP") == 0) { + targetVariant.package = TargetPackage::DIP; + + } else if (tdVariant.package.find("QFN") == 0 || tdVariant.package.find("VQFN") == 0) { + targetVariant.package = TargetPackage::QFN; + + } else if (tdVariant.package.find("SOIC") == 0) { + targetVariant.package = TargetPackage::SOIC; + } + + if (!tdPinoutsByName.contains(tdVariant.pinoutName)) { + // Missing pinouts in the target description file + continue; + } + + auto tdPinout = tdPinoutsByName.find(tdVariant.pinoutName)->second; + for (const auto& tdPin : tdPinout.pins) { + auto targetPin = TargetPinDescriptor(); + targetPin.name = tdPin.pad; + targetPin.padName = tdPin.pad; + targetPin.number = tdPin.position; + + // TODO: REMOVE THIS: + if (tdPin.pad.find("vcc") == 0 || tdPin.pad.find("avcc") == 0 || tdPin.pad.find("aref") == 0) { + targetPin.type = TargetPinType::VCC; + + } else if (tdPin.pad.find("gnd") == 0) { + targetPin.type = TargetPinType::GND; + } + + if (this->padDescriptorsByName.contains(targetPin.padName)) { + auto& pad = this->padDescriptorsByName.at(targetPin.padName); if (pad.gpioPortSetAddress.has_value() && pad.ddrSetAddress.has_value()) { - pinDescriptor.type = TargetPinType::GPIO; + targetPin.type = TargetPinType::GPIO; } } + + targetVariant.pinDescriptorsByNumber.insert(std::pair(targetPin.number, targetPin)); } this->targetVariantsById.insert(std::pair(targetVariant.id, targetVariant)); @@ -463,64 +510,6 @@ TargetSignature Avr8::getId() { return this->id.value(); } -std::vector Avr8::generateVariantsFromTdf() { - std::vector output; - auto tdVariants = this->targetDescriptionFile->getVariants(); - auto tdPinoutsByName = this->targetDescriptionFile->getPinoutsMappedByName(); - auto& modules = this->targetDescriptionFile->getModulesMappedByName(); - - for (const auto& tdVariant : tdVariants) { - if (tdVariant.disabled) { - continue; - } - - auto targetVariant = TargetVariant(); - targetVariant.id = static_cast(output.size()); - targetVariant.name = tdVariant.orderCode; - targetVariant.packageName = tdVariant.package; - - if (tdVariant.package.find("QFP") == 0 || tdVariant.package.find("TQFP") == 0) { - targetVariant.package = TargetPackage::QFP; - - } else if (tdVariant.package.find("PDIP") == 0 || tdVariant.package.find("DIP") == 0) { - targetVariant.package = TargetPackage::DIP; - - } else if (tdVariant.package.find("QFN") == 0 || tdVariant.package.find("VQFN") == 0) { - targetVariant.package = TargetPackage::QFN; - - } else if (tdVariant.package.find("SOIC") == 0) { - targetVariant.package = TargetPackage::SOIC; - } - - if (!tdPinoutsByName.contains(tdVariant.pinoutName)) { - // Missing pinouts in the target description file - continue; - } - - auto tdPinout = tdPinoutsByName.find(tdVariant.pinoutName)->second; - for (const auto& tdPin : tdPinout.pins) { - auto targetPin = TargetPinDescriptor(); - targetPin.name = tdPin.pad; - targetPin.padName = tdPin.pad; - targetPin.number = tdPin.position; - - // TODO: REMOVE THIS: - if (tdPin.pad.find("vcc") == 0 || tdPin.pad.find("avcc") == 0 || tdPin.pad.find("aref") == 0) { - targetPin.type = TargetPinType::VCC; - - } else if (tdPin.pad.find("gnd") == 0) { - targetPin.type = TargetPinType::GND; - } - - targetVariant.pinDescriptorsByNumber.insert(std::pair(targetPin.number, targetPin)); - } - - output.push_back(targetVariant); - } - - return output; -} - TargetDescriptor Avr8Bit::Avr8::getDescriptor() { auto parameters = this->getTargetParameters(); diff --git a/src/Targets/Microchip/AVR/AVR8/Avr8.hpp b/src/Targets/Microchip/AVR/AVR8/Avr8.hpp index 2e1c957f..c6bee045 100644 --- a/src/Targets/Microchip/AVR/AVR8/Avr8.hpp +++ b/src/Targets/Microchip/AVR/AVR8/Avr8.hpp @@ -52,16 +52,7 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit virtual void loadPadDescriptors(); /** - * Extracts target variant information from the loaded target description file and generates a collection - * of TargetVariant objects. - * - * @return - */ - virtual std::vector generateVariantsFromTdf(); - - /** - * Populates this->targetVariantsById using this->generateVariantsFromTdf() and data from - * this->padDescriptorsByName. + * Loads all variants for the AVR8 target, from the TDF. */ virtual void loadTargetVariants();