diff options
Diffstat (limited to 'src/gen_lib')
| -rw-r--r-- | src/gen_lib/power_extras.lem | 8 | ||||
| -rw-r--r-- | src/gen_lib/prompt.lem | 68 | ||||
| -rw-r--r-- | src/gen_lib/sail_values.lem | 68 | ||||
| -rw-r--r-- | src/gen_lib/vector.lem | 4 |
4 files changed, 92 insertions, 56 deletions
diff --git a/src/gen_lib/power_extras.lem b/src/gen_lib/power_extras.lem index 2e255db7..c16b197f 100644 --- a/src/gen_lib/power_extras.lem +++ b/src/gen_lib/power_extras.lem @@ -25,10 +25,10 @@ let MEMw (_,_,value) = write_memory_val value >>= fun _ -> return () let MEMw_conditional (_,_,value) = write_memory_val value >>= fun b -> return (bool_to_bit b) -val I_Sync : forall 'e unit -> M 'e unit -val H_Sync : forall 'e unit -> M 'e unit -val LW_Sync : forall 'e unit -> M 'e unit -val EIEIO_Sync : forall 'e unit -> M 'e unit +val I_Sync : forall 'e. unit -> M 'e unit +val H_Sync : forall 'e. unit -> M 'e unit +val LW_Sync : forall 'e. unit -> M 'e unit +val EIEIO_Sync : forall 'e. unit -> M 'e unit let I_Sync () = barrier Isync let H_Sync () = barrier Sync diff --git a/src/gen_lib/prompt.lem b/src/gen_lib/prompt.lem index 02a83d8a..412bfbc1 100644 --- a/src/gen_lib/prompt.lem +++ b/src/gen_lib/prompt.lem @@ -2,7 +2,6 @@ open import Pervasives_extra open import Sail_impl_base open import Vector open import Sail_values -open import Arch val return : forall 's 'e 'a. 'a -> outcome 's 'e 'a let return a = Done a @@ -55,8 +54,8 @@ let write_memory_val v = val read_reg_range : forall 'e. register -> integer -> integer -> M 'e (vector bitU) let read_reg_range reg i j = let (i,j) = (natFromInteger i,natFromInteger j) in - let start = natFromInteger (start_index_reg reg) in - let reg = Reg_slice (register_to_string reg) start (dir defaultDir) (i,j) in + let reg = Reg_slice (name_of_reg reg) (start_of_reg_nat reg) (dir_of_reg reg) + (if i<j then (i,j) else (j,i)) in let k register_value = let v = bitvFromRegisterValue register_value in (Done v,Nothing) in @@ -68,37 +67,34 @@ let read_reg_bit reg i = val read_reg : forall 'e. register -> M 'e (vector bitU) let read_reg reg = - let start = natFromInteger (start_index_reg reg) in - let sz = natFromInteger (length_reg reg) in - let reg = Reg (register_to_string reg) start sz (dir defaultDir) in + let reg = Reg (name_of_reg reg) (start_of_reg_nat reg) + (size_of_reg_nat reg) (dir_of_reg reg) in let k register_value = let v = bitvFromRegisterValue register_value in (Done v,Nothing) in Read_reg reg k + val read_reg_field : forall 'e. register -> register_field -> M 'e (vector bitU) -let read_reg_field reg rfield = - let (i,j) = - let (i,j) = field_indices rfield in - (natFromInteger i,natFromInteger j) in - let start = natFromInteger (start_index_reg reg) in - let reg = Reg_slice (register_to_string reg) start (dir defaultDir) (i,j) in +let read_reg_field reg regfield = + let (i,j) = register_field_indices_nat reg regfield in + let reg = Reg_slice (name_of_reg reg) (start_of_reg_nat reg) (dir_of_reg reg) + (if i<j then (i,j) else (j,i)) in let k register_value = let v = bitvFromRegisterValue register_value in (Done v,Nothing) in Read_reg reg k -val read_reg_bitfield : forall 'e. register -> register_bitfield -> M 'e bitU -let read_reg_bitfield reg rbit = read_reg_bit reg (field_index_bit rbit) - +val read_reg_bitfield : forall 'e. register -> register_field -> M 'e bitU +let read_reg_bitfield reg rbit = + read_reg_bit reg (fst (register_field_indices reg rbit)) val write_reg_range : forall 'e. register -> integer -> integer -> vector bitU -> M 'e unit let write_reg_range reg i j v = let rv = registerValueFromBitv v reg in - let start = natFromInteger (start_index_reg reg) in let (i,j) = (natFromInteger i,natFromInteger j) in - let reg = Reg_slice (register_to_string reg) start (dir defaultDir) (i,j) in + let reg = Reg_slice (name_of_reg reg) (start_of_reg_nat reg) (dir_of_reg reg) (i,j) in Write_reg (reg,rv) (Done (),Nothing) val write_reg_bit : forall 'e. register -> integer -> bitU -> M 'e unit @@ -107,16 +103,17 @@ let write_reg_bit reg i bit = write_reg_range reg i i (Vector [bit] 0 true) val write_reg : forall 'e. register -> vector bitU -> M 'e unit let write_reg reg v = let rv = registerValueFromBitv v reg in - let start = natFromInteger (start_index_reg reg) in - let sz = natFromInteger (length_reg reg) in - let reg = Reg (register_to_string reg) start sz (dir defaultDir) in + let reg = Reg (name_of_reg reg) (start_of_reg_nat reg) + (size_of_reg_nat reg) (dir_of_reg reg) in Write_reg (reg,rv) (Done (),Nothing) val write_reg_field : forall 'e. register -> register_field -> vector bitU -> M 'e unit -let write_reg_field reg rfield = uncurry (write_reg_range reg) (field_indices rfield) +let write_reg_field reg regfield = + uncurry (write_reg_range reg) (register_field_indices reg regfield) -val write_reg_bitfield : forall 'e. register -> register_bitfield -> bitU -> M 'e unit -let write_reg_bitfield reg rbit = write_reg_bit reg (field_index_bit rbit) +val write_reg_bitfield : forall 'e. register -> register_field -> bitU -> M 'e unit +let write_reg_bitfield reg rbit = + write_reg_bit reg (fst (register_field_indices reg rbit)) val barrier : forall 'e. barrier_kind -> M 'e unit @@ -146,14 +143,23 @@ let rec foreachM_dec (i,stop,by) vars body = foreachM_dec (i - by,stop,by) vars body else return vars - let write_two_regs r1 r2 vec = - let size = length_reg r1 in - let start = get_start vec in - let vsize = length vec in - let r1_v = slice vec start ((if defaultDir then size - start else start - size) - 1) in + let is_inc = + let is_inc_r1 = is_inc_of_reg r1 in + let is_inc_r2 = is_inc_of_reg r2 in + let () = ensure (is_inc_r1 = is_inc_r2) + "write_two_regs called with vectors of different direction" in + is_inc_r1 in + + let (size_r1 : integer) = size_of_reg r1 in + let (start_vec : integer) = get_start vec in + let size_vec = length vec in + let r1_v = + if is_inc + then slice vec start_vec (size_r1 - start_vec - 1) + else slice vec start_vec (start_vec - size_r1 - 1) in let r2_v = - (slice vec) - (if defaultDir then size - start else start - size) - (if defaultDir then vsize - start else start - vsize) in + if is_inc + then slice vec (size_r1 - start_vec) (size_vec - start_vec) + else slice vec (start_vec - size_r1) (start_vec - size_vec) in write_reg r1 r1_v >> write_reg r2 r2_v diff --git a/src/gen_lib/sail_values.lem b/src/gen_lib/sail_values.lem index 98b68e1b..9307ef80 100644 --- a/src/gen_lib/sail_values.lem +++ b/src/gen_lib/sail_values.lem @@ -1,11 +1,48 @@ open import Pervasives_extra open import Sail_impl_base open import Vector -open import Arch type i = integer type n = natural +type bitU = O | I | Undef + + +type register_field = string +type register_field_index = string * (integer * integer) (* name, start and end *) + +type register = + | Register of string * (* name *) + integer * (* length *) + integer * (* start index *) + bool * (* is increasing *) + list register_field_index + | UndefinedRegister of integer (* length *) + | RegisterPair of register * register + +let dir is_inc = if is_inc then D_increasing else D_decreasing + +let name_of_reg (Register name _ _ _ _) = name +let size_of_reg (Register _ size _ _ _) = size +let start_of_reg (Register _ _ start _ _) = start +let is_inc_of_reg (Register _ _ _ is_inc _) = is_inc +let dir_of_reg (Register _ _ _ is_inc _) = dir is_inc + +let size_of_reg_nat reg = natFromInteger (size_of_reg reg) +let start_of_reg_nat reg = natFromInteger (start_of_reg reg) + + +val register_field_indices : register -> register_field -> integer * integer +let register_field_indices (Register _ _ _ _ rfields) rfield = + match List.lookup rfield rfields with + | None -> failwith "Invalid register/register-field combination" + | Just indices -> indices + end + +let register_field_indices_nat reg regfield= + let (i,j) = register_field_indices reg regfield in + (natFromInteger i,natFromInteger j) + let to_bool = function | O -> false | I -> true @@ -147,7 +184,7 @@ let rec divide_by_2 bs (i : integer) (n : integer) = let rec add_one_bit bs co (i : integer) = if i < 0 then bs - else match (nth bs i,co) with + else match (List_extra.nth bs (natFromInteger i),co) with | (O,false) -> replace bs (i,I) | (O,true) -> add_one_bit (replace bs (i,I)) true (i-1) | (I,false) -> add_one_bit (replace bs (i,O)) true (i-1) @@ -178,8 +215,6 @@ let to_vec_undef is_inc (len : integer) = let to_vec_inc_undef = to_vec_undef true let to_vec_dec_undef = to_vec_undef false - -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) @@ -495,16 +530,16 @@ let neq_vec_range (l,r) = bitwise_not_bit (eq_vec_range (l,r)) let neq_range_vec (l,r) = bitwise_not_bit (eq_range_vec (l,r)) -val make_indexed_vector : forall 'a. list (integer * 'a) -> 'a -> integer -> integer -> vector 'a -let make_indexed_vector entries default start length = +val make_indexed_vector : forall 'a. list (integer * 'a) -> 'a -> integer -> integer -> bool -> vector 'a +let make_indexed_vector entries default start length dir = let length = natFromInteger length in - Vector (List.foldl replace (replicate length default) entries) start defaultDir + Vector (List.foldl replace (replicate length default) entries) start dir val make_bit_vector_undef : integer -> vector bitU let make_bitvector_undef length = Vector (replicate (natFromInteger length) Undef) 0 true -let bitwise_not_range_bit n = bitwise_not (to_vec defaultDir n) +(* let bitwise_not_range_bit n = bitwise_not (to_vec defaultDir n) *) let mask (n,Vector bits start dir) = let current_size = List.length bits in @@ -528,7 +563,8 @@ end val bitv_of_byte_lifteds : list Sail_impl_base.byte_lifted -> vector bitU let bitv_of_byte_lifteds v = - Vector (foldl (fun x (Byte_lifted y) -> x ++ (List.map bitU_of_bit_lifted y)) [] v) 0 defaultDir + Vector (foldl (fun x (Byte_lifted y) -> x ++ (List.map bitU_of_bit_lifted y)) [] v) 0 true + val byte_lifteds_of_bitv : vector bitU -> list byte_lifted let byte_lifteds_of_bitv (Vector bits length is_inc) = @@ -540,26 +576,22 @@ let address_lifted_of_bitv v = Address_lifted (byte_lifteds_of_bitv v) Nothing -let dir is_inc = if is_inc then D_increasing else D_decreasing - - val bitvFromRegisterValue : register_value -> vector bitU let bitvFromRegisterValue v = Vector (List.map bitU_of_bit_lifted v.rv_bits) - (integerFromNat (v.rv_start)) + (integerFromNat v.rv_start_internal) (v.rv_dir = D_increasing) val registerValueFromBitv : vector bitU -> register -> register_value let registerValueFromBitv (Vector bits start is_inc) reg = let start = natFromInteger start in - <| rv_bits = List.map bit_lifted_of_bitU bits; + let bit_lifteds = + List.map bit_lifted_of_bitU bits in + <| rv_bits = bit_lifteds; rv_dir = dir is_inc; rv_start_internal = start; - rv_start = start+1 - (natFromInteger (length_reg reg)) |> - - - + rv_start = if is_inc then start else start+1 - (size_of_reg_nat reg) |> class (ToNatural 'a) diff --git a/src/gen_lib/vector.lem b/src/gen_lib/vector.lem index 6acb4aa0..07238180 100644 --- a/src/gen_lib/vector.lem +++ b/src/gen_lib/vector.lem @@ -1,8 +1,5 @@ open import Pervasives_extra -(* this is here to avoid circular dependencies when Sail_values imports Arch.lem *) -type bitU = O | I | Undef - (* element list * start * has increasing direction *) type vector 'a = Vector of list 'a * integer * bool @@ -13,6 +10,7 @@ let rec nth xs (n : integer) = end +let get_dir (Vector _ _ ord) = ord let get_start (Vector _ s _) = s let length (Vector bs _ _) = integerFromNat (length bs) |
