-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathregistor.cpp
More file actions
76 lines (70 loc) · 1.52 KB
/
registor.cpp
File metadata and controls
76 lines (70 loc) · 1.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "./headers/registor.h"
extern clk_tick sys_clk;
registor::registor(int _RegSize):RegSize(_RegSize)
{
intReg = new int[_RegSize];
for (int i = 0; i<_RegSize; i++)
intReg[i] = 0;
// intReg[0] = 0;
flpReg = new float[_RegSize];
for (int i = 0; i<RegSize; i++)
flpReg[i] = 0.;
}
registor::~registor()
{
if (intReg) delete[] intReg;
if (flpReg) delete[] flpReg;
}
bool registor::get(string name, memCell &ret)
{
int index = stoi(name.substr(1, name.size() - 1));
if (index >= RegSize)
{
err_log(name + ": Reg access out of range");
return false;
}
if (name[0] == 'R')
ret.i = intReg[index];
else if (name[0] == 'F')
ret.f = flpReg[index];
else
{
err_log("Reg name error");
return false;
}
return true;
}
bool registor::set(string name, memCell val)
{
int index = stoi(name.substr(1, name.size() - 1));
if (index >= RegSize)
{
err_log(name + ": Reg access out of range");
return false;
}
if (name[0] == 'R')
{
if (index == 0)
{
err_log("R0 can't be modified");
return false;
}
intReg[index] = val.i;
}
else if (name[0] == 'F')
flpReg[index] = val.f;
else
{
err_log("Reg name error");
return false;
}
return true;
}
void registor::clear()
{
for (int i = 0; i<RegSize; i++)
intReg[i] = 0;
for (int i = 0; i<RegSize; i++)
flpReg[i] = 0;
return;
}