summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/type_check.ml2
-rw-r--r--src/type_internal.ml19
2 files changed, 11 insertions, 10 deletions
diff --git a/src/type_check.ml b/src/type_check.ml
index e20851de..5ba8fab2 100644
--- a/src/type_check.ml
+++ b/src/type_check.ml
@@ -1472,7 +1472,7 @@ and check_lexp envs imp_param is_top (LEXP_aux(lexp,(l,annot))) : (tannot lexp *
| Tapp("vector",[TA_nexp base;TA_nexp rise;TA_ord ord;TA_typ t]) ->
let acc_t = match ord.order with
| Oinc -> {t = Tapp("range",[TA_nexp base;TA_nexp (mk_sub (mk_add base rise) n_one)])}
- | Odec -> {t = Tapp("range",[TA_nexp (mk_sub (mk_sub base rise) n_one);TA_nexp (mk_sub base n_one)])}
+ | Odec -> {t = Tapp("range",[TA_nexp (mk_sub rise (mk_add base n_one)); TA_nexp base])}
| _ -> typ_error l ("Assignment to one vector element requires either inc or dec order")
in
let (e,t',_,cs',_,ef_e) = check_exp envs imp_param acc_t acc in
diff --git a/src/type_internal.ml b/src/type_internal.ml
index 09775475..95bfdd45 100644
--- a/src/type_internal.ml
+++ b/src/type_internal.ml
@@ -1000,6 +1000,7 @@ let mk_sub n1 n2 = {nexp = Nsub (n1, n2)}
let mk_mult n1 n2 = {nexp = Nmult(n1,n2) }
let mk_range n1 n2 = {t=Tapp("range",[TA_nexp n1;TA_nexp n2])}
+let mk_atom n1 = {t = Tapp("atom",[TA_nexp n1])}
let mk_vector typ order start size = {t=Tapp("vector",[TA_nexp {nexp=start}; TA_nexp {nexp=size}; TA_ord {order}; TA_typ typ])}
let mk_bitwise_op name symb arity =
let ovar = Ovar "o" in
@@ -1417,14 +1418,14 @@ let initial_typ_env =
External (Some "neq"),[],pure_e,nob));
("<",
Overload(
- Base((["a",{k=K_Typ}],(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "a"}]) bit_t)),
+ Base((["a",{k=K_Typ};"b",{k=K_Typ}],(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) bit_t)),
External (Some "lt"),[],pure_e,nob),
false,
[Base(((mk_nat_params ["n"; "m"; "o";"p"]),
(mk_pure_fun (mk_tup [mk_range (mk_nv "n") (mk_nv "m");mk_range (mk_nv "o") (mk_nv "p")]) bit_t)),
External (Some "lt"),
- [LtEq(Specc(Parse_ast.Int("<",None)),Guarantee, mk_add (mk_nv "n") n_one, mk_nv "o");
- LtEq(Specc(Parse_ast.Int("<",None)),Guarantee, mk_add (mk_nv "m") n_one, mk_nv "p")],
+ [(*LtEq(Specc(Parse_ast.Int("<",None)),Guarantee, mk_add (mk_nv "n") n_one, mk_nv "o");
+ LtEq(Specc(Parse_ast.Int("<",None)),Guarantee, mk_add (mk_nv "m") n_one, mk_nv "p")*)],
pure_e,nob);
Base((((mk_nat_params ["n";"o";"p"])@["ord",{k=K_Ord}]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n");
@@ -1449,7 +1450,7 @@ let initial_typ_env =
]));
(">",
Overload(
- Base((["a",{k=K_Typ}],(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "a"}]) bit_t)),
+ Base((["a",{k=K_Typ};"b",{k=K_Typ}],(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) bit_t)),
External (Some "gt"),[],pure_e,nob),
false,
[Base(((mk_nat_params ["n";"m";"o";"p"]),
@@ -1556,9 +1557,9 @@ let initial_typ_env =
mk_bitwise_op "bitwise_or" "|" 2;
mk_bitwise_op "bitwise_xor" "^" 2;
mk_bitwise_op "bitwise_and" "&" 2;
- ("^^",Base((mk_nat_params ["n";"m"],
- (mk_pure_fun (mk_tup [bit_t;mk_range (mk_nv "n") (mk_nv "m")])
- (mk_vector bit_t Oinc (Nconst zero) (Nadd({nexp=Nvar "n"},{nexp=Nvar "m"}))))),
+ ("^^",Base((mk_nat_params ["n"],
+ (mk_pure_fun (mk_tup [bit_t;mk_atom (mk_nv "n")])
+ (mk_vector bit_t Oinc (Nconst zero) (Nvar "n")))),
External (Some "duplicate"),[],pure_e,nob));
("<<",Base((((mk_nat_params ["n";"m"])@[("ord",{k=K_Ord})]),
(mk_pure_fun (mk_tup [(mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"));
@@ -2530,8 +2531,8 @@ let rec simple_constraint_check in_env cs =
else eq_error (get_c_loc co) ("Type constraint mismatch: constraint arising from here requires "
^ string_of_big_int i1 ^ " to be less than or equal to " ^ string_of_big_int i2)
| _, Npos_inf | Npos_inf, Npos_inf | Nneg_inf, _ | Nneg_inf, Nneg_inf -> check cs
- | Npos_inf, Nconst _ -> eq_error (get_c_loc co) ("Type constraint mismatch: constraint arising from here requires infinity to be less than "
- ^ (n_to_string n2'))
+ (*| Npos_inf, Nconst _ -> eq_error (get_c_loc co) ("Type constraint mismatch: constraint arising from here requires infinity to be less than or equal to "
+ ^ (n_to_string n2'))*)
| _,_ -> LtEq(co,enforce,n1',n2')::(check cs))
| CondCons(co,pats,exps):: cs ->
(*let _ = Printf.eprintf "Condcons check length pats %i, length exps %i\n" (List.length pats) (List.length exps) in*)