contur2
Loading...
Searching...
No Matches
register_file.h
Go to the documentation of this file.
1
7
8#pragma once
9
10#include <array>
11#include <cstdint>
12#include <iosfwd>
13#include <memory>
14#include <string>
15
16#include "contur/core/types.h"
17
18namespace contur {
19
25 enum class Register : std::uint8_t
26 {
27 R0 = 0,
43 };
44
50 {
51 public:
54
55 // Non-copyable
56 RegisterFile(const RegisterFile &) = delete;
58
59 // Movable
61 RegisterFile &operator=(RegisterFile &&) noexcept;
62
64 [[nodiscard]] RegisterValue get(Register reg) const noexcept;
65
68 [[nodiscard]] RegisterValue get(std::uint8_t index) const noexcept;
69
71 void set(Register reg, RegisterValue value) noexcept;
72
75 void set(std::uint8_t index, RegisterValue value) noexcept;
76
78 [[nodiscard]] RegisterValue pc() const noexcept;
79
81 void setPc(RegisterValue value) noexcept;
82
84 [[nodiscard]] RegisterValue sp() const noexcept;
85
87 void setSp(RegisterValue value) noexcept;
88
90 void reset() noexcept;
91
94 [[nodiscard]] std::array<RegisterValue, REGISTER_COUNT> snapshot() const noexcept;
95
97 void restore(const std::array<RegisterValue, REGISTER_COUNT> &values) noexcept;
98
100 [[nodiscard]] std::string dump() const;
101
103 friend std::ostream &operator<<(std::ostream &os, const RegisterFile &rf);
104
105 private:
106 struct Impl;
107 std::unique_ptr<Impl> impl_;
108 };
109
111 [[nodiscard]] constexpr std::string_view registerName(Register reg) noexcept
112 {
113 switch (reg)
114 {
115 case Register::R0:
116 return "R0";
117 case Register::R1:
118 return "R1";
119 case Register::R2:
120 return "R2";
121 case Register::R3:
122 return "R3";
123 case Register::R4:
124 return "R4";
125 case Register::R5:
126 return "R5";
127 case Register::R6:
128 return "R6";
129 case Register::R7:
130 return "R7";
131 case Register::R8:
132 return "R8";
133 case Register::R9:
134 return "R9";
135 case Register::R10:
136 return "R10";
137 case Register::R11:
138 return "R11";
139 case Register::R12:
140 return "R12";
141 case Register::R13:
142 return "R13";
144 return "PC";
146 return "SP";
147 }
148 return "??";
149 }
150
151} // namespace contur
void restore(const std::array< RegisterValue, REGISTER_COUNT > &values) noexcept
Restores register values from a previously taken snapshot.
RegisterFile & operator=(const RegisterFile &)=delete
void setPc(RegisterValue value) noexcept
Sets the Program Counter.
void setSp(RegisterValue value) noexcept
Sets the Stack Pointer.
RegisterValue sp() const noexcept
Convenience accessor for the Stack Pointer.
RegisterValue pc() const noexcept
Convenience accessor for the Program Counter.
RegisterFile(RegisterFile &&) noexcept
std::array< RegisterValue, REGISTER_COUNT > snapshot() const noexcept
Returns a snapshot of all register values as an array. Used for context switching (save/restore).
RegisterValue get(Register reg) const noexcept
Gets the value of the specified register.
std::unique_ptr< Impl > impl_
void set(Register reg, RegisterValue value) noexcept
Sets the value of the specified register.
void reset() noexcept
Resets all registers to zero.
std::string dump() const
Returns a formatted string showing all register values.
RegisterFile(const RegisterFile &)=delete
Definition block.h:15
Register
CPU register identifiers.
constexpr std::string_view registerName(Register reg) noexcept
Returns the human-readable name of a register (e.g., "R0", "PC", "SP").
constexpr std::uint8_t REGISTER_COUNT
Maximum number of CPU registers.
Definition types.h:58
std::int32_t RegisterValue
Value stored in a CPU register.
Definition types.h:21
Common type aliases, sentinel constants, and forward declarations used throughout the Contur 2 kernel...