Restructured project
This commit is contained in:
@ -6,21 +6,14 @@ set(LIB_SOURCES
|
||||
iss/rv64ia.cpp
|
||||
internal/vm_rv32imac.cpp
|
||||
internal/vm_rv64ia.cpp
|
||||
sysc/core_complex.cpp
|
||||
sysc/gpio.cpp
|
||||
sysc/plic.cpp
|
||||
sysc/platform.cpp
|
||||
sysc/spi.cpp
|
||||
sysc/uart.cpp
|
||||
)
|
||||
|
||||
set(APP_HEADERS )
|
||||
|
||||
set(APP_SOURCES main.cpp sc_main.cpp
|
||||
)
|
||||
set(APP_SOURCES main.cpp)
|
||||
|
||||
# Define two variables in order not to repeat ourselves.
|
||||
set(LIBRARY_NAME riscv)
|
||||
set(LIBRARY_NAME risc-v)
|
||||
|
||||
# Define the library
|
||||
add_library(${LIBRARY_NAME} ${LIB_SOURCES})
|
||||
@ -32,7 +25,7 @@ set_target_properties(${LIBRARY_NAME} PROPERTIES
|
||||
)
|
||||
|
||||
# This is a make target, so you can do a "make riscv-sc"
|
||||
set(APPLICATION_NAME riscv-sc)
|
||||
set(APPLICATION_NAME riscv)
|
||||
|
||||
add_executable(${APPLICATION_NAME} ${APP_SOURCES})
|
||||
|
||||
@ -42,10 +35,6 @@ target_link_libraries(${APPLICATION_NAME} dbt-core)
|
||||
target_link_libraries(${APPLICATION_NAME} sc-components)
|
||||
target_link_libraries(${APPLICATION_NAME} external)
|
||||
target_link_libraries(${APPLICATION_NAME} ${llvm_libs})
|
||||
target_link_libraries(${APPLICATION_NAME} ${SystemC_LIBRARIES} )
|
||||
if(SCV_FOUND)
|
||||
target_link_libraries (${APPLICATION_NAME} ${SCV_LIBRARIES})
|
||||
endif()
|
||||
target_link_libraries(${APPLICATION_NAME} ${Boost_LIBRARIES} )
|
||||
|
||||
# Says how and where to install software
|
||||
|
@ -1,108 +0,0 @@
|
||||
import "RV32IBase.core_desc"
|
||||
|
||||
InsructionSet RV32A extends RV32IBase{
|
||||
|
||||
address_spaces {
|
||||
RES[8]
|
||||
}
|
||||
|
||||
instructions{
|
||||
LR.W {
|
||||
encoding: b00010 | aq[0:0] | rl[0:0] | b00000 | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d";
|
||||
if(rd!=0){
|
||||
val offs[XLEN] <= X[rs1];
|
||||
X[rd]<= sext(MEM[offs]{32}, XLEN);
|
||||
RES[offs]{32}<=sext(-1, 32);
|
||||
}
|
||||
}
|
||||
SC.W {
|
||||
encoding: b00011 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d";
|
||||
val offs[XLEN] <= X[rs1];
|
||||
val res1[32] <= RES[offs]{32};
|
||||
if(res1!=0)
|
||||
MEM[offs]{32} <= X[rs2];
|
||||
if(rd!=0) X[rd]<= choose(res1!=0, 0, 1);
|
||||
}
|
||||
AMOSWAP.W{
|
||||
encoding: b00001 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%aq$d,rel=%rl$d)";
|
||||
val offs[XLEN]<=X[rs1];
|
||||
if(rd!=0) X[rd]<=sext(MEM[offs]{32});
|
||||
MEM[offs]{32}<=X[rs2];
|
||||
}
|
||||
AMOADD.W{
|
||||
encoding: b00000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%aq$d,rel=%rl$d)";
|
||||
val offs[XLEN]<=X[rs1];
|
||||
val res1[XLEN] <= sext(MEM[offs]{32});
|
||||
if(rd!=0) X[rd]<=res1;
|
||||
val res2[XLEN]<=res1 + X[rs2];
|
||||
MEM[offs]{32}<=res2;
|
||||
}
|
||||
AMOXOR.W{
|
||||
encoding: b00100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%aq$d,rel=%rl$d)";
|
||||
val offs[XLEN]<=X[rs1];
|
||||
val res1[XLEN] <= sext(MEM[offs]{32});
|
||||
if(rd!=0) X[rd]<=res1;
|
||||
val res2[XLEN]<=res1 ^ X[rs2];
|
||||
MEM[offs]{32}<=res2;
|
||||
}
|
||||
AMOAND.W{
|
||||
encoding: b01100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%aq$d,rel=%rl$d)";
|
||||
val offs[XLEN]<=X[rs1];
|
||||
val res1[XLEN] <= sext(MEM[offs]{32});
|
||||
if(rd!=0) X[rd]<=res1;
|
||||
val res2[XLEN] <=res1 & X[rs2];
|
||||
MEM[offs]{32}<=res2;
|
||||
}
|
||||
AMOOR.W {
|
||||
encoding: b01000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%aq$d,rel=%rl$d)";
|
||||
val offs[XLEN]<=X[rs1];
|
||||
val res1[XLEN] <= sext(MEM[offs]{32});
|
||||
if(rd!=0) X[rd]<=res1;
|
||||
val res2[XLEN]<=res1 | X[rs2];
|
||||
MEM[offs]{32}<=res2;
|
||||
}
|
||||
AMOMIN.W{
|
||||
encoding: b10000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%aq$d,rel=%rl$d)";
|
||||
val offs[XLEN]<=X[rs1];
|
||||
val res1[XLEN] <= sext(MEM[offs]{32});
|
||||
if(rd!=0) X[rd]<=res1;
|
||||
val res2[XLEN]<= choose(res1's>X[rs2]s, X[rs2], res1);
|
||||
MEM[offs]{32}<=res2;
|
||||
}
|
||||
AMOMAX.W{
|
||||
encoding: b10100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%aq$d,rel=%rl$d)";
|
||||
val offs[XLEN]<=X[rs1];
|
||||
val res1[XLEN] <= sext(MEM[offs]{32});
|
||||
if(rd!=0) X[rd]<=res1;
|
||||
val res2[XLEN]<= choose(res1's<X[rs2]s, X[rs2], res1);
|
||||
MEM[offs]{32}<=res2;
|
||||
}
|
||||
AMOMINU.W{
|
||||
encoding: b11000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%aq$d,rel=%rl$d)";
|
||||
val offs[XLEN]<=X[rs1];
|
||||
val res1[XLEN] <= zext(MEM[offs]{32});
|
||||
if(rd!=0) X[rd]<=res1;
|
||||
val res2[XLEN]<= choose(res1>X[rs2], X[rs2], res1);
|
||||
MEM[offs]{32}<=res2;
|
||||
}
|
||||
AMOMAXU.W{
|
||||
encoding: b11100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%aq$d,rel=%rl$d)";
|
||||
val offs[XLEN]<=X[rs1];
|
||||
val res1[XLEN] <= zext(MEM[offs]{32});
|
||||
if(rd!=0) X[rd]<=res1;
|
||||
val res2[XLEN]<= choose(res1'u<X[rs2]'u, X[rs2], res1);
|
||||
MEM[offs]{32}<=res2;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,310 +0,0 @@
|
||||
import "RV32IBase.core_desc"
|
||||
|
||||
InsructionSet RV32CI {
|
||||
constants {
|
||||
XLEN
|
||||
}
|
||||
address_spaces {
|
||||
MEM[8]
|
||||
}
|
||||
registers {
|
||||
[31:0] X[XLEN],
|
||||
PC[XLEN](is_pc)
|
||||
}
|
||||
instructions{
|
||||
C.ADDI4SPN { //(RES, nzuimm=0)
|
||||
encoding: b000 | nzuimm[5:4] | nzuimm[9:6] | nzuimm[2:2] | nzuimm[3:3] | rd[2:0] | b00;
|
||||
args_disass: "x%rd$d, 0x%nzuimm$05x";
|
||||
if(nzuimm == 0)
|
||||
raise(0, 2);
|
||||
val rd_idx[5] <= rd+8;
|
||||
val x2_idx[5] <= 2;
|
||||
X[rd_idx] <= X[x2_idx] + nzuimm;
|
||||
}
|
||||
C.LW { // (RV32)
|
||||
encoding: b010 | uimm[5:3] | rs1[2:0] | uimm[2:2] | uimm[6:6] | rd[2:0] | b00;
|
||||
args_disass: "x(8+%rd$d), x(8+%rs1$d), 0x%uimm$05x";
|
||||
val rs1_idx[5] <= rs1+8;
|
||||
val adr[XLEN] <= X[rs1_idx]+uimm;
|
||||
val rd_idx[5] <= rd+8;
|
||||
X[rd_idx] <= MEM[adr]{32};
|
||||
}
|
||||
C.SW {//(RV32)
|
||||
encoding: b110 | uimm[5:3] | rs1[2:0] | uimm[2:2] | uimm[6:6] | rs2[2:0] | b00;
|
||||
args_disass: "x(8+%rs1$d), x(8+%rs2$d), 0x%uimm$05x";
|
||||
val rs1_idx[5] <= rs1+8;
|
||||
val adr[XLEN] <= X[rs1_idx]+uimm;
|
||||
val rs2_idx[5] <= rs2+8;
|
||||
MEM[adr]{32} <= X[rs2_idx];
|
||||
}
|
||||
C.NOP {//(RV32)
|
||||
encoding: b000 | b0 | b00000 | b00000 | b01; //TODO
|
||||
args_disass: "";
|
||||
}
|
||||
C.ADDI {//(RV32)
|
||||
encoding:b000 | nzimm[5:5]s | rs1[4:0] | nzimm[4:0]s | b01;
|
||||
args_disass: "x%rs1$d, 0x%nzimm$05x";
|
||||
if(nzimm == 0)
|
||||
raise(0, 2);
|
||||
X[rs1] <= X[rs1] + nzimm;
|
||||
|
||||
}
|
||||
// C.JAL will be overwritten by C.ADDIW for RV64/128
|
||||
C.JAL(no_cont) {//(RV32)
|
||||
encoding: b001 | imm[11:11]s | imm[4:4]s | imm[9:8]s | imm[10:10]s | imm[6:6]s | imm[7:7]s | imm[3:1]s | imm[5:5]s | b01;
|
||||
args_disass: "0x%imm$05x";
|
||||
val rd[5] <= 1;
|
||||
X[rd] <= PC+2;
|
||||
PC<=PC+imm;
|
||||
}
|
||||
C.LI {//(RV32)
|
||||
encoding:b010 | imm[5:5]s | rd[4:0] | imm[4:0]s | b01;
|
||||
args_disass: "x%rd$d, 0x%imm$05x";
|
||||
if(rd == 0) raise(0, 2);
|
||||
X[rd] <= imm;
|
||||
}
|
||||
// order matters here as C.ADDI16SP overwrites C.LUI vor rd==2
|
||||
C.LUI {//(RV32)
|
||||
encoding:b011 | nzimm[17:17]s | rd[4:0] | nzimm[16:12]s | b01;
|
||||
args_disass: "x%rd$d, 0x%nzimm$05x";
|
||||
if(rd == 0) raise(0, 2);
|
||||
if(rd == 2) raise(0, 2);
|
||||
if(nzimm == 0) raise(0, 2);
|
||||
X[rd] <= nzimm;
|
||||
}
|
||||
C.ADDI16SP {//(RV32)
|
||||
encoding:b011 | nzimm[9:9]s | b00010 | nzimm[4:4]s |nzimm[6:6]s | nzimm[8:7]s | nzimm[5:5]s | b01;
|
||||
args_disass: "0x%nzimm$05x";
|
||||
val x2_idx[5] <= 2;
|
||||
X[x2_idx] <= X[x2_idx]s + nzimm;
|
||||
}
|
||||
C.SRLI {//(RV32 nse)
|
||||
encoding:b100 | shamt[5:5] | b00 | rs1[2:0] | shamt[4:0] | b01;
|
||||
args_disass: "x(8+%rs1$d), %shamt$d";
|
||||
if(shamt > 31) raise(0, 2);
|
||||
val rs1_idx[5] <= rs1+8;
|
||||
X[rs1_idx] <= shrl(X[rs1_idx], shamt);
|
||||
}
|
||||
C.SRAI {//(RV32)
|
||||
encoding:b100 | shamt[5:5] | b01 | rs1[2:0] | shamt[4:0] | b01;
|
||||
args_disass: "x(8+%rs1$d), %shamt$d";
|
||||
if(shamt > 31) raise(0, 2);
|
||||
val rs1_idx[5] <= rs1+8;
|
||||
X[rs1_idx] <= shra(X[rs1_idx], shamt);
|
||||
}
|
||||
C.ANDI {//(RV32)
|
||||
encoding:b100 | imm[5:5]s | b10 | rs1[2:0] | imm[4:0]s | b01;
|
||||
args_disass: "x(8+%rs1$d), 0x%imm$05x";
|
||||
val rs1_idx[5] <= rs1 + 8;
|
||||
X[rs1_idx] <= X[rs1_idx] & imm;
|
||||
}
|
||||
C.SUB {//(RV32)
|
||||
encoding:b100 | b0 | b11 | rd[2:0] | b00 | rs2[2:0] | b01;
|
||||
args_disass: "x(8+%rd$d), x(8+%rs2$d)";
|
||||
val rd_idx[5] <= rd + 8;
|
||||
val rs2_idx[5] <= rs2 + 8;
|
||||
X[rd_idx] <= X[rd_idx] - X[rs2_idx];
|
||||
}
|
||||
C.XOR {//(RV32)
|
||||
encoding:b100 | b0 | b11 | rd[2:0] | b01 | rs2[2:0] | b01;
|
||||
args_disass: "x(8+%rd$d), x(8+%rs2$d)";
|
||||
val rd_idx[5] <= rd + 8;
|
||||
val rs2_idx[5] <= rs2 + 8;
|
||||
X[rd_idx] <= X[rd_idx] ^ X[rs2_idx];
|
||||
}
|
||||
C.OR {//(RV32)
|
||||
encoding:b100 | b0 | b11 | rd[2:0] | b10 | rs2[2:0] | b01;
|
||||
args_disass: "x(8+%rd$d), x(8+%rs2$d)";
|
||||
val rd_idx[5] <= rd + 8;
|
||||
val rs2_idx[5] <= rs2 + 8;
|
||||
X[rd_idx] <= X[rd_idx] | X[rs2_idx];
|
||||
}
|
||||
C.AND {//(RV32)
|
||||
encoding:b100 | b0 | b11 | rd[2:0] | b11 | rs2[2:0] | b01;
|
||||
args_disass: "x(8+%rd$d), x(8+%rs2$d)";
|
||||
val rd_idx[5] <= rd + 8;
|
||||
val rs2_idx[5] <= rs2 + 8;
|
||||
X[rd_idx] <= X[rd_idx] & X[rs2_idx];
|
||||
}
|
||||
C.J(no_cont) {//(RV32)
|
||||
encoding:b101 | imm[11:11]s | imm[4:4]s | imm[9:8]s | imm[10:10]s | imm[6:6]s | imm[7:7]s | imm[3:1]s | imm[5:5]s | b01;
|
||||
args_disass: "0x%imm$05x";
|
||||
PC<=PC+imm;
|
||||
}
|
||||
C.BEQZ(no_cont) {//(RV32)
|
||||
encoding:b110 | imm[8:8]s | imm[4:3]s | rs1d[2:0] | imm[7:6]s |imm[2:1]s | imm[5:5]s | b01;
|
||||
args_disass: "x(8+%rs1d$d), 0x%imm$05x";
|
||||
val rs1[5] <= rs1d+8;
|
||||
PC<=choose(X[rs1]==0, PC+imm, PC+2);
|
||||
}
|
||||
C.BNEZ(no_cont) {//(RV32)
|
||||
encoding:b111 | imm[8:8] | imm[4:3] | rs1d[2:0] | imm[7:6] | imm[2:1] | imm[5:5] | b01;
|
||||
args_disass: "x(8+%rs1d$d),, 0x%imm$05x";
|
||||
val rs1[5] <= rs1d+8;
|
||||
PC<=choose(X[rs1]!=0, PC+imm, PC+2);
|
||||
}
|
||||
C.SLLI {//(RV32)
|
||||
encoding:b000 | shamt[5:5] | rs1[4:0] | shamt[4:0] | b10;
|
||||
args_disass: "x%rs1$d, %shamt$d";
|
||||
if(rs1 == 0) raise(0, 2);
|
||||
if(shamt > 31) raise(0, 2);
|
||||
X[rs1] <= shll(X[rs1], shamt);
|
||||
}
|
||||
C.LQSP {//(RV128)
|
||||
encoding:b001 | uimm[5:5] | rd[4:0] | uimm[4:4] | uimm[9:6] | b10;
|
||||
}
|
||||
C.LWSP {//
|
||||
encoding:b010 | uimm[5:5] | rd[4:0] | uimm[4:2] | uimm[7:6] | b10;
|
||||
args_disass: "x%rd$d, sp, 0x%uimm$05x";
|
||||
val x2_idx[5] <= 2;
|
||||
val offs[XLEN] <= X[x2_idx] + uimm;
|
||||
X[rd] <= MEM[offs]{32};
|
||||
}
|
||||
// order matters as C.JR is a special case of C.JR
|
||||
C.MV {//(RV32)
|
||||
encoding:b100 | b0 | rd[4:0] | rs2[4:0] | b10;
|
||||
args_disass: "x%rd$d, x%rs2$d";
|
||||
X[rd] <= X[rs2];
|
||||
}
|
||||
C.JR(no_cont) {//(RV32)
|
||||
encoding:b100 | b0 | rs1[4:0] | b00000 | b10;
|
||||
args_disass: "x%rs1$d";
|
||||
PC <= X[rs1];
|
||||
}
|
||||
C.EBREAK(no_cont) {//(RV32)
|
||||
encoding:b100 | b1 | b00000 | b00000 | b10;
|
||||
raise(0, 3);
|
||||
}
|
||||
// order matters as C.JALR is a special case of C.ADD
|
||||
C.ADD {//(RV32)
|
||||
encoding:b100 | b1 | rd[4:0] | rs2[4:0] | b10;
|
||||
args_disass: "x%rd$d, x%rs2$d";
|
||||
X[rd] <= X[rd] + X[rs2];
|
||||
}
|
||||
C.JALR(no_cont) {//(RV32)
|
||||
encoding:b100 | b1 | rs1[4:0] | b00000 | b10;
|
||||
args_disass: "x%rs1$d";
|
||||
val rd[5] <= 1;
|
||||
X[rd] <= PC+2;
|
||||
PC<=X[rs1];
|
||||
}
|
||||
C.SWSP {//
|
||||
encoding:b110 | uimm[5:2] | uimm[7:6] | rs2[4:0] | b10;
|
||||
args_disass: "x2+0x%uimm$05x, x%rs2$d";
|
||||
val x2_idx[5] <= 2;
|
||||
val offs[XLEN] <= X[x2_idx] + uimm;
|
||||
MEM[offs]{32} <= X[rs2];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
InsructionSet RV32CF extends RV32CI {
|
||||
constants {
|
||||
XLEN, FLEN
|
||||
}
|
||||
address_spaces {
|
||||
MEM[8]
|
||||
}
|
||||
registers {
|
||||
[31:0] X[XLEN],
|
||||
[31:0] F[FLEN]
|
||||
}
|
||||
instructions{
|
||||
C.FLD { //(RV32/64)
|
||||
encoding: b001 | uimm[5:3] | rs1[2:0] | uimm[7:6] | rd[2:0] | b00;
|
||||
}
|
||||
C.FLW {//(RV32)
|
||||
encoding: b011 | uimm[5:3] | rs1[2:0] | uimm[2:2] | uimm[6:6] | rd[2:0] | b00;
|
||||
}
|
||||
C.FSD { //(RV32/64)
|
||||
encoding: b101 | uimm[5:3] | rs1[2:0] | uimm[7:6] | rs2[2:0] | b00;
|
||||
}
|
||||
C.FSW {//(RV32)
|
||||
encoding: b111 | uimm[5:3] | rs1[2:0] | uimm[2:2] | uimm[6:6] | rs2[2:0] | b00;
|
||||
}
|
||||
C.FLDSP {//(RV32/64)
|
||||
encoding:b001 | uimm[5:5] | rd[4:0] | uimm[4:3] | uimm[8:6] | b10;
|
||||
}
|
||||
C.FLWSP {//RV32
|
||||
encoding:b011 | uimm[5:5] | rd[4:0] | uimm[4:2] | uimm[7:6] | b10;
|
||||
}
|
||||
C.FSDSP {//(RV32/64)
|
||||
encoding:b101 | uimm[5:3] | uimm[8:6] | rs2[4:0] | b10;
|
||||
}
|
||||
C.FSWSP {//(RV32)
|
||||
encoding:b111 | uimm[5:2] | uimm[7:6] | rs2[4:0] | b10;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
InsructionSet RV64CI extends RV32CI {
|
||||
constants {
|
||||
XLEN
|
||||
}
|
||||
address_spaces {
|
||||
MEM[8]
|
||||
}
|
||||
registers {
|
||||
[31:0] X[XLEN],
|
||||
PC[XLEN](is_pc)
|
||||
}
|
||||
instructions{
|
||||
C.LD {//(RV64/128)
|
||||
encoding:b011 | uimm[5:3] | rs1[2:0] | uimm[7:6] | rd[2:0] | b00;
|
||||
}
|
||||
C.SD { //(RV64/128)
|
||||
encoding:b111 | uimm[5:3] | rs1[2:0] | uimm[7:6] | rs2[2:0] | b00;
|
||||
}
|
||||
C.SUBW {//(RV64/128, RV32 res)
|
||||
encoding:b100 | b1 | b11 | rd[2:0] | b00 | rs2[2:0] | b01;
|
||||
args_disass: "x%rd$d, sp, 0x%imm$05x";
|
||||
}
|
||||
C.ADDW {//(RV64/128 RV32 res)
|
||||
encoding:b100 | b1 | b11 | rd[2:0] | b01 | rs2[2:0] | b01;
|
||||
args_disass: "x%rd$d, sp, 0x%imm$05x";
|
||||
}
|
||||
C.ADDIW {//(RV64/128)
|
||||
encoding:b001 | imm[5:5] | rs1[4:0] | imm[4:0] | b01;
|
||||
}
|
||||
C.SRLI64 {//(RV32/64/128)
|
||||
encoding:b100 | b0 | b00 | rs1[2:0] | b00000 | b01;
|
||||
}
|
||||
C.SRAI64 {//(RV32/64/128)
|
||||
encoding:b100 | b0 | b01 | rs1[2:0] | b00000 | b01;
|
||||
}
|
||||
C.SLLI64 {//(RV128 RV32/64)
|
||||
encoding:b000 | b0 | rs1[4:0] | b00000 | b10;
|
||||
}
|
||||
C.LDSP {//(RV64/128
|
||||
encoding:b011 | uimm[5:5] | rd[4:0] | uimm[4:3] | uimm[8:6] | b10;
|
||||
args_disass: "x%rd$d, sp, 0x%imm$05x";
|
||||
}
|
||||
C.SDSP {//(RV64/128)
|
||||
encoding:b111 | uimm[5:3] | uimm[8:6] | rs2[4:0] | b10;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
InsructionSet RV128CI extends RV64CI {
|
||||
constants {
|
||||
XLEN
|
||||
}
|
||||
address_spaces {
|
||||
MEM[8]
|
||||
}
|
||||
registers {
|
||||
[31:0] X[XLEN],
|
||||
PC[XLEN](is_pc)
|
||||
}
|
||||
instructions{
|
||||
C.LQ { //(RV128)
|
||||
encoding:b001 | uimm[5:4] | uimm[8:8] | rs1[2:0] | uimm[7:6] | rd[2:0] | b00;
|
||||
}
|
||||
C.SQ { //(RV128)
|
||||
encoding:b101 | uimm[5:4] | uimm[8:8] | rs1[2:0] | uimm[7:6] | rs2[2:0] | b00;
|
||||
}
|
||||
C.SQSP {//(RV128)
|
||||
encoding:b101 | uimm[5:4] | uimm[9:6] | rs2[4:0] | b10;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,105 +0,0 @@
|
||||
import "RV32IBase.core_desc"
|
||||
|
||||
InsructionSet RV32F extends RV32IBase{
|
||||
constants {
|
||||
FLEN, fcsr
|
||||
}
|
||||
registers {
|
||||
[31:0] F[FLEN]
|
||||
}
|
||||
instructions{
|
||||
FLW {
|
||||
encoding: imm[11:0]s | rs1[4:0] | b010 | rd[4:0] | b0000111;
|
||||
val offs[XLEN] <= X[rs1]+imm;
|
||||
F[rd]<=MEM[offs];
|
||||
}
|
||||
FSW {
|
||||
encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b010 | imm[4:0]s | b0100111;
|
||||
val offs[XLEN] <= X[rs1]+imm;
|
||||
MEM[offs]<=F[rs2];
|
||||
}
|
||||
FMADD.S {
|
||||
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1000011;
|
||||
F[rd]f<= F[rs1]f * F[rs2]f * F[rs3]f;
|
||||
}
|
||||
FMSUB.S {
|
||||
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1000111;
|
||||
F[rd]f<=F[rs1]f * F[rs2]f -F[rs3]f;
|
||||
}
|
||||
FNMSUB.S {
|
||||
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1001011;
|
||||
F[rd]f<=-F[rs1]f * F[rs2]f- F[rs3]f;
|
||||
}
|
||||
FNMADD.S {
|
||||
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1001111;
|
||||
F[rd]f<=-F[rs1]f*F[rs2]f+F[rs3]f;
|
||||
}
|
||||
FADD.S {
|
||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||
F[rd]f <= F[rs1]f + F[rs2]f;
|
||||
}
|
||||
FSUB.S {
|
||||
encoding: b0000100 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||
F[rd]f <= F[rs1]f - F[rs2]f;
|
||||
}
|
||||
FMUL.S {
|
||||
encoding: b0001000 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||
F[rd]f <= F[rs1]f * F[rs2];
|
||||
}
|
||||
FDIV.S {
|
||||
encoding: b0001100 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||
F[rd]f <= F[rs1]f / F[rs2]f;
|
||||
}
|
||||
FSQRT.S {
|
||||
encoding: b0101100 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||
F[rd]f<=sqrt(F[rs1]f);
|
||||
}
|
||||
FSGNJ.S {
|
||||
encoding: b0010000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
||||
}
|
||||
FSGNJN.S {
|
||||
encoding: b0010000 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
||||
}
|
||||
FSGNJX.S {
|
||||
encoding: b0010000 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b1010011;
|
||||
}
|
||||
FMIN.S {
|
||||
encoding: b0010100 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
||||
F[rd]f<= choose(F[rs1]f<F[rs2]f, F[rs1]f, F[rs2]f);
|
||||
}
|
||||
FMAX.S {
|
||||
encoding: b0010100 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
||||
F[rd]f<= choose(F[rs1]f>F[rs2]f, F[rs1]f, F[rs2]f);
|
||||
}
|
||||
FCVT.W.S {
|
||||
encoding: b1100000 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||
}
|
||||
FCVT.WU.S {
|
||||
encoding: b1100000 | b00001 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||
}
|
||||
FMV.X.W {
|
||||
encoding: b1110000 | b00000 | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
||||
}
|
||||
FEQ.S {
|
||||
encoding: b1010000 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b1010011;
|
||||
}
|
||||
FLT.S {
|
||||
encoding: b1010000 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
||||
}
|
||||
FLE.S {
|
||||
encoding: b1010000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
||||
}
|
||||
FCLASS.S {
|
||||
encoding: b1110000 | b00000 | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
||||
}
|
||||
FCVT.S.W {
|
||||
encoding: b1101000 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||
}
|
||||
FCVT.S.WU {
|
||||
encoding: b1101000 | b00001 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||
}
|
||||
FMV.W.X {
|
||||
encoding: b1111000 | b00000 | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,308 +0,0 @@
|
||||
InsructionSet RV32IBase {
|
||||
constants {
|
||||
XLEN,
|
||||
XLEN_BIT_MASK,
|
||||
PCLEN,
|
||||
fence,
|
||||
fencei,
|
||||
fencevmal,
|
||||
fencevmau
|
||||
}
|
||||
|
||||
address_spaces {
|
||||
MEM[8], CSR[XLEN], FENCE[XLEN]
|
||||
}
|
||||
|
||||
registers {
|
||||
[31:0] X[XLEN],
|
||||
PC[XLEN](is_pc)
|
||||
}
|
||||
|
||||
instructions {
|
||||
LUI{
|
||||
encoding: imm[31:12]s | rd[4:0] | b0110111;
|
||||
args_disass: "x%rd$d, 0x%imm$05x";
|
||||
if(rd!=0) X[rd] <= imm;
|
||||
}
|
||||
AUIPC{
|
||||
encoding: imm[31:12]s | rd[4:0] | b0010111;
|
||||
args_disass: "x%rd%, 0x%imm$08x";
|
||||
if(rd!=0) X[rd] <= PC+imm;
|
||||
}
|
||||
JAL(no_cont){
|
||||
encoding: imm[20:20]s | imm[10:1]s | imm[11:11]s | imm[19:12]s | rd[4:0] | b1101111;
|
||||
args_disass: "x%rd$d, 0x%imm$x";
|
||||
if(rd!=0) X[rd] <= PC+4;
|
||||
PC<=PC+imm;
|
||||
}
|
||||
JALR(no_cont){
|
||||
encoding: imm[11:0]s | rs1[4:0] | b000 | rd[4:0] | b1100111;
|
||||
args_disass: "x%rd$d, x%rs1$d, 0x%imm$x";
|
||||
if(rd!=0) X[rd] <= PC+4;
|
||||
val ret[XLEN] <= X[rs1]+ imm;
|
||||
PC<=ret& ~0x1;
|
||||
}
|
||||
BEQ(no_cont){
|
||||
encoding: imm[12:12]s |imm[10:5]s | rs2[4:0] | rs1[4:0] | b000 | imm[4:1]s | imm[11:11]s | b1100011;
|
||||
args_disass:"x%rs1$d, x%rs2$d, 0x%imm$x";
|
||||
PC<=choose(X[rs1]==X[rs2], PC+imm, PC+4);
|
||||
}
|
||||
BNE(no_cont){
|
||||
encoding: imm[12:12]s |imm[10:5]s | rs2[4:0] | rs1[4:0] | b001 | imm[4:1]s | imm[11:11]s | b1100011;
|
||||
args_disass:"x%rs1$d, x%rs2$d, 0x%imm$x";
|
||||
PC<=choose(X[rs1]!=X[rs2], PC+imm, PC+4);
|
||||
}
|
||||
BLT(no_cont){
|
||||
encoding: imm[12:12]s |imm[10:5]s | rs2[4:0] | rs1[4:0] | b100 | imm[4:1]s | imm[11:11]s | b1100011;
|
||||
args_disass:"x%rs1$d, x%rs2$d, 0x%imm$x";
|
||||
PC<=choose(X[rs1]s<X[rs2]s, PC+imm, PC+4);
|
||||
}
|
||||
BGE(no_cont) {
|
||||
encoding: imm[12:12]s |imm[10:5]s | rs2[4:0] | rs1[4:0] | b101 | imm[4:1]s | imm[11:11]s | b1100011;
|
||||
args_disass:"x%rs1$d, x%rs2$d, 0x%imm$x";
|
||||
PC<=choose(X[rs1]s>=X[rs2]s, PC+imm, PC+4);
|
||||
}
|
||||
BLTU(no_cont) {
|
||||
encoding: imm[12:12]s |imm[10:5]s | rs2[4:0] | rs1[4:0] | b110 | imm[4:1]s | imm[11:11]s | b1100011;
|
||||
args_disass:"x%rs1$d, x%rs2$d, 0x%imm$x";
|
||||
PC<=choose(X[rs1]<X[rs2],PC+imm, PC+4);
|
||||
}
|
||||
BGEU(no_cont) {
|
||||
encoding: imm[12:12]s |imm[10:5]s | rs2[4:0] | rs1[4:0] | b111 | imm[4:1]s | imm[11:11]s | b1100011;
|
||||
args_disass:"x%rs1$d, x%rs2$d, 0x%imm$x";
|
||||
PC<=choose(X[rs1]>=X[rs2], PC+imm, PC+4);
|
||||
}
|
||||
LB {
|
||||
encoding: imm[11:0]s | rs1[4:0] | b000 | rd[4:0] | b0000011;
|
||||
args_disass:"x%rd$d, %imm%(x%rs1$d)";
|
||||
val offs[XLEN] <= X[rs1]+imm;
|
||||
if(rd!=0) X[rd]<=sext(MEM[offs]);
|
||||
}
|
||||
LH {
|
||||
encoding: imm[11:0]s | rs1[4:0] | b001 | rd[4:0] | b0000011;
|
||||
args_disass:"x%rd$d, %imm%(x%rs1$d)";
|
||||
val offs[XLEN] <= X[rs1]+imm;
|
||||
if(rd!=0) X[rd]<=sext(MEM[offs]{16});
|
||||
}
|
||||
LW {
|
||||
encoding: imm[11:0]s | rs1[4:0] | b010 | rd[4:0] | b0000011;
|
||||
args_disass:"x%rd$d, %imm%(x%rs1$d)";
|
||||
val offs[XLEN] <= X[rs1]+imm;
|
||||
if(rd!=0) X[rd]<=sext(MEM[offs]{32});
|
||||
}
|
||||
LBU {
|
||||
encoding: imm[11:0]s | rs1[4:0] | b100 | rd[4:0] | b0000011;
|
||||
args_disass:"x%rd$d, %imm%(x%rs1$d)";
|
||||
val offs[XLEN] <= X[rs1]+imm;
|
||||
if(rd!=0) X[rd]<=zext(MEM[offs]);
|
||||
}
|
||||
LHU {
|
||||
encoding: imm[11:0]s | rs1[4:0] | b101 | rd[4:0] | b0000011;
|
||||
args_disass:"x%rd$d, %imm%(x%rs1$d)";
|
||||
val offs[XLEN] <= X[rs1]+imm;
|
||||
if(rd!=0) X[rd]<=zext(MEM[offs]{16});
|
||||
}
|
||||
SB {
|
||||
encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b000 | imm[4:0]s | b0100011;
|
||||
args_disass:"x%rs2$d, %imm%(x%rs1$d)";
|
||||
val offs[XLEN] <= X[rs1] + imm;
|
||||
MEM[offs] <= X[rs2];
|
||||
}
|
||||
SH {
|
||||
encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b001 | imm[4:0]s | b0100011;
|
||||
args_disass:"x%rs2$d, %imm%(x%rs1$d)";
|
||||
val offs[XLEN] <= X[rs1] + imm;
|
||||
MEM[offs]{16} <= X[rs2];
|
||||
}
|
||||
SW {
|
||||
encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b010 | imm[4:0]s | b0100011;
|
||||
args_disass:"x%rs2$d, %imm%(x%rs1$d)";
|
||||
val offs[XLEN] <= X[rs1] + imm;
|
||||
MEM[offs]{32} <= X[rs2];
|
||||
}
|
||||
ADDI {
|
||||
encoding: imm[11:0]s | rs1[4:0] | b000 | rd[4:0] | b0010011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %imm%";
|
||||
if(rd != 0) X[rd] <= X[rs1] + imm;
|
||||
}
|
||||
SLTI {
|
||||
encoding: imm[11:0]s | rs1[4:0] | b010 | rd[4:0] | b0010011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %imm%";
|
||||
if (rd != 0) X[rd] <= choose(X[rs1]s < imm's, 1, 0); //TODO: needs fix
|
||||
}
|
||||
SLTIU {
|
||||
encoding: imm[11:0]s | rs1[4:0] | b011 | rd[4:0] | b0010011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %imm%";
|
||||
val full_imm[XLEN] <= imm's;
|
||||
if (rd != 0) X[rd] <= choose(X[rs1]'u < full_imm'u, 1, 0);
|
||||
}
|
||||
XORI {
|
||||
encoding: imm[11:0]s | rs1[4:0] | b100 | rd[4:0] | b0010011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %imm%";
|
||||
if(rd != 0) X[rd] <= X[rs1] ^ imm;
|
||||
}
|
||||
ORI {
|
||||
encoding: imm[11:0]s | rs1[4:0] | b110 | rd[4:0] | b0010011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %imm%";
|
||||
if(rd != 0) X[rd] <= X[rs1] | imm;
|
||||
}
|
||||
ANDI {
|
||||
encoding: imm[11:0]s | rs1[4:0] | b111 | rd[4:0] | b0010011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %imm%";
|
||||
if(rd != 0) X[rd] <= X[rs1] & imm;
|
||||
}
|
||||
SLLI {
|
||||
encoding: b0000000 | shamt[4:0] | rs1[4:0] | b001 | rd[4:0] | b0010011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %shamt%";
|
||||
if(rd != 0) X[rd] <= shll(X[rs1], shamt);
|
||||
}
|
||||
SRLI {
|
||||
encoding: b0000000 | shamt[4:0] | rs1[4:0] | b101 | rd[4:0] | b0010011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %shamt%";
|
||||
if(rd != 0) X[rd] <= shrl(X[rs1], shamt);
|
||||
}
|
||||
SRAI {
|
||||
encoding: b0100000 | shamt[4:0] | rs1[4:0] | b101 | rd[4:0] | b0010011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %shamt%";
|
||||
if(rd != 0) X[rd] <= shra(X[rs1], shamt);
|
||||
}
|
||||
ADD {
|
||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0) X[rd] <= X[rs1] + X[rs2];
|
||||
}
|
||||
SUB {
|
||||
encoding: b0100000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0) X[rd] <= X[rs1] - X[rs2];
|
||||
}
|
||||
SLL {
|
||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0) X[rd] <= shll(X[rs1], X[rs2]&XLEN_BIT_MASK);
|
||||
}
|
||||
SLT {
|
||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if (rd != 0) X[rd] <= choose(X[rs1]s < X[rs2]s, 1, 0);
|
||||
}
|
||||
SLTU {
|
||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if (rd != 0) X[rd] <= choose(zext(X[rs1]) < zext(X[rs2]), 1, 0);
|
||||
}
|
||||
XOR {
|
||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b100 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0) X[rd] <= X[rs1] ^ X[rs2];
|
||||
}
|
||||
SRL {
|
||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0) X[rd] <= shrl(X[rs1], X[rs2]&XLEN_BIT_MASK);
|
||||
}
|
||||
SRA {
|
||||
encoding: b0100000 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0) X[rd] <= shra(X[rs1], X[rs2]&XLEN_BIT_MASK);
|
||||
}
|
||||
OR {
|
||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b110 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0) X[rd] <= X[rs1] | X[rs2];
|
||||
}
|
||||
AND {
|
||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b111 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0) X[rd] <= X[rs1] & X[rs2];
|
||||
}
|
||||
FENCE {
|
||||
encoding: b0000 | pred[3:0] | succ[3:0] | rs1[4:0] | b000 | rd[4:0] | b0001111;
|
||||
FENCE[fence] <= pred<<4 | succ;
|
||||
}
|
||||
FENCE_I(flush) {
|
||||
encoding: imm[11:0] | rs1[4:0] | b001 | rd[4:0] | b0001111 ;
|
||||
FENCE[fencei] <= imm;
|
||||
}
|
||||
ECALL(no_cont) {
|
||||
encoding: b000000000000 | b00000 | b000 | b00000 | b1110011;
|
||||
raise(0, 11);
|
||||
}
|
||||
EBREAK(no_cont) {
|
||||
encoding: b000000000001 | b00000 | b000 | b00000 | b1110011;
|
||||
raise(0, 3);
|
||||
}
|
||||
URET(no_cont) {
|
||||
encoding: b0000000 | b00010 | b00000 | b000 | b00000 | b1110011;
|
||||
leave(0);
|
||||
}
|
||||
SRET(no_cont) {
|
||||
encoding: b0001000 | b00010 | b00000 | b000 | b00000 | b1110011;
|
||||
leave(1);
|
||||
}
|
||||
MRET(no_cont) {
|
||||
encoding: b0011000 | b00010 | b00000 | b000 | b00000 | b1110011;
|
||||
leave(3);
|
||||
}
|
||||
WFI {
|
||||
encoding: b0001000 | b00101 | b00000 | b000 | b00000 | b1110011;
|
||||
wait(1);
|
||||
}
|
||||
SFENCE.VMA {
|
||||
encoding: b0001001 | rs2[4:0] | rs1[4:0] | b000 | b00000 | b1110011;
|
||||
FENCE[fencevmal] <= rs1;
|
||||
FENCE[fencevmau] <= rs2;
|
||||
}
|
||||
CSRRW {
|
||||
encoding: csr[11:0] | rs1[4:0] | b001 | rd[4:0] | b1110011;
|
||||
args_disass:"x%rd$d, %csr$d, x%rs1$d";
|
||||
val rs_val[XLEN] <= X[rs1];
|
||||
if(rd!=0){
|
||||
val csr_val[XLEN] <= CSR[csr];
|
||||
CSR[csr] <= rs_val;
|
||||
// make sure Xrd is updated once CSR write succeeds
|
||||
X[rd] <= csr_val;
|
||||
} else {
|
||||
CSR[csr] <= rs_val;
|
||||
}
|
||||
}
|
||||
CSRRS {
|
||||
encoding: csr[11:0] | rs1[4:0] | b010 | rd[4:0] | b1110011;
|
||||
args_disass:"x%rd$d, %csr$d, x%rs1$d";
|
||||
val xrd[XLEN] <= CSR[csr];
|
||||
val xrs1[XLEN] <= X[rs1];
|
||||
if(rd!=0) X[rd] <= xrd;
|
||||
if(rs1!=0) CSR[csr] <= xrd | xrs1;
|
||||
}
|
||||
CSRRC {
|
||||
encoding: csr[11:0] | rs1[4:0] | b011 | rd[4:0] | b1110011;
|
||||
args_disass:"x%rd$d, %csr$d, x%rs1$d";
|
||||
val xrd[XLEN] <= CSR[csr];
|
||||
val xrs1[XLEN] <= X[rs1];
|
||||
if(rd!=0) X[rd] <= xrd;
|
||||
if(rs1!=0) CSR[csr] <= xrd & ~xrs1;
|
||||
}
|
||||
CSRRWI {
|
||||
encoding: csr[11:0] | zimm[4:0] | b101 | rd[4:0] | b1110011;
|
||||
args_disass:"x%rd$d, %csr$d, 0x%zimm$x";
|
||||
if(rd!=0) X[rd] <= CSR[csr];
|
||||
CSR[csr] <= zext(zimm);
|
||||
}
|
||||
CSRRSI {
|
||||
encoding: csr[11:0] | zimm[4:0] | b110 | rd[4:0] | b1110011;
|
||||
args_disass:"x%rd$d, %csr$d, 0x%zimm$x";
|
||||
val res[XLEN] <= CSR[csr];
|
||||
if(zimm!=0) CSR[csr] <= res | zext(zimm);
|
||||
// make sure rd is written after csr write succeeds
|
||||
if(rd!=0) X[rd] <= res;
|
||||
}
|
||||
CSRRCI {
|
||||
encoding: csr[11:0] | zimm[4:0] | b111 | rd[4:0] | b1110011;
|
||||
args_disass:"x%rd$d, %csr$d, 0x%zimm$x";
|
||||
val res[XLEN] <= CSR[csr];
|
||||
if(rd!=0) X[rd] <= res;
|
||||
if(zimm!=0) CSR[csr] <= res & ~zext(zimm, XLEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,81 +0,0 @@
|
||||
import "RV32IBase.core_desc"
|
||||
|
||||
InsructionSet RV32M extends RV32IBase {
|
||||
constants {
|
||||
XLEN2
|
||||
}
|
||||
instructions{
|
||||
MUL{
|
||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
val res[XLEN2] <= zext(X[rs1], XLEN2) * zext(X[rs2], XLEN2);
|
||||
X[rd]<= zext(res , XLEN);
|
||||
}
|
||||
}
|
||||
MULH {
|
||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
val res[XLEN2] <= sext(X[rs1], XLEN2) * sext(X[rs2], XLEN2);
|
||||
X[rd]<= zext(res >> XLEN, XLEN);
|
||||
}
|
||||
}
|
||||
MULHSU {
|
||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
val res[XLEN2] <= sext(X[rs1], XLEN2) * zext(X[rs2], XLEN2);
|
||||
X[rd]<= zext(res >> XLEN, XLEN);
|
||||
}
|
||||
}
|
||||
MULHU {
|
||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
val res[XLEN2] <= zext(X[rs1], XLEN2) * zext(X[rs2], XLEN2);
|
||||
X[rd]<= zext(res >> XLEN, XLEN);
|
||||
}
|
||||
}
|
||||
DIV {
|
||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b100 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
if(X[rs2]!=0)
|
||||
X[rd] <= sext(X[rs1], 32) / sext(X[rs2], 32);
|
||||
else
|
||||
X[rd] <= -1;
|
||||
}
|
||||
}
|
||||
DIVU {
|
||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
if(X[rs2]!=0)
|
||||
X[rd] <= zext(X[rs1], 32) / zext(X[rs2], 32);
|
||||
else
|
||||
X[rd] <= -1;
|
||||
}
|
||||
}
|
||||
REM {
|
||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b110 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
if(X[rs2]!=0)
|
||||
X[rd] <= sext(X[rs1], 32) % sext(X[rs2], 32);
|
||||
else
|
||||
X[rd] <= X[rs1];
|
||||
}
|
||||
}
|
||||
REMU {
|
||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b111 | rd[4:0] | b0110011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
if(X[rs2]!=0)
|
||||
X[rd] <= zext(X[rs1], 32) % zext(X[rs2], 32);
|
||||
else
|
||||
X[rd] <= X[rs1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,111 +0,0 @@
|
||||
import "RV64IBase.core_desc"
|
||||
|
||||
InsructionSet RV64A extends RV64IBase{
|
||||
|
||||
address_spaces {
|
||||
RES[8]
|
||||
}
|
||||
|
||||
instructions{
|
||||
LR.D {
|
||||
encoding: b00010 | aq[0:0] | rl[0:0] | b00000 | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d";
|
||||
if(rd!=0){
|
||||
val offs[XLEN] <= X[rs1];
|
||||
X[rd]<= sext(MEM[offs]{64}, XLEN);
|
||||
RES[offs]{64}<=sext(-1, 64);
|
||||
}
|
||||
}
|
||||
SC.D {
|
||||
encoding: b00011 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d";
|
||||
val offs[XLEN] <= X[rs1];
|
||||
val res[64] <= RES[offs];
|
||||
if(res!=0){
|
||||
MEM[offs]{64} <= X[rs2];
|
||||
if(rd!=0) X[rd]<=0;
|
||||
} else{
|
||||
if(rd!=0) X[rd]<= 1;
|
||||
}
|
||||
}
|
||||
AMOSWAP.D{
|
||||
encoding: b00001 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%a,rel=%rl)";
|
||||
val offs[XLEN] <= X[rs1];
|
||||
if(rd!=0) X[rd] <= sext(MEM[offs]{64});
|
||||
MEM[offs]{64} <= X[rs2];
|
||||
}
|
||||
AMOADD.D{
|
||||
encoding: b00000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%a,rel=%rl)";
|
||||
val offs[XLEN] <= X[rs1];
|
||||
val res[XLEN] <= sext(MEM[offs]{64});
|
||||
if(rd!=0) X[rd]<=res;
|
||||
val res2[XLEN] <= res + X[rs2];
|
||||
MEM[offs]{64}<=res2;
|
||||
}
|
||||
AMOXOR.D{
|
||||
encoding: b00100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%a,rel=%rl)";
|
||||
val offs[XLEN] <= X[rs1];
|
||||
val res[XLEN] <= sext(MEM[offs]{64});
|
||||
if(rd!=0) X[rd] <= res;
|
||||
val res2[XLEN] <= res ^ X[rs2];
|
||||
MEM[offs]{64} <= res2;
|
||||
}
|
||||
AMOAND.D{
|
||||
encoding: b01100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%a,rel=%rl)";
|
||||
val offs[XLEN] <= X[rs1];
|
||||
val res[XLEN] <= sext(MEM[offs]{64});
|
||||
if(rd!=0) X[rd] <= res;
|
||||
val res2[XLEN] <= res & X[rs2];
|
||||
MEM[offs]{64} <= res2;
|
||||
}
|
||||
AMOOR.D {
|
||||
encoding: b01000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%a,rel=%rl)";
|
||||
val offs[XLEN] <= X[rs1];
|
||||
val res[XLEN] <= sext(MEM[offs]{64});
|
||||
if(rd!=0) X[rd] <= res;
|
||||
val res2[XLEN] <= res | X[rs2];
|
||||
MEM[offs]{64} <= res2;
|
||||
}
|
||||
AMOMIN.D{
|
||||
encoding: b10000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%a,rel=%rl)";
|
||||
val offs[XLEN] <= X[rs1];
|
||||
val res[XLEN] <= sext(MEM[offs]{64});
|
||||
if(rd!=0) X[rd] <= res;
|
||||
val res2[XLEN] <= choose(res s > X[rs2]s, X[rs2], res);
|
||||
MEM[offs]{64} <= res;
|
||||
}
|
||||
AMOMAX.D{
|
||||
encoding: b10100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%a,rel=%rl)";
|
||||
val offs[XLEN] <= X[rs1];
|
||||
val res[XLEN] <= sext(MEM[offs]{64});
|
||||
if(rd!=0) X[rd] <= res;
|
||||
val res2[XLEN] <= choose(res s < X[rs2]s, X[rs2], res);
|
||||
MEM[offs]{64} <= res2;
|
||||
}
|
||||
AMOMINU.D{
|
||||
encoding: b11000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%a,rel=%rl)";
|
||||
val offs[XLEN] <= X[rs1];
|
||||
val res[XLEN] <= zext(MEM[offs]{64});
|
||||
if(rd!=0) X[rd] <= res;
|
||||
val res2[XLEN] <= choose(res > X[rs2], X[rs2], res);
|
||||
MEM[offs]{64} <= res2;
|
||||
}
|
||||
AMOMAXU.D{
|
||||
encoding: b11100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
||||
args_disass: "x%rd$d, x%rs1$d, x%rs2$d (aqu=%a,rel=%rl)";
|
||||
val offs[XLEN] <= X[rs1];
|
||||
val res[XLEN] <= zext(MEM[offs]{64});
|
||||
if(rd!=0) X[rd] <= res;
|
||||
val res2[XLEN] <= choose(res < X[rs2], X[rs2], res);
|
||||
MEM[offs]{64} <= res2;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,99 +0,0 @@
|
||||
import "RV32IBase.core_desc"
|
||||
|
||||
InsructionSet RV64IBase extends RV32IBase {
|
||||
instructions{
|
||||
LWU {
|
||||
encoding: imm[11:0]s | rs1[4:0] | b010 | rd[4:0] | b0000011;
|
||||
args_disass:"x%rd$d, %imm%(x%rs1$d)";
|
||||
val offs[XLEN] <= X[rs1]+imm;
|
||||
if(rd!=0) X[rd]<=zext(MEM[offs]{32});
|
||||
}
|
||||
LD{
|
||||
encoding: imm[11:0]s | rs1[4:0] | b011 | rd[4:0] | b0000011;
|
||||
args_disass:"x%rd$d, %imm%(x%rs1$d)";
|
||||
val offs[XLEN] <= X[rs1]+imm;
|
||||
if(rd!=0) X[rd]<=sext(MEM[offs]{64});
|
||||
}
|
||||
SD{
|
||||
encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b011 | imm[4:0] | b0100011;
|
||||
args_disass:"x%rs2$d, %imm%(x%rs1$d)";
|
||||
val offs[XLEN] <= X[rs1] + sext(imm, XLEN);
|
||||
MEM[offs]{64} <= X[rs2];
|
||||
}
|
||||
SLLI {
|
||||
encoding: b000000 | shamt[5:0] | rs1[4:0] | b001 | rd[4:0] | b0010011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %shamt%";
|
||||
if(rd != 0) X[rd] <= shll(X[rs1], shamt);
|
||||
}
|
||||
SRLI {
|
||||
encoding: b000000 | shamt[5:0] | rs1[4:0] | b101 | rd[4:0] | b0010011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %shamt%";
|
||||
if(rd != 0) X[rd] <= shrl(X[rs1], shamt);
|
||||
}
|
||||
SRAI {
|
||||
encoding: b010000 | shamt[5:0] | rs1[4:0] | b101 | rd[4:0] | b0010011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %shamt%";
|
||||
if(rd != 0) X[rd] <= shra(X[rs1], shamt);
|
||||
}
|
||||
ADDIW {
|
||||
encoding: imm[11:0]s | rs1[4:0] | b000 | rd[4:0] | b0011011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %imm%";
|
||||
if(rd != 0) X[rd] <= sext(X[rs1]{32}, XLEN) + sext(imm, XLEN);
|
||||
}
|
||||
SLLIW {
|
||||
encoding: b0000000 | shamt[4:0] | rs1[4:0] | b001 | rd[4:0] | b0011011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %shamt%";
|
||||
if(rd != 0){
|
||||
val sh_val[32] <= shll(X[rs1]{32}, shamt);
|
||||
X[rd] <= sext(sh_val, XLEN);
|
||||
}
|
||||
}
|
||||
SRLIW {
|
||||
encoding: b0000000 | shamt[4:0] | rs1[4:0] | b101 | rd[4:0] | b0011011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %shamt%";
|
||||
if(rd != 0){
|
||||
val sh_val[32] <= shrl(X[rs1], shamt);
|
||||
X[rd] <= sext(sh_val, XLEN);
|
||||
}
|
||||
}
|
||||
SRAIW {
|
||||
encoding: b0100000 | shamt[4:0] | rs1[4:0] | b101 | rd[4:0] | b0011011;
|
||||
args_disass:"x%rd$d, x%rs1$d, %shamt%";
|
||||
if(rd != 0){
|
||||
val sh_val[32] <= shra(X[rs1], shamt);
|
||||
X[rd] <= sext(sh_val, XLEN);
|
||||
}
|
||||
}
|
||||
ADDW {
|
||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0111011;
|
||||
}
|
||||
SUBW {
|
||||
encoding: b0100000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0111011;
|
||||
}
|
||||
SLLW {
|
||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b0111011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
val sh_val[32] <= shll(X[rs1], X[rs2]&0x1f);
|
||||
X[rd] <= sext(sh_val, XLEN);
|
||||
}
|
||||
}
|
||||
SRLW {
|
||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0111011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
val sh_val[32] <= shrl(X[rs1], X[rs2]&0x1f);
|
||||
X[rd] <= sext(sh_val, XLEN);
|
||||
}
|
||||
}
|
||||
SRAW {
|
||||
encoding: b0100000 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0111011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
val sh_val[32] <= shra(X[rs1], X[rs2]&0x1f);
|
||||
X[rd] <= sext(sh_val, XLEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,41 +0,0 @@
|
||||
import "RV64IBase.core_desc"
|
||||
|
||||
InsructionSet RV64M extends RV64IBase {
|
||||
instructions{
|
||||
MULW{
|
||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0111011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
X[rd]<= X[rs1] * X[rs2];
|
||||
}
|
||||
}
|
||||
DIVW {
|
||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b100 | rd[4:0] | b0111011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
X[rd] <= X[rs1]s / X[rs2]s;
|
||||
}
|
||||
}
|
||||
DIVUW {
|
||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0111011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
X[rd] <= X[rs1] / X[rs2];
|
||||
}
|
||||
}
|
||||
REMW {
|
||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b110 | rd[4:0] | b0111011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
X[rd] <= X[rs1]s % X[rs2]s;
|
||||
}
|
||||
}
|
||||
REMUW {
|
||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b111 | rd[4:0] | b0111011;
|
||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||
if(rd != 0){
|
||||
X[rd] <= X[rs1] % X[rs2];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -227,13 +227,13 @@ protected:
|
||||
|
||||
inline
|
||||
llvm::Value* gen_reg_load(unsigned i, unsigned level=0){
|
||||
if(level){
|
||||
// if(level){
|
||||
return this->builder->CreateLoad(get_reg_ptr(i), false);
|
||||
} else {
|
||||
if(!this->loaded_regs[i])
|
||||
this->loaded_regs[i]=this->builder->CreateLoad(get_reg_ptr(i), false);
|
||||
return this->loaded_regs[i];
|
||||
}
|
||||
// } else {
|
||||
// if(!this->loaded_regs[i])
|
||||
// this->loaded_regs[i]=this->builder->CreateLoad(get_reg_ptr(i), false);
|
||||
// return this->loaded_regs[i];
|
||||
// }
|
||||
}
|
||||
|
||||
inline
|
||||
@ -523,7 +523,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("LUI x%1$d, 0x%2$05x");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -556,7 +556,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("AUIPC x%1%, 0x%2$08x");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -591,7 +591,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("JAL x%1$d, 0x%2$x");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -629,7 +629,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("JALR x%1$d, x%2$d, 0x%3$x");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -670,7 +670,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("BEQ x%1$d, x%2$d, 0x%3$x");
|
||||
ins_fmter % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -711,7 +711,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("BNE x%1$d, x%2$d, 0x%3$x");
|
||||
ins_fmter % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -752,7 +752,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("BLT x%1$d, x%2$d, 0x%3$x");
|
||||
ins_fmter % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -797,7 +797,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("BGE x%1$d, x%2$d, 0x%3$x");
|
||||
ins_fmter % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -842,7 +842,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("BLTU x%1$d, x%2$d, 0x%3$x");
|
||||
ins_fmter % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -883,7 +883,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("BGEU x%1$d, x%2$d, 0x%3$x");
|
||||
ins_fmter % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -924,7 +924,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("LB x%1$d, %2%(x%3$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (int64_t)fld_imm_val % (uint64_t)fld_rs1_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -964,7 +964,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("LH x%1$d, %2%(x%3$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (int64_t)fld_imm_val % (uint64_t)fld_rs1_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1004,7 +1004,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("LW x%1$d, %2%(x%3$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (int64_t)fld_imm_val % (uint64_t)fld_rs1_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1044,7 +1044,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("LBU x%1$d, %2%(x%3$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (int64_t)fld_imm_val % (uint64_t)fld_rs1_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1084,7 +1084,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("LHU x%1$d, %2%(x%3$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (int64_t)fld_imm_val % (uint64_t)fld_rs1_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1124,7 +1124,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("SB x%1$d, %2%(x%3$d)");
|
||||
ins_fmter % (uint64_t)fld_rs2_val % (int64_t)fld_imm_val % (uint64_t)fld_rs1_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1162,7 +1162,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("SH x%1$d, %2%(x%3$d)");
|
||||
ins_fmter % (uint64_t)fld_rs2_val % (int64_t)fld_imm_val % (uint64_t)fld_rs1_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1200,7 +1200,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("SW x%1$d, %2%(x%3$d)");
|
||||
ins_fmter % (uint64_t)fld_rs2_val % (int64_t)fld_imm_val % (uint64_t)fld_rs1_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1238,7 +1238,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("ADDI x%1$d, x%2$d, %3%");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1274,7 +1274,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("SLTI x%1$d, x%2$d, %3%");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1319,7 +1319,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("SLTIU x%1$d, x%2$d, %3%");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1365,7 +1365,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("XORI x%1$d, x%2$d, %3%");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1401,7 +1401,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("ORI x%1$d, x%2$d, %3%");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1437,7 +1437,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("ANDI x%1$d, x%2$d, %3%");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1473,7 +1473,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("SLLI x%1$d, x%2$d, %3%");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_shamt_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1509,7 +1509,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("SRLI x%1$d, x%2$d, %3%");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_shamt_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1545,7 +1545,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("SRAI x%1$d, x%2$d, %3%");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_shamt_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1581,7 +1581,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("ADD x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1617,7 +1617,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("SUB x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1653,7 +1653,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("SLL x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1691,7 +1691,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("SLT x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1736,7 +1736,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("SLTU x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1783,7 +1783,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("XOR x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1819,7 +1819,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("SRL x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1857,7 +1857,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("SRA x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1895,7 +1895,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("OR x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -1931,7 +1931,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("AND x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -2235,7 +2235,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("CSRRW x%1$d, %2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_csr_val % (uint64_t)fld_rs1_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -2282,7 +2282,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("CSRRS x%1$d, %2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_csr_val % (uint64_t)fld_rs1_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -2327,7 +2327,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("CSRRC x%1$d, %2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_csr_val % (uint64_t)fld_rs1_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -2372,7 +2372,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("CSRRWI x%1$d, %2$d, 0x%3$x");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_csr_val % (uint64_t)fld_zimm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -2414,7 +2414,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("CSRRSI x%1$d, %2$d, 0x%3$x");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_csr_val % (uint64_t)fld_zimm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -2461,7 +2461,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("CSRRCI x%1$d, %2$d, 0x%3$x");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_csr_val % (uint64_t)fld_zimm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -2508,7 +2508,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("MUL x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -2554,7 +2554,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("MULH x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -2602,7 +2602,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("MULHSU x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -2650,7 +2650,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("MULHU x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -2698,7 +2698,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("DIV x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -2762,7 +2762,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("DIVU x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -2826,7 +2826,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("REM x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -2890,7 +2890,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("REMU x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -2955,7 +2955,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("LR.W x%1$d, x%2$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3003,7 +3003,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("SC.W x%1$d, x%2$d, x%3$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3068,7 +3068,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("AMOSWAP.W x%1$d, x%2$d, x%3$d (aqu=%4$d,rel=%5$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (uint64_t)fld_aq_val % (uint64_t)fld_rl_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3113,7 +3113,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("AMOADD.W x%1$d, x%2$d, x%3$d (aqu=%4$d,rel=%5$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (uint64_t)fld_aq_val % (uint64_t)fld_rl_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3162,7 +3162,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("AMOXOR.W x%1$d, x%2$d, x%3$d (aqu=%4$d,rel=%5$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (uint64_t)fld_aq_val % (uint64_t)fld_rl_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3211,7 +3211,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("AMOAND.W x%1$d, x%2$d, x%3$d (aqu=%4$d,rel=%5$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (uint64_t)fld_aq_val % (uint64_t)fld_rl_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3260,7 +3260,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("AMOOR.W x%1$d, x%2$d, x%3$d (aqu=%4$d,rel=%5$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (uint64_t)fld_aq_val % (uint64_t)fld_rl_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3309,7 +3309,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("AMOMIN.W x%1$d, x%2$d, x%3$d (aqu=%4$d,rel=%5$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (uint64_t)fld_aq_val % (uint64_t)fld_rl_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3367,7 +3367,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("AMOMAX.W x%1$d, x%2$d, x%3$d (aqu=%4$d,rel=%5$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (uint64_t)fld_aq_val % (uint64_t)fld_rl_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3425,7 +3425,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("AMOMINU.W x%1$d, x%2$d, x%3$d (aqu=%4$d,rel=%5$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (uint64_t)fld_aq_val % (uint64_t)fld_rl_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3479,7 +3479,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("AMOMAXU.W x%1$d, x%2$d, x%3$d (aqu=%4$d,rel=%5$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (uint64_t)fld_aq_val % (uint64_t)fld_rl_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3534,7 +3534,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.ADDI4SPN x%1$d, 0x%2$05x");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_nzuimm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3573,7 +3573,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.LW x(8+%1$d), x(8+%2$d), 0x%3$05x");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs1_val % (uint64_t)fld_uimm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3610,7 +3610,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.SW x(8+%1$d), x(8+%2$d), 0x%3$05x");
|
||||
ins_fmter % (uint64_t)fld_rs1_val % (uint64_t)fld_rs2_val % (uint64_t)fld_uimm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3648,7 +3648,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.NOP ");
|
||||
ins_fmter ;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3678,7 +3678,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.ADDI x%1$d, 0x%2$05x");
|
||||
ins_fmter % (uint64_t)fld_rs1_val % (int64_t)fld_nzimm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3713,7 +3713,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.JAL 0x%1$05x");
|
||||
ins_fmter % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3749,7 +3749,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.LI x%1$d, 0x%2$05x");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3783,7 +3783,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.LUI x%1$d, 0x%2$05x");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (int64_t)fld_nzimm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3822,7 +3822,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.ADDI16SP 0x%1$05x");
|
||||
ins_fmter % (int64_t)fld_nzimm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3858,7 +3858,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.SRLI x(8+%1$d), %2$d");
|
||||
ins_fmter % (uint64_t)fld_rs1_val % (uint64_t)fld_shamt_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3895,7 +3895,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.SRAI x(8+%1$d), %2$d");
|
||||
ins_fmter % (uint64_t)fld_rs1_val % (uint64_t)fld_shamt_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3932,7 +3932,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.ANDI x(8+%1$d), 0x%2$05x");
|
||||
ins_fmter % (uint64_t)fld_rs1_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -3966,7 +3966,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.SUB x(8+%1$d), x(8+%2$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -4001,7 +4001,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.XOR x(8+%1$d), x(8+%2$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -4036,7 +4036,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.OR x(8+%1$d), x(8+%2$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -4071,7 +4071,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.AND x(8+%1$d), x(8+%2$d)");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -4105,7 +4105,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.J 0x%1$05x");
|
||||
ins_fmter % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -4136,7 +4136,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.BEQZ x(8+%1$d), 0x%2$05x");
|
||||
ins_fmter % (uint64_t)fld_rs1d_val % (int64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -4177,7 +4177,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.BNEZ x(8+%1$d),, 0x%2$05x");
|
||||
ins_fmter % (uint64_t)fld_rs1d_val % (uint64_t)fld_imm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -4218,7 +4218,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.SLLI x%1$d, %2$d");
|
||||
ins_fmter % (uint64_t)fld_rs1_val % (uint64_t)fld_shamt_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -4286,7 +4286,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.LWSP x%1$d, sp, 0x%2$05x");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_uimm_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -4321,7 +4321,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.MV x%1$d, x%2$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -4351,7 +4351,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.JR x%1$d");
|
||||
ins_fmter % (uint64_t)fld_rs1_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -4406,7 +4406,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.ADD x%1$d, x%2$d");
|
||||
ins_fmter % (uint64_t)fld_rd_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -4438,7 +4438,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.JALR x%1$d");
|
||||
ins_fmter % (uint64_t)fld_rs1_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -4472,7 +4472,7 @@ private:
|
||||
/* generate console output when executing the command */
|
||||
boost::format ins_fmter("C.SWSP x2+0x%1$05x, x%2$d");
|
||||
ins_fmter % (uint64_t)fld_uimm_val % (uint64_t)fld_rs2_val;
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t%%v");
|
||||
boost::format fmter("0x%1$016x\t\t%2$-40s\t\t");
|
||||
fmter % pc.val % ins_fmter.str();
|
||||
std::vector<llvm::Value*> args {
|
||||
this->core_ptr,
|
||||
@ -4591,7 +4591,7 @@ void vm_impl<ARCH>::gen_leave_behavior(llvm::BasicBlock* leave_blk){
|
||||
|
||||
template<typename ARCH>
|
||||
void vm_impl<ARCH>::gen_raise_trap(uint16_t trap_id, uint16_t cause){
|
||||
auto* TRAP_val = this->gen_const(traits<ARCH>::XLEN, 0x80<<24| (cause<<16) | trap_id );
|
||||
auto* TRAP_val = this->gen_const(32, 0x80<<24| (cause<<16) | trap_id );
|
||||
this->builder->CreateStore(TRAP_val, get_reg_ptr(traits<ARCH>::TRAP_STATE), true);
|
||||
}
|
||||
|
||||
|
3884
riscv/src/internal/vm_rv64ia.cpp
Normal file
3884
riscv/src/internal/vm_rv64ia.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,21 +1,21 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2017, MINRES Technologies GmbH
|
||||
// All rights reserved.
|
||||
//
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
@ -27,29 +27,50 @@
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Contributors:
|
||||
// eyck@minres.com - initial API and implementation
|
||||
//
|
||||
//
|
||||
// Created on: Tue Sep 05 18:57:24 CEST 2017
|
||||
// * rv64ia.cpp Author: <CoreDSL Generator>
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <sysc/SiFive/core_complex.h>
|
||||
#include "util/ities.h"
|
||||
#include <util/logging.h>
|
||||
|
||||
namespace sysc {
|
||||
namespace SiFive {
|
||||
#include <elfio/elfio.hpp>
|
||||
#include <iss/arch/rv64ia.h>
|
||||
|
||||
core_complex::core_complex(sc_core::sc_module_name name)
|
||||
:sc_core::sc_module(name)
|
||||
, NAMED(initiator)
|
||||
, NAMED(rst_i){
|
||||
// TODO Auto-generated constructor stub
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#include <ihex.h>
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#include <fstream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
|
||||
using namespace iss::arch;
|
||||
|
||||
rv64ia::rv64ia() {
|
||||
reg.icount=0;
|
||||
}
|
||||
|
||||
core_complex::~core_complex() {
|
||||
// TODO Auto-generated destructor stub
|
||||
rv64ia::~rv64ia(){
|
||||
}
|
||||
|
||||
} /* namespace SiFive */
|
||||
} /* namespace sysc */
|
||||
void rv64ia::reset(uint64_t address) {
|
||||
for(size_t i=0; i<traits<rv64ia>::NUM_REGS; ++i) set_reg(i, std::vector<uint8_t>(sizeof(traits<rv64ia>::reg_t),0));
|
||||
reg.PC=address;
|
||||
reg.NEXT_PC=reg.PC;
|
||||
reg.trap_state=0;
|
||||
reg.machine_state=0x0;
|
||||
}
|
||||
|
||||
uint8_t* rv64ia::get_regs_base_ptr(){
|
||||
return reinterpret_cast<uint8_t*>(®);
|
||||
}
|
||||
|
||||
rv64ia::phys_addr_t rv64ia::v2p(const iss::addr_t& pc) {
|
||||
return phys_addr_t(pc); //change logical address to physical address
|
||||
}
|
@ -40,9 +40,6 @@
|
||||
#include <iss/arch/rv32imac.h>
|
||||
#include <iss/arch/rv64ia.h>
|
||||
#include <iss/jit/MCJIThelper.h>
|
||||
#ifdef WITH_SYSTEMC
|
||||
#include <sysc/kernel/sc_externs.h>
|
||||
#endif
|
||||
#include <boost/lexical_cast.hpp>
|
||||
|
||||
namespace po= boost::program_options;
|
||||
@ -55,52 +52,43 @@ int main(int argc, char *argv[]) {
|
||||
if(parse_cli_options(vm, argc, argv)) return ERROR_IN_COMMAND_LINE;
|
||||
configure_default_logger(vm);
|
||||
// configure the connection logger
|
||||
configure_debugger_logger();
|
||||
configure_debugger_logger();
|
||||
|
||||
// application code comes here //
|
||||
iss::init_jit(argc, argv);
|
||||
if(vm.count("systemc")){
|
||||
#ifdef WITH_SYSTEMC
|
||||
return sc_core::sc_elab_and_sim(argc, argv);
|
||||
#else
|
||||
std::cerr<<"SystemC simulation is currently not supported, please rebuild with -DWITH_SYSTEMC"<<std::endl;
|
||||
#endif
|
||||
bool dump=vm.count("dump-ir");
|
||||
// instantiate the simulator
|
||||
std::unique_ptr<iss::vm_if> cpu = nullptr;
|
||||
if(vm.count("rv64")==1){
|
||||
if(vm.count("gdb-port")==1)
|
||||
cpu = iss::create<iss::arch::rv64ia>("rv64ia", vm["gdb-port"].as<unsigned>(), dump);
|
||||
else
|
||||
cpu = iss::create<iss::arch::rv64ia>("rv64ia", dump);
|
||||
} else {
|
||||
bool dump=vm.count("dump-ir");
|
||||
// instantiate the simulator
|
||||
std::unique_ptr<iss::vm_if> cpu = nullptr;
|
||||
if(vm.count("rv64")==1){
|
||||
if(vm.count("gdb-port")==1)
|
||||
cpu = iss::create<iss::arch::rv64ia>("rv64ia", vm["gdb-port"].as<unsigned>(), dump);
|
||||
else
|
||||
cpu = iss::create<iss::arch::rv64ia>("rv64ia", dump);
|
||||
} else {
|
||||
if(vm.count("gdb-port")==1)
|
||||
cpu = iss::create<iss::arch::rv32imac>("rv32ima", vm["gdb-port"].as<unsigned>(), dump);
|
||||
else
|
||||
cpu = iss::create<iss::arch::rv32imac>("rv32ima", dump);
|
||||
}
|
||||
if(vm.count("elf")){
|
||||
for(std::string input: vm["elf"].as<std::vector<std::string> >())
|
||||
cpu->get_arch()->load_file(input);
|
||||
} else if(vm.count("mem")){
|
||||
cpu->get_arch()->load_file(vm["mem"].as<std::string>() , iss::arch::traits<iss::arch::rv32imac>::MEM);
|
||||
} //else
|
||||
// LOG(FATAL)<<"At least one (flash-)input file (ELF or IHEX) needs to be specified";
|
||||
|
||||
configure_disass_logger(vm);
|
||||
if(vm.count("disass")){
|
||||
cpu->setDisassEnabled(true);
|
||||
}
|
||||
if(vm.count("reset")){
|
||||
auto str = vm["reset"].as<std::string>();
|
||||
auto start_address = str.find("0x")==0? std::stoull(str, 0, 16):std::stoull(str, 0, 10);
|
||||
cpu->reset(start_address);
|
||||
} else {
|
||||
cpu->reset();
|
||||
}
|
||||
return cpu->start(vm["cycles"].as<int64_t>());
|
||||
if(vm.count("gdb-port")==1)
|
||||
cpu = iss::create<iss::arch::rv32imac>("rv32ima", vm["gdb-port"].as<unsigned>(), dump);
|
||||
else
|
||||
cpu = iss::create<iss::arch::rv32imac>("rv32ima", dump);
|
||||
}
|
||||
if(vm.count("elf")){
|
||||
for(std::string input: vm["elf"].as<std::vector<std::string> >())
|
||||
cpu->get_arch()->load_file(input);
|
||||
} else if(vm.count("mem")){
|
||||
cpu->get_arch()->load_file(vm["mem"].as<std::string>() , iss::arch::traits<iss::arch::rv32imac>::MEM);
|
||||
}
|
||||
|
||||
configure_disass_logger(vm);
|
||||
if(vm.count("disass")){
|
||||
cpu->setDisassEnabled(true);
|
||||
}
|
||||
if(vm.count("reset")){
|
||||
auto str = vm["reset"].as<std::string>();
|
||||
auto start_address = str.find("0x")==0? std::stoull(str, 0, 16):std::stoull(str, 0, 10);
|
||||
cpu->reset(start_address);
|
||||
} else {
|
||||
cpu->reset();
|
||||
}
|
||||
return cpu->start(vm["cycles"].as<int64_t>());
|
||||
} catch(std::exception& e){
|
||||
LOG(logging::ERROR) << "Unhandled Exception reached the top of main: "
|
||||
<< e.what() << ", application will now exit" << std::endl;
|
||||
|
@ -1,44 +0,0 @@
|
||||
import "RV32IBase.core_desc"
|
||||
import "RV32M.core_desc"
|
||||
import "RV32A.core_desc"
|
||||
import "RV32C.core_desc"
|
||||
import "RV64IBase.core_desc"
|
||||
//import "RV64M.core_desc"
|
||||
import "RV64A.core_desc"
|
||||
|
||||
Core RV32IMAC provides RV32IBase,RV32M,RV32A, RV32CI {
|
||||
template:"vm_riscv.in.cpp";
|
||||
constants {
|
||||
XLEN:=32;
|
||||
XLEN2:=64;
|
||||
XLEN_BIT_MASK:=0x1f;
|
||||
PCLEN:=32;
|
||||
fence:=0;
|
||||
fencei:=1;
|
||||
fencevmal:=2;
|
||||
fencevmau:=3;
|
||||
// XL ZYXWVUTSRQPONMLKJIHGFEDCBA
|
||||
MISA_VAL:=0b01000000000101000001000100000001;
|
||||
PGSIZE := 4096; //1 << 12;
|
||||
PGMASK := 4095; //PGSIZE-1
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Core RV64IA provides RV64IBase,RV64A {
|
||||
template:"vm_riscv.in.cpp";
|
||||
constants {
|
||||
XLEN:=64;
|
||||
XLEN2:=128;
|
||||
XLEN_BIT_MASK:=0x3f;
|
||||
PCLEN:=64;
|
||||
fence:=0;
|
||||
fencei:=1;
|
||||
fencevmal:=2;
|
||||
fencevmau:=3;
|
||||
// XL ZYXWVUTSRQPONMLKJIHGFEDCBA
|
||||
MISA_VAL:=0b10000000000001000001000100000000;
|
||||
PGSIZE := 4096; //1 << 12;
|
||||
PGMASK := 4095; //PGSIZE-1
|
||||
}
|
||||
}
|
@ -1,83 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright 2017 eyck@minres.com
|
||||
//
|
||||
// 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.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/*
|
||||
* sc_main.cpp
|
||||
*
|
||||
* Created on: 17.09.2017
|
||||
* Author: eyck@minres.com
|
||||
*/
|
||||
|
||||
#include <sysc/tracer.h>
|
||||
#include <sysc/scv_tr_db.h>
|
||||
#include <sr_report/sr_report.h>
|
||||
#include <boost/program_options.hpp>
|
||||
#include <sysc/report.h>
|
||||
#include <sstream>
|
||||
#include <sysc/SiFive/platform.h>
|
||||
|
||||
using namespace sysc;
|
||||
namespace po = boost::program_options;
|
||||
|
||||
namespace {
|
||||
const size_t ERROR_IN_COMMAND_LINE = 1;
|
||||
const size_t SUCCESS = 0;
|
||||
const size_t ERROR_UNHANDLED_EXCEPTION = 2;
|
||||
} // namespace
|
||||
|
||||
int sc_main(int argc, char* argv[]){
|
||||
// sc_report_handler::set_handler(my_report_handler);
|
||||
sysc::Logger::reporting_level()=log::DEBUG;
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// CLI argument parsing
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
po::options_description desc("Options");\
|
||||
desc.add_options()\
|
||||
("help,h", "Print help message")\
|
||||
("debug,d", po::value<int>(), "set debug level")\
|
||||
("trace,t", "trace SystemC signals");
|
||||
po::variables_map vm;
|
||||
try {
|
||||
po::store(po::parse_command_line(argc, argv, desc), vm); // can throw
|
||||
// --help option
|
||||
if ( vm.count("help") ){
|
||||
std::cout << "JIT-ISS simulator for AVR" << std::endl << desc << std::endl;
|
||||
return SUCCESS;
|
||||
}
|
||||
po::notify(vm); // throws on error, so do after help in case
|
||||
// there are any problems
|
||||
} catch(po::error& e){
|
||||
std::cerr << "ERROR: " << e.what() << std::endl << std::endl;
|
||||
std::cerr << desc << std::endl;
|
||||
return ERROR_IN_COMMAND_LINE;
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// set up tracing & transaction recording
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
sysc::tracer trace("simple_system", sysc::tracer::TEXT, vm.count("trace"));
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// instantiate top level
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
platform i_simple_system("i_simple_system");
|
||||
//sr_report_handler::add_sc_object_to_filter(&i_simple_system.i_master, sc_core::SC_WARNING, sc_core::SC_MEDIUM);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// run simulation
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
sc_start(sc_core::sc_time(100, sc_core::SC_NS));
|
||||
if(!sc_end_of_simulation_invoked()) sc_stop();
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,50 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright 2017 eyck@minres.com
|
||||
//
|
||||
// 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 "sysc/SiFive/gpio.h"
|
||||
#include "sysc/SiFive/gen/gpio_regs.h"
|
||||
#include "sysc/utilities.h"
|
||||
|
||||
namespace sysc {
|
||||
|
||||
gpio::gpio(sc_core::sc_module_name nm)
|
||||
: sc_core::sc_module(nm)
|
||||
, tlm_target<>(clk)
|
||||
, NAMED(clk_i)
|
||||
, NAMED(rst_i)
|
||||
, NAMEDD(gpio_regs, regs)
|
||||
{
|
||||
regs->registerResources(*this);
|
||||
SC_METHOD(clock_cb);
|
||||
sensitive<<clk_i;
|
||||
SC_METHOD(reset_cb);
|
||||
sensitive<<rst_i;
|
||||
}
|
||||
|
||||
gpio::~gpio() {
|
||||
}
|
||||
|
||||
void gpio::clock_cb() {
|
||||
}
|
||||
|
||||
void gpio::reset_cb() {
|
||||
if(rst_i.read())
|
||||
regs->reset_start();
|
||||
else
|
||||
regs->reset_stop();
|
||||
}
|
||||
|
||||
} /* namespace sysc */
|
@ -1,66 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright 2017 eyck@minres.com
|
||||
//
|
||||
// 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.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/*
|
||||
* simplesystem.cpp
|
||||
*
|
||||
* Created on: 17.09.2017
|
||||
* Author: eyck@minres.com
|
||||
*/
|
||||
|
||||
#include <sysc/SiFive/platform.h>
|
||||
|
||||
namespace sysc {
|
||||
|
||||
platform::platform(sc_core::sc_module_name nm)
|
||||
: sc_core::sc_module(nm)
|
||||
, NAMED(i_master)
|
||||
, NAMED(i_router, 4, 1)
|
||||
, NAMED(i_uart)
|
||||
, NAMED(i_spi)
|
||||
, NAMED(i_gpio)
|
||||
, NAMED(i_plic)
|
||||
, NAMED(s_clk)
|
||||
, NAMED(s_rst)
|
||||
{
|
||||
i_master.initiator(i_router.target[0]);
|
||||
size_t i=0;
|
||||
for(const auto& e: e300_plat_map){
|
||||
i_router.initiator.at(i)(e.target->socket);
|
||||
i_router.add_target_range(i, e.start, e.size);
|
||||
i++;
|
||||
}
|
||||
i_uart.clk_i(s_clk);
|
||||
i_spi.clk_i(s_clk);
|
||||
i_gpio.clk_i(s_clk);
|
||||
i_plic.clk_i(s_clk);
|
||||
s_clk.write(10_ns);
|
||||
|
||||
i_uart.rst_i(s_rst);
|
||||
i_spi.rst_i(s_rst);
|
||||
i_gpio.rst_i(s_rst);
|
||||
i_plic.rst_i(s_rst);
|
||||
i_master.rst_i(s_rst);
|
||||
|
||||
SC_THREAD(gen_reset);
|
||||
}
|
||||
|
||||
void platform::gen_reset() {
|
||||
s_rst=true;
|
||||
wait(10_ns);
|
||||
s_rst=false;
|
||||
}
|
||||
|
||||
} /* namespace sysc */
|
@ -1,51 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright 2017 eyck@minres.com
|
||||
//
|
||||
// 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 "sysc/SiFive/plic.h"
|
||||
#include "sysc/SiFive/gen/plic_regs.h"
|
||||
#include "sysc/utilities.h"
|
||||
|
||||
namespace sysc {
|
||||
|
||||
plic::plic(sc_core::sc_module_name nm)
|
||||
: sc_core::sc_module(nm)
|
||||
, tlm_target<>(clk)
|
||||
, NAMED(clk_i)
|
||||
, NAMED(rst_i)
|
||||
, NAMEDD(plic_regs, regs)
|
||||
{
|
||||
regs->registerResources(*this);
|
||||
SC_METHOD(clock_cb);
|
||||
sensitive<<clk_i;
|
||||
SC_METHOD(reset_cb);
|
||||
sensitive<<rst_i;
|
||||
}
|
||||
|
||||
plic::~plic() {
|
||||
}
|
||||
|
||||
void plic::clock_cb() {
|
||||
this->clk=clk_i.read();
|
||||
}
|
||||
|
||||
void plic::reset_cb() {
|
||||
if(rst_i.read())
|
||||
regs->reset_start();
|
||||
else
|
||||
regs->reset_stop();
|
||||
}
|
||||
|
||||
} /* namespace sysc */
|
@ -1,51 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright 2017 eyck@minres.com
|
||||
//
|
||||
// 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 "sysc/SiFive/spi.h"
|
||||
#include "sysc/SiFive/gen/spi_regs.h"
|
||||
#include "sysc/utilities.h"
|
||||
|
||||
namespace sysc {
|
||||
|
||||
spi::spi(sc_core::sc_module_name nm)
|
||||
: sc_core::sc_module(nm)
|
||||
, tlm_target<>(clk)
|
||||
, NAMED(clk_i)
|
||||
, NAMED(rst_i)
|
||||
, NAMEDD(spi_regs, regs)
|
||||
{
|
||||
regs->registerResources(*this);
|
||||
SC_METHOD(clock_cb);
|
||||
sensitive<<clk_i;
|
||||
SC_METHOD(reset_cb);
|
||||
sensitive<<rst_i;
|
||||
}
|
||||
|
||||
spi::~spi() {
|
||||
}
|
||||
|
||||
void spi::clock_cb() {
|
||||
this->clk=clk_i.read();
|
||||
}
|
||||
|
||||
void spi::reset_cb() {
|
||||
if(rst_i.read())
|
||||
regs->reset_start();
|
||||
else
|
||||
regs->reset_stop();
|
||||
}
|
||||
|
||||
} /* namespace sysc */
|
@ -1,51 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright 2017 eyck@minres.com
|
||||
//
|
||||
// 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 "sysc/SiFive/uart.h"
|
||||
#include "sysc/SiFive/gen/uart_regs.h"
|
||||
#include "sysc/utilities.h"
|
||||
|
||||
namespace sysc {
|
||||
|
||||
uart::uart(sc_core::sc_module_name nm)
|
||||
: sc_core::sc_module(nm)
|
||||
, tlm_target<>(clk)
|
||||
, NAMED(clk_i)
|
||||
, NAMED(rst_i)
|
||||
, NAMEDD(uart_regs, regs)
|
||||
{
|
||||
regs->registerResources(*this);
|
||||
SC_METHOD(clock_cb);
|
||||
sensitive<<clk_i;
|
||||
SC_METHOD(reset_cb);
|
||||
sensitive<<rst_i;
|
||||
}
|
||||
|
||||
uart::~uart() {
|
||||
}
|
||||
|
||||
void uart::clock_cb() {
|
||||
this->clk=clk_i.read();
|
||||
}
|
||||
|
||||
void uart::reset_cb() {
|
||||
if(rst_i.read())
|
||||
regs->reset_start();
|
||||
else
|
||||
regs->reset_stop();
|
||||
}
|
||||
|
||||
} /* namespace sysc */
|
Reference in New Issue
Block a user