;; Partially auto generated using https://github.com/nmeum/riscv-opcodes

(define (get-value sym alist)
  (let ((val (assoc sym alist)))
    (if val (cdr val) val)))

(define (get-opcode instr-symbol)
  (get-value instr-symbol OPCODES))

(define (get-funct3 instr-symbol)
  (get-value instr-symbol FUNCT3))

(define (get-funct7 instr-symbol)
  (get-value instr-symbol FUNCT7))

(define OPCODES '(
  (BEQ . #x63)
  (BNE . #x63)
  (BLT . #x63)
  (BGE . #x63)
  (BLTU . #x63)
  (BGEU . #x63)
  (JALR . #x67)
  (JAL . #x6f)
  (LUI . #x37)
  (AUIPC . #x17)
  (ADDI . #x13)
  (SLLI . #x13)
  (SLTI . #x13)
  (SLTIU . #x13)
  (XORI . #x13)
  (SRLI . #x13)
  (SRAI . #x13)
  (ORI . #x13)
  (ANDI . #x13)
  (ADD . #x33)
  (SUB . #x33)
  (SLL . #x33)
  (SLT . #x33)
  (SLTU . #x33)
  (XOR . #x33)
  (SRL . #x33)
  (SRA . #x33)
  (OR . #x33)
  (AND . #x33)
  (LB . #x3)
  (LH . #x3)
  (LW . #x3)
  (LBU . #x3)
  (LHU . #x3)
  (SB . #x23)
  (SH . #x23)
  (SW . #x23)
  (FENCE . #xf)
  (FENCE.I . #xf)
))

(define FUNCT3 '(
  (BEQ . #x0)
  (BNE . #x1)
  (BLT . #x4)
  (BGE . #x5)
  (BLTU . #x6)
  (BGEU . #x7)
  (JALR . #x0)
  (JAL . #x0)
  (LUI . #x0)
  (AUIPC . #x0)
  (ADDI . #x0)
  (SLLI . #x1)
  (SLTI . #x2)
  (SLTIU . #x3)
  (XORI . #x4)
  (SRLI . #x5)
  (SRAI . #x5)
  (ORI . #x6)
  (ANDI . #x7)
  (ADD . #x0)
  (SUB . #x0)
  (SLL . #x1)
  (SLT . #x2)
  (SLTU . #x3)
  (XOR . #x4)
  (SRL . #x5)
  (SRA . #x5)
  (OR . #x6)
  (AND . #x7)
  (LB . #x0)
  (LH . #x1)
  (LW . #x2)
  (LBU . #x4)
  (LHU . #x5)
  (SB . #x0)
  (SH . #x1)
  (SW . #x2)
  (FENCE . #x0)
  (FENCE.I . #x1)
))

(define FUNCT7 '(
  (BEQ . #x0)
  (BNE . #x0)
  (BLT . #x0)
  (BGE . #x0)
  (BLTU . #x0)
  (BGEU . #x0)
  (JALR . #x0)
  (JAL . #x0)
  (LUI . #x0)
  (AUIPC . #x0)
  (ADDI . #x0)
  (SLLI . #x0)
  (SLTI . #x0)
  (SLTIU . #x0)
  (XORI . #x0)
  (SRLI . #x0)
  (SRAI . #x20)
  (ORI . #x0)
  (ANDI . #x0)
  (ADD . #x0)
  (SUB . #x20)
  (SLL . #x0)
  (SLT . #x0)
  (SLTU . #x0)
  (XOR . #x0)
  (SRL . #x0)
  (SRA . #x20)
  (OR . #x0)
  (AND . #x0)
  (LB . #x0)
  (LH . #x0)
  (LW . #x0)
  (LBU . #x0)
  (LHU . #x0)
  (SB . #x0)
  (SH . #x0)
  (SW . #x0)
  (FENCE . #x0)
  (FENCE.I . #x0)
))
