Contur 2
Educational OS kernel simulator
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,
28 R1 = 1,
29 R2 = 2,
30 R3 = 3,
31 R4 = 4,
32 R5 = 5,
33 R6 = 6,
34 R7 = 7,
35 R8 = 8,
36 R9 = 9,
37 R10 = 10,
38 R11 = 11,
39 R12 = 12,
40 R13 = 13,
43 };
44
50 {
51 public:
54
57
58 // Non-copyable
59 RegisterFile(const RegisterFile &) = delete;
61
62 // Movable
65
67 RegisterFile &operator=(RegisterFile &&) noexcept;
68
70 [[nodiscard]] RegisterValue get(Register reg) const noexcept;
71
74 [[nodiscard]] RegisterValue get(std::uint8_t index) const noexcept;
75
77 void set(Register reg, RegisterValue value) noexcept;
78
81 void set(std::uint8_t index, RegisterValue value) noexcept;
82
84 [[nodiscard]] RegisterValue pc() const noexcept;
85
87 void setPc(RegisterValue value) noexcept;
88
90 [[nodiscard]] RegisterValue sp() const noexcept;
91
93 void setSp(RegisterValue value) noexcept;
94
96 void reset() noexcept;
97
100 [[nodiscard]] std::array<RegisterValue, REGISTER_COUNT> snapshot() const noexcept;
101
103 void restore(const std::array<RegisterValue, REGISTER_COUNT> &values) noexcept;
104
106 [[nodiscard]] std::string dump() const;
107
109 friend std::ostream &operator<<(std::ostream &os, const RegisterFile &rf);
110
111 private:
112 struct Impl;
113 std::unique_ptr<Impl> impl_;
114 };
115
117 [[nodiscard]] constexpr std::string_view registerName(Register reg) noexcept
118 {
119 switch (reg)
120 {
121 case Register::R0:
122 return "R0";
123 case Register::R1:
124 return "R1";
125 case Register::R2:
126 return "R2";
127 case Register::R3:
128 return "R3";
129 case Register::R4:
130 return "R4";
131 case Register::R5:
132 return "R5";
133 case Register::R6:
134 return "R6";
135 case Register::R7:
136 return "R7";
137 case Register::R8:
138 return "R8";
139 case Register::R9:
140 return "R9";
141 case Register::R10:
142 return "R10";
143 case Register::R11:
144 return "R11";
145 case Register::R12:
146 return "R12";
147 case Register::R13:
148 return "R13";
150 return "PC";
152 return "SP";
153 }
154 return "??";
155 }
156
157} // 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.
RegisterFile()
Constructs register file with all registers initialized to zero.
RegisterValue pc() const noexcept
Convenience accessor for the Program Counter.
RegisterFile(RegisterFile &&) noexcept
Move-constructs register file state.
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.
~RegisterFile()
Destroys register file.
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...