forked from PrincetonUniversity/ILAng
-
Notifications
You must be signed in to change notification settings - Fork 0
/
riscvIla.hpp
76 lines (49 loc) · 1.79 KB
/
riscvIla.hpp
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
/********************
RISC-V ILA
********************/
#ifndef __RISCV_ILA_HPP__
#define __RISCV_ILA_HPP__
#include <vector>
#include "encoding.hpp"
class riscvILA_user
{
Ila model;
ExprRef pc;
ExprRef mem;
std::vector<ExprRef> GPR; // R0-R31
std::set<std::string> Instrs;
std::map<std::string, InstrRef> InstrMap;
ExprRef inst;
ExprRef opcode;
ExprRef rd;
ExprRef rs1;
ExprRef rs2;
ExprRef funct3;
ExprRef funct7;
ExprRef funct12;
ExprRef immI;
ExprRef immS;
ExprRef immB;
ExprRef immU;
ExprRef immJ;
ExprRef csr_index;
protected:
ExprRef indexIntoGPR(const ExprRef & idxBits);
void UpdateGPR(InstrRef & inst, const ExprRef & idxBits, const ExprRef & val );
ExprRef bv(int val) { return BvConst(val, XLEN); }
ExprRef zext(const ExprRef & v) {return ZExt( v, XLEN ); }
ExprRef sext(const ExprRef & v) {return SExt( v, XLEN ); }
ExprRef getSlice(const ExprRef & word,const ExprRef & lowBits, int width, bool unSigned);
ExprRef CombineSlices(const ExprRef & word, const ExprRef & lowBits, int width, const ExprRef & old);
// privileged model will overload these to insert their address translation
virtual ExprRef FetchFromMem(const ExprRef &m, const ExprRef &addr) { return Load(m,addr); }
virtual ExprRef LoadFromMem (const ExprRef &m, const ExprRef &addr) { return Load(m,addr); }
virtual ExprRef StoreToMem (const ExprRef &m, const ExprRef &addr , const ExprRef &data) { return Store(m,addr,data); }
public:
riscvILA_user( int pc_init_val );
void addInstructions();
};
class riscvILA_machine : public riscvILA_user
{
};
#endif