blob: 6e218fb6f961f7aba05e32c4817cb87412bfcf90 [file]
// Copyright 2023 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// This file defines the decoder for RiscV32G instructions represented in
// protobuf format. It should work with the standard RiscV32G .isa file.
decoder RiscV32IProto {
namespace mpact_sim::decoder::test;
opcode_enum = "mpact::sim::riscv::isa32::OpcodeEnum";
includes {
#include "mpact/sim/decoder/test/riscv32i_enums.h"
}
i_instructions;
}
// From package mpact_sim.decoder.test.
using mpact_sim.decoder.test.RiscVInstruction;
instruction group i_instructions : RiscVInstruction {
setter btype_setter:
B_imm12 = btype.immediate;
rs1 = btype.rs1;
rs2 = btype.rs2;
lui: opcode == OPCODE_LOAD_UPPER_IMM, HAS(utype);
U_imm20 = utype.immediate;
rd = utype.rd;
auipc: opcode == OPCODE_ADD_UPPER_IMM_PC, HAS(utype);
U_imm20 = utype.immediate;
rd = utype.rd;
jal: opcode == OPCODE_JUMP_AND_LINK, HAS(utype);
J_imm20 = utype.immediate;
rd = utype.rd;
j: opcode == OPCODE_JUMP, HAS(utype);
J_imm20 = utype.immediate;
rd = utype.rd;
jr: opcode == OPCODE_JUMP_REG, HAS(jregtype);
J_imm12 = jregtype.immediate;
rs1 = jregtype.rs1;
jalr: opcode == OPCODE_JUMP_AND_LINK_REG, HAS(itype);
J_imm12 = itype.immediate;
rs1 = itype.rs1;
rd = itype.rd;
beq: opcode == OPCODE_BEQ, HAS(btype);
btype_setter;
bne: opcode == OPCODE_BNE, HAS(btype);
btype_setter;
blt: opcode == OPCODE_BLT, HAS(btype);
btype_setter;
bltu: opcode == OPCODE_BLTU, HAS(btype);
btype_setter;
bge: opcode == OPCODE_BGE, HAS(btype);
btype_setter;
bgeu: opcode == OPCODE_BGEU, HAS(btype);
btype_setter;
lw: opcode == OPCODE_LOAD_WORD, HAS(itype);
I_imm12 = itype.immediate;
rs1 = itype.rs1;
rd = itype.rd;
lh: opcode == OPCODE_LOAD_HALF, HAS(itype);
I_imm12 = itype.immediate;
rs1 = itype.rs1;
rd = itype.rd;
lb: opcode == OPCODE_LOAD_BYTE, HAS(itype);
I_imm12 = itype.immediate;
rs1 = itype.rs1;
rd = itype.rd;
lhu: opcode == OPCODE_LOAD_HALF_UNSIGNED, HAS(itype);
I_imm12 = itype.immediate;
rs1 = itype.rs1;
rd = itype.rd;
lbu: opcode == OPCODE_LOAD_BYTE_UNSIGNED, HAS(itype);
I_imm12 = itype.immediate;
rs1 = itype.rs1;
rd = itype.rd;
}