diff options
| author | Christopher Pulte | 2016-09-19 16:12:03 +0100 |
|---|---|---|
| committer | Christopher Pulte | 2016-09-19 16:12:03 +0100 |
| commit | 4d823e649a4070fbc2ce90bf0980378ffd96a0f9 (patch) | |
| tree | 7303a37c32fae244b57e0d188db5fe21f73f9d96 /src/gen_lib | |
| parent | 62c2f45fbb34703ebc6c43819f4450da5601dff4 (diff) | |
sail-to-lem progress
Diffstat (limited to 'src/gen_lib')
| -rw-r--r-- | src/gen_lib/armv8_extras.lem | 37 | ||||
| -rw-r--r-- | src/gen_lib/prompt.lem | 4 | ||||
| -rw-r--r-- | src/gen_lib/sail_values.lem | 97 | ||||
| -rw-r--r-- | src/gen_lib/state.lem | 11 | ||||
| -rw-r--r-- | src/gen_lib/vector.lem | 22 |
5 files changed, 86 insertions, 85 deletions
diff --git a/src/gen_lib/armv8_extras.lem b/src/gen_lib/armv8_extras.lem index 54304225..fd0fc17b 100644 --- a/src/gen_lib/armv8_extras.lem +++ b/src/gen_lib/armv8_extras.lem @@ -1,26 +1,7 @@ open import Pervasives open import State open import Sail_values -import Set_extra -(* -let memory_parameter_transformer mode v = - let mode = <|mode with endian = E_big_endian|> in - match v with - | Interp.V_tuple [location;length] -> - match length with - | Interp.V_lit (L_aux (L_num len) _) -> - let (v,regs) = extern_mem_value mode location in - (v,(natFromInteger len),regs) - | Interp.V_track (Interp.V_lit (L_aux (L_num len) _)) size_regs -> - let (v,loc_regs) = extern_mem_value mode location in - match loc_regs with - | Nothing -> (v,(natFromInteger len),Just (List.map (fun r -> extern_reg r Nothing) (Set_extra.toList size_regs))) - | Just loc_regs -> (v,(natFromInteger len),Just (loc_regs++(List.map (fun r -> extern_reg r Nothing) (Set_extra.toList size_regs)))) - end - end - end - *) let rMem_NORMAL (addr,l) = read_memory (unsigned addr) l let rMem_STREAM (addr,l) = read_memory (unsigned addr) l let rMem_ORDERED (addr,l) = read_memory (unsigned addr) l @@ -37,14 +18,14 @@ let wMem_Addr_ORDERED (addr,l) = write_writeEA (unsigned addr) l let wMem_Addr_ATOMIC (addr,l) = write_writeEA (unsigned addr) l let wMem_Addr_ATOMIC_ORDERED (addr,l) = write_writeEA (unsigned addr) l -let wMem_Val_NORMAL l v = read_writeEA () >>= fun (addr,_) -> write_memory addr l v -let wMem_Val_ATOMIC l v = read_writeEA () >>= fun (addr,_) -> write_memory addr l v +let wMem_Val_NORMAL (l,v) = read_writeEA () >>= fun (addr,_) -> write_memory addr l v >> return () +let wMem_Val_ATOMIC (l,v) = read_writeEA () >>= fun (addr,_) -> write_memory addr l v >> return Vector.O -let DataMemoryBarrier_Reads = return () -let DataMemoryBarrier_Writes = return () -let DataMemoryBarrier_All = return () -let DataSynchronizationBarrier_Reads = return () -let DataSynchronizationBarrier_Writes = return () -let DataSynchronizationBarrier_All = return () -let InstructionSynchronizationBarrier = return () +let DataMemoryBarrier_Reads () = return () +let DataMemoryBarrier_Writes () = return () +let DataMemoryBarrier_All () = return () +let DataSynchronizationBarrier_Reads () = return () +let DataSynchronizationBarrier_Writes () = return () +let DataSynchronizationBarrier_All () = return () +let InstructionSynchronizationBarrier () = return () diff --git a/src/gen_lib/prompt.lem b/src/gen_lib/prompt.lem index 6fa406b8..1382fd1d 100644 --- a/src/gen_lib/prompt.lem +++ b/src/gen_lib/prompt.lem @@ -83,7 +83,7 @@ type reg_name = * specifies a part of the field, indexed w.r.t. the register as a whole *) | Reg_f_slice of string * nat * direction * string * slice * slice -type outcome 'e 'a = +type outcome 'a = (* Request to read memory, value is location to read followed by registers that location depended * on when mode.track_values, integer is size to read, followed by registers that were used in * computing that size *) @@ -123,7 +123,7 @@ type outcome 'e 'a = (* Escape the current instruction, for traps, some sys calls, interrupts, etc. Can optionally * provide a handler. *) - | Escape 'e (* currently without handlers *) (* of maybe (unit -> outcome 'a) *) + | Escape of (outcome unit) (* currently without handlers *) (* of maybe (unit -> outcome 'a) *) (* Stop for incremental stepping, function can be used to display function call data *) | Done of 'a diff --git a/src/gen_lib/sail_values.lem b/src/gen_lib/sail_values.lem index c78a6cdf..0f6aa5ee 100644 --- a/src/gen_lib/sail_values.lem +++ b/src/gen_lib/sail_values.lem @@ -1,17 +1,18 @@ open import Pervasives_extra -open import State open import Vector open import Arch type i = integer type number = integer +type n = natural + let length l = integerFromNat (length l) -let has_undef (V bs _ _) = List.any (function Undef -> true | _ -> false end) bs +let has_undef (Vector bs _ _) = List.any (function Undef -> true | _ -> false end) bs let most_significant = function - | (V (b :: _) _ _) -> b + | (Vector (b :: _) _ _) -> b | _ -> failwith "most_significant applied to empty vector" end @@ -22,9 +23,11 @@ let bitwise_not_bit = function end let (~) = bitwise_not_bit +let pow m n = m ** (natFromInteger n) + -let bitwise_not (V bs start is_inc) = - V (List.map bitwise_not_bit bs) start is_inc +let bitwise_not (Vector bs start is_inc) = + Vector (List.map bitwise_not_bit bs) start is_inc val is_one : integer -> bit let is_one i = @@ -56,15 +59,15 @@ let (|.) x y = bitwise_or_bit (x,y) val (+.) : bit -> bit -> bit let (+.) x y = bitwise_xor_bit (x,y) -let bitwise_binop op (V bsl start is_inc, V bsr _ _) = +let bitwise_binop op (Vector bsl start is_inc, Vector bsr _ _) = let revbs = foldl (fun acc pair -> bitwise_binop_bit op pair :: acc) [] (zip bsl bsr) in - V (reverse revbs) start is_inc + Vector (reverse revbs) start is_inc let bitwise_and = bitwise_binop (&&) let bitwise_or = bitwise_binop (||) let bitwise_xor = bitwise_binop xor -let unsigned (V bs _ _ as v) : integer = +let unsigned (Vector bs _ _ as v) : integer = if has_undef v then failwith "unsigned applied to vector with undefined bits" else fst (List.foldl (fun (acc,exp) b -> (acc + (if b = I then integerPow 2 exp else 0),exp +1)) (0,0) bs) @@ -133,13 +136,13 @@ let to_vec is_inc ((len : integer),(n : integer)) = let bs = List.replicate (natFromInteger len) O in let start = if is_inc then 0 else len-1 in if n = 0 then - V bs start is_inc + Vector bs start is_inc else if n > 0 then - V (divide_by_2 bs (len-1) n) start is_inc + Vector (divide_by_2 bs (len-1) n) start is_inc else let abs_bs = divide_by_2 bs (len-1) (abs n) in - let (V bs start is_inc) = bitwise_not (V abs_bs start is_inc) in - V (add_one_bit bs false (len-1)) start is_inc + let (Vector bs start is_inc) = bitwise_not (Vector abs_bs start is_inc) in + Vector (add_one_bit bs false (len-1)) start is_inc let to_vec_big = to_vec @@ -147,12 +150,12 @@ let to_vec_inc = to_vec true let to_vec_dec = to_vec false let to_vec_undef is_inc (len : integer) = - V (replicate (natFromInteger len) Undef) (if is_inc then 0 else len-1) is_inc + Vector (replicate (natFromInteger len) Undef) (if is_inc then 0 else len-1) is_inc let to_vec_inc_undef = to_vec_undef true let to_vec_dec_undef = to_vec_undef false -let get_dir (V _ _ ord) = ord +let get_dir (Vector _ _ ord) = ord let exts (len, vec) = to_vec (get_dir vec) (len,signed vec) let extz (len, vec) = to_vec (get_dir vec) (len,unsigned vec) @@ -168,7 +171,7 @@ let modulo = integerMod let quot = integerDiv let power = integerPow -let arith_op_vec op sign (size : integer) (V _ _ is_inc as l) r = +let arith_op_vec op sign (size : integer) (Vector _ _ is_inc as l) r = let (l',r') = (to_num sign l, to_num sign r) in let n = op l' r' in to_vec is_inc (size * (length l),n) @@ -186,7 +189,7 @@ let minus_VVV = arith_op_vec integerMinus false 1 let mult_VVV = arith_op_vec integerMult false 2 let multS_VVV = arith_op_vec integerMult true 2 -let arith_op_vec_range op sign size (V _ _ is_inc as l) r = +let arith_op_vec_range op sign size (Vector _ _ is_inc as l) r = arith_op_vec op sign size l (to_vec is_inc (length l,r)) (* add_vec_range @@ -201,7 +204,7 @@ let minus_VIV = arith_op_vec_range integerMinus false 1 let mult_VIV = arith_op_vec_range integerMult false 2 let multS_VIV = arith_op_vec_range integerMult true 2 -let arith_op_range_vec op sign size l (V _ _ is_inc as r) = +let arith_op_range_vec op sign size l (Vector _ _ is_inc as r) = arith_op_vec op sign size (to_vec is_inc (length r, l)) r (* add_range_vec @@ -248,7 +251,7 @@ let arith_op_vec_vec_range op sign l r = let add_VVI = arith_op_vec_vec_range integerAdd false let addS_VVI = arith_op_vec_vec_range integerAdd true -let arith_op_vec_bit op sign (size : integer) (V _ _ is_inc as l)r = +let arith_op_vec_bit op sign (size : integer) (Vector _ _ is_inc as l)r = let l' = to_num sign l in let n = op l' (match r with | I -> (1 : integer) | _ -> 0 end) in to_vec is_inc (length l * size,n) @@ -261,7 +264,7 @@ let add_VBV = arith_op_vec_bit integerAdd false 1 let addS_VBV = arith_op_vec_bit integerAdd true 1 let minus_VBV = arith_op_vec_bit integerMinus true 1 -let rec arith_op_overflow_vec (op : integer -> integer -> integer) sign size (V _ _ is_inc as l) r = +let rec arith_op_overflow_vec (op : integer -> integer -> integer) sign size (Vector _ _ is_inc as l) r = let len = length l in let act_size = len * size in let (l_sign,r_sign) = (to_num sign l,to_num sign r) in @@ -292,7 +295,7 @@ let multO_VVV = arith_op_overflow_vec integerMult false 2 let multSO_VVV = arith_op_overflow_vec integerMult true 2 let rec arith_op_overflow_vec_bit (op : integer -> integer -> integer) sign (size : integer) - (V _ _ is_inc as l) r_bit = + (Vector _ _ is_inc as l) r_bit = let act_size = length l * size in let l' = to_num sign l in let l_u = to_num false l in @@ -320,35 +323,35 @@ let addSO_VBV = arith_op_overflow_vec_bit integerAdd true 1 let minusO_VBV = arith_op_overflow_vec_bit integerMinus false 1 let minusSO_VBV = arith_op_overflow_vec_bit integerMinus true 1 -type shift = LL | RR | LLL +type shift = LL_shift | RR_shift | LLL_shift -let shift_op_vec op ((V bs start is_inc as l),(n : integer)) = +let shift_op_vec op ((Vector bs start is_inc as l),(n : integer)) = let len = integerFromNat (List.length bs) in match op with - | LL (*"<<"*) -> - let right_vec = V (List.replicate (natFromInteger n) O) 0 true in + | LL_shift (*"<<"*) -> + let right_vec = Vector (List.replicate (natFromInteger n) O) 0 true in let left_vec = slice l n (if is_inc then len + start else start - len) in vector_concat left_vec right_vec - | RR (*">>"*) -> + | RR_shift (*">>"*) -> let right_vec = slice l start n in - let left_vec = V (List.replicate (natFromInteger n) O) 0 true in + let left_vec = Vector (List.replicate (natFromInteger n) O) 0 true in vector_concat left_vec right_vec - | LLL (*"<<<"*) -> + | LLL_shift (*"<<<"*) -> let left_vec = slice l n (if is_inc then len + start else start - len) in let right_vec = slice l start n in vector_concat left_vec right_vec end -let bitwise_leftshift = shift_op_vec LL (*"<<"*) -let bitwise_rightshift = shift_op_vec RR (*">>"*) -let bitwise_rotate = shift_op_vec LLL (*"<<<"*) +let bitwise_leftshift = shift_op_vec LL_shift (*"<<"*) +let bitwise_rightshift = shift_op_vec RR_shift (*">>"*) +let bitwise_rotate = shift_op_vec LLL_shift (*"<<<"*) let rec arith_op_no0 (op : integer -> integer -> integer) l r = if r = 0 then Nothing else Just (op l r) -let rec arith_op_vec_no0 (op : integer -> integer -> integer) sign size ((V _ start is_inc) as l) r = +let rec arith_op_vec_no0 (op : integer -> integer -> integer) sign size ((Vector _ start is_inc) as l) r = let act_size = length l * size in let (l',r') = (to_num sign l,to_num sign r) in let n = arith_op_no0 op l' r' in @@ -361,13 +364,13 @@ let rec arith_op_vec_no0 (op : integer -> integer -> integer) sign size ((V _ st end in if representable then to_vec is_inc (act_size,n') - else V (List.replicate (natFromInteger act_size) Undef) start is_inc + else Vector (List.replicate (natFromInteger act_size) Undef) start is_inc let mod_VVV = arith_op_vec_no0 integerMod false 1 let quot_VVV = arith_op_vec_no0 integerDiv false 1 let quotS_VVV = arith_op_vec_no0 integerDiv true 1 -let arith_op_overflow_no0_vec op sign size ((V _ start is_inc) as l) r = +let arith_op_overflow_no0_vec op sign size ((Vector _ start is_inc) as l) r = let rep_size = length r * size in let act_size = length l * size in let (l',r') = (to_num sign l,to_num sign r) in @@ -385,21 +388,31 @@ let arith_op_overflow_no0_vec op sign size ((V _ start is_inc) as l) r = if representable then (to_vec is_inc (act_size,n'),to_vec is_inc (act_size + 1,n_u')) else - (V (List.replicate (natFromInteger act_size) Undef) start is_inc, - V (List.replicate (natFromInteger (act_size + 1)) Undef) start is_inc) in + (Vector (List.replicate (natFromInteger act_size) Undef) start is_inc, + Vector (List.replicate (natFromInteger (act_size + 1)) Undef) start is_inc) in let overflow = if representable then O else I in (correct_size_num,overflow,most_significant one_more) let quotO_VVV = arith_op_overflow_no0_vec integerDiv false 1 let quotSO_VVV = arith_op_overflow_no0_vec integerDiv true 1 -let arith_op_vec_range_no0 op sign size (V _ _ is_inc as l) r = +let arith_op_vec_range_no0 op sign size (Vector _ _ is_inc as l) r = arith_op_vec_no0 op sign size l (to_vec is_inc (length l,r)) let mod_VIV = arith_op_vec_range_no0 integerMod false 1 let duplicate (bit,length) = - V (List.replicate (natFromInteger length) bit) 0 true + Vector (List.replicate (natFromInteger length) bit) 0 true + +val repeat : forall 'a. list 'a -> integer -> list 'a +let rec repeat xs = function + | 0 -> [] + | n -> xs ++ repeat xs (n-1) + end + +let duplicate_bits (Vector bits start direction,len) = + let bits' = repeat bits len in + Vector bits' start direction let compare_op op (l,r) = bool_to_bit (op l r) @@ -463,7 +476,7 @@ val make_indexed_vector_reg : list (integer * register) -> maybe register -> int let make_indexed_vector_reg entries default start length = let length = natFromInteger length in match default with - | Just v -> V (List.foldl replace (replicate length v) entries) start defaultDir + | Just v -> Vector (List.foldl replace (replicate length v) entries) start defaultDir | Nothing -> failwith "make_indexed_vector used without default value" end @@ -471,15 +484,15 @@ val make_indexed_vector_bit : list (integer * bit) -> maybe bit -> integer -> in let make_indexed_vector_bit entries default start length = let length = natFromInteger length in let default = match default with Nothing -> Undef | Just v -> v end in - V (List.foldl replace (replicate length default) entries) start defaultDir + Vector (List.foldl replace (replicate length default) entries) start defaultDir val make_bit_vector_undef : integer -> vector bit let make_bitvector_undef length = - V (replicate (natFromInteger length) Undef) 0 true + Vector (replicate (natFromInteger length) Undef) 0 true let bitwise_not_range_bit n = bitwise_not (to_vec defaultDir n) -let mask (n,V bits start dir) = +let mask (n,Vector bits start dir) = let current_size = List.length bits in - V (drop (current_size - (natFromInteger n)) bits) (if dir then 0 else (n-1)) dir + Vector (drop (current_size - (natFromInteger n)) bits) (if dir then 0 else (n-1)) dir diff --git a/src/gen_lib/state.lem b/src/gen_lib/state.lem index 610bcc7d..6db45002 100644 --- a/src/gen_lib/state.lem +++ b/src/gen_lib/state.lem @@ -38,6 +38,13 @@ let (>>=) = bind val (>>): forall 's 'e 'b. State 's 'e unit -> State 's 'e 'b -> State 's 'e 'b let (>>) m n = m >>= fun _ -> n +let assert' b msg_opt = + let msg = match msg_opt with + | Just msg -> msg + | Nothing -> "unspecified error" + end in + if to_bool b then failwith msg else () + val read_writeEA : forall 'e. unit -> State state 'e (integer * integer) let read_writeEA () s = (Left s.writeEA,s) @@ -68,10 +75,10 @@ let write_memstate s (addr,bits) = Map.insert addr bits s val read_memory : forall 'e. integer -> integer -> State state 'e (vector bit) let read_memory addr l s = let bytes = List.map (compose (read_memstate s.memstate) ((+) addr)) (ints l) in - (Left (V (foldl (++) [] bytes) 0 defaultDir),s) + (Left (Vector (foldl (++) [] bytes) 0 defaultDir),s) val write_memory : forall 'e. integer -> integer -> vector bit -> State state 'e unit -let write_memory addr l (V bits _ _) s = +let write_memory addr l (Vector bits _ _) s = let addrs = List.map ((+) addr) (ints l) in let bytes = byte_chunks l bits in (Left (), <| s with memstate = foldl write_memstate s.memstate (zip addrs bytes) |>) diff --git a/src/gen_lib/vector.lem b/src/gen_lib/vector.lem index 4044e23c..72c8b584 100644 --- a/src/gen_lib/vector.lem +++ b/src/gen_lib/vector.lem @@ -1,7 +1,7 @@ open import Pervasives_extra type bit = O | I | Undef -type vector 'a = V of list 'a * integer * bool +type vector 'a = Vector of list 'a * integer * bool let rec nth xs (n : integer) = match xs with @@ -15,8 +15,8 @@ let to_bool = function | Undef -> failwith "to_bool applied to Undef" end -let get_start (V _ s _) = s -let length (V bs _ _) = length bs +let get_start (Vector _ s _) = s +let length (Vector bs _ _) = length bs let rec replace bs ((n : integer),b') = match bs with | [] -> [] @@ -27,13 +27,13 @@ let rec replace bs ((n : integer),b') = match bs with b :: replace bs (n - 1,b') end -let vector_concat (V bs start is_inc) (V bs' _ _) = - V (bs ++ bs') start is_inc +let vector_concat (Vector bs start is_inc) (Vector bs' _ _) = + Vector (bs ++ bs') start is_inc let (^^) = vector_concat val slice : vector bit -> integer -> integer -> vector bit -let slice (V bs start is_inc) n m = +let slice (Vector bs start is_inc) n m = let n = natFromInteger n in let m = natFromInteger m in let start = natFromInteger start in @@ -41,9 +41,9 @@ let slice (V bs start is_inc) n m = let (_,suffix) = List.splitAt offset bs in let (subvector,_) = List.splitAt length suffix in let n = integerFromNat n in - V subvector n is_inc + Vector subvector n is_inc -let update (V bs start is_inc) n m (V bs' _ _) = +let update (Vector bs start is_inc) n m (Vector bs' _ _) = let n = natFromInteger n in let m = natFromInteger m in let start = natFromInteger start in @@ -51,12 +51,12 @@ let update (V bs start is_inc) n m (V bs' _ _) = let (prefix,_) = List.splitAt offset bs in let (_,suffix) = List.splitAt (offset + length) bs in let start = integerFromNat start in - V (prefix ++ (List.take length bs') ++ suffix) start is_inc + Vector (prefix ++ (List.take length bs') ++ suffix) start is_inc val access : forall 'a. vector 'a -> (*nat*) integer -> 'a -let access (V bs start is_inc) n = +let access (Vector bs start is_inc) n = if is_inc then nth bs (n - start) else nth bs (start - n) val update_pos : forall 'a. vector 'a -> (*nat*) integer -> 'a -> vector 'a let update_pos v n b = - update v n n (V [b] 0 true) + update v n n (Vector [b] 0 true) |
