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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
use strum_macros::{IntoStaticStr, VariantArray};

use super::{super::super::basic::parser::lexer::RISCVOpToken, oplist::OP_LIST};

#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, VariantArray, IntoStaticStr)]
#[strum(serialize_all = "snake_case")]
pub enum RV32IOpToken {
    Add,
    Addi,
    And,
    Andi,
    Auipc,
    Beq,
    Bge,
    Bgeu,
    Blt,
    Bltu,
    Bne,
    Csrrc,
    Csrrci,
    Csrrs,
    Csrrsi,
    Csrrw,
    Csrrwi,
    Div,
    Divu,
    Ebreak,
    Ecall,
    Fence,
    FenceI,
    Jal,
    Jalr,
    Lb,
    Lbu,
    Lh,
    Lhu,
    Lui,
    Lw,
    Mul,
    Mulh,
    Mulhsu,
    Mulhu,
    Or,
    Ori,
    Rem,
    Remu,
    Sb,
    Sh,
    Sll,
    Slli,
    Slt,
    Slti,
    Sltiu,
    Sltu,
    Sra,
    Srai,
    Srl,
    Srli,
    Sub,
    Sw,
    Uret,
    Wfi,
    Xor,
    Xori,
    B,
    Beqz,
    Bgez,
    Bgt,
    Bgtu,
    Bgtz,
    Ble,
    Bleu,
    Blez,
    Bltz,
    Bnez,
    Call,
    Csrc,
    Csrci,
    Csrr,
    Csrs,
    Csrsi,
    Csrw,
    Csrwi,
    J,
    Jr,
    La,
    Li,
    Mv,
    Neg,
    Nop,
    Not,
    Rdcycle,
    Rdcycleh,
    Rdinstret,
    Rdinstreth,
    Rdtime,
    Rdtimeh,
    Ret,
    Seqz,
    SextB,
    SextH,
    Sgt,
    Sgtu,
    Sgtz,
    Sltz,
    Snez,
    Tail,
    ZextB,
    ZextH,
}

impl RV32IOpToken {
    pub fn name(&self) -> String {
        Into::<&'static str>::into(self).replace("_", ".")
    }
}

impl From<RV32IOpToken> for RISCVOpToken {
    fn from(op: RV32IOpToken) -> RISCVOpToken {
        RISCVOpToken {
            val: op as u8,
            get_opd_set_fn: |v| &OP_LIST[v as usize],
        }
    }
}