summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lem_interp/interp.lem11
-rw-r--r--src/lem_interp/interp_inter_imp.lem9
-rw-r--r--src/lem_interp/printing_functions.ml2
-rw-r--r--src/lem_interp/run_interp_model.ml4
-rw-r--r--src/type_check.ml13
5 files changed, 22 insertions, 17 deletions
diff --git a/src/lem_interp/interp.lem b/src/lem_interp/interp.lem
index 0abc6220..92fa4ec0 100644
--- a/src/lem_interp/interp.lem
+++ b/src/lem_interp/interp.lem
@@ -583,7 +583,6 @@ let access_vector v n =
| V_lit (L_aux L_zero _) -> v
| V_lit (L_aux L_one _ ) -> v
| V_vector m dir vs ->
- (*let _ = debug_print ("access_vector given " ^ string_of_value v ^ " where dir was " ^ (if is_inc(dir) then "increasing" else "decreaseing") ^ " and start is " ^ show m ^ " and index is " ^ show n ^ "\n") in*)
list_nth vs (if is_inc(dir) then (n - m) else (m - n))
| V_vector_sparse _ _ _ vs d ->
match (List.lookup n vs) with
@@ -702,7 +701,7 @@ val fupdate_vector_slice : value -> value -> nat -> nat -> value
let fupdate_vector_slice vec replace start stop =
let fupdate_vec_help vec replace =
(match (vec,replace) with
- | (V_vector m dir vals,V_vector _ dir' reps) ->
+ | (V_vector m dir vals,V_vector r_m dir' reps) ->
V_vector m dir
(replace_is vals
(if dir=dir' then reps else (List.reverse reps))
@@ -761,7 +760,7 @@ let update_vector_slice track vector value start stop mem =
^ " and " ^ string_of_value value)
end
-let update_vector_start default_dir new_start expected_size v =
+let update_vector_start default_dir new_start expected_size v =
retaint v
(match detaint v with
| V_lit (L_aux L_zero _) -> V_vector new_start default_dir [v]
@@ -1908,13 +1907,11 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) =
(interp_main mode t_level l_env lm e2)
(fun v2 lm le ->
let append v1 v2 = (match (v1,v2) with
- | (V_vector m dir vals1, V_vector _ _ vals2) ->
+ | (V_vector _ dir vals1, V_vector _ _ vals2) ->
let vals = vals1++vals2 in
let len = List.length vals in
if is_inc(dir)
- then V_vector m dir vals
- else if m > len
- then V_vector m dir vals
+ then V_vector 0 dir vals
else V_vector (len-1) dir vals
| (V_vector m dir vals1, V_vector_sparse _ len _ vals2 d) ->
let original_len = List.length vals1 in
diff --git a/src/lem_interp/interp_inter_imp.lem b/src/lem_interp/interp_inter_imp.lem
index 914cc6a5..d7a86b7e 100644
--- a/src/lem_interp/interp_inter_imp.lem
+++ b/src/lem_interp/interp_inter_imp.lem
@@ -247,10 +247,17 @@ let rec slice_reg_value v start stop =
rv_start_internal = r_internal_start
|>
+let lift_reg_name_to_whole reg_name size = match reg_name with
+ | Reg _ _ _ _ -> reg_name
+ | Reg_slice name start dir _ -> Reg name start size dir
+ | Reg_field name start dir _ _ -> Reg name start size dir
+ | Reg_f_slice name start dir _ _ _ -> Reg name start size dir
+end
+
let update_reg_value_slice reg_name v start stop v2 =
let v_internal = intern_reg_value v in
let v2_internal = intern_reg_value v2 in
- extern_reg_value reg_name
+ extern_reg_value (lift_reg_name_to_whole reg_name 0)
(if start = stop then
(Interp.fupdate_vec v_internal start v2_internal)
else
diff --git a/src/lem_interp/printing_functions.ml b/src/lem_interp/printing_functions.ml
index 7cef082e..ad423fd9 100644
--- a/src/lem_interp/printing_functions.ml
+++ b/src/lem_interp/printing_functions.ml
@@ -155,7 +155,7 @@ let bit_lifteds_to_string (bls: bit_lifted list) (show_length_and_start:bool) (s
let register_value_to_string rv =
- bit_lifteds_to_string rv.rv_bits true (Some rv.rv_start) false
+ bit_lifteds_to_string rv.rv_bits true (Some rv.rv_start_internal) false
let memory_value_to_string endian mv =
let bls = List.concat(List.map (fun (Byte_lifted bs) -> bs) (if endian = E_big_endian then mv else (List.rev mv))) in
diff --git a/src/lem_interp/run_interp_model.ml b/src/lem_interp/run_interp_model.ml
index 9abf0442..9df5cdc3 100644
--- a/src/lem_interp/run_interp_model.ml
+++ b/src/lem_interp/run_interp_model.ml
@@ -97,8 +97,8 @@ let fupdate_slice reg_name original e (start,stop) =
increasing because ppcmem only speaks increasing, so here we turn it back *)
let startd = original.rv_start_internal- start in
let stopd = startd - (stop - start) in
- (*let _ = Printf.eprintf "fupdate_slice: starts at %i, %i -> %i,%i -> %i\n" original.rv_start_internal start startd stop stopd in*)
- update_reg_value_slice reg_name {original with rv_start=original.rv_start_internal} startd stopd e
+(* let _ = Printf.eprintf "fupdate_slice: starts at %i, %i -> %i,%i -> %i\n" original.rv_start_internal start startd stop stopd in *)
+ update_reg_value_slice reg_name original startd stopd e
let combine_slices (start, stop) (inner_start,inner_stop) =
(start + inner_start, start + inner_stop)
diff --git a/src/type_check.ml b/src/type_check.ml
index 4642a5a6..27b705d8 100644
--- a/src/type_check.ml
+++ b/src/type_check.ml
@@ -1154,15 +1154,16 @@ let rec check_exp envs (imp_param:nexp option) (widen:bool) (expect_t:t) (E_aux(
check_exp envs imp_param true {t=Tapp("vector",[TA_nexp base1;TA_nexp rise1;TA_ord ord;TA_typ item_t])} v1 in
let (v2',t2',_,cs_2,_,ef_2) =
check_exp envs imp_param true {t=Tapp("vector",[TA_nexp base2;TA_nexp rise2;TA_ord ord;TA_typ item_t])} v2 in
- let ti = {t=Tapp("vector",[TA_nexp base1;TA_nexp (mk_add rise1 rise2);TA_ord ord; TA_typ item_t])} in
- let cs_loc = match ord.order with
- | Odec -> [] (* (*This should probably be handled by casts*)[GtEq((Expr l),Require,base1,mk_add rise1 rise2)] *)
- | _ -> [] in
+ let result_rise = mk_add rise1 rise2 in
+ let result_base = match ord.order with
+ | Odec -> mk_sub result_rise n_one
+ | _ -> n_zero in
+ let ti = {t=Tapp("vector",[TA_nexp result_base;TA_nexp result_rise;TA_ord ord; TA_typ item_t])} in
let sub_effects = union_effects ef_1 ef_2 in
let (t,cs_c,ef_c,e') =
type_coerce (Expr l) d_env Require false true b_env ti
- (E_aux(E_vector_append(v1',v2'),(l,constrained_annot_efr ti cs_loc sub_effects))) expect_t in
- (e',t,t_env,cs_loc@cs_1@cs_2,nob,(union_effects ef_c sub_effects))
+ (E_aux(E_vector_append(v1',v2'),(l,simple_annot_efr ti sub_effects))) expect_t in
+ (e',t,t_env,cs_1@cs_2,nob,(union_effects ef_c sub_effects))
| E_list(es) ->
let item_t = match expect_t.t with
| Tapp("list",[TA_typ i]) -> i