2023-11-23 16:32:53 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
2024-07-23 21:14:22 +01:00
|
|
|
#include "src/DebugToolDrivers/Protocols/RiscVDebugSpec/RiscVGeneric.hpp"
|
2023-11-23 16:32:53 +00:00
|
|
|
|
2024-07-23 21:14:22 +01: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,
|
|
|
|
|
};
|
|
|
|
|
|
2023-11-23 23:31:13 +00:00
|
|
|
RegisterNumber registerNumber;
|
2023-11-23 16:32:53 +00:00
|
|
|
bool write:1 = false;
|
|
|
|
|
bool transfer:1 = false;
|
|
|
|
|
bool postExecute:1 = false;
|
|
|
|
|
bool postIncrement:1 = false;
|
|
|
|
|
RegisterSize size:3 = RegisterSize::SIZE_32;
|
|
|
|
|
|
|
|
|
|
RegisterAccessControlField(
|
2023-11-23 23:31:13 +00:00
|
|
|
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)
|
2023-11-23 23:31:13 +00:00
|
|
|
: 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
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|