// This file is used for the go/mpact-sim-codelabs/instruction-decoder
// codelab. It will contain instruction decode information for a subset
// of the RiscV32I architecture.

isa RiscV32I {
  namespace mpact::sim::codelab;
  slots { riscv32; }
}

// First disasm fragment is 15 char wide and left justified.
disasm widths = {-15};

// The RiscV 'I' instructions.
slot riscv32i {
  // Include file that contains the declarations of the semantic functions for
  // the 'I' instructions.
  includes {
    #include "riscv_semantic_functions/rv32i_instructions.h"
  }
  // These are all 32 bit instructions, so set default size to 4.
  default size = 4;
  // Model these with 0 latency to avoid buffering the result. Since RiscV
  // instructions have sequential semantics this is fine.
  default latency = 0;
  // The opcodes.
  opcodes {

    // Add the instruction definition for the instructions in the codelab
    // at the place holders below.
    //
    // Note "Initial Build" does not involve adding instructions.

    // Add Register-Register ALU Instructions.

    // Add ALU Instructions with Immediates.

    // Add Branch and Jump-And-Link Instructions.

    // Add Store Instructions.

    // Add Load Instructions.

    // End of Excercises.
    fence{: imm12 : },
      semfunc: "&RV32IFence",
      disasm: "fence";
    ebreak{},
      semfunc: "&RV32IEbreak",
      disasm: "ebreak";
  }
}

// RiscV32 CSR manipulation instructions.
slot zicsr {
  // Include file that contains the declarations of the semantic functions for
  // the 'zicsr' instructions.
  includes {
    #include "riscv_semantic_functions/zicsr_instructions.h"
  }
  // 32 bit instructions.
  default size = 4;
  // No buffering of the result.
  default latency = 0;
  // Instructions.
  opcodes {
    csrs{: rs1, csr : rd, csr},
      semfunc: "&RV32ZiCsrs",
      disasm: "csrs", "%csr, %rs1";
    csrw_nr{: rs1 : csr},
      semfunc: "&RV32ZiCsrwNr",  // rd == 0 (x0).
      disasm: "csrw", "%csr, %rs1";
    csrs_nw{: csr : rd, csr},
      semfunc: "&RV32ZiCsrsNw",  // rs1 == 0 (x0).
      disasm: "csrs", "%csr, %rd";
  }
}

// The final instruction set combines riscv32i and zicsr.
slot riscv32 : riscv32i, zicsr {
  // Default opcode for any instruction not matched by the decoder.
  default opcode =
    disasm: "Illegal instruction at 0x%(@:08x)",
    semfunc: "&RV32IllegalInstruction";
}
