| // 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 |
| // |
| // http://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. |
| |
| #include "riscv_semantic_functions/rv32i_instructions.h" |
| |
| #include <functional> |
| #include <iostream> |
| |
| #include "mpact/sim/generic/arch_state.h" |
| #include "mpact/sim/generic/data_buffer.h" |
| #include "mpact/sim/generic/instruction_helpers.h" |
| #include "other/riscv_simple_state.h" |
| |
| namespace mpact { |
| namespace sim { |
| namespace codelab { |
| |
| using generic::DataBuffer; |
| using riscv::RiscVState; |
| |
| void RV32IllegalInstruction(Instruction *inst) { |
| inst->state() |
| ->program_error_controller() |
| ->GetProgramError(generic::ProgramErrorController::kInternalErrorName) |
| ->Raise( |
| absl::StrCat("Illegal instruction at ", absl::Hex(inst->address()))); |
| std::cerr << absl::StrCat("Illegal instruction at 0x", |
| absl::Hex(inst->address()), "\n"); |
| } |
| |
| // The following instruction semantic functions implement basic alu operations. |
| // They are used for both register-register and register-immediate versions of |
| // the corresponding instructions. |
| |
| // Semantic functions for Exercise 2. |
| void RV32IAdd(Instruction *instruction) {} |
| |
| void RV32IAnd(Instruction *instruction) {} |
| |
| void RV32IOr(Instruction *instruction) {} |
| |
| void RV32ISll(Instruction *instruction) {} |
| |
| void RV32ISltu(Instruction *instruction) {} |
| |
| void RV32ISra(Instruction *instruction) {} |
| |
| void RV32ISrl(Instruction *instruction) {} |
| |
| void RV32ISub(Instruction *instruction) {} |
| |
| void RV32IXor(Instruction *instruction) {} |
| // End semantic functions for exercise 2. |
| |
| // Semantic functions for Exercise 3. |
| // Load upper immediate. It is assumed that the decoder already shifted the |
| // immediate. |
| void RV32ILui(Instruction *instruction) {} |
| |
| // Add upper immediate to PC (for PC relative addressing). It is assumed that |
| // the decoder already shifted the immediate. |
| void RV32IAuipc(Instruction *instruction) {} |
| // End semantic functions for Exercise 3. |
| |
| // Semantic functions for Exercise 4. |
| // Branch instructions. |
| void RV32IBeq(Instruction *instruction) {} |
| |
| void RV32IBge(Instruction *instruction) {} |
| |
| void RV32IBgeu(Instruction *instruction) {} |
| |
| void RV32IBlt(Instruction *instruction) {} |
| |
| void RV32IBltu(Instruction *instruction) {} |
| |
| void RV32IBne(Instruction *instruction) {} |
| |
| // Jal instruction. |
| void RV32IJal(Instruction *instruction) {} |
| |
| // Jalr instruction. |
| void RV32IJalr(Instruction *instruction) {} |
| // End of semantic functions for Exercise 4. |
| |
| // Semantic functions for Exercise 5. |
| // Store instructions. |
| void RV32ISw(Instruction *instruction) {} |
| |
| void RV32ISh(Instruction *instruction) {} |
| |
| void RV32ISb(Instruction *instruction) {} |
| // End of semantic functions for Exercise 5. |
| |
| // Semantic functions for Exercise 6. |
| // Load instructions. |
| void RV32ILw(Instruction *instruction) {} |
| |
| void RV32ILwChild(Instruction *instruction) {} |
| |
| void RV32ILh(Instruction *instruction) {} |
| |
| void RV32ILhChild(Instruction *instruction) {} |
| |
| void RV32ILhu(Instruction *instruction) {} |
| |
| void RV32ILhuChild(Instruction *instruction) {} |
| |
| void RV32ILb(Instruction *instruction) {} |
| |
| void RV32ILbChild(Instruction *instruction) {} |
| |
| void RV32ILbu(Instruction *instruction) {} |
| |
| void RV32ILbuChild(Instruction *instruction) {} |
| // End of semantic functions for Exercise 6. |
| |
| // Fence. |
| void RV32IFence(Instruction *instruction) { |
| uint32_t bits = instruction->Source(0)->AsUint32(0); |
| int fm = (bits >> 8) & 0xf; |
| int predecessor = (bits >> 4) & 0xf; |
| int successor = bits & 0xf; |
| auto *state = static_cast<RiscVState *>(instruction->state()); |
| state->Fence(instruction, fm, predecessor, successor); |
| } |
| |
| // Ebreak - software breakpoint instruction. |
| void RV32IEbreak(Instruction *instruction) { |
| auto *state = static_cast<RiscVState *>(instruction->state()); |
| state->EBreak(instruction); |
| } |
| |
| } // namespace codelab |
| } // namespace sim |
| } // namespace mpact |