summaryrefslogtreecommitdiff
path: root/inst.chisel
blob: f7bfd4435b0798161c869d5d33e5f72bd468cc18 (plain)
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
/* Automatically generated by parse-opcodes */
object Instructions {
  def BEQ                = Bits("b?????????????????000?????1100011")
  def BNE                = Bits("b?????????????????001?????1100011")
  def BLT                = Bits("b?????????????????100?????1100011")
  def BGE                = Bits("b?????????????????101?????1100011")
  def BLTU               = Bits("b?????????????????110?????1100011")
  def BGEU               = Bits("b?????????????????111?????1100011")
  def JALR               = Bits("b?????????????????000?????1100111")
  def JAL                = Bits("b?????????????????????????1101111")
  def LUI                = Bits("b?????????????????????????0110111")
  def AUIPC              = Bits("b?????????????????????????0010111")
  def ADDI               = Bits("b?????????????????000?????0010011")
  def SLLI               = Bits("b000000???????????001?????0010011")
  def SLTI               = Bits("b?????????????????010?????0010011")
  def SLTIU              = Bits("b?????????????????011?????0010011")
  def XORI               = Bits("b?????????????????100?????0010011")
  def SRLI               = Bits("b000000???????????101?????0010011")
  def SRAI               = Bits("b010000???????????101?????0010011")
  def ORI                = Bits("b?????????????????110?????0010011")
  def ANDI               = Bits("b?????????????????111?????0010011")
  def ADD                = Bits("b0000000??????????000?????0110011")
  def SUB                = Bits("b0100000??????????000?????0110011")
  def SLL                = Bits("b0000000??????????001?????0110011")
  def SLT                = Bits("b0000000??????????010?????0110011")
  def SLTU               = Bits("b0000000??????????011?????0110011")
  def XOR                = Bits("b0000000??????????100?????0110011")
  def SRL                = Bits("b0000000??????????101?????0110011")
  def SRA                = Bits("b0100000??????????101?????0110011")
  def OR                 = Bits("b0000000??????????110?????0110011")
  def AND                = Bits("b0000000??????????111?????0110011")
  def ADDIW              = Bits("b?????????????????000?????0011011")
  def SLLIW              = Bits("b0000000??????????001?????0011011")
  def SRLIW              = Bits("b0000000??????????101?????0011011")
  def SRAIW              = Bits("b0100000??????????101?????0011011")
  def ADDW               = Bits("b0000000??????????000?????0111011")
  def SUBW               = Bits("b0100000??????????000?????0111011")
  def SLLW               = Bits("b0000000??????????001?????0111011")
  def SRLW               = Bits("b0000000??????????101?????0111011")
  def SRAW               = Bits("b0100000??????????101?????0111011")
  def LB                 = Bits("b?????????????????000?????0000011")
  def LH                 = Bits("b?????????????????001?????0000011")
  def LW                 = Bits("b?????????????????010?????0000011")
  def LD                 = Bits("b?????????????????011?????0000011")
  def LBU                = Bits("b?????????????????100?????0000011")
  def LHU                = Bits("b?????????????????101?????0000011")
  def LWU                = Bits("b?????????????????110?????0000011")
  def SB                 = Bits("b?????????????????000?????0100011")
  def SH                 = Bits("b?????????????????001?????0100011")
  def SW                 = Bits("b?????????????????010?????0100011")
  def SD                 = Bits("b?????????????????011?????0100011")
  def FENCE              = Bits("b?????????????????000?????0001111")
  def FENCE_I            = Bits("b?????????????????001?????0001111")
  def MUL                = Bits("b0000001??????????000?????0110011")
  def MULH               = Bits("b0000001??????????001?????0110011")
  def MULHSU             = Bits("b0000001??????????010?????0110011")
  def MULHU              = Bits("b0000001??????????011?????0110011")
  def DIV                = Bits("b0000001??????????100?????0110011")
  def DIVU               = Bits("b0000001??????????101?????0110011")
  def REM                = Bits("b0000001??????????110?????0110011")
  def REMU               = Bits("b0000001??????????111?????0110011")
  def MULW               = Bits("b0000001??????????000?????0111011")
  def DIVW               = Bits("b0000001??????????100?????0111011")
  def DIVUW              = Bits("b0000001??????????101?????0111011")
  def REMW               = Bits("b0000001??????????110?????0111011")
  def REMUW              = Bits("b0000001??????????111?????0111011")
  def AMOADD_W           = Bits("b00000????????????010?????0101111")
  def AMOXOR_W           = Bits("b00100????????????010?????0101111")
  def AMOOR_W            = Bits("b01000????????????010?????0101111")
  def AMOAND_W           = Bits("b01100????????????010?????0101111")
  def AMOMIN_W           = Bits("b10000????????????010?????0101111")
  def AMOMAX_W           = Bits("b10100????????????010?????0101111")
  def AMOMINU_W          = Bits("b11000????????????010?????0101111")
  def AMOMAXU_W          = Bits("b11100????????????010?????0101111")
  def AMOSWAP_W          = Bits("b00001????????????010?????0101111")
  def LR_W               = Bits("b00010??00000?????010?????0101111")
  def SC_W               = Bits("b00011????????????010?????0101111")
  def AMOADD_D           = Bits("b00000????????????011?????0101111")
  def AMOXOR_D           = Bits("b00100????????????011?????0101111")
  def AMOOR_D            = Bits("b01000????????????011?????0101111")
  def AMOAND_D           = Bits("b01100????????????011?????0101111")
  def AMOMIN_D           = Bits("b10000????????????011?????0101111")
  def AMOMAX_D           = Bits("b10100????????????011?????0101111")
  def AMOMINU_D          = Bits("b11000????????????011?????0101111")
  def AMOMAXU_D          = Bits("b11100????????????011?????0101111")
  def AMOSWAP_D          = Bits("b00001????????????011?????0101111")
  def LR_D               = Bits("b00010??00000?????011?????0101111")
  def SC_D               = Bits("b00011????????????011?????0101111")
  def SCALL              = Bits("b00000000000000000000000001110011")
  def SBREAK             = Bits("b00000000000100000000000001110011")
  def SRET               = Bits("b00010000000000000000000001110011")
  def SFENCE_VM          = Bits("b000100000001?????000000001110011")
  def WFI                = Bits("b00010000001000000000000001110011")
  def MRTH               = Bits("b00110000011000000000000001110011")
  def MRTS               = Bits("b00110000010100000000000001110011")
  def HRTS               = Bits("b00100000010100000000000001110011")
  def CSRRW              = Bits("b?????????????????001?????1110011")
  def CSRRS              = Bits("b?????????????????010?????1110011")
  def CSRRC              = Bits("b?????????????????011?????1110011")
  def CSRRWI             = Bits("b?????????????????101?????1110011")
  def CSRRSI             = Bits("b?????????????????110?????1110011")
  def CSRRCI             = Bits("b?????????????????111?????1110011")
  def FADD_S             = Bits("b0000000??????????????????1010011")
  def FSUB_S             = Bits("b0000100??????????????????1010011")
  def FMUL_S             = Bits("b0001000??????????????????1010011")
  def FDIV_S             = Bits("b0001100??????????????????1010011")
  def FSGNJ_S            = Bits("b0010000??????????000?????1010011")
  def FSGNJN_S           = Bits("b0010000??????????001?????1010011")
  def FSGNJX_S           = Bits("b0010000??????????010?????1010011")
  def FMIN_S             = Bits("b0010100??????????000?????1010011")
  def FMAX_S             = Bits("b0010100??????????001?????1010011")
  def FSQRT_S            = Bits("b010110000000?????????????1010011")
  def FADD_D             = Bits("b0000001??????????????????1010011")
  def FSUB_D             = Bits("b0000101??????????????????1010011")
  def FMUL_D             = Bits("b0001001??????????????????1010011")
  def FDIV_D             = Bits("b0001101??????????????????1010011")
  def FSGNJ_D            = Bits("b0010001??????????000?????1010011")
  def FSGNJN_D           = Bits("b0010001??????????001?????1010011")
  def FSGNJX_D           = Bits("b0010001??????????010?????1010011")
  def FMIN_D             = Bits("b0010101??????????000?????1010011")
  def FMAX_D             = Bits("b0010101??????????001?????1010011")
  def FCVT_S_D           = Bits("b010000000001?????????????1010011")
  def FCVT_D_S           = Bits("b010000100000?????????????1010011")
  def FSQRT_D            = Bits("b010110100000?????????????1010011")
  def FLE_S              = Bits("b1010000??????????000?????1010011")
  def FLT_S              = Bits("b1010000??????????001?????1010011")
  def FEQ_S              = Bits("b1010000??????????010?????1010011")
  def FLE_D              = Bits("b1010001??????????000?????1010011")
  def FLT_D              = Bits("b1010001??????????001?????1010011")
  def FEQ_D              = Bits("b1010001??????????010?????1010011")
  def FCVT_W_S           = Bits("b110000000000?????????????1010011")
  def FCVT_WU_S          = Bits("b110000000001?????????????1010011")
  def FCVT_L_S           = Bits("b110000000010?????????????1010011")
  def FCVT_LU_S          = Bits("b110000000011?????????????1010011")
  def FMV_X_S            = Bits("b111000000000?????000?????1010011")
  def FCLASS_S           = Bits("b111000000000?????001?????1010011")
  def FCVT_W_D           = Bits("b110000100000?????????????1010011")
  def FCVT_WU_D          = Bits("b110000100001?????????????1010011")
  def FCVT_L_D           = Bits("b110000100010?????????????1010011")
  def FCVT_LU_D          = Bits("b110000100011?????????????1010011")
  def FMV_X_D            = Bits("b111000100000?????000?????1010011")
  def FCLASS_D           = Bits("b111000100000?????001?????1010011")
  def FCVT_S_W           = Bits("b110100000000?????????????1010011")
  def FCVT_S_WU          = Bits("b110100000001?????????????1010011")
  def FCVT_S_L           = Bits("b110100000010?????????????1010011")
  def FCVT_S_LU          = Bits("b110100000011?????????????1010011")
  def FMV_S_X            = Bits("b111100000000?????000?????1010011")
  def FCVT_D_W           = Bits("b110100100000?????????????1010011")
  def FCVT_D_WU          = Bits("b110100100001?????????????1010011")
  def FCVT_D_L           = Bits("b110100100010?????????????1010011")
  def FCVT_D_LU          = Bits("b110100100011?????????????1010011")
  def FMV_D_X            = Bits("b111100100000?????000?????1010011")
  def FLW                = Bits("b?????????????????010?????0000111")
  def FLD                = Bits("b?????????????????011?????0000111")
  def FSW                = Bits("b?????????????????010?????0100111")
  def FSD                = Bits("b?????????????????011?????0100111")
  def FMADD_S            = Bits("b?????00??????????????????1000011")
  def FMSUB_S            = Bits("b?????00??????????????????1000111")
  def FNMSUB_S           = Bits("b?????00??????????????????1001011")
  def FNMADD_S           = Bits("b?????00??????????????????1001111")
  def FMADD_D            = Bits("b?????01??????????????????1000011")
  def FMSUB_D            = Bits("b?????01??????????????????1000111")
  def FNMSUB_D           = Bits("b?????01??????????????????1001011")
  def FNMADD_D           = Bits("b?????01??????????????????1001111")
  def CUSTOM0            = Bits("b?????????????????000?????0001011")
  def CUSTOM0_RS1        = Bits("b?????????????????010?????0001011")
  def CUSTOM0_RS1_RS2    = Bits("b?????????????????011?????0001011")
  def CUSTOM0_RD         = Bits("b?????????????????100?????0001011")
  def CUSTOM0_RD_RS1     = Bits("b?????????????????110?????0001011")
  def CUSTOM0_RD_RS1_RS2 = Bits("b?????????????????111?????0001011")
  def CUSTOM1            = Bits("b?????????????????000?????0101011")
  def CUSTOM1_RS1        = Bits("b?????????????????010?????0101011")
  def CUSTOM1_RS1_RS2    = Bits("b?????????????????011?????0101011")
  def CUSTOM1_RD         = Bits("b?????????????????100?????0101011")
  def CUSTOM1_RD_RS1     = Bits("b?????????????????110?????0101011")
  def CUSTOM1_RD_RS1_RS2 = Bits("b?????????????????111?????0101011")
  def CUSTOM2            = Bits("b?????????????????000?????1011011")
  def CUSTOM2_RS1        = Bits("b?????????????????010?????1011011")
  def CUSTOM2_RS1_RS2    = Bits("b?????????????????011?????1011011")
  def CUSTOM2_RD         = Bits("b?????????????????100?????1011011")
  def CUSTOM2_RD_RS1     = Bits("b?????????????????110?????1011011")
  def CUSTOM2_RD_RS1_RS2 = Bits("b?????????????????111?????1011011")
  def CUSTOM3            = Bits("b?????????????????000?????1111011")
  def CUSTOM3_RS1        = Bits("b?????????????????010?????1111011")
  def CUSTOM3_RS1_RS2    = Bits("b?????????????????011?????1111011")
  def CUSTOM3_RD         = Bits("b?????????????????100?????1111011")
  def CUSTOM3_RD_RS1     = Bits("b?????????????????110?????1111011")
  def CUSTOM3_RD_RS1_RS2 = Bits("b?????????????????111?????1111011")
}
object Causes {
  val misaligned_fetch = 0x0
  val fault_fetch = 0x1
  val illegal_instruction = 0x2
  val breakpoint = 0x3
  val misaligned_load = 0x4
  val fault_load = 0x5
  val misaligned_store = 0x6
  val fault_store = 0x7
  val user_ecall = 0x8
  val supervisor_ecall = 0x9
  val hypervisor_ecall = 0xa
  val machine_ecall = 0xb
  val all = {
    val res = collection.mutable.ArrayBuffer[Int]()
    res += misaligned_fetch
    res += fault_fetch
    res += illegal_instruction
    res += breakpoint
    res += misaligned_load
    res += fault_load
    res += misaligned_store
    res += fault_store
    res += user_ecall
    res += supervisor_ecall
    res += hypervisor_ecall
    res += machine_ecall
    res.toArray
  }
}
object CSRs {
  val fflags = 0x1
  val frm = 0x2
  val fcsr = 0x3
  val cycle = 0xc00
  val time = 0xc01
  val instret = 0xc02
  val stats = 0xc0
  val uarch0 = 0xcc0
  val uarch1 = 0xcc1
  val uarch2 = 0xcc2
  val uarch3 = 0xcc3
  val uarch4 = 0xcc4
  val uarch5 = 0xcc5
  val uarch6 = 0xcc6
  val uarch7 = 0xcc7
  val uarch8 = 0xcc8
  val uarch9 = 0xcc9
  val uarch10 = 0xcca
  val uarch11 = 0xccb
  val uarch12 = 0xccc
  val uarch13 = 0xccd
  val uarch14 = 0xcce
  val uarch15 = 0xccf
  val sstatus = 0x100
  val stvec = 0x101
  val sie = 0x104
  val sscratch = 0x140
  val sepc = 0x141
  val sip = 0x144
  val sptbr = 0x180
  val sasid = 0x181
  val cyclew = 0x900
  val timew = 0x901
  val instretw = 0x902
  val stime = 0xd01
  val scause = 0xd42
  val sbadaddr = 0xd43
  val stimew = 0xa01
  val mstatus = 0x300
  val mtvec = 0x301
  val mtdeleg = 0x302
  val mie = 0x304
  val mtimecmp = 0x321
  val mscratch = 0x340
  val mepc = 0x341
  val mcause = 0x342
  val mbadaddr = 0x343
  val mip = 0x344
  val mtime = 0x701
  val mcpuid = 0xf00
  val mimpid = 0xf01
  val mhartid = 0xf10
  val mtohost = 0x780
  val mfromhost = 0x781
  val mreset = 0x782
  val send_ipi = 0x783
  val cycleh = 0xc80
  val timeh = 0xc81
  val instreth = 0xc82
  val cyclehw = 0x980
  val timehw = 0x981
  val instrethw = 0x982
  val stimeh = 0xd81
  val stimehw = 0xa81
  val mtimecmph = 0x361
  val mtimeh = 0x741
  val all = {
    val res = collection.mutable.ArrayBuffer[Int]()
    res += fflags
    res += frm
    res += fcsr
    res += cycle
    res += time
    res += instret
    res += stats
    res += uarch0
    res += uarch1
    res += uarch2
    res += uarch3
    res += uarch4
    res += uarch5
    res += uarch6
    res += uarch7
    res += uarch8
    res += uarch9
    res += uarch10
    res += uarch11
    res += uarch12
    res += uarch13
    res += uarch14
    res += uarch15
    res += sstatus
    res += stvec
    res += sie
    res += sscratch
    res += sepc
    res += sip
    res += sptbr
    res += sasid
    res += cyclew
    res += timew
    res += instretw
    res += stime
    res += scause
    res += sbadaddr
    res += stimew
    res += mstatus
    res += mtvec
    res += mtdeleg
    res += mie
    res += mtimecmp
    res += mscratch
    res += mepc
    res += mcause
    res += mbadaddr
    res += mip
    res += mtime
    res += mcpuid
    res += mimpid
    res += mhartid
    res += mtohost
    res += mfromhost
    res += mreset
    res += send_ipi
    res.toArray
  }
  val all32 = {
    val res = collection.mutable.ArrayBuffer(all:_*)
    res += cycleh
    res += timeh
    res += instreth
    res += cyclehw
    res += timehw
    res += instrethw
    res += stimeh
    res += stimehw
    res += mtimecmph
    res += mtimeh
    res.toArray
  }
}