Files
BloomPatched/src/DebugToolDrivers/Protocols/RiscVDebugSpec/DebugModule/Registers/RegisterAccessControlField.hpp

62 lines
2.0 KiB
C++
Raw Normal View History

2023-11-23 16:32:53 +00:00
#pragma once
#include <cstdint>
#include "src/DebugToolDrivers/Protocols/RiscVDebugSpec/RiscVGeneric.hpp"
2023-11-23 16:32:53 +00:00
namespace DebugToolDrivers::Protocols::RiscVDebugSpec::DebugModule::Registers
2023-11-23 16:32:53 +00:00
{
struct RegisterAccessControlField
{
enum class RegisterSize: std::uint8_t
{
SIZE_32 = 0x02,
SIZE_64 = 0x03,
SIZE_128 = 0x04,
};
RegisterNumber registerNumber;
2024-09-04 00:13:55 +01:00
bool write:1;
bool transfer:1;
bool postExecute:1;
bool postIncrement:1;
RegisterSize size:3;
2023-11-23 16:32:53 +00:00
RegisterAccessControlField(
RegisterNumber registerNumber,
2023-11-23 16:32:53 +00:00
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<RegisterNumber>(controlValue & 0xFFFF))
2023-11-23 16:32:53 +00:00
, write(static_cast<bool>(controlValue & (0x01 << 16)))
, transfer(static_cast<bool>(controlValue & (0x01 << 17)))
, postExecute(static_cast<bool>(controlValue & (0x01 << 18)))
, postIncrement(static_cast<bool>(controlValue & (0x01 << 19)))
, size(static_cast<RegisterSize>((controlValue >> 20) & 0x07))
{}
2024-03-29 16:31:14 +00:00
[[nodiscard]] constexpr std::uint32_t value() const {
2023-11-23 16:32:53 +00:00
return std::uint32_t{0}
| static_cast<std::uint32_t>(this->registerNumber)
| static_cast<std::uint32_t>(this->write) << 16
| static_cast<std::uint32_t>(this->transfer) << 17
| static_cast<std::uint32_t>(this->postExecute) << 18
| static_cast<std::uint32_t>(this->postIncrement) << 19
| static_cast<std::uint32_t>(this->size) << 20
;
}
};
}