#pragma once #include #include "src/Targets/RiscV/RiscVGeneric.hpp" namespace Targets::RiscV::DebugModule::Registers { struct RegisterAccessControlField { enum class RegisterSize: std::uint8_t { SIZE_32 = 0x02, SIZE_64 = 0x03, SIZE_128 = 0x04, }; RegisterNumber registerNumber; bool write:1 = false; bool transfer:1 = false; bool postExecute:1 = false; bool postIncrement:1 = false; RegisterSize size:3 = RegisterSize::SIZE_32; RegisterAccessControlField( RegisterNumber registerNumber, bool write, bool transfer, bool postExecute, bool postIncrement, RegisterSize size ) : registerNumber(registerNumber) , write(write) , transfer(transfer) , postExecute(postExecute) , postIncrement(postIncrement) , size(size) {} constexpr explicit RegisterAccessControlField(std::uint32_t controlValue) : registerNumber(static_cast(controlValue & 0xFFFF)) , write(static_cast(controlValue & (0x01 << 16))) , transfer(static_cast(controlValue & (0x01 << 17))) , postExecute(static_cast(controlValue & (0x01 << 18))) , postIncrement(static_cast(controlValue & (0x01 << 19))) , size(static_cast((controlValue >> 20) & 0x07)) {} [[nodiscard]] constexpr std::uint32_t value() const { return std::uint32_t{0} | static_cast(this->registerNumber) | static_cast(this->write) << 16 | static_cast(this->transfer) << 17 | static_cast(this->postExecute) << 18 | static_cast(this->postIncrement) << 19 | static_cast(this->size) << 20 ; } }; }