diff options
| -rw-r--r-- | mips_new_tc/Makefile | 22 | ||||
| -rw-r--r-- | mips_new_tc/mips_extras.lem | 94 | ||||
| -rw-r--r-- | mips_new_tc/mips_extras_embed.lem | 47 | ||||
| -rw-r--r-- | mips_new_tc/mips_extras_embed_sequential.lem | 51 | ||||
| -rw-r--r-- | mips_new_tc/mips_prelude.sail | 23 | ||||
| -rw-r--r-- | mips_new_tc/mips_tlb_stub.sail | 8 | ||||
| -rw-r--r-- | mips_new_tc/mips_wrappers.sail | 5 | ||||
| -rw-r--r-- | mips_new_tc/prelude.sail | 5 | ||||
| -rw-r--r-- | src/gen_lib/prompt_monad.lem | 6 | ||||
| -rw-r--r-- | src/gen_lib/sail_operators.lem | 14 | ||||
| -rw-r--r-- | src/gen_lib/sail_operators_bitlists.lem | 28 | ||||
| -rw-r--r-- | src/gen_lib/sail_operators_mwords.lem | 28 | ||||
| -rw-r--r-- | src/process_file.ml | 4 | ||||
| -rw-r--r-- | src/sail_lib.ml | 2 |
14 files changed, 187 insertions, 150 deletions
diff --git a/mips_new_tc/Makefile b/mips_new_tc/Makefile index 3bef7551..d9ccba6b 100644 --- a/mips_new_tc/Makefile +++ b/mips_new_tc/Makefile @@ -6,10 +6,26 @@ MIPS_SAIL_DIR:=$(SAIL_DIR)/mips_new_tc SAIL:=$(SAIL_DIR)/sail -MIPS_SAILS:=$(SAIL_LIB_DIR)/flow.sail $(MIPS_SAIL_DIR)/prelude.sail $(MIPS_SAIL_DIR)/mips_prelude.sail $(MIPS_SAIL_DIR)/mips_tlb.sail $(MIPS_SAIL_DIR)/mips_wrappers.sail $(MIPS_SAIL_DIR)/mips_ast_decl.sail $(MIPS_SAIL_DIR)/mips_insts.sail $(MIPS_SAIL_DIR)/mips_ri.sail $(MIPS_SAIL_DIR)/mips_epilogue.sail $(MIPS_SAIL_DIR)/main.sail +MIPS_PRE:=$(SAIL_LIB_DIR)/flow.sail $(MIPS_SAIL_DIR)/prelude.sail $(MIPS_SAIL_DIR)/mips_prelude.sail +MIPS_TLB:=$(MIPS_SAIL_DIR)/mips_tlb.sail +MIPS_TLB_STUB:=$(MIPS_SAIL_DIR)/mips_tlb_stub.sail +MIPS_SAILS:=$(MIPS_SAIL_DIR)/mips_wrappers.sail $(MIPS_SAIL_DIR)/mips_ast_decl.sail $(MIPS_SAIL_DIR)/mips_insts.sail $(MIPS_SAIL_DIR)/mips_ri.sail $(MIPS_SAIL_DIR)/mips_epilogue.sail +MIPS_MAIN:=$(MIPS_SAIL_DIR)/main.sail -mips: $(MIPS_SAILS) - $(SAIL) -ocaml -o mips $(MIPS_SAILS) +mips: $(MIPS_PRE) $(MIPS_TLB) $(MIPS_SAILS) $(MIPS_MAIN) + $(SAIL) -ocaml -o mips $^ + +mips_no_tlb.lem: $(MIPS_PRE) $(MIPS_TLB_STUB) $(MIPS_SAILS) + $(SAIL) -lem -o mips_no_tlb -lem_mwords -lem_lib Mips_extras -undefined_gen $^ +mips_no_tlb_types.lem: mips_no_tlb.lem + +# TODO: Use monomorphisation so that we can switch to machine words +mips.lem: $(MIPS_PRE) $(MIPS_TLB) $(MIPS_SAILS) + $(SAIL) -lem -o mips -lem_lib Mips_extras -undefined_gen $^ +mips_types.lem: mips.lem + +M%.thy: m%.lem m%_types.lem mips_extras.lem + lem -isa -outdir . -lib $(SAIL_DIR)/src/gen_lib -lib $(SAIL_DIR)/src/lem_interp $^ clean: rm -rf _sbuild diff --git a/mips_new_tc/mips_extras.lem b/mips_new_tc/mips_extras.lem new file mode 100644 index 00000000..920277f6 --- /dev/null +++ b/mips_new_tc/mips_extras.lem @@ -0,0 +1,94 @@ +open import Pervasives +open import Pervasives_extra +open import Sail_instr_kinds +open import Sail_values +open import Sail_operators +open import Prompt_monad +open import Prompt + +val MEMr : forall 'regval 'a 'b 'e. Bitvector 'a, Bitvector 'b => 'a -> integer -> monad 'regval 'b 'e +val MEMr_reserve : forall 'regval 'a 'b 'e. Bitvector 'a, Bitvector 'b => 'a -> integer -> monad 'regval 'b 'e +val MEMr_tag : forall 'regval 'a 'b 'e. Bitvector 'a, Bitvector 'b => 'a -> integer -> monad 'regval (bool * 'b) 'e +val MEMr_tag_reserve : forall 'regval 'a 'b 'e. Bitvector 'a, Bitvector 'b => 'a -> integer -> monad 'regval (bool * 'b) 'e + +let MEMr addr size = read_mem Read_plain addr size +let MEMr_reserve addr size = read_mem Read_reserve addr size + +let MEMr_tag addr size = + read_mem Read_plain addr size >>= fun v -> + read_tag addr >>= fun t -> + return (bool_of_bitU t, v) + +let MEMr_tag_reserve addr size = + read_mem Read_plain addr size >>= fun v -> + read_tag addr >>= fun t -> + return (bool_of_bitU t, v) + + +val MEMea : forall 'regval 'a 'e. Bitvector 'a => 'a -> integer -> monad 'regval unit 'e +val MEMea_conditional : forall 'regval 'a 'e. Bitvector 'a => 'a -> integer -> monad 'regval unit 'e +val MEMea_tag : forall 'regval 'a 'e. Bitvector 'a => 'a -> integer -> monad 'regval unit 'e +val MEMea_tag_conditional : forall 'regval 'a 'e. Bitvector 'a => 'a -> integer -> monad 'regval unit 'e + +let MEMea addr size = write_mem_ea Write_plain addr size +let MEMea_conditional addr size = write_mem_ea Write_conditional addr size + +let MEMea_tag addr size = write_mem_ea Write_plain addr size +let MEMea_tag_conditional addr size = write_mem_ea Write_conditional addr size + + +val MEMval : forall 'regval 'a 'b 'e. Bitvector 'a, Bitvector 'b => 'a -> integer -> 'b -> monad 'regval unit 'e +val MEMval_conditional : forall 'regval 'a 'b 'e. Bitvector 'a, Bitvector 'b => 'a -> integer -> 'b -> monad 'regval bool 'e +val MEMval_tag : forall 'regval 'a 'b 'e. Bitvector 'a, Bitvector 'b => 'a -> integer -> bool -> 'b -> monad 'regval unit 'e +val MEMval_tag_conditional : forall 'regval 'a 'b 'e. Bitvector 'a, Bitvector 'b => 'a -> integer -> bool -> 'b -> monad 'regval bool 'e + +let MEMval _ size v = write_mem_val v >>= fun _ -> return () +let MEMval_conditional _ size v = write_mem_val v >>= fun b -> return (if b then true else false) +let MEMval_tag _ size t v = write_mem_val v >>= fun _ -> write_tag_val (bitU_of_bool t) >>= fun _ -> return () +let MEMval_tag_conditional _ size t v = write_mem_val v >>= fun b -> write_tag_val (bitU_of_bool t) >>= fun _ -> return (if b then true else false) + +val MEM_sync : forall 'regval 'e. unit -> monad 'regval unit 'e + +let MEM_sync () = barrier Barrier_MIPS_SYNC + +(* Some wrappers copied from aarch64_extras *) +(* TODO: Harmonise into a common library *) + +let get_slice_int_bl len n lo = + (* TODO: Is this the intended behaviour? *) + let hi = lo + len - 1 in + let bits = bits_of_int (hi + 1) n in + get_bits false bits hi lo + +val get_slice_int : forall 'a. Bitvector 'a => integer -> integer -> integer -> 'a +let get_slice_int len n lo = of_bits (get_slice_int_bl len n lo) + +let write_ram _ size _ addr data = + MEMea addr size >> + MEMval addr size data + +let read_ram _ size _ addr = MEMr addr size + +let sign_extend bits len = exts_bv len bits +let zero_extend bits len = extz_bv len bits + +let shift_bits_left v n = shiftl_bv v (unsigned n) +let shift_bits_right v n = shiftr_bv v (unsigned n) +let shift_bits_right_arith v n = arith_shiftr_bv v (unsigned n) + +(* TODO: These could be monadic instead of hardcoded *) +let internal_pick vs = head vs +let undefined_string () = "" +let undefined_unit () = () +let undefined_int () = (0:ii) +let undefined_bool () = false +val undefined_vector : forall 'a. integer -> 'a -> list 'a +let undefined_vector len u = repeat [u] len +val undefined_bitvector : forall 'a. Bitvector 'a => integer -> 'a +let undefined_bitvector len = of_bits (repeat [B0] len) +let undefined_bits len = undefined_bitvector len +let undefined_bit () = B0 +let undefined_real () = realFromFrac 0 1 +let undefined_range i j = i +let undefined_atom i = i +let undefined_nat () = (0:ii) diff --git a/mips_new_tc/mips_extras_embed.lem b/mips_new_tc/mips_extras_embed.lem deleted file mode 100644 index bda70274..00000000 --- a/mips_new_tc/mips_extras_embed.lem +++ /dev/null @@ -1,47 +0,0 @@ -open import Pervasives -open import Pervasives_extra -open import Sail_impl_base -open import Sail_values -open import Prompt - -val MEMr : forall 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer) -> M 'b 'e -val MEMr_reserve : forall 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer) -> M 'b 'e -val MEMr_tag : forall 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer) -> M 'b 'e -val MEMr_tag_reserve : forall 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer) -> M 'b 'e - -let MEMr (addr,size) = read_mem false Read_plain addr size -let MEMr_reserve (addr,size) = read_mem false Read_reserve addr size - -let MEMr_tag (addr,size) = read_mem false Read_plain addr size -let MEMr_tag_reserve (addr,size) = read_mem false Read_reserve addr size - - -val MEMea : forall 'a 'e. Bitvector 'a => ('a * integer) -> M unit 'e -val MEMea_conditional : forall 'a 'e. Bitvector 'a => ('a * integer) -> M unit 'e -val MEMea_tag : forall 'a 'e. Bitvector 'a => ('a * integer) -> M unit 'e -val MEMea_tag_conditional : forall 'a 'e. Bitvector 'a => ('a * integer) -> M unit 'e - -let MEMea (addr,size) = write_mem_ea Write_plain addr size -let MEMea_conditional (addr,size) = write_mem_ea Write_conditional addr size - -let MEMea_tag (addr,size) = write_mem_ea Write_plain addr size -let MEMea_tag_conditional (addr,size) = write_mem_ea Write_conditional addr size - - -val MEMval : forall 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer * 'b) -> M unit 'e -val MEMval_conditional : forall 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer * 'b) -> M bool 'e -val MEMval_tag : forall 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer * 'b) -> M unit 'e -val MEMval_tag_conditional : forall 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer * 'b) -> M bool 'e - -let MEMval (_,_,v) = write_mem_val v >>= fun _ -> return () -let MEMval_conditional (_,_,v) = write_mem_val v >>= fun b -> return (if b then true else false) -let MEMval_tag (_,_,v) = write_mem_val v >>= fun _ -> return () -let MEMval_tag_conditional (_,_,v) = write_mem_val v >>= fun b -> return (if b then true else false) - -(* TODO *) -val TAGw : forall 'e. (vector bitU * vector bitU) -> M unit 'e -let TAGw (addr, tag) = failwith "TAGw not implemented" - -val MEM_sync : forall 'e. unit -> M unit 'e - -let MEM_sync () = barrier Barrier_Isync diff --git a/mips_new_tc/mips_extras_embed_sequential.lem b/mips_new_tc/mips_extras_embed_sequential.lem deleted file mode 100644 index b50052dc..00000000 --- a/mips_new_tc/mips_extras_embed_sequential.lem +++ /dev/null @@ -1,51 +0,0 @@ -open import Pervasives -open import Pervasives_extra -open import Sail_impl_base -open import Sail_values -open import Sail_operators_mwords -open import State - -val MEMr : forall 'regs 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer) -> M 'regs 'b 'e -val MEMr_reserve : forall 'regs 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer) -> M 'regs 'b 'e -val MEMr_tag : forall 'regs 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer) -> M 'regs (bool * 'b) 'e -val MEMr_tag_reserve : forall 'regs 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer) -> M 'regs (bool * 'b) 'e - -let MEMr (addr,size) = read_mem false Read_plain addr size -let MEMr_reserve (addr,size) = read_mem false Read_reserve addr size - -let MEMr_tag (addr,size) = - read_mem false Read_plain addr size >>= fun v -> - read_tag false Read_plain addr >>= fun t -> - return (bitU_to_bool t, v) - -let MEMr_tag_reserve (addr,size) = - read_mem false Read_plain addr size >>= fun v -> - read_tag false Read_plain addr >>= fun t -> - return (bitU_to_bool t, v) - - -val MEMea : forall 'regs 'a 'e. Bitvector 'a => ('a * integer) -> M 'regs unit 'e -val MEMea_conditional : forall 'regs 'a 'e. Bitvector 'a => ('a * integer) -> M 'regs unit 'e -val MEMea_tag : forall 'regs 'a 'e. Bitvector 'a => ('a * integer) -> M 'regs unit 'e -val MEMea_tag_conditional : forall 'regs 'a 'e. Bitvector 'a => ('a * integer) -> M 'regs unit 'e - -let MEMea (addr,size) = write_mem_ea Write_plain addr size -let MEMea_conditional (addr,size) = write_mem_ea Write_conditional addr size - -let MEMea_tag (addr,size) = write_mem_ea Write_plain addr size -let MEMea_tag_conditional (addr,size) = write_mem_ea Write_conditional addr size - - -val MEMval : forall 'regs 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer * 'b) -> M 'regs unit 'e -val MEMval_conditional : forall 'regs 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer * 'b) -> M 'regs bool 'e -val MEMval_tag : forall 'regs 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer * bool * 'b) -> M 'regs unit 'e -val MEMval_tag_conditional : forall 'regs 'a 'b 'e. Bitvector 'a, Bitvector 'b => ('a * integer * bool * 'b) -> M 'regs bool 'e - -let MEMval (_,size,v) = write_mem_val v >>= fun _ -> return () -let MEMval_conditional (_,size,v) = write_mem_val v >>= fun b -> return (if b then true else false) -let MEMval_tag (_,size,t,v) = write_mem_val v >>= fun _ -> write_tag (bool_to_bitU t) >>= fun _ -> return () -let MEMval_tag_conditional (_,size,t,v) = write_mem_val v >>= fun b -> write_tag (bool_to_bitU t) >>= fun _ -> return (if b then true else false) - -val MEM_sync : forall 'regs 'e. unit -> M 'regs unit 'e - -let MEM_sync () = barrier Barrier_MIPS_SYNC diff --git a/mips_new_tc/mips_prelude.sail b/mips_new_tc/mips_prelude.sail index 24196c29..d2e44092 100644 --- a/mips_new_tc/mips_prelude.sail +++ b/mips_new_tc/mips_prelude.sail @@ -324,14 +324,21 @@ function wGPR (idx, v) = { if i == 0 then () else GPR[i] = v } -val MEMr : forall 'n. ( bits(64) , atom('n) ) -> (bits(8 * 'n)) effect { rmem } -val MEMr_reserve : forall 'n. ( bits(64) , atom('n) ) -> (bits(8 * 'n)) effect { rmem } -val MEM_sync : unit -> unit effect { barr } - -val MEMea : forall 'n. ( bits(64) , atom('n)) -> unit effect { eamem } -val MEMea_conditional : forall 'n. ( bits(64) , atom('n)) -> unit effect { eamem } -val MEMval : forall 'n. ( bits(64) , atom('n), bits(8*'n)) -> unit effect { wmv } -val MEMval_conditional : forall 'n. ( bits(64) , atom('n), bits(8*'n)) -> bool effect { wmv } +val MEMr = {lem: "MEMr"} : forall 'n. + ( bits(64) , atom('n) ) -> (bits(8 * 'n)) effect { rmem } +val MEMr_reserve = {lem: "MEMr_reserve"} : forall 'n. + ( bits(64) , atom('n) ) -> (bits(8 * 'n)) effect { rmem } +val MEM_sync = {lem: "MEM_sync"} : + unit -> unit effect { barr } + +val MEMea = {lem: "MEMea"} : forall 'n. + ( bits(64) , atom('n)) -> unit effect { eamem } +val MEMea_conditional = {lem: "MEMea_conditional"} : forall 'n. + ( bits(64) , atom('n)) -> unit effect { eamem } +val MEMval = {lem: "MEMval"} : forall 'n. + ( bits(64) , atom('n), bits(8*'n)) -> unit effect { wmv } +val MEMval_conditional = {lem: "MEMval_conditional"} : forall 'n. + ( bits(64) , atom('n), bits(8*'n)) -> bool effect { wmv } /* Extern nops with effects, sometimes useful for faking effect */ val skip_eamem = "skip" : unit -> unit effect {eamem} diff --git a/mips_new_tc/mips_tlb_stub.sail b/mips_new_tc/mips_tlb_stub.sail index 04f80c35..f0ffb9dd 100644 --- a/mips_new_tc/mips_tlb_stub.sail +++ b/mips_new_tc/mips_tlb_stub.sail @@ -32,9 +32,17 @@ /* SUCH DAMAGE. */ /*========================================================================*/ +$ifndef _MIPS_TLB_STUB +$define _MIPS_TLB_STUB + +val tlbEntryMatch : (bits(2), bits(27), bits(8), TLBEntry) -> bool effect pure function tlbSearch(VAddr) : bits(64) -> option(TLBIndexT) = None +val TLBTranslate2 : (bits(64), MemAccessType) -> (bits(64), bool) effect pure function TLBTranslate (vAddr, accessType) : (bits(64), MemAccessType) -> bits(64) = vAddr +val TLBTranslateC : (bits(64), MemAccessType) -> (bits(64), bool) effect pure function TLBTranslateC (vAddr, accessType) : (bits(64), MemAccessType) -> (bits(64), bool) = (vAddr, false) + +$endif diff --git a/mips_new_tc/mips_wrappers.sail b/mips_new_tc/mips_wrappers.sail index 42e3e427..fd0619f4 100644 --- a/mips_new_tc/mips_wrappers.sail +++ b/mips_new_tc/mips_wrappers.sail @@ -60,7 +60,12 @@ val addrWrapper : (bits(64), MemAccessType, WordType) -> bits(64) function addrWrapper(addr, accessType, width) = addr +$ifdef _MIPS_TLB_STUB +val TranslatePC : bits(64) -> bits(64) effect {rreg, wreg, escape} +$else val TranslatePC : bits(64) -> bits(64) effect {rreg, wreg, escape, undef} +$endif + function TranslatePC (vAddr) = { incrementCP0Count(); if (vAddr[1..0] != 0b00) then /* bad PC alignment */ diff --git a/mips_new_tc/prelude.sail b/mips_new_tc/prelude.sail index 1fab008b..1add5bf8 100644 --- a/mips_new_tc/prelude.sail +++ b/mips_new_tc/prelude.sail @@ -267,7 +267,7 @@ val __TraceMemoryRead : forall 'n 'm. (atom('n), bits('m), bits(8 * 'n)) -> unit val replicate_bits = "replicate_bits" : forall 'n 'm. (bits('n), atom('m)) -> bits('n * 'm) infix 8 ^^ -val operator ^^ : forall 'n 'm . (bits('n), atom('m)) -> bits('n * 'm) +val operator ^^ = {lem: "replicate_bits"} : forall 'n 'm . (bits('n), atom('m)) -> bits('n * 'm) function operator ^^ (bs, n) = replicate_bits (bs, n) val cast ex_nat : nat -> {'n, 'n >= 0. atom('n)} @@ -351,7 +351,7 @@ val operator << = "shift_bits_left" : forall 'n 'm. (bits('n), bits('m)) -> bits val operator >>_s = "shift_bits_right_arith" : forall 'n 'm. (bits('n), bits('m)) -> bits('n) infix 7 *_s -val operator *_s = "mult_svec" : forall 'n . (bits('n), bits('n)) -> bits(2 * 'n) +val operator *_s = "smult_vec" : forall 'n . (bits('n), bits('n)) -> bits(2 * 'n) infix 7 *_u val operator *_u = "mult_vec" : forall 'n . (bits('n), bits('n)) -> bits(2 * 'n) @@ -374,4 +374,3 @@ overload vector_update_subrange = {vector_update_subrange_dec, vector_update_sub val mask : forall 'm 'n , 'm >= 'n > 0 . bits('m) -> bits('n) function mask bs = bs['n - 1 .. 0] - diff --git a/src/gen_lib/prompt_monad.lem b/src/gen_lib/prompt_monad.lem index 3c414d6e..0966f911 100644 --- a/src/gen_lib/prompt_monad.lem +++ b/src/gen_lib/prompt_monad.lem @@ -123,6 +123,9 @@ let read_mem rk addr sz = let k bytes = Done (bits_of_mem_bytes bytes) in Read_mem rk (bits_of addr) (natFromInteger sz) k +val read_tag : forall 'rv 'a 'e. Bitvector 'a => 'a -> monad 'rv bitU 'e +let read_tag addr = Read_tag (bits_of addr) return + val excl_result : forall 'rv 'e. unit -> monad 'rv bool 'e let excl_result () = let k successful = (return successful) in @@ -137,6 +140,9 @@ let write_mem_val v = match mem_bytes_of_bits v with | Nothing -> Fail "write_mem_val" end +val write_tag_val : forall 'rv 'e. bitU -> monad 'rv bool 'e +let write_tag_val b = Write_tagv b return + val read_reg : forall 's 'rv 'a 'e. register_ref 's 'rv 'a -> monad 'rv 'a 'e let read_reg reg = let k v = diff --git a/src/gen_lib/sail_operators.lem b/src/gen_lib/sail_operators.lem index 7d6b156b..9354f9d4 100644 --- a/src/gen_lib/sail_operators.lem +++ b/src/gen_lib/sail_operators.lem @@ -54,10 +54,10 @@ let arith_op_bv op sign size l r = let add_bv = arith_op_bv integerAdd false 1 -let addS_bv = arith_op_bv integerAdd true 1 +let sadd_bv = arith_op_bv integerAdd true 1 let sub_bv = arith_op_bv integerMinus false 1 let mult_bv = arith_op_bv integerMult false 2 -let multS_bv = arith_op_bv integerMult true 2 +let smult_bv = arith_op_bv integerMult true 2 let inline add_mword = Machine_word.plus let inline sub_mword = Machine_word.minus @@ -72,10 +72,10 @@ let arith_op_bv_int op sign size l r = of_int (size * length l) n let add_bv_int = arith_op_bv_int integerAdd false 1 -let addS_bv_int = arith_op_bv_int integerAdd true 1 +let sadd_bv_int = arith_op_bv_int integerAdd true 1 let sub_bv_int = arith_op_bv_int integerMinus false 1 let mult_bv_int = arith_op_bv_int integerMult false 2 -let multS_bv_int = arith_op_bv_int integerMult true 2 +let smult_bv_int = arith_op_bv_int integerMult true 2 val arith_op_int_bv : forall 'a 'b. Bitvector 'a, Bitvector 'b => (integer -> integer -> integer) -> bool -> integer -> integer -> 'a -> 'b @@ -85,10 +85,10 @@ let arith_op_int_bv op sign size l r = of_int (size * length r) n let add_int_bv = arith_op_int_bv integerAdd false 1 -let addS_int_bv = arith_op_int_bv integerAdd true 1 +let sadd_int_bv = arith_op_int_bv integerAdd true 1 let sub_int_bv = arith_op_int_bv integerMinus false 1 let mult_int_bv = arith_op_int_bv integerMult false 2 -let multS_int_bv = arith_op_int_bv integerMult true 2 +let smult_int_bv = arith_op_int_bv integerMult true 2 let arith_op_bv_bit op sign (size : integer) l r = let l' = int_of_bv sign l in @@ -96,7 +96,7 @@ let arith_op_bv_bit op sign (size : integer) l r = of_int (size * length l) n let add_bv_bit = arith_op_bv_bit integerAdd false 1 -let addS_bv_bit = arith_op_bv_bit integerAdd true 1 +let sadd_bv_bit = arith_op_bv_bit integerAdd true 1 let sub_bv_bit = arith_op_bv_bit integerMinus true 1 val arith_op_overflow_bv : forall 'a 'b. Bitvector 'a, Bitvector 'b => diff --git a/src/gen_lib/sail_operators_bitlists.lem b/src/gen_lib/sail_operators_bitlists.lem index 5658dc21..a627f560 100644 --- a/src/gen_lib/sail_operators_bitlists.lem +++ b/src/gen_lib/sail_operators_bitlists.lem @@ -69,43 +69,43 @@ let xor_vec = xor_bv let not_vec = not_bv val add_vec : list bitU -> list bitU -> list bitU -val addS_vec : list bitU -> list bitU -> list bitU +val sadd_vec : list bitU -> list bitU -> list bitU val sub_vec : list bitU -> list bitU -> list bitU val mult_vec : list bitU -> list bitU -> list bitU -val multS_vec : list bitU -> list bitU -> list bitU +val smult_vec : list bitU -> list bitU -> list bitU let add_vec = add_bv -let addS_vec = addS_bv +let sadd_vec = sadd_bv let sub_vec = sub_bv let mult_vec = mult_bv -let multS_vec = multS_bv +let smult_vec = smult_bv val add_vec_int : list bitU -> integer -> list bitU -val addS_vec_int : list bitU -> integer -> list bitU +val sadd_vec_int : list bitU -> integer -> list bitU val sub_vec_int : list bitU -> integer -> list bitU val mult_vec_int : list bitU -> integer -> list bitU -val multS_vec_int : list bitU -> integer -> list bitU +val smult_vec_int : list bitU -> integer -> list bitU let add_vec_int = add_bv_int -let addS_vec_int = addS_bv_int +let sadd_vec_int = sadd_bv_int let sub_vec_int = sub_bv_int let mult_vec_int = mult_bv_int -let multS_vec_int = multS_bv_int +let smult_vec_int = smult_bv_int val add_int_vec : integer -> list bitU -> list bitU -val addS_int_vec : integer -> list bitU -> list bitU +val sadd_int_vec : integer -> list bitU -> list bitU val sub_int_vec : integer -> list bitU -> list bitU val mult_int_vec : integer -> list bitU -> list bitU -val multS_int_vec : integer -> list bitU -> list bitU +val smult_int_vec : integer -> list bitU -> list bitU let add_int_vec = add_int_bv -let addS_int_vec = addS_int_bv +let sadd_int_vec = sadd_int_bv let sub_int_vec = sub_int_bv let mult_int_vec = mult_int_bv -let multS_int_vec = multS_int_bv +let smult_int_vec = smult_int_bv val add_vec_bit : list bitU -> bitU -> list bitU -val addS_vec_bit : list bitU -> bitU -> list bitU +val sadd_vec_bit : list bitU -> bitU -> list bitU val sub_vec_bit : list bitU -> bitU -> list bitU let add_vec_bit = add_bv_bit -let addS_vec_bit = addS_bv_bit +let sadd_vec_bit = sadd_bv_bit let sub_vec_bit = sub_bv_bit val add_overflow_vec : list bitU -> list bitU -> (list bitU * bitU * bitU) diff --git a/src/gen_lib/sail_operators_mwords.lem b/src/gen_lib/sail_operators_mwords.lem index fcc3153b..7411c0a9 100644 --- a/src/gen_lib/sail_operators_mwords.lem +++ b/src/gen_lib/sail_operators_mwords.lem @@ -69,43 +69,43 @@ let xor_vec = xor_bv let not_vec = not_bv val add_vec : forall 'a. Size 'a => mword 'a -> mword 'a -> mword 'a -val addS_vec : forall 'a. Size 'a => mword 'a -> mword 'a -> mword 'a +val sadd_vec : forall 'a. Size 'a => mword 'a -> mword 'a -> mword 'a val sub_vec : forall 'a. Size 'a => mword 'a -> mword 'a -> mword 'a val mult_vec : forall 'a 'b. Size 'a, Size 'b => mword 'a -> mword 'a -> mword 'b -val multS_vec : forall 'a 'b. Size 'a, Size 'b => mword 'a -> mword 'a -> mword 'b +val smult_vec : forall 'a 'b. Size 'a, Size 'b => mword 'a -> mword 'a -> mword 'b let add_vec = add_bv -let addS_vec = addS_bv +let sadd_vec = sadd_bv let sub_vec = sub_bv let mult_vec = mult_bv -let multS_vec = multS_bv +let smult_vec = smult_bv val add_vec_int : forall 'a. Size 'a => mword 'a -> integer -> mword 'a -val addS_vec_int : forall 'a. Size 'a => mword 'a -> integer -> mword 'a +val sadd_vec_int : forall 'a. Size 'a => mword 'a -> integer -> mword 'a val sub_vec_int : forall 'a. Size 'a => mword 'a -> integer -> mword 'a val mult_vec_int : forall 'a 'b. Size 'a, Size 'b => mword 'a -> integer -> mword 'b -val multS_vec_int : forall 'a 'b. Size 'a, Size 'b => mword 'a -> integer -> mword 'b +val smult_vec_int : forall 'a 'b. Size 'a, Size 'b => mword 'a -> integer -> mword 'b let add_vec_int = add_bv_int -let addS_vec_int = addS_bv_int +let sadd_vec_int = sadd_bv_int let sub_vec_int = sub_bv_int let mult_vec_int = mult_bv_int -let multS_vec_int = multS_bv_int +let smult_vec_int = smult_bv_int val add_int_vec : forall 'a. Size 'a => integer -> mword 'a -> mword 'a -val addS_int_vec : forall 'a. Size 'a => integer -> mword 'a -> mword 'a +val sadd_int_vec : forall 'a. Size 'a => integer -> mword 'a -> mword 'a val sub_int_vec : forall 'a. Size 'a => integer -> mword 'a -> mword 'a val mult_int_vec : forall 'a 'b. Size 'a, Size 'b => integer -> mword 'a -> mword 'b -val multS_int_vec : forall 'a 'b. Size 'a, Size 'b => integer -> mword 'a -> mword 'b +val smult_int_vec : forall 'a 'b. Size 'a, Size 'b => integer -> mword 'a -> mword 'b let add_int_vec = add_int_bv -let addS_int_vec = addS_int_bv +let sadd_int_vec = sadd_int_bv let sub_int_vec = sub_int_bv let mult_int_vec = mult_int_bv -let multS_int_vec = multS_int_bv +let smult_int_vec = smult_int_bv val add_vec_bit : forall 'a. Size 'a => mword 'a -> bitU -> mword 'a -val addS_vec_bit : forall 'a. Size 'a => mword 'a -> bitU -> mword 'a +val sadd_vec_bit : forall 'a. Size 'a => mword 'a -> bitU -> mword 'a val sub_vec_bit : forall 'a. Size 'a => mword 'a -> bitU -> mword 'a let add_vec_bit = add_bv_bit -let addS_vec_bit = addS_bv_bit +let sadd_vec_bit = sadd_bv_bit let sub_vec_bit = sub_bv_bit val add_overflow_vec : forall 'a. Size 'a => mword 'a -> mword 'a -> (mword 'a * bitU * bitU) diff --git a/src/process_file.ml b/src/process_file.ml index a447061b..ffd61fae 100644 --- a/src/process_file.ml +++ b/src/process_file.ml @@ -252,8 +252,8 @@ let output_lem filename libs defs = separate hardline [ string ("theory " ^ isa_thy_name); string " imports"; - string " Sail.Sail_values_extras"; - string " Sail.State_extras"; + string " Sail.Sail_values_lemmas"; + string " Sail.State_lemmas"; string (" " ^ String.capitalize filename); string "begin"; string ""; diff --git a/src/sail_lib.ml b/src/sail_lib.ml index 53f4aec6..44dd4ac5 100644 --- a/src/sail_lib.ml +++ b/src/sail_lib.ml @@ -282,7 +282,7 @@ let mult_vec (x, y) = to_bits' (2*len, prod) (* signed multiplication of two n bit lists producing a list of 2n bits. *) -let mult_svec (x, y) = +let smult_vec (x, y) = let xi = sint(x) in let yi = sint(y) in let len = List.length x in |
