#pragma once #include #include #include #include #include #include "BitField.hpp" #include "src/Targets/TargetRegisterDescriptor.hpp" #include "Exceptions/InvalidTargetDescriptionDataException.hpp" namespace Targets::TargetDescription { struct Register { std::string key; std::string name; std::optional description; std::uint32_t offset; std::uint16_t size; std::optional initialValue; std::optional access; std::optional alternative; std::map> bitFieldsByKey; Register( const std::string& key, const std::string& name, const std::optional& description, std::uint32_t offset, std::uint16_t size, const std::optional& initialValue, const std::optional& access, const std::optional& alternative, const std::map>& bitFieldsByKey ) : key(key) , name(name) , description(description) , offset(offset) , size(size) , initialValue(initialValue) , access(access) , alternative(alternative) , bitFieldsByKey(bitFieldsByKey) {} std::optional> tryGetBitField(std::string_view key) const { const auto bitFieldIt = this->bitFieldsByKey.find(key); if (bitFieldIt == this->bitFieldsByKey.end()) { return std::nullopt; } return std::cref(bitFieldIt->second); } const BitField& getBitField(std::string_view key) const { const auto bitField = this->tryGetBitField(key); if (!bitField.has_value()) { throw Exceptions::InvalidTargetDescriptionDataException{ "Failed to get bit field \"" + std::string{key} + "\" from register in TDF - bit field not found" }; } return bitField->get(); } }; }