summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--riscv/main.sail12
-rw-r--r--riscv/prelude.sail4
-rw-r--r--riscv/riscv.sail28
-rw-r--r--src/sail_lib.ml20
4 files changed, 60 insertions, 4 deletions
diff --git a/riscv/main.sail b/riscv/main.sail
index 28afe5ac..43820e25 100644
--- a/riscv/main.sail
+++ b/riscv/main.sail
@@ -34,10 +34,16 @@ val elf_entry = {
c: "elf_entry"
} : unit -> int
-val main : unit -> unit effect {barr, eamem, escape, exmem, rmem, rreg, wmv, wreg}
+val main : unit -> unit effect pure //{barr, eamem, escape, exmem, rmem, rreg, wmv, wreg}
function main () = {
- PC = __GetSlice_int(64, elf_entry(), 0);
+
+ print(assembly(ITYPE(0b000000000000, 0b00000, 0b11010, RISCV_ADDI)));
+ print(assembly(assembly("addi zero, zero, 0x0")));
+ print(assembly(assembly("ldu.aq zero, zero, 0x0")));
+ print_bits("assembled lui zero, 0x0: ", encdec(assembly("lui zero, 0x0")));
+ print_bits("assembled jal zero, 0x123456 : ", encdec(assembly("jal zero, 0x123456")));
+ /*PC = __GetSlice_int(64, elf_entry(), 0);
try {
init_sys ();
loop ()
@@ -45,5 +51,5 @@ function main () = {
Error_not_implemented(s) => print_string("Error: Not implemented: ", s),
Error_EBREAK() => print("EBREAK"),
Error_internal_error() => print("Error: internal error")
- }
+ }*/
}
diff --git a/riscv/prelude.sail b/riscv/prelude.sail
index 67089228..be81ce17 100644
--- a/riscv/prelude.sail
+++ b/riscv/prelude.sail
@@ -15,6 +15,10 @@ val hex_bits_20 : bits(20) <-> string
val hex_bits_20_forwards = "string_of_bits" : bits(20) -> string
val "hex_bits_20_matches_prefix" : string -> option((bits(20), nat))
+val hex_bits_21 : bits(21) <-> string
+val hex_bits_21_forwards = "string_of_bits" : bits(21) -> string
+val "hex_bits_21_matches_prefix" : string -> option((bits(21), nat))
+
val spaces_forwards : unit -> string
function spaces_forwards () = " "
diff --git a/riscv/riscv.sail b/riscv/riscv.sail
index 17dbc288..f0380ffc 100644
--- a/riscv/riscv.sail
+++ b/riscv/riscv.sail
@@ -15,12 +15,18 @@ scattered function print_insn
val assembly : ast <-> string
scattered mapping assembly
+val encdec : ast <-> bits(32)
+scattered mapping encdec
+
/* ****************************************************************** */
union clause ast = UTYPE : (bits(20), regbits, uop)
function clause decode imm : bits(20) @ rd : regbits @ 0b0110111 = Some(UTYPE(imm, rd, RISCV_LUI))
function clause decode imm : bits(20) @ rd : regbits @ 0b0010111 = Some(UTYPE(imm, rd, RISCV_AUIPC))
+mapping clause encdec = UTYPE(imm, rd, RISCV_LUI) <-> imm : bits(20) @ rd : regbits @ 0b0110111
+mapping clause encdec = UTYPE(imm, rd, RISCV_AUIPC) <-> imm : bits(20) @ rd : regbits @ 0b0010111
+
function clause execute UTYPE(imm, rd, op) =
let off : xlenbits = EXTS(imm @ 0x000) in
let ret : xlenbits = match op {
@@ -48,6 +54,11 @@ union clause ast = RISCV_JAL : (bits(21), regbits)
function clause decode imm : bits(20) @ rd : regbits @ 0b1101111 = Some (RISCV_JAL(imm[19] @ imm[7..0] @ imm[8] @ imm[18..13] @ imm[12..9] @ 0b0, rd))
+/* TODO: handle 2-byte-alignment in mappings */
+
+mapping clause encdec = RISCV_JAL(imm_19 : bits(1) @ imm_7_0 : bits(8) @ imm_8 : bits(1) @ imm_18_13 : bits(6) @ imm_12_9 : bits(4) @ 0b0, rd)
+ <-> imm_19 : bits(1) @ imm_18_13 : bits(6) @ imm_12_9 : bits(4) @ imm_8 : bits(1) @ imm_7_0 : bits(8) @ rd : regbits @ 0b1101111
+
function clause execute (RISCV_JAL(imm, rd)) = {
let pc : xlenbits = PC;
X(rd) = nextPC; /* compatible with JAL and C.JAL */
@@ -58,6 +69,8 @@ function clause execute (RISCV_JAL(imm, rd)) = {
function clause print_insn (RISCV_JAL(imm, rd)) =
"jal " ^ rd ^ ", " ^ BitStr(imm)
+mapping clause assembly = RISCV_JAL(imm, rd) <-> "jal" ^^ spaces() ^^ reg_name(rd) ^^ operand_sep() ^^ hex_bits_21(imm)
+
/* ****************************************************************** */
union clause ast = RISCV_JALR : (bits(12), regbits, regbits)
@@ -379,6 +392,18 @@ function clause print_insn (STORE(imm, rs2, rs1, width, aq, rl)) =
} in
insn ^ rs2 ^ ", " ^ rs1 ^ ", " ^ BitStr(imm)
+val store_operands : (bits(12), regbits, regbits, bool, bool) <-> string
+mapping store_operands = {
+ (imm, rs1, rd, aq, rl) <-> maybe_aq(aq) ^^ maybe_rl(rl) ^^ spaces() ^^ reg_name(rd) ^^ operand_sep() ^^ reg_name(rs1) ^^ operand_sep() ^^ hex_bits_12(imm)
+}
+
+ /* STORE(imm, rs1, rd, width, aq, rl) */
+mapping clause assembly = STORE(imm, rs1, rd, DOUBLE, aq, rl) <-> "sd" ^^ store_operands(imm, rs1, rd, aq, rl)
+mapping clause assembly = STORE(imm, rs1, rd, WORD, aq, rl) <-> "sw" ^^ store_operands(imm, rs1, rd, aq, rl)
+mapping clause assembly = STORE(imm, rs1, rd, HALF, aq, rl) <-> "sh" ^^ store_operands(imm, rs1, rd, aq, rl)
+mapping clause assembly = STORE(imm, rs1, rd, BYTE, aq, rl) <-> "sb" ^^ store_operands(imm, rs1, rd, aq, rl)
+
+
/* ****************************************************************** */
union clause ast = ADDIW : (bits(12), regbits, regbits)
@@ -1532,4 +1557,5 @@ end decode
end decodeCompressed
end execute
end print_insn
-end assembly \ No newline at end of file
+end assembly
+end encdec \ No newline at end of file
diff --git a/src/sail_lib.ml b/src/sail_lib.ml
index 415fc9fd..bab4000b 100644
--- a/src/sail_lib.ml
+++ b/src/sail_lib.ml
@@ -654,3 +654,23 @@ let hex_bits_12_matches_prefix s =
ZSome ((bits_of_int 2048 n, len))
else
ZNone ()
+
+let hex_bits_20_matches_prefix s =
+ match maybe_int_of_prefix s with
+ | ZNone () -> ZNone ()
+ | ZSome (n, len) ->
+ let n = Big_int.to_int n in
+ if 0 <= n && n < 1048576 then
+ ZSome ((bits_of_int 524288 n, len))
+ else
+ ZNone ()
+
+let hex_bits_21_matches_prefix s =
+ match maybe_int_of_prefix s with
+ | ZNone () -> ZNone ()
+ | ZSome (n, len) ->
+ let n = Big_int.to_int n in
+ if 0 <= n && n < 2097152 then
+ ZSome ((bits_of_int 1048576 n, len))
+ else
+ ZNone ()