+ def calculate_immediate(self):
+ """ calculate immediate
+ """
+ ci = {}
+ no_imm = 0x0
+
+ # R-type: no immediate
+ for op in [opcode_amo, opcode_op, opcode_op_32, opcode_op_fp]:
+ ci[op] = self.immediate.eq(no_imm)
+
+ # I-type
+ im = Cat(self.instruction[20:], Replicate(self.instruction[31], 20))
+ for op in [opcode_load, opcode_load_fp, opcode_misc_mem,
+ opcode_op_imm, opcode_op_imm_32, opcode_jalr,
+ opcode_system]:
+ ci[op] = self.immediate.eq(im)
+
+ # S-type
+ im = Cat(self.instruction[7:12], self.instruction[25:31],
+ Replicate(self.instruction[31], 21))
+ for op in [opcode_store, opcode_store_fp]:
+ ci[op] = self.immediate.eq(im)
+
+ # B-type
+ im = Cat(Constant(0, 1),
+ self.instruction[8:12], self.instruction[25:31],
+ self.instruction[7], Replicate(self.instruction[31], 20))
+ for op in [opcode_branch, ]:
+ ci[op] = self.immediate.eq(im)
+
+ # U-type
+ im = Cat(Constant(0, 1), self.instruction[12:], )
+ for op in [opcode_auipc, opcode_lui]:
+ ci[op] = self.immediate.eq(im)
+
+ # J-type
+ im = Cat(Constant(0, 1),
+ self.instruction[21:25], self.instruction[25:31],
+ self.instruction[20], self.instruction[12:20],
+ Replicate(self.instruction[31], 12))
+ for op in [opcode_jal, ]:
+ ci[op] = self.immediate.eq(im)
+
+ # R4-type: no immediate
+ for op in [opcode_madd, opcode_msub, opcode_nmsub, opcode_nmadd]:
+ ci[op] = self.immediate.eq(no_imm)
+
+ # unknown
+ for op in [ opcode_custom_0, opcode_48b_escape_0, opcode_custom_1,
+ opcode_64b_escape, opcode_reserved_10101, opcode_rv128_0,
+ opcode_48b_escape_1, opcode_reserved_11010,
+ opcode_reserved_11101, opcode_rv128_1, opcode_80b_escape]:
+ ci[op] = self.immediate.eq(no_imm)
+
+ # default
+ for op in [ "default", ]:
+ ci[op] = self.immediate.eq(no_imm)
+
+ return Case(self.opcode, ci)
+
+ def _decode_funct3(self, options, action):
+ """ decode by list of cases