summaryrefslogtreecommitdiff
path: root/src/gen_lib/prompt.lem
diff options
context:
space:
mode:
authorBrian Campbell2017-10-02 13:19:57 +0100
committerBrian Campbell2017-10-02 13:19:57 +0100
commit0e2e4a583ee1f5c76c17355c9ffc92111960f4dd (patch)
treef14029fb0edc05a2413c8cf9b0ede60149796639 /src/gen_lib/prompt.lem
parent686b65f279db1c37ec4e72e4b76b3ce43d1138f5 (diff)
parentddc8421b1d51dd76aeb6035e2ebb0fbb64db9cb7 (diff)
Merge branch 'experiments' into mono-experiments
Diffstat (limited to 'src/gen_lib/prompt.lem')
-rw-r--r--src/gen_lib/prompt.lem38
1 files changed, 21 insertions, 17 deletions
diff --git a/src/gen_lib/prompt.lem b/src/gen_lib/prompt.lem
index 8e04bd30..f5ac8fc5 100644
--- a/src/gen_lib/prompt.lem
+++ b/src/gen_lib/prompt.lem
@@ -73,12 +73,12 @@ let rec catch_early_return m = match m with
| Return a -> Done a
end
-val read_mem : bool -> read_kind -> vector bitU -> integer -> M (vector bitU)
+val read_mem : forall 'a 'b. Bitvector 'a, Bitvector 'b => bool -> read_kind -> 'a -> integer -> M 'b
let read_mem dir rk addr sz =
- let addr = address_lifted_of_bitv addr in
+ let addr = address_lifted_of_bitv (bits_of addr) in
let sz = natFromInteger sz in
let k memory_value =
- let bitv = internal_mem_value dir memory_value in
+ let bitv = of_bits (internal_mem_value dir memory_value) in
(Done bitv,Nothing) in
Read_mem (rk,addr,sz) k
@@ -87,22 +87,22 @@ let excl_result () =
let k successful = (return successful,Nothing) in
Excl_res k
-val write_mem_ea : write_kind -> vector bitU -> integer -> M unit
+val write_mem_ea : forall 'a. Bitvector 'a => write_kind -> 'a -> integer -> M unit
let write_mem_ea wk addr sz =
- let addr = address_lifted_of_bitv addr in
+ let addr = address_lifted_of_bitv (bits_of addr) in
let sz = natFromInteger sz in
Write_ea (wk,addr,sz) (Done (),Nothing)
-val write_mem_val : vector bitU -> M bool
+val write_mem_val : forall 'a. Bitvector 'a => 'a -> M bool
let write_mem_val v =
- let v = external_mem_value v in
+ let v = external_mem_value (bits_of v) in
let k successful = (return successful,Nothing) in
Write_memv v k
-val read_reg_aux : reg_name -> M (vector bitU)
+val read_reg_aux : forall 'a. Bitvector 'a => reg_name -> M 'a
let read_reg_aux reg =
let k reg_value =
- let v = internal_reg_value reg_value in
+ let v = of_bits (internal_reg_value reg_value) in
(Done v,Nothing) in
Read_reg reg k
@@ -121,25 +121,29 @@ let read_reg_bitfield reg regfield =
let reg_deref = read_reg
-val write_reg_aux : reg_name -> vector bitU -> M unit
+val write_reg_aux : forall 'a. Bitvector 'a => reg_name -> 'a -> M unit
let write_reg_aux reg_name v =
- let regval = external_reg_value reg_name v in
+ let regval = external_reg_value reg_name (bits_of v) in
Write_reg (reg_name,regval) (Done (), Nothing)
let write_reg reg v =
write_reg_aux (external_reg_whole reg) v
let write_reg_range reg i j v =
write_reg_aux (external_reg_slice reg (natFromInteger i,natFromInteger j)) v
-let write_reg_bit reg i bit =
+let write_reg_pos reg i v =
let iN = natFromInteger i in
- write_reg_aux (external_reg_slice reg (iN,iN)) (Vector [bit] i (is_inc_of_reg reg))
+ write_reg_aux (external_reg_slice reg (iN,iN)) [v]
+let write_reg_bit = write_reg_pos
let write_reg_field reg regfield v =
write_reg_aux (external_reg_field_whole reg regfield.field_name) v
-let write_reg_bitfield reg regfield bit =
+(*let write_reg_field_bit reg regfield bit =
write_reg_aux (external_reg_field_whole reg regfield.field_name)
- (Vector [bit] 0 (is_inc_of_reg reg))
+ (Vector [bit] 0 (is_inc_of_reg reg))*)
let write_reg_field_range reg regfield i j v =
write_reg_aux (external_reg_field_slice reg regfield.field_name (natFromInteger i,natFromInteger j)) v
+let write_reg_field_pos reg regfield i v =
+ write_reg_field_range reg regfield i i [v]
+let write_reg_field_bit = write_reg_field_pos
@@ -199,7 +203,7 @@ let rec while_MM is_while vars cond body =
then body vars >>= fun vars -> while_MM is_while vars cond body
else return vars
-let write_two_regs r1 r2 vec =
+(*let write_two_regs r1 r2 vec =
let is_inc =
let is_inc_r1 = is_inc_of_reg r1 in
let is_inc_r2 = is_inc_of_reg r2 in
@@ -218,4 +222,4 @@ let write_two_regs r1 r2 vec =
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
+ write_reg r1 r1_v >> write_reg r2 r2_v*)