summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKathy Gray2015-06-09 14:33:49 +0100
committerKathy Gray2015-06-09 14:33:49 +0100
commitbfbf5125780181fd41fd74986a4dd1654f35be48 (patch)
treee6ed7a33cd9f78971b11ed99142db9b658e1b630
parentae86c0e628b85c1ea3c5760b9398f45c0120ed4e (diff)
Fix error in building register values
(make one function to do it instead of almost the same function multiple times) Fix lost nexp variable in constraints, removing another undefined
-rw-r--r--src/lem_interp/interp_interface.lem17
-rw-r--r--src/type_check.ml14
-rw-r--r--src/type_internal.ml31
3 files changed, 31 insertions, 31 deletions
diff --git a/src/lem_interp/interp_interface.lem b/src/lem_interp/interp_interface.lem
index 0fa5730b..d2684553 100644
--- a/src/lem_interp/interp_interface.lem
+++ b/src/lem_interp/interp_interface.lem
@@ -882,9 +882,9 @@ let concretizable_bytls = List.all concretizable_bytl
(* constructing values *)
-val register_value : bit_lifted -> direction -> nat -> nat -> register_value
-let register_value b dir width start_index =
- <| rv_bits = List.replicate width b;
+val build_register_value : list bit_lifted -> direction -> nat -> nat -> register_value
+let build_register_value bs dir width start_index =
+ <| rv_bits = bs;
rv_dir = dir; (* D_increasing for Power, D_decreasing for ARM *)
rv_start_internal = start_index;
rv_start = if dir = D_increasing
@@ -892,6 +892,10 @@ let register_value b dir width start_index =
else (start_index+1) - width; (* Smaller index, as in Power, for external interaction *)
|>
+val register_value : bit_lifted -> direction -> nat -> nat -> register_value
+let register_value b dir width start_index =
+ build_register_value (List.replicate width b) dir width start_index
+
val register_value_zeros : direction -> nat -> nat -> register_value
let register_value_zeros dir width start_index =
register_value Bitl_zero dir width start_index
@@ -1080,12 +1084,7 @@ let integer_of_register_value (rv:register_value):maybe integer =
val register_value_of_integer : nat -> nat -> direction -> integer -> register_value
let register_value_of_integer (len:nat) (start:nat) (dir:direction) (i:integer):register_value =
let bs = bit_list_of_integer len i in
- <|
- rv_bits = List.map bit_lifted_of_bit bs;
- rv_dir = dir;
- rv_start = start;
- rv_start_internal = if dir = D_increasing then start else start + (List.length bs) - 1
-|>
+ build_register_value (List.map bit_lifted_of_bit bs) dir len start
(* *)
diff --git a/src/type_check.ml b/src/type_check.ml
index 105748a3..92e42641 100644
--- a/src/type_check.ml
+++ b/src/type_check.ml
@@ -227,7 +227,7 @@ let rec check_pattern envs emp_tag expect_t (P_aux(p,(l,annot))) : ((tannot pat)
TA_ord d_env.default_o;TA_typ{t = Tid"bit"}])},lit
| L_string s -> {t = Tid "string"},lit
| L_undef -> typ_error l' "Cannot pattern match on undefined") in
-(* let _ = Printf.printf "checking pattern literal. expected type is %s. t is %s\n" (t_to_string expect_t) (t_to_string t) in*)
+(* let _ = Printf.eprintf "checking pattern literal. expected type is %s. t is %s\n" (t_to_string expect_t) (t_to_string t) in*)
let t',cs' = type_consistent (Patt l) d_env Require true t expect_t in
let cs_l = cs@cs' in
(P_aux(P_lit(L_aux(lit,l')),(l,cons_tag_annot t emp_tag cs_l)),Envmap.empty,cs_l,nob,t)
@@ -499,7 +499,7 @@ let rec check_exp envs (imp_param:nexp option) (expect_t:t) (E_aux(e,(l,annot)):
| Tabbrev(_,t),_ -> t,expect_t
| _,Tabbrev(_,e) -> t,e
| _,_ -> t,expect_t in
- (*let _ = Printf.printf "On general id check, expect_t %s, t %s, tactual %s, expect_actual %s\n" (t_to_string expect_t) (t_to_string t) (t_to_string t_actual) (t_to_string expect_actual) in*)
+ (*let _ = Printf.eprintf "On general id check, expect_t %s, t %s, tactual %s, expect_actual %s\n" (t_to_string expect_t) (t_to_string t) (t_to_string t_actual) (t_to_string expect_actual) in*)
(match t_actual.t,expect_actual.t with
| Tfn _,_ -> typ_error l ("Identifier " ^ (id_to_string id) ^ " is bound to a function and cannot be used as a value")
| Tapp("register",[TA_typ(t')]),Tapp("register",[TA_typ(expect_t')]) ->
@@ -1870,7 +1870,7 @@ let check_alias_spec envs alias (AL_aux(al,(l,annot))) e_typ =
let tannot = Base(([],et),Alias,[],pure_e,nob) in
let d_env = {d_env with alias_env = Envmap.insert (d_env.alias_env) (alias, (OneReg(reg,tannot)))} in
(AL_aux(AL_subreg(reg_a,subreg),(l,tannot)),tannot,d_env)))
- | _ -> let _ = Printf.printf "%s\n" (t_to_string reg_t) in assert false)
+ | _ -> let _ = Printf.eprintf "%s\n" (t_to_string reg_t) in assert false)
| AL_bit(reg_a,bit) ->
let (reg,reg_a,reg_t,t) = check_reg reg_a in
let (E_aux(bit,(le,eannot)),_,_,_,_,_) = check_exp envs None (new_t ()) bit in
@@ -1920,14 +1920,14 @@ let check_def envs def =
let (Env(d_env,t_env,b_env,tp_env)) = envs in
match def with
| DEF_type tdef ->
- (*let _ = Printf.printf "checking type def\n" in*)
+ (*let _ = Printf.eprintf "checking type def\n" in*)
let td,envs = check_type_def envs tdef in
- (*let _ = Printf.printf "checked type def\n" in*)
+ (*let _ = Printf.eprintf "checked type def\n" in*)
(DEF_type td,envs)
| DEF_fundef fdef ->
- (*let _ = Printf.printf "checking fun def\n" in*)
+ (*let _ = Printf.eprintf "checking fun def\n" in*)
let fd,envs = check_fundef envs fdef in
- (*let _ = Printf.printf "checked fun def\n" in*)
+ (*let _ = Printf.eprintf "checked fun def\n" in*)
(DEF_fundef fd,envs)
| DEF_val letdef ->
(*let _ = Printf.eprintf "checking letdef\n" in*)
diff --git a/src/type_internal.ml b/src/type_internal.ml
index fb5e3489..eae11d6e 100644
--- a/src/type_internal.ml
+++ b/src/type_internal.ml
@@ -625,7 +625,7 @@ let rec normalize_nexp n =
| _ -> {nexp = Nmult(n2',n1')})
| _ -> {nexp = Nmult(normalize_nexp {nexp = Nmult(n1',n21)},n22)})
| Nmult _ ,Nmult(n21,n22) -> {nexp = Nmult({nexp = Nmult(n21,n1')},{nexp = Nmult(n22,n1')})}
- | Nneg _,_ | _,Nneg _ -> let _ = Printf.printf "neg case still around %s\n" (n_to_string n) in assert false (* If things are normal, neg should be gone. *)
+ | Nneg _,_ | _,Nneg _ -> let _ = Printf.eprintf "neg case still around %s\n" (n_to_string n) in assert false (* If things are normal, neg should be gone. *)
)
let int_to_nexp i = {nexp = Nconst (big_int_of_int i)}
@@ -685,7 +685,7 @@ let new_e _ =
exception Occurs_exn of t_arg
let rec resolve_tsubst (t : t) : t =
- (*let _ = Printf.printf "resolve_tsubst on %s\n" (t_to_string t) in*)
+ (*let _ = Printf.eprintf "resolve_tsubst on %s\n" (t_to_string t) in*)
match t.t with
| Tuvar({ subst=Some(t') } as u) ->
let t'' = resolve_tsubst t' in
@@ -772,9 +772,9 @@ let rec nexp_eq_check n1 n2 =
| _,_ -> false
let nexp_eq n1 n2 =
-(* let _ = Printf.printf "comparing nexps %s and %s\n" (n_to_string n1) (n_to_string n2) in*)
+(* let _ = Printf.eprintf "comparing nexps %s and %s\n" (n_to_string n1) (n_to_string n2) in*)
let b = nexp_eq_check (normalize_nexp n1) (normalize_nexp n2) in
-(* let _ = Printf.printf "compared nexps %s\n" (string_of_bool b) in*)
+(* let _ = Printf.eprintf "compared nexps %s\n" (string_of_bool b) in*)
b
let nexp_one_more_than n1 n2 =
@@ -912,7 +912,8 @@ let rec fresh_nvar bindings n =
(*let _ = Printf.eprintf "fresh_nvar for %s\n" (n_to_string n) in*)
match n.nexp with
| Nuvar { nindex = i;nsubst = None } ->
- fresh_var "nv" i (fun v add -> n.nexp <- (Nvar v); (*(Printf.eprintf "fresh nvar set %i to %s : %s\n" i v (n_to_string n));*) if add then Some(v,{k=K_Nat}) else None) bindings
+ fresh_var "nv" i (fun v add -> n.nexp <- (Nvar v);
+(*(Printf.eprintf "fresh nvar set %i to %s : %s\n" i v (n_to_string n));*) if add then Some(v,{k=K_Nat}) else None) bindings
| Nuvar { nindex = i; nsubst = Some({nexp=Nuvar _} as n')} ->
let kv = fresh_nvar bindings n' in
n.nexp <- n'.nexp;
@@ -2182,7 +2183,7 @@ and conforms_to_e loosely spec actual =
When considering two atom type applications, will expand into a range encompasing both when widen is true
*)
let rec type_consistent_internal co d_env enforce widen t1 cs1 t2 cs2 =
-(* let _ = Printf.printf "type_consistent_internal called with %s and %s\n" (t_to_string t1) (t_to_string t2) in*)
+(* let _ = Printf.eprintf "type_consistent_internal called with %s and %s\n" (t_to_string t1) (t_to_string t2) in*)
let l = get_c_loc co in
let t1,cs1' = get_abbrev d_env t1 in
let t2,cs2' = get_abbrev d_env t2 in
@@ -2219,7 +2220,7 @@ let rec type_consistent_internal co d_env enforce widen t1 cs1 t2 cs2 =
({t=Tapp("range",[TA_nexp nu1;TA_nexp nu2])},
csp@[LtEq(co,enforce,nu1,a1);LtEq(co,enforce,nu1,a2);LtEq(co,enforce,a1,nu2);LtEq(co,enforce,a2,nu2)]))
| Tapp(id1,args1), Tapp(id2,args2) ->
- (*let _ = Printf.printf "checking consistency of %s and %s\n" id1 id2 in*)
+ (*let _ = Printf.eprintf "checking consistency of %s and %s\n" id1 id2 in*)
let la1,la2 = List.length args1, List.length args2 in
if id1=id2 && la1 = la2
then (t2,csp@(List.flatten (List.map2 (type_arg_eq co d_env enforce widen) args1 args2)))
@@ -2491,9 +2492,9 @@ let rec select_overload_variant d_env params_check get_all variants actual_type
| NoTyp::variants | Overload _::variants ->
select_overload_variant d_env params_check get_all variants actual_type
| Base((parms,t_orig),tag,cs,ef,bindings)::variants ->
- (*let _ = Printf.printf "About to check a variant %s\n" (t_to_string t_orig) in*)
+ (*let _ = Printf.eprintf "About to check a variant %s\n" (t_to_string t_orig) in*)
let t,cs,ef,_ = if parms=[] then t_orig,cs,ef,Envmap.empty else subst parms false t_orig cs ef in
- (*let _ = Printf.printf "And after substitution %s\n" (t_to_string t) in*)
+ (*let _ = Printf.eprintf "And after substitution %s\n" (t_to_string t) in*)
let t,cs' = get_abbrev d_env t in
let recur _ = select_overload_variant d_env params_check get_all variants actual_type in
(match t.t with
@@ -2505,7 +2506,7 @@ let rec select_overload_variant d_env params_check get_all variants actual_type
(conforms_to_t d_env false true at1 r || conforms_to_t d_env false true at2 r)
| Toptions(at1,None) -> conforms_to_t d_env false true at1 r
| _ -> conforms_to_t d_env true true actual_type r in
- (*let _ = Printf.printf "Checked a variant, matching? %b\n" is_matching in*)
+ (*let _ = Printf.eprintf "Checked a variant, matching? %b\n" is_matching in*)
if is_matching
then (Base(([],t),tag,cs@cs',ef,bindings))::(if get_all then (recur ()) else [])
else recur ()
@@ -2657,7 +2658,7 @@ let rec simple_constraint_check in_env cs =
let occurs = occurs_in_nexp n1' n2' in
let leave = leave_nu_as_var n2' in
(*let _ = Printf.eprintf "occurs? %b, leave? %b n1' %s in n2' %s\n" occurs leave (n_to_string n1') (n_to_string n2') in*)
- if not(u.nin) && ok_to_set && not(occurs) && not(leave)
+ if (*not(u.nin) &&*) ok_to_set && not(occurs) && not(leave)
then if (equate_n n2' n1') then None else (Some (Eq(co,n1',n2')))
else if occurs
then begin (reduce_n_unifications n1'); (reduce_n_unifications n2'); eq_to_zero ok_to_set n1' n2' end
@@ -2667,7 +2668,7 @@ let rec simple_constraint_check in_env cs =
let occurs = occurs_in_nexp n2' n1' in
let leave = leave_nu_as_var n1' in
(*let _ = Printf.eprintf "occurs? %b, leave? %b n2' %s in n1' %s\n" occurs leave (n_to_string n2') (n_to_string n1') in*)
- if not(u.nin) && ok_to_set && not(occurs) && not(leave)
+ if (*not(u.nin) && *)ok_to_set && not(occurs) && not(leave)
then if equate_n n1' n2' then None else (Some (Eq(co,n1',n2')))
else if occurs
then begin (reduce_n_unifications n1'); (reduce_n_unifications n2'); eq_to_zero ok_to_set n1' n2' end
@@ -2808,7 +2809,7 @@ let check_tannot l annot imp_param constraints efs =
| Overload _ -> raise (Reporting_basic.err_unreachable l "check_tannot given overload")
let tannot_merge co denv widen t_older t_newer =
- (*let _ = Printf.printf "tannot_merge called\n" in*)
+ (*let _ = Printf.eprintf "tannot_merge called\n" in*)
match t_older,t_newer with
| NoTyp,NoTyp -> NoTyp
| NoTyp,_ -> t_newer
@@ -2822,10 +2823,10 @@ let tannot_merge co denv widen t_older t_newer =
Base(([],t),tag_n,cs_o,ef_o,bounds_o)
| _ -> t_newer)
| Emp_local, Emp_local ->
- (*let _ = Printf.printf "local-local case\n" in*)
+ (*let _ = Printf.eprintf "local-local case\n" in*)
(*TODO Check conforms to first; if true check consistent, if false replace with t_newer *)
let t,cs_b = type_consistent co denv Guarantee widen t_n t_o in
- (*let _ = Printf.printf "types consistent\n" in*)
+ (*let _ = Printf.eprintf "types consistent\n" in*)
Base(([],t),Emp_local,cs_o@cs_n@cs_b,union_effects ef_o ef_n, merge_bounds bounds_o bounds_n)
| _,_ -> t_newer)
| _ -> t_newer