clarify vxcptsave/vxctkill semantics
[riscv-isa-sim.git] / hwacha / hwacha.h
1 #ifndef _HWACHA_H
2 #define _HWACHA_H
3
4 #include "extension.h"
5
6 struct ct_state_t
7 {
8 void reset();
9
10 uint32_t nxpr;
11 uint32_t nfpr;
12 uint32_t maxvl;
13 uint32_t vl;
14 uint32_t count;
15
16 reg_t vf_pc;
17 };
18
19 struct ut_state_t
20 {
21 void reset();
22
23 bool run;
24 regfile_t<reg_t, 32, true> XPR;
25 regfile_t<reg_t, 32, false> FPR;
26 };
27
28 class hwacha_t : public extension_t
29 {
30 public:
31 hwacha_t() : cause(0), aux(0), debug(false) {}
32 std::vector<insn_desc_t> get_instructions();
33 std::vector<disasm_insn_t*> get_disasms();
34 const char* name() { return "hwacha"; }
35 void reset();
36 void set_debug(bool value) { debug = value; }
37
38 ct_state_t* get_ct_state() { return &ct_state; }
39 ut_state_t* get_ut_state(int idx) { return &ut_state[idx]; }
40 bool vf_active();
41 reg_t get_cause() { return cause; }
42 reg_t get_aux() { return aux; }
43 void take_exception(reg_t, reg_t);
44 void clear_exception() { clear_interrupt(); }
45
46 bool get_debug() { return debug; }
47 disassembler_t* get_ut_disassembler() { return &ut_disassembler; }
48
49 static const int max_uts = 2048;
50
51 private:
52 ct_state_t ct_state;
53 ut_state_t ut_state[max_uts];
54 reg_t cause;
55 reg_t aux;
56
57 disassembler_t ut_disassembler;
58 bool debug;
59 };
60
61 REGISTER_EXTENSION(hwacha, []() { return new hwacha_t; })
62
63 #endif