summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKathy Gray2015-10-23 15:14:07 +0100
committerKathy Gray2015-10-23 15:14:59 +0100
commit89f9c0e89ca3722e7248c70300c239374842b93e (patch)
treec744f94e0f51803f28531d81bda336d1847c56a4
parenta43119b131d87309e51b851466c9a4b489b8bec7 (diff)
More of sail correctly generating ocaml; including using polymorphic variants when there are more than 246 constructors
-rw-r--r--src/gen_lib/sail_values.ml122
-rw-r--r--src/pretty_print.ml110
-rw-r--r--src/type_check.ml58
-rw-r--r--src/type_internal.ml580
-rw-r--r--src/type_internal.mli2
5 files changed, 509 insertions, 363 deletions
diff --git a/src/gen_lib/sail_values.ml b/src/gen_lib/sail_values.ml
index 42f0bfde..c789ff52 100644
--- a/src/gen_lib/sail_values.ml
+++ b/src/gen_lib/sail_values.ml
@@ -131,11 +131,11 @@ let set_vector_subrange_bit v n m new_v =
done;
end
in
- match v with
- | Vvector(array,start,is_inc) ->
+ match v,new_v with
+ | Vvector(array,start,is_inc),Vvector(new_v,_,_) ->
let (length,offset) = if is_inc then (m-n+1,n-start) else (n-m+1,start-n) in
walker array length offset new_v
- | Vregister(array,start,is_inc,fields) ->
+ | Vregister(array,start,is_inc,fields),Vvector(new_v,_,_) ->
let (length,offset) = if is_inc then (m-n+1,n-start) else (n-m+1,start-n) in
walker !array length offset new_v
| _ -> ()
@@ -240,6 +240,44 @@ let bitwise_not = function
| Vregister(array,s,d,_) -> Vvector( Array.map bitwise_not_bit !array,s,d)
| _ -> assert false
+let bool_to_bit b = if b then Vone else Vzero
+
+let bitwise_binop_bit op (l,r) =
+ match l,r with
+ | Vundef,_ | _,Vundef -> Vundef (*Do we want to do this or to respect | of One and & of Zero rules?*)
+ | Vone,Vone -> bool_to_bit (op true true)
+ | Vone,Vzero -> bool_to_bit (op true false)
+ | Vzero,Vone -> bool_to_bit (op false true)
+ | Vzero,Vzero -> bool_to_bit (op false false)
+
+let bitwise_and_bit = bitwise_binop_bit (&&)
+let bitwise_or_bit = bitwise_binop_bit (||)
+let bitwise_xor_bit = bitwise_binop_bit (fun x y -> (1 = (if x then 1 else 0) lxor (if y then 0 else 1)))
+
+let bitwise_binop op (l,r) =
+ let bop l arrayl arrayr =
+ let array = Array.make l Vzero in
+ begin
+ for i = 0 to l do
+ array.(i) <- bitwise_binop_bit op (arrayl.(i), arrayr.(i))
+ done;
+ array
+ end in
+ match l,r with
+ | Vvector(arrayl, start, dir), Vvector(arrayr,_,_) ->
+ Vvector(bop (Array.length arrayl) arrayl arrayr, start,dir)
+ | Vvector(arrayl, start, dir), Vregister(arrayr,_,_,_) ->
+ Vvector(bop (Array.length arrayl) arrayl !arrayr, start, dir)
+ | Vregister(arrayl, start,dir,_), Vvector(arrayr,_,_) ->
+ Vvector(bop (Array.length arrayr) !arrayl arrayr, start,dir)
+ | Vregister(arrayl, start, dir, _), Vregister(arrayr,_,_,_) ->
+ Vvector(bop (Array.length !arrayl) !arrayl !arrayr, start,dir)
+ | _ -> Vbit Vundef
+
+let bitwise_and = bitwise_binop (&&)
+let bitwise_or = bitwise_binop (||)
+let bitwise_xor = bitwise_binop (fun x y -> (1 = (if x then 1 else 0) lxor (if y then 0 else 1)))
+
let unsigned = function
| (Vvector(array,_,_) as v) ->
if has_undef v
@@ -342,6 +380,14 @@ let to_vec ord len n =
let to_vec_inc (len,n) = to_vec true len n
let to_vec_dec (len,n) = to_vec false len n
+let to_vec_undef ord len =
+ let len = int_of_big_int len in
+ let array = Array.make len Vundef in
+ let start = if ord then 0 else len-1 in
+ Vvector(array, start, ord)
+
+let to_vec_inc_undef len = to_vec_undef true len
+let to_vec_dec_undef len = to_vec_undef false len
let arith_op op (l,r) = op l r
let add = arith_op add_big_int
@@ -493,11 +539,14 @@ let rec arith_op_no0 op (l,r) =
then None
else Some (op l r)
+let modulo = arith_op_no0 mod_big_int
+let quot = arith_op_no0 div_big_int
+
let rec arith_op_vec_no0 op sign size (l,r) =
let ord = get_ord l in
let act_size = int_of_big_int (mult_big_int (length l) size) in
let (l',r') = (to_num sign l,to_num sign r) in
- let n = arith_op op (l',r') in
+ let n = arith_op_no0 op (l',r') in
let representable,n' =
match n with
| Some n' ->
@@ -512,6 +561,10 @@ let rec arith_op_vec_no0 op sign size (l,r) =
Vvector((Array.make act_size Vundef), start, ord)
| _ -> assert false
+let mod_vec = arith_op_vec_no0 mod_big_int false unit_big_int
+let quot_vec = arith_op_vec_no0 div_big_int false unit_big_int
+let quot_vec_signed = arith_op_vec_no0 div_big_int true unit_big_int
+
let arith_op_overflow_no0_vec op sign size (l,r) =
let ord = get_ord l in
let rep_size = mult_big_int (length r) size in
@@ -537,8 +590,67 @@ let arith_op_overflow_no0_vec op sign size (l,r) =
let overflow = if representable then Vzero else Vone in
(correct_size_num,overflow,most_significant one_more)
+let quot_overflow_vec = arith_op_overflow_no0_vec div_big_int false unit_big_int
+let quot_overflow_vec_signed = arith_op_overflow_no0_vec div_big_int true unit_big_int
+
let arith_op_vec_range_no0 op sign size (l,r) =
let ord = get_ord l in
arith_op_vec_no0 op sign size (l,(to_vec ord (length l) r))
-
+let mod_vec_range = arith_op_vec_range_no0 mod_big_int false unit_big_int
+
+(*Need to have a default top level direction reference I think*)
+let duplicate (bit,length) =
+ Vvector((Array.make (int_of_big_int length) bit), 0, true)
+
+
+let compare_op op (l,r) =
+ if (op l r)
+ then Vone
+ else Vzero
+
+let lt = compare_op lt_big_int
+let gt = compare_op gt_big_int
+let lteq = compare_op le_big_int
+let gteq = compare_op ge_big_int
+
+let compare_op_vec op sign (l,r) =
+ let (l',r') = (to_num sign l, to_num sign r) in
+ compare_op op (l',r')
+
+let lt_vec = compare_op_vec lt_big_int true
+let gt_vec = compare_op_vec gt_big_int true
+let lteq_vec = compare_op_vec le_big_int true
+let gteq_vec = compare_op_vec ge_big_int true
+let lt_vec_signed = compare_op_vec lt_big_int true
+let gt_vec_signed = compare_op_vec gt_big_int true
+let lteq_vec_signed = compare_op_vec le_big_int true
+let gteq_vec_signed = compare_op_vec ge_big_int true
+let lt_vec_unsigned = compare_op_vec lt_big_int false
+let gt_vec_unsigned = compare_op_vec gt_big_int false
+let lteq_vec_unsigned = compare_op_vec le_big_int false
+let gteq_vec_unsigned = compare_op_vec ge_big_int false
+
+let compare_op_vec_range op sign (l,r) =
+ compare_op op ((to_num sign l),r)
+
+let lt_vec_range = compare_op_vec_range lt_big_int true
+let gt_vec_range = compare_op_vec_range gt_big_int true
+let lteq_vec_range = compare_op_vec_range le_big_int true
+let gteq_vec_range = compare_op_vec_range ge_big_int true
+
+let compare_op_range_vec op sign (l,r) =
+ compare_op op (l, (to_num sign r))
+
+let lt_range_vec = compare_op_range_vec lt_big_int true
+let gt_range_vec = compare_op_range_vec gt_big_int true
+let lteq_range_vec = compare_op_range_vec le_big_int true
+let gteq_range_vec = compare_op_range_vec ge_big_int true
+
+let eq (l,r) = if l == r then Vone else Vzero
+let eq_vec_range (l,r) = eq (to_num false l,r)
+let eq_range_vec (l,r) = eq (l, to_num false r)
+let eq_vec_vec (l,r) = eq (to_num true l, to_num true r)
+
+let neq (l,r) = bitwise_not_bit (eq (l,r))
+let neq_vec (l,r) = bitwise_not_bit (eq_vec_vec(l,r))
diff --git a/src/pretty_print.ml b/src/pretty_print.ml
index 7ec83696..f979efca 100644
--- a/src/pretty_print.ml
+++ b/src/pretty_print.ml
@@ -294,7 +294,7 @@ let pp_format_tag = function
| External (Some s) -> "(Tag_extern (Just \""^s^"\"))"
| External None -> "(Tag_extern Nothing)"
| Default -> "Tag_default"
- | Constructor -> "Tag_ctor"
+ | Constructor _ -> "Tag_ctor"
| Enum i -> "(Tag_enum " ^ (lemnum string_of_int i) ^ ")"
| Alias alias_inf -> "Tag_alias"
| Spec -> "Tag_spec"
@@ -1225,10 +1225,10 @@ let doc_id_ocaml_type (Id_aux(i,_)) =
* token in case of x ending with star. *)
parens (separate space [colon; string (String.uncapitalize x); empty])
-let doc_id_ocaml_ctor (Id_aux(i,_)) =
+let doc_id_ocaml_ctor n (Id_aux(i,_)) =
match i with
| Id("bit") -> string "vbit"
- | Id i -> string (String.capitalize i)
+ | Id i -> string ((if n > 246 then "`" else "") ^ (String.capitalize i))
| DeIid x ->
(* add an extra space through empty to avoid a closing-comment
* token in case of x ending with star. *)
@@ -1300,13 +1300,21 @@ let doc_typscm_ocaml (TypSchm_aux(TypSchm_ts(tq,t),_)) =
let doc_pat_ocaml =
let rec pat pa = app_pat pa
and app_pat ((P_aux(p,(l,annot))) as pa) = match p with
- | P_app(id, ((_ :: _) as pats)) -> doc_unop (doc_id_ocaml_ctor id) (parens (separate_map comma_sp pat pats))
+ | P_app(id, ((_ :: _) as pats)) ->
+ (match annot with
+ | Base(_,Constructor n,_,_,_,_) ->
+ doc_unop (doc_id_ocaml_ctor n id) (parens (separate_map comma_sp pat pats))
+ | _ -> empty)
| P_lit lit -> doc_lit_ocaml true lit
| P_wild -> underscore
| P_id id -> doc_id_ocaml id
| P_as(p,id) -> parens (separate space [pat p; string "as"; doc_id_ocaml id])
| P_typ(typ,p) -> doc_op colon (pat p) (doc_typ_ocaml typ)
- | P_app(id,[]) -> doc_id_ocaml_ctor id
+ | P_app(id,[]) ->
+ (match annot with
+ | Base(_,Constructor n,_,_,_,_) ->
+ doc_id_ocaml_ctor n id
+ | _ -> empty)
| P_vector pats ->
let non_bit_print () =
parens
@@ -1337,18 +1345,18 @@ let doc_exp_ocaml, doc_let_ocaml =
(match le_act with
| LEXP_id _ | LEXP_cast _ ->
(*Setting local variable fully *)
- doc_op coloneq (doc_lexp_ocaml le) (exp e)
+ doc_op coloneq (doc_lexp_ocaml true le) (exp e)
| LEXP_vector _ ->
doc_op (string "<-") (doc_lexp_array_ocaml le) (exp e)
| LEXP_vector_range _ ->
- parens ((string "set_vector_range") ^^ space ^^ (doc_lexp_ocaml le) ^^ space ^^ (exp e)))
+ doc_lexp_rwrite le e)
| _ ->
(match le_act with
| LEXP_vector _ | LEXP_vector_range _ | LEXP_cast _ | LEXP_field _ | LEXP_id _ ->
(doc_lexp_rwrite le e)
| LEXP_memory _ -> (doc_lexp_fcall le e)))
| E_vector_append(l,r) ->
- parens (string "vector_concat ") ^^ (exp l) ^^ space ^^ (exp r)
+ parens ((string "vector_concat ") ^^ (exp l) ^^ space ^^ (exp r))
| E_cons(l,r) -> doc_op (group (colon^^colon)) (exp l) (exp r)
| E_if(c,t,E_aux(E_block [], _)) ->
parens (string "if" ^^ space ^^ string "to_bool" ^^ parens (exp c) ^/^
@@ -1396,7 +1404,7 @@ let doc_exp_ocaml, doc_let_ocaml =
| E_app(f,args) ->
let call = match annot with
| Base(_,External (Some n),_,_,_,_) -> string n
- | Base(_,Constructor,_,_,_,_) -> doc_id_ocaml_ctor f
+ | Base(_,Constructor i,_,_,_,_) -> doc_id_ocaml_ctor i f
| _ -> doc_id_ocaml f in
parens (doc_unop call (parens (separate_map comma exp args)))
| E_vector_access(v,e) ->
@@ -1432,7 +1440,7 @@ let doc_exp_ocaml, doc_let_ocaml =
if read_registers
then string "(read_register " ^^ doc_id_ocaml id ^^ string ")"
else doc_id_ocaml id
- | Base(_,(Constructor|Enum _),_,_,_,_) -> doc_id_ocaml_ctor id
+ | Base(_,(Constructor i |Enum i),_,_,_,_) -> doc_id_ocaml_ctor i id
| Base((_,t),Alias alias_info,_,_,_,_) ->
(match alias_info with
| Alias_field(reg,field) ->
@@ -1532,7 +1540,7 @@ let doc_exp_ocaml, doc_let_ocaml =
parens (separate space [call; parens (separate_map comma exp [e1;e2])])
| E_internal_let(lexp, eq_exp, in_exp) ->
separate space [string "let";
- doc_lexp_ocaml lexp; (*Rewriter/typecheck should ensure this is only cast or id*)
+ doc_lexp_ocaml true lexp; (*Rewriter/typecheck should ensure this is only cast or id*)
equals;
string "ref";
exp eq_exp;
@@ -1560,42 +1568,56 @@ let doc_exp_ocaml, doc_let_ocaml =
and doc_case (Pat_aux(Pat_exp(pat,e),_)) =
doc_op arrow (separate space [pipe; doc_pat_ocaml pat]) (group (top_exp false e))
- and doc_lexp_ocaml ((LEXP_aux(lexp,(l,annot))) as le) =
+ and doc_lexp_ocaml top_call ((LEXP_aux(lexp,(l,annot))) as le) =
let exp = top_exp false in
match lexp with
- | LEXP_vector(v,e) -> parens ((string "vector_access") ^^ space ^^ doc_lexp_ocaml v) ^^ dot ^^ parens (exp e)
+ | LEXP_vector(v,e) -> parens ((string "vector_access") ^^ space ^^ (doc_lexp_ocaml false v)) ^^ dot ^^ parens (exp e)
| LEXP_vector_range(v,e1,e2) ->
- parens ((string "vector_subrange") ^^ space ^^ doc_lexp_ocaml v ^^ space ^^ (exp e1) ^^ space ^^ (exp e2))
- | LEXP_field(v,id) -> doc_lexp_ocaml v ^^ dot ^^ doc_id_ocaml id
- | LEXP_id id -> doc_id_ocaml id
- | LEXP_cast(typ,id) -> (doc_id_ocaml id)
+ parens ((string "vector_subrange") ^^ space ^^ (doc_lexp_ocaml false v) ^^ space ^^ (exp e1) ^^ space ^^ (exp e2))
+ | LEXP_field(v,id) -> (doc_lexp_ocaml false v) ^^ dot ^^ doc_id_ocaml id
+ | LEXP_id id | LEXP_cast(_,id) ->
+ let name = doc_id_ocaml id in
+ match annot,top_call with
+ | Base((_,{t=Tapp("reg",_)}),Emp_set,_,_,_,_),false | Base((_,{t=Tabbrev(_,{t=Tapp("reg",_)})}),Emp_set,_,_,_,_),false ->
+ string "!" ^^ name
+ | _ -> name
and doc_lexp_array_ocaml ((LEXP_aux(lexp,(l,annot))) as le) = match lexp with
- | LEXP_vector(v,e) -> parens ((string "get_varray") ^^ space ^^ doc_lexp_ocaml v) ^^ dot ^^ parens (top_exp false e)
- | _ -> empty
+ | LEXP_vector(v,e) ->
+ (match annot with
+ | Base((_,t),_,_,_,_,_) ->
+ let t_act = match t.t with | Tapp("reg",[TA_typ t]) | Tabbrev(_,{t=Tapp("reg",[TA_typ t])}) -> t | _ -> t in
+ (match t_act.t with
+ | Tid "bit" | Tabbrev(_,{t=Tid "bit"}) ->
+ parens ((string "get_barray") ^^ space ^^ doc_lexp_ocaml false v) ^^ dot ^^ parens (top_exp false e)
+ | _ -> parens ((string "get_varray") ^^ space ^^ doc_lexp_ocaml false v) ^^ dot ^^ parens (top_exp false e))
+ | _ ->
+ parens ((string "get_varray") ^^ space ^^ doc_lexp_ocaml false v) ^^ dot ^^ parens (top_exp false e))
+ | _ -> empty
and doc_lexp_rwrite ((LEXP_aux(lexp,(l,annot))) as le) e_new_v =
let exp = top_exp false in
- let is_bit = match e_new_v with
+ let (is_bit,is_bitv) = match e_new_v with
| E_aux(_,(_,Base((_,t),_,_,_,_,_))) ->
(match t.t with
| Tapp("vector", [_;_;_;(TA_typ ({t=Tid "bit"} | {t=Tabbrev(_,{t=Tid "bit"})}))]) |
Tabbrev(_,{t=Tapp("vector",[_;_;_;TA_typ ({t=Tid "bit"} | {t=Tabbrev(_,{t=Tid "bit"})})])}) ->
- true
- | _ -> false)
- | _ -> false in
+ (false,true)
+ | Tid "bit" | Tabbrev(_,{t=Tid "bit"}) -> (true,false)
+ | _ -> (false,false))
+ | _ -> (false,false) in
match lexp with
| LEXP_vector(v,e) ->
doc_op (string "<-")
- (group (parens ((string (if is_bit then "get_barray" else "get_varray")) ^^ space ^^ doc_lexp_ocaml v)) ^^
+ (group (parens ((string (if is_bit then "get_barray" else "get_varray")) ^^ space ^^ doc_lexp_ocaml false v)) ^^
dot ^^ parens (exp e))
(exp e_new_v)
| LEXP_vector_range(v,e1,e2) ->
- parens ((string (if is_bit then "set_vector_subrange_bit" else "set_vector_subrange_v")) ^^ space ^^
- doc_lexp_ocaml v ^^ space ^^ exp e1 ^^ space ^^ exp e2 ^^ space ^^ exp e_new_v)
+ parens ((string (if is_bitv then "set_vector_subrange_bit" else "set_vector_subrange_v")) ^^ space ^^
+ doc_lexp_ocaml false v ^^ space ^^ exp e1 ^^ space ^^ exp e2 ^^ space ^^ exp e_new_v)
| LEXP_field(v,id) ->
- parens ((string "set_register_field") ^^ space ^^
- doc_lexp_ocaml v ^^ space ^^string_lit (doc_id id) ^^ space ^^ exp e_new_v)
+ parens ((string (if is_bit then "set_register_field_bit" else "set_register_field_v")) ^^ space ^^
+ doc_lexp_ocaml false v ^^ space ^^string_lit (doc_id id) ^^ space ^^ exp e_new_v)
| LEXP_id id | LEXP_cast (_,id) ->
(match annot with
| Base(_,Alias alias_info,_,_,_,_) ->
@@ -1611,7 +1633,7 @@ let doc_exp_ocaml, doc_let_ocaml =
dot ^^ parens (doc_int start))
(exp e_new_v)
else
- parens ((string (if is_bit then "set_vector_subrange_bit" else "set_vector_subrange_v")) ^^ space ^^
+ parens ((string (if is_bitv then "set_vector_subrange_bit" else "set_vector_subrange_v")) ^^ space ^^
string reg ^^ space ^^ doc_int start ^^ space ^^ doc_int stop ^^ space ^^ exp e_new_v)
| Alias_pair(reg1,reg2) ->
parens ((string "set_two_regs") ^^ space ^^ string reg1 ^^ space ^^ string reg2 ^^ space ^^ exp e_new_v))
@@ -1625,9 +1647,9 @@ let doc_exp_ocaml, doc_let_ocaml =
in top_exp false, let_exp
(*TODO Upcase and downcase type and constructors as needed*)
-let doc_type_union_ocaml (Tu_aux(typ_u,_)) = match typ_u with
- | Tu_ty_id(typ,id) -> separate space [pipe; doc_id_ocaml_ctor id; string "of"; doc_typ_ocaml typ;]
- | Tu_id id -> separate space [pipe; doc_id_ocaml_ctor id]
+let doc_type_union_ocaml n (Tu_aux(typ_u,_)) = match typ_u with
+ | Tu_ty_id(typ,id) -> separate space [pipe; doc_id_ocaml_ctor n id; string "of"; doc_typ_ocaml typ;]
+ | Tu_id id -> separate space [pipe; doc_id_ocaml_ctor n id]
let rec doc_range_ocaml (BF_aux(r,_)) = match r with
| BF_single i -> parens (doc_op comma (doc_int i) (doc_int i))
@@ -1643,18 +1665,22 @@ let doc_typdef_ocaml (TD_aux(td,_)) = match td with
doc_op equals
(concat [string "type"; space; doc_id_ocaml_type id;]) (doc_typquant_ocaml typq (braces fs_doc))
| TD_variant(id,nm,typq,ar,_) ->
- let ar_doc = group (separate_map (break 1) doc_type_union_ocaml ar) in
- doc_op equals
- (concat [string "type"; space; doc_id_ocaml_type id;])
- (doc_typquant_ocaml typq ar_doc)
+ let n = List.length ar in
+ let ar_doc = group (separate_map (break 1) (doc_type_union_ocaml n) ar) in
+ doc_op equals
+ (concat [string "type"; space; doc_id_ocaml_type id;])
+ (if n > 246
+ then brackets (space ^^(doc_typquant_ocaml typq ar_doc))
+ else (doc_typquant_ocaml typq ar_doc))
| TD_enum(id,nm,enums,_) ->
- let enums_doc = group (separate_map (break 1 ^^ pipe) doc_id_ocaml_ctor enums) in
- doc_op equals
- (concat [string "type"; space; doc_id_ocaml_type id;])
- (enums_doc)
+ let n = List.length enums in
+ let enums_doc = group (separate_map (break 1 ^^ pipe) (doc_id_ocaml_ctor n) enums) in
+ doc_op equals
+ (concat [string "type"; space; doc_id_ocaml_type id;])
+ (enums_doc)
| TD_register(id,n1,n2,rs) ->
- let doc_rid (r,id) = separate comma_sp [string_lit (doc_id id); doc_range_ocaml r;] in
- let doc_rids = group (separate_map (break 1) doc_rid rs) in
+ let doc_rid (r,id) = parens (separate comma_sp [string_lit (doc_id id); doc_range_ocaml r;]) in
+ let doc_rids = group (separate_map (semi ^^ (break 1)) doc_rid rs) in
match n1,n2 with
| Nexp_aux(Nexp_constant i1,_),Nexp_aux(Nexp_constant i2,_) ->
let dir = i1 < i2 in
diff --git a/src/type_check.ml b/src/type_check.ml
index 59b5df44..4fb2cfc1 100644
--- a/src/type_check.ml
+++ b/src/type_check.ml
@@ -258,14 +258,14 @@ let rec check_pattern envs emp_tag expect_t (P_aux(p,(l,annot))) : ((tannot pat)
| Some n -> Base(([],expect_t), Enum n, cs,pure_e,pure_e,default_bounds) in
(P_aux(p,(l,pat_annot)),Envmap.from_list [(i,id_annot)],cs,default_bounds,expect_t) in
(match Envmap.apply t_env i with
- | Some(Base((params,t),Constructor,cs,efl,efr,bounds)) ->
+ | Some(Base((params,t),Constructor n,cs,efl,efr,bounds)) ->
let t,cs,ef,_ = subst params false t cs efl in
(match t.t with
| Tfn({t = Tid "unit"},t',IP_none,ef) ->
if conforms_to_t d_env false false t' expect_t
then
let tp,cp = type_consistent (Expr l) d_env Guarantee false t' expect_t in
- (P_aux(P_app(id,[]),(l,tag_annot t Constructor)),Envmap.empty,cs@cp,bounds,tp)
+ (P_aux(P_app(id,[]),(l,tag_annot t (Constructor n))),Envmap.empty,cs@cp,bounds,tp)
else default
| Tfn(t1,t',IP_none,e) ->
if conforms_to_t d_env false false t' expect_t
@@ -285,28 +285,28 @@ let rec check_pattern envs emp_tag expect_t (P_aux(p,(l,annot))) : ((tannot pat)
(*let _ = Printf.eprintf "checking constructor pattern %s\n" i in*)
(match Envmap.apply t_env i with
| None | Some NoTyp | Some Overload _ -> typ_error l ("Constructor " ^ i ^ " in pattern is undefined")
- | Some(Base((params,t),Constructor,constraints,efl,efr,bounds)) ->
+ | Some(Base((params,t),Constructor n,constraints,efl,efr,bounds)) ->
let t,dec_cs,_,_ = subst params false t constraints efl in
(match t.t with
| Tid id -> if pats = []
then let t',ret_cs = type_consistent (Patt l) d_env Guarantee false t expect_t in
- (P_aux(p,(l,cons_tag_annot t' Constructor dec_cs)), Envmap.empty,dec_cs@ret_cs,nob,t')
+ (P_aux(p,(l,cons_tag_annot t' (Constructor n) dec_cs)), Envmap.empty,dec_cs@ret_cs,nob,t')
else typ_error l ("Constructor " ^ i ^ " does not expect arguments")
| Tfn(t1,t2,IP_none,ef) ->
let t',ret_cs = type_consistent (Patt l) d_env Guarantee false t2 expect_t in
(match pats with
| [] -> let _ = type_consistent (Patt l) d_env Guarantee false unit_t t1 in
- (P_aux(P_app(id,[]),(l,cons_tag_annot t' Constructor dec_cs)),
+ (P_aux(P_app(id,[]),(l,cons_tag_annot t' (Constructor n) dec_cs)),
Envmap.empty,dec_cs@ret_cs,nob,t')
| [p] -> let (p',env,p_cs,bounds,u) = check_pattern envs emp_tag t1 p in
(P_aux(P_app(id,[p']),
- (l,cons_tag_annot t' Constructor dec_cs)),env,dec_cs@p_cs@ret_cs,bounds,t')
+ (l,cons_tag_annot t' (Constructor n) dec_cs)),env,dec_cs@p_cs@ret_cs,bounds,t')
| pats -> let (pats',env,p_cs,bounds,u) =
match check_pattern envs emp_tag t1 (P_aux(P_tup(pats),(l,annot))) with
| ((P_aux(P_tup(pats'),_)),env,constraints,bounds,u) -> (pats',env,constraints,bounds,u)
| _ -> assert false in
(P_aux(P_app(id,pats'),
- (l,cons_tag_annot t' Constructor dec_cs)),env,dec_cs@p_cs@ret_cs,bounds,t'))
+ (l,cons_tag_annot t' (Constructor n) dec_cs)),env,dec_cs@p_cs@ret_cs,bounds,t'))
| _ -> typ_error l ("Identifier " ^ i ^ " must be a union constructor"))
| Some(Base((params,t),tag,constraints,efl,efr,bounds)) ->
typ_error l ("Identifier " ^ i ^ " used in pattern is not a union constructor"))
@@ -478,12 +478,12 @@ let rec check_exp envs (imp_param:nexp option) (expect_t:t) (E_aux(e,(l,annot)):
| E_id id ->
let i = id_to_string id in
(match Envmap.apply t_env i with
- | Some(Base((params,t),Constructor,cs,ef,_,bounds)) ->
+ | Some(Base((params,t),(Constructor n),cs,ef,_,bounds)) ->
let t,cs,ef,_ = subst params false t cs ef in
(match t.t with
| Tfn({t = Tid "unit"},t',IP_none,ef) ->
let e = E_aux(E_app(id, []),
- (l, (Base(([],{t=Tfn(unit_t,t',IP_none,ef)}), Constructor, cs, ef,pure_e, bounds)))) in
+ (l, (Base(([],{t=Tfn(unit_t,t',IP_none,ef)}), (Constructor n), cs, ef,pure_e, bounds)))) in
let t',cs',ef',e' = type_coerce (Expr l) d_env Require false false b_env t' e expect_t in
(e',t',t_env,cs@cs',nob,union_effects ef ef')
| Tfn(t1,t',IP_none,e) ->
@@ -596,13 +596,13 @@ let rec check_exp envs (imp_param:nexp option) (expect_t:t) (E_aux(e,(l,annot)):
| Tapp ("vector",[TA_nexp base;TA_nexp {nexp = rise};TA_ord o;(TA_typ {t=Tid "bit"})])
| Tapp ("register",[TA_typ {t=Tapp ("vector",[TA_nexp base;TA_nexp { nexp = rise};
TA_ord o;(TA_typ {t=Tid "bit"})])}])->
- let f = match o.order with | Oinc -> "to_vec_inc" | Odec -> "to_vec_dec"
+ let f = match o.order with | Oinc -> "to_vec_inc_undef" | Odec -> "to_vec_dec_undef"
| _ -> (match d_env.default_o.order with
- | Oinc -> "to_vec_inc" | Odec -> "to_vec_dec"
- | _ -> "to_vec_inc") in
+ | Oinc -> "to_vec_inc_undef" | Odec -> "to_vec_dec_undef"
+ | _ -> "to_vec_inc_undef") in
let tannot = (l,Base(([],expect_t),External (Some f),[],ef,ef,b_env)) in
E_aux(E_app((Id_aux((Id f),l)),
- [(E_aux (E_internal_exp(tannot), tannot));simp_exp e l bit_t]),tannot),[],ef
+ [(E_aux (E_internal_exp(tannot), tannot));]),tannot),[],ef
| _ -> simp_exp e l (new_t ()),[],ef)) in
let t',cs',_,e' = type_coerce (Expr l) d_env Require false true b_env (get_e_typ e) e expect_t in
(e',t',t_env,cs@cs',nob,effect)
@@ -775,15 +775,15 @@ let rec check_exp envs (imp_param:nexp option) (expect_t:t) (E_aux(e,(l,annot)):
(match t_p.t with
| Tfn(arg,ret,_,ef') -> check_parms arg lft rht
| _ -> typ_error l ("Expected a function, found identifier " ^ i ^ " bound to type " ^ (t_to_string t))) in
- (*let _ = Printf.eprintf "Looking for overloaded function %s, generic type is %s, arg_t is %s\n"
- i (t_to_string t_p) (t_to_string arg_t) in*)
+ let _ = Printf.eprintf "Looking for overloaded function %s, generic type is %s, arg_t is %s\n"
+ i (t_to_string t_p) (t_to_string arg_t) in
(match (select_overload_variant d_env true overload_return variants arg_t) with
| [] ->
typ_error l ("No function found with name " ^ i ^
" that expects parameters " ^ (t_to_string arg_t))
| [Base((params,t),tag,cs,ef,_,b)] ->
- (*let _ = Printf.eprintf "Selected an overloaded function for %s,
- variant with function type %s for actual type %s\n" i (t_to_string t) (t_to_string arg_t) in*)
+ let _ = Printf.eprintf "Selected an overloaded function for %s,
+ variant with function type %s for actual type %s\n" i (t_to_string t) (t_to_string arg_t) in
(match t.t with
| Tfn(arg,ret,imp,ef') ->
(match arg.t,arg_t.t with
@@ -795,15 +795,15 @@ let rec check_exp envs (imp_param:nexp option) (expect_t:t) (E_aux(e,(l,annot)):
|_ -> raise (Reporting_basic.err_unreachable l "function no longer has tuple type"))
| _ -> raise (Reporting_basic.err_unreachable l "overload variant does not have function"))
| variants ->
- (*let _ = Printf.eprintf "Number of variants found before looking at return value %i\n%!"
- (List.length variants) in*)
+ let _ = Printf.eprintf "Number of variants found before looking at return value %i\n%!"
+ (List.length variants) in
(match (select_overload_variant d_env false true variants expect_t) with
| [] ->
typ_error l ("No matching function found with name " ^ i ^ " that expects parameters " ^
(t_to_string arg_t) ^ " returning " ^ (t_to_string expect_t))
| [Base((params,t),tag,cs,ef,_,b)] ->
- (*let _ = Printf.eprintf "Selected an overloaded function for %s,
- variant with function type %s for actual type %s\n" i (t_to_string t) (t_to_string arg_t) in*)
+ let _ = Printf.eprintf "Selected an overloaded function for %s,
+ variant with function type %s for actual type %s\n" i (t_to_string t) (t_to_string arg_t) in
(match t.t with
| Tfn(arg,ret,imp,ef') ->
(match arg.t,arg_t.t with
@@ -859,9 +859,9 @@ let rec check_exp envs (imp_param:nexp option) (expect_t:t) (E_aux(e,(l,annot)):
let t_cs = CondCons((Expr l),Positive,None,c1p,then_c@then_c') in
let e_cs = CondCons((Expr l),Negative,None,c1n,else_c@else_c') in
let sub_effects = union_effects ef1 (union_effects then_ef else_ef) in
+ let resulting_env = Envmap.intersect_merge (tannot_merge (Expr l) d_env true) then_env else_env in
(E_aux(E_if(cond',then',else'),(l,simple_annot_efr expect_t sub_effects)),
- expect_t,
- Envmap.intersect_merge (tannot_merge (Expr l) d_env true) then_env else_env,
+ expect_t, resulting_env,
[BranchCons(Expr l, None, [t_cs;e_cs])],
merge_bounds then_bs else_bs, (*TODO Should be an intersecting merge*)
sub_effects)
@@ -1299,7 +1299,8 @@ let rec check_exp envs (imp_param:nexp option) (expect_t:t) (E_aux(e,(l,annot)):
| E_exit e ->
let (e',t',_,_,_,_) = check_exp envs imp_param (new_t ()) e in
(E_aux (E_exit e',(l,(simple_annot expect_t))),expect_t,t_env,[],nob,pure_e)
- | E_internal_cast _ | E_internal_exp _ | E_internal_exp_user _ | E_internal_let _ ->
+ | E_internal_cast _ | E_internal_exp _ | E_internal_exp_user _ | E_internal_let _
+ | E_internal_plet _ | E_internal_return _ ->
raise (Reporting_basic.err_unreachable l "Internal expression passed back into type checker")
and check_block envs imp_param expect_t exps:((tannot exp) list * tannot * nexp_range list * t * effect) =
@@ -1665,11 +1666,12 @@ let check_type_def envs (TD_aux(td,(l,annot))) =
| TD_variant(id,nmscm,typq,arms,_) ->
let id' = id_to_string id in
let (params,typarms,constraints) = typq_to_params envs typq in
+ let num_arms = List.length arms in
let ty = match params with
| [] -> {t=Tid id'}
| params -> {t = Tapp(id', typarms) }in
- let tyannot = Base((params,ty),Constructor,constraints,pure_e,pure_e,nob) in
- let arm_t input = Base((params,{t=Tfn(input,ty,IP_none,pure_e)}),Constructor,constraints,pure_e,pure_e,nob) in
+ let tyannot = Base((params,ty),Constructor num_arms,constraints,pure_e,pure_e,nob) in
+ let arm_t input = Base((params,{t=Tfn(input,ty,IP_none,pure_e)}),Constructor num_arms,constraints,pure_e,pure_e,nob) in
let arms' = List.map
(fun (Tu_aux(tu,l')) ->
match tu with
@@ -1841,8 +1843,8 @@ let check_fundef envs (FD_aux(FD_function(recopt,tannotopt,effectopt,funcls),(l,
let check t_env tp_env imp_param =
List.split
(List.map (fun (FCL_aux((FCL_Funcl(id,pat,exp)),(l,_))) ->
- (*let _ = Printf.eprintf "checking function %s : %s -> %s\n"
- (id_to_string id) (t_to_string param_t) (t_to_string ret_t) in*)
+ let _ = Printf.eprintf "checking function %s : %s -> %s\n"
+ (id_to_string id) (t_to_string param_t) (t_to_string ret_t) in
let (pat',t_env',cs_p,b_env',t') = check_pattern (Env(d_env,t_env,b_env,tp_env)) Emp_local param_t pat in
let _, _ = type_consistent (Patt l) d_env Require false param_t t' in
let exp',_,_,cs_e,_,ef =
diff --git a/src/type_internal.ml b/src/type_internal.ml
index 3c7d5ff6..660ef20a 100644
--- a/src/type_internal.ml
+++ b/src/type_internal.ml
@@ -85,7 +85,7 @@ type tag =
| Emp_set
| External of string option
| Default
- | Constructor
+ | Constructor of int
| Enum of int
| Alias of alias_inf
| Spec
@@ -328,7 +328,7 @@ let tag_to_string = function
| External None -> "External"
| External (Some s) -> "External " ^ s
| Default -> "Default"
- | Constructor -> "Constructor"
+ | Constructor _ -> "Constructor"
| Enum _ -> "Enum"
| Alias _ -> "Alias"
| Spec -> "Spec"
@@ -1446,6 +1446,9 @@ let mk_tup ts = {t = Ttup ts }
let mk_pure_fun arg ret = {t = Tfn (arg,ret,IP_none,pure_e)}
let mk_pure_imp arg ret var = {t = Tfn (arg,ret,IP_length (mk_nv var),pure_e)}
+let lib_tannot param_typs func cs =
+ Base(param_typs, External func, cs, pure_e, pure_e, nob)
+
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 start; TA_nexp size; TA_ord {order}; TA_typ typ])}
@@ -1461,326 +1464,313 @@ let mk_bitwise_op name symb arity =
then List.hd single_bit_vec_args,List.hd vec_args,List.hd bit_args,List.hd gen_args
else mk_tup single_bit_vec_args,mk_tup vec_args,mk_tup bit_args, mk_tup gen_args in
(symb,
- Overload(Base(((mk_typ_params ["a"]),mk_pure_fun garg {t=Tvar "a"}), External (Some name),[],pure_e,pure_e,nob),true,
- [Base(((mk_nat_params ["n";"m"]@mk_ord_params["o"]), mk_pure_fun varg vec_typ),
- External (Some name),[],pure_e,pure_e,nob);
- Base((["n",{k=K_Nat};"o",{k=K_Ord}],mk_pure_fun svarg bit_t),
- External(Some (name ^ "_range_bit")),[],pure_e,pure_e,nob);
- Base(([],mk_pure_fun barg bit_t),External (Some (name ^ "_bit")),[],pure_e,pure_e,nob)]))
+ Overload(lib_tannot ((mk_typ_params ["a"]),mk_pure_fun garg {t=Tvar "a"}) (Some name) [], true,
+ [lib_tannot ((mk_nat_params ["n";"m"]@mk_ord_params["o"]), mk_pure_fun varg vec_typ) (Some name) [];
+ lib_tannot (["n",{k=K_Nat};"o",{k=K_Ord}],mk_pure_fun svarg bit_t) (Some (name ^ "_range_bit")) [];
+ lib_tannot ([],mk_pure_fun barg bit_t) (Some (name ^ "_bit")) []]))
let initial_typ_env =
Envmap.from_list [
- ("ignore",Base(([("a",{k=K_Typ})],mk_pure_fun {t=Tvar "a"} unit_t),External None,[],pure_e,pure_e,nob));
+ ("ignore",lib_tannot ([("a",{k=K_Typ})],mk_pure_fun {t=Tvar "a"} unit_t) None []);
("+",Overload(
- Base(((mk_typ_params ["a";"b";"c"]),
- (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"})),External (Some "add"),[],pure_e,pure_e,nob),
+ lib_tannot ((mk_typ_params ["a";"b";"c"]),
+ (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"})) (Some "add") [],
true,
- [Base(((mk_nat_params ["n";"m"]),
- (mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")])
- (mk_atom (mk_add (mk_nv "n") (mk_nv "m"))))),
- External (Some "add"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
- mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
- (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")))),
- External (Some "add_vec"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"o";"p";"q"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
- mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
- (mk_range (mk_nv "q") (mk_2n (mk_nv "n"))))),
- External (Some "add_vec_vec_range"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
- mk_atom (mk_nv "o")])
- (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))),
- External (Some "add_vec_range"),
- [LtEq(Specc(Parse_ast.Int("+",None)),Require, (mk_nv "o"),mk_sub (mk_2n (mk_nv "m")) n_one)],
- pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
- mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
- (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")); bit_t; bit_t]))),
- External (Some "add_overflow_vec"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
- mk_atom (mk_nv "o")])
- (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m")))))),
- External (Some "add_vec_range_range"),
- [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),mk_sub (mk_2n (mk_nv "m")) n_one)],
- pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
- mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
- (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))),
- External (Some "add_range_vec"),
- [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),mk_sub (mk_2n (mk_nv "m")) n_one)],
- pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
- mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
- (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_sub (mk_2n (mk_nv "m")) n_one))))),
- External (Some "add_range_vec_range"),
- [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),mk_sub (mk_2n (mk_nv "m")) n_one)],
- pure_e,pure_e,nob);
- Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"); bit_t])
- (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")))),
- External (Some "add_vec_bit"), [], pure_e,pure_e,nob);
- Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
- (mk_pure_fun (mk_tup [bit_t; mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")])
- (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")))),
- External (Some "add_bit_vec"), [], pure_e,pure_e,nob);
+ [lib_tannot ((mk_nat_params ["n";"m"]),
+ (mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")])
+ (mk_atom (mk_add (mk_nv "n") (mk_nv "m")))))
+ (Some "add") [];
+ lib_tannot ((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
+ mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"))))
+ (Some "add_vec") [];
+ lib_tannot ((mk_nat_params ["n";"o";"p";"q"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
+ mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
+ (mk_range (mk_nv "q") (mk_2n (mk_nv "n")))))
+ (Some "add_vec_vec_range") [];
+ lib_tannot ((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
+ mk_atom (mk_nv "o")])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"))))
+ (Some "add_vec_range")
+ [LtEq(Specc(Parse_ast.Int("+",None)),Require, (mk_nv "o"),mk_sub (mk_2n (mk_nv "m")) n_one)];
+ lib_tannot ((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
+ mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
+ (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")); bit_t; bit_t])))
+ (Some "add_overflow_vec") [];
+ lib_tannot ((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
+ mk_atom (mk_nv "o")])
+ (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m"))))))
+ (Some "add_vec_range_range")
+ [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),mk_sub (mk_2n (mk_nv "m")) n_one)];
+ lib_tannot ((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
+ mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"))))
+ (Some "add_range_vec")
+ [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),mk_sub (mk_2n (mk_nv "m")) n_one)];
+ lib_tannot ((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
+ mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
+ (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_sub (mk_2n (mk_nv "m")) n_one)))))
+ (Some "add_range_vec_range")
+ [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),mk_sub (mk_2n (mk_nv "m")) n_one)];
+ lib_tannot ((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"); bit_t])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"))))
+ (Some "add_vec_bit") [];
+ lib_tannot ((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
+ (mk_pure_fun (mk_tup [bit_t; mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"))))
+ (Some "add_bit_vec") [];
]));
("+_s",Overload(
- Base(((mk_typ_params ["a";"b";"c"]),
- (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"})),External (Some "add"),[],pure_e,pure_e,nob),
+ lib_tannot ((mk_typ_params ["a";"b";"c"]),
+ (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"})) (Some "add") [],
true,
- [Base(((mk_nat_params ["n";"m"]),
- (mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")])
- (mk_atom (mk_add (mk_nv "n") (mk_nv "m"))))),
- External (Some "add_signed"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
- mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
- (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")))),
- External (Some "add_vec_signed"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"o";"p";"q"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
- mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
- (mk_range (mk_nv "q") (mk_2n (mk_nv "n"))))),
- External (Some "add_vec_vec_range_signed"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
- mk_atom (mk_nv "o")])
- (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))),
- External (Some "add_vec_range_signed"),
- [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),(mk_sub (mk_2n (mk_nv "m")) n_one))],
- pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
- mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
- (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")); bit_t; bit_t]))),
- External (Some "add_overflow_vec_signed"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
- mk_atom (mk_nv "o")])
- (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m")))))),
- External (Some "add_vec_range_range_signed"),
- [LtEq(Specc(Parse_ast.Int("+",None)),Require, (mk_nv "o"),mk_sub (mk_2n (mk_nv "m")) n_one)],
- pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
- mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
- (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))),
- External (Some "add_range_vec_signed"),
- [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),(mk_sub (mk_2n (mk_nv "m")) n_one))],
- pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
- mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
- (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m")))))),
- External (Some "add_range_vec_range_signed"),
- [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),(mk_sub (mk_2n (mk_nv "m")) n_one))],
- pure_e,pure_e,nob);
- Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"); bit_t])
- (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")))),
- External (Some "add_vec_bit_signed"), [], pure_e,pure_e,nob);
- Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"); bit_t])
- (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")); bit_t; bit_t]))),
- External (Some "add_overflow_vec_bit_signed"), [], pure_e,pure_e,nob);
- Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
- (mk_pure_fun (mk_tup [bit_t; mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")])
- (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")))),
- External (Some "add_bit_vec_signed"), [], pure_e,pure_e,nob);
+ [lib_tannot ((mk_nat_params ["n";"m"]),
+ (mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")])
+ (mk_atom (mk_add (mk_nv "n") (mk_nv "m")))))
+ (Some "add_signed") [];
+ lib_tannot ((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
+ mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"))))
+ (Some "add_vec_signed") [];
+ lib_tannot ((mk_nat_params ["n";"o";"p";"q"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
+ mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
+ (mk_range (mk_nv "q") (mk_2n (mk_nv "n")))))
+ (Some "add_vec_vec_range_signed") [];
+ lib_tannot ((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
+ mk_atom (mk_nv "o")])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"))))
+ (Some "add_vec_range_signed")
+ [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),(mk_sub (mk_2n (mk_nv "m")) n_one))];
+ lib_tannot ((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
+ mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
+ (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")); bit_t; bit_t])))
+ (Some "add_overflow_vec_signed") [];
+ lib_tannot ((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
+ mk_atom (mk_nv "o")])
+ (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m"))))))
+ (Some "add_vec_range_range_signed")
+ [LtEq(Specc(Parse_ast.Int("+",None)),Require, (mk_nv "o"),mk_sub (mk_2n (mk_nv "m")) n_one)];
+ lib_tannot ((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
+ mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"))))
+ (Some "add_range_vec_signed")
+ [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),(mk_sub (mk_2n (mk_nv "m")) n_one))];
+ lib_tannot ((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
+ mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
+ (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m"))))))
+ (Some "add_range_vec_range_signed")
+ [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),(mk_sub (mk_2n (mk_nv "m")) n_one))];
+ lib_tannot ((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"); bit_t])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"))))
+ (Some "add_vec_bit_signed") [];
+ lib_tannot ((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"); bit_t])
+ (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")); bit_t; bit_t])))
+ (Some "add_overflow_vec_bit_signed") [];
+ lib_tannot ((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
+ (mk_pure_fun (mk_tup [bit_t; mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"))))
+ (Some "add_bit_vec_signed") [];
]));
("-_s",Overload(
- Base(((mk_typ_params ["a";"b";"c"]),
- (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"})),
- External (Some "minus"),[],pure_e,pure_e,nob),
+ lib_tannot ((mk_typ_params ["a";"b";"c"]), (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"}))
+ (Some "minus") [],
true,
- [Base(((mk_nat_params["n";"m"]),
- (mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")])
- (mk_atom (mk_sub (mk_nv "n") (mk_nv "m"))))),
- External (Some "minus"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
- mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
- (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")))),
- External (Some "minus_vec_signed"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
- mk_atom (mk_nv "o")])
- (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))),
- External (Some "minus_vec_range_signed"),
- [],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
- mk_atom (mk_nv "o")])
- (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m")))))),
- External (Some "minus_vec_range_range_signed"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
- mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
- (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))),
- External (Some "minus_range_vec_signed"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
- mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
- (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m")))))),
- External (Some "minus_range_vec_range_signed"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
- mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
- (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")); bit_t; bit_t]))),
- External (Some "minus_overflow_vec_signed"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"); bit_t])
- (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")); bit_t; bit_t]))),
- External (Some "minus_overflow_vec_bit_signed"), [], pure_e,pure_e,nob);
+ [lib_tannot ((mk_nat_params["n";"m"]),
+ (mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")])
+ (mk_atom (mk_sub (mk_nv "n") (mk_nv "m")))))
+ (Some "minus") [];
+ lib_tannot ((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
+ mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"))))
+ (Some "minus_vec_signed") [];
+ lib_tannot ((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
+ mk_atom (mk_nv "o")])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"))))
+ (Some "minus_vec_range_signed") [];
+ lib_tannot ((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
+ mk_atom (mk_nv "o")])
+ (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m"))))))
+ (Some "minus_vec_range_range_signed") [];
+ lib_tannot ((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
+ mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"))))
+ (Some "minus_range_vec_signed") [];
+ lib_tannot ((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
+ mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
+ (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m"))))))
+ (Some "minus_range_vec_range_signed") [];
+ lib_tannot ((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
+ mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
+ (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")); bit_t; bit_t])))
+ (Some "minus_overflow_vec_signed") [];
+ lib_tannot ((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"); bit_t])
+ (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")); bit_t; bit_t])))
+ (Some "minus_overflow_vec_bit_signed") [];
]));
("-",Overload(
- Base(((mk_typ_params ["a";"b";"c"]),
- (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"})),
- External (Some "minus"),[],pure_e,pure_e,nob),
+ lib_tannot ((mk_typ_params ["a";"b";"c"]), (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"}))
+ (Some "minus") [],
true,
- [Base(((mk_nat_params["n";"m"]),
- (mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")])
- (mk_atom (mk_sub (mk_nv "n") (mk_nv "m"))))),
- External (Some "minus"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
- mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
- (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")))),
- External (Some "minus_vec"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["m";"n";"o";"p"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
- mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
- (mk_atom (mk_nv "m")))), External (Some "minus_vec_vec_range"),[],pure_e,pure_e,nob); (*Need a bound on m*)
- Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
- mk_atom (mk_nv "o")])
- (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))),
- External (Some "minus_vec_range"),[],pure_e,pure_e,nob); (*Need a bound on o?*)
- Base(((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
- mk_atom (mk_nv "o")])
- (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m")))))),
- External (Some "minus_vec_range_range"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
- mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
- (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))),
- External (Some "minus_range_vec"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
- mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
- (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m")))))),
- External (Some "minus_range_vec_range"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
- mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
- (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")); bit_t; bit_t]))),
- External (Some "minus_overflow_vec"),[],pure_e,pure_e,nob);
- Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
- (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"); bit_t])
- (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")); bit_t; bit_t]))),
- External (Some "minus_overflow_vec_bit"), [], pure_e,pure_e,nob);
+ [lib_tannot ((mk_nat_params["n";"m"]),
+ (mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")])
+ (mk_atom (mk_sub (mk_nv "n") (mk_nv "m")))))
+ (Some "minus") [];
+ lib_tannot ((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
+ mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"))))
+ (Some "minus_vec") [];
+ lib_tannot ((mk_nat_params ["m";"n";"o";"p"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
+ mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
+ (mk_atom (mk_nv "m")))) (Some "minus_vec_vec_range") [];
+ lib_tannot ((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
+ mk_atom (mk_nv "o")])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"))))
+ (Some "minus_vec_range") [];
+ lib_tannot ((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
+ mk_atom (mk_nv "o")])
+ (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m"))))))
+ (Some "minus_vec_range_range") [];
+ lib_tannot ((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
+ mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
+ (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"))))
+ (Some "minus_range_vec") [];
+ lib_tannot ((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
+ mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");])
+ (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m"))))))
+ (Some "minus_range_vec_range") [];
+ lib_tannot ((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
+ mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
+ (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")); bit_t; bit_t])))
+ (Some "minus_overflow_vec") [];
+ lib_tannot ((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"); bit_t])
+ (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")); bit_t; bit_t])))
+ (Some "minus_overflow_vec_bit") [];
]));
("*",Overload(
- Base(((mk_typ_params ["a";"b";"c"]),
- (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]){t=Tvar "c"})),
- External (Some "multiply"),[],pure_e,pure_e,nob),
+ lib_tannot ((mk_typ_params ["a";"b";"c"]),
+ (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]){t=Tvar "c"}))
+ (Some "multiply") [],
true,
- [Base(((mk_nat_params["n";"m"]),
- (mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")])
- (mk_atom (mk_mult (mk_nv "n") (mk_nv "m"))))),
- External (Some "multiply"), [],pure_e,pure_e,nob);
+ [lib_tannot ((mk_nat_params["n";"m"]),
+ (mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")])
+ (mk_atom (mk_mult (mk_nv "n") (mk_nv "m")))))
+ (Some "multiply") [];
Base(((mk_nat_params ["n";"o";"p";"q"])@(mk_ord_params ["ord"]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
(mk_vector bit_t (Ovar "ord") (mk_nv "q") (mk_add (mk_nv "n") (mk_nv "n"))))),
- External (Some "multiply_vec"), [],pure_e,pure_e,nob);
+ (External (Some "multiply_vec")), [],pure_e,pure_e,nob);
Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]),
(mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")])
(mk_vector bit_t (Ovar "ord") (mk_nv "q") (mk_add (mk_nv "m") (mk_nv "m"))))),
- External (Some "mult_range_vec"),[],pure_e,pure_e,nob);
+ (External (Some "mult_range_vec")),[],pure_e,pure_e,nob);
Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
mk_atom (mk_nv "o")])
(mk_vector bit_t (Ovar "ord") (mk_nv "q") (mk_add (mk_nv "m") (mk_nv "m"))))),
- External (Some "mult_vec_range"),[],pure_e,pure_e,nob);
+ (External (Some "mult_vec_range")),[],pure_e,pure_e,nob);
]));
("*_s",Overload(
Base(((mk_typ_params ["a";"b";"c"]),
(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]){t=Tvar "c"})),
- External (Some "multiply"),[],pure_e,pure_e,nob),
+ (External (Some "multiply")),[],pure_e,pure_e,nob),
true,
[Base(((mk_nat_params["n";"m";]),
(mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")])
(mk_atom (mk_mult (mk_nv "n") (mk_nv "m"))))),
- External (Some "multiply_signed"), [],pure_e,pure_e,nob);
+ (External (Some "multiply_signed")), [],pure_e,pure_e,nob);
Base(((mk_nat_params ["n";"o";"p";"m"])@(mk_ord_params ["ord"]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_add (mk_nv "n") (mk_nv "n"))))),
- External (Some "multiply_vec_signed"), [],pure_e,pure_e,nob);
+ (External (Some "multiply_vec_signed")), [],pure_e,pure_e,nob);
Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]),
(mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")])
(mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_add (mk_nv "m") (mk_nv "m"))))),
- External (Some "mult_range_vec_signed"),[],pure_e,pure_e,nob);
+ (External (Some "mult_range_vec_signed")),[],pure_e,pure_e,nob);
Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
mk_atom (mk_nv "o")])
(mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_add (mk_nv "m") (mk_nv "m"))))),
- External (Some "mult_vec_range_signed"),[],pure_e,pure_e,nob);
+ (External (Some "mult_vec_range_signed")),[],pure_e,pure_e,nob);
Base(((mk_nat_params ["n";"o";"p";"m"])@(mk_ord_params ["ord"]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")])
(mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_add (mk_nv "n") (mk_nv "n")));
bit_t;bit_t]))),
- External (Some "mult_overflow_vec_signed"), [],pure_e,pure_e,nob);
+ (External (Some "mult_overflow_vec_signed")), [],pure_e,pure_e,nob);
]));
("**",
Base(((mk_nat_params ["o"]),
(mk_pure_fun (mk_tup [(mk_atom n_two); (mk_atom (mk_nv "o"))])
(mk_atom (mk_2n (mk_nv "o"))))),
- External (Some "power"), [],pure_e,pure_e,nob));
+ (External (Some "power")), [],pure_e,pure_e,nob));
("mod",
Overload(
Base(((mk_typ_params ["a";"b";"c"]),
(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"})),
- External (Some "modulo"),[],pure_e,pure_e,nob),
+ (External (Some "modulo")),[],pure_e,pure_e,nob),
true,
[Base(((mk_nat_params["n";"o";]),
(mk_pure_fun (mk_tup [mk_atom (mk_nv "n") ; mk_atom (mk_nv "o")])
(mk_range n_zero (mk_sub (mk_nv "o") n_one)))),
- External (Some "modulo"),
+ (External (Some "modulo")),
[GtEq(Specc(Parse_ast.Int("modulo",None)),Require,(mk_nv "o"),n_one)],pure_e,pure_e,nob);
Base(((mk_nat_params["n";"m";"o"])@(mk_ord_params["ord"]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
mk_range n_one (mk_nv "o")])
(mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))),
- External (Some "mod_vec_range"),
+ (External (Some "mod_vec_range")),
[GtEq(Specc(Parse_ast.Int("mod",None)),Require,(mk_nv "o"),n_one);],pure_e,pure_e,nob);
Base(((mk_nat_params["n";"m"])@(mk_ord_params["ord"]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")])
(mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))),
- External (Some "mod_vec"),[],pure_e,pure_e,nob)]));
+ (External (Some "mod_vec")),[],pure_e,pure_e,nob)]));
("quot",
Overload(
Base(((mk_typ_params ["a";"b";"c"]),
(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"})),
- External (Some "quot"),[],pure_e,pure_e,nob),
+ (External (Some "quot")),[],pure_e,pure_e,nob),
true,
[Base(((mk_nat_params["n";"m";"o";]),
(mk_pure_fun (mk_tup [mk_atom (mk_nv "n");mk_atom (mk_nv "m")])
(mk_atom (mk_nv "o")))),
- External (Some "quot"),[GtEq(Specc(Parse_ast.Int("quot",None)),Require,(mk_nv "m"),n_one);
+ (External (Some "quot")),[GtEq(Specc(Parse_ast.Int("quot",None)),Require,(mk_nv "m"),n_one);
LtEq(Specc(Parse_ast.Int("quot",None)),Guarantee,
(mk_mult (mk_nv "n") (mk_nv "o")),(mk_nv "m"))],
pure_e,pure_e,nob);
@@ -1788,24 +1778,24 @@ let initial_typ_env =
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "q")])
(mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))),
- External (Some "quot_vec"),[GtEq(Specc(Parse_ast.Int("quot",None)),Require, mk_nv "m", mk_nv "q")],
+ (External (Some "quot_vec")),[GtEq(Specc(Parse_ast.Int("quot",None)),Require, mk_nv "m", mk_nv "q")],
pure_e,pure_e,nob);
Base(((mk_nat_params["n";"m";"p";"q"])@(mk_ord_params["ord"]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "q")])
(mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")); bit_t;bit_t]))),
- External (Some "quot_overflow_vec"),
+ (External (Some "quot_overflow_vec")),
[GtEq(Specc(Parse_ast.Int("quot",None)),Require, mk_nv "m", mk_nv "q")],
pure_e,pure_e,nob)]));
("quot_s",
Overload(
Base(((mk_typ_params ["a";"b";"c"]), (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"})),
- External (Some "quot_signed"),[],pure_e,pure_e,nob),
+ (External (Some "quot_signed")),[],pure_e,pure_e,nob),
true,
[Base(((mk_nat_params["n";"m";"o";"p";"q";"r"]),
(mk_pure_fun (mk_tup [mk_range (mk_nv "n") (mk_nv "m"); mk_range (mk_nv "o") (mk_nv "p")])
(mk_range (mk_nv "q") (mk_nv "r")))),
- External (Some "quot_signed"),
+ (External (Some "quot_signed")),
[GtEq(Specc(Parse_ast.Int("quot",None)),Require,(mk_nv "o"),n_one);
LtEq(Specc(Parse_ast.Int("quot",None)),Guarantee,(mk_mult (mk_nv "p") (mk_nv "r")),mk_nv "m")],
pure_e,pure_e,nob);
@@ -1813,39 +1803,39 @@ let initial_typ_env =
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "q")])
(mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))),
- External (Some "quot_vec_signed"),
+ (External (Some "quot_vec_signed")),
[GtEq(Specc(Parse_ast.Int("quot",None)),Require, mk_nv "m", mk_nv "q")],pure_e,pure_e,nob);
Base(((mk_nat_params["n";"m";"p";"q"])@(mk_ord_params["ord"]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "q")])
(mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")); bit_t;bit_t]))),
- External (Some "quot_overflow_vec_signed"),
+ (External (Some "quot_overflow_vec_signed")),
[GtEq(Specc(Parse_ast.Int("quot",None)),Require, mk_nv "m", mk_nv "q")],pure_e,pure_e,nob);
]));
("length", Base((["a",{k=K_Typ}]@(mk_nat_params["n";"m"])@(mk_ord_params["ord"]),
(mk_pure_fun (mk_vector {t=Tvar "a"} (Ovar "ord") (mk_nv "n") (mk_nv "m"))
(mk_atom (mk_nv "m")))),
- External (Some "length"),[],pure_e,pure_e,nob));
+ (External (Some "length")),[],pure_e,pure_e,nob));
(* incorrect types for typechecking processed sail code; do we care? *)
("mask",Base(((mk_typ_params ["a"])@(mk_nat_params["n";"m";"o";"p"])@(mk_ord_params["ord"]),
(mk_pure_imp (mk_vector {t=Tvar "a"} (Ovar "ord") (mk_nv "n") (mk_nv "m"))
(mk_vector {t=Tvar "a"} (Ovar "ord") (mk_nv "p") (mk_nv "o")) "o")),
- External (Some "mask"),
+ (External (Some "mask")),
[GtEq(Specc(Parse_ast.Int("mask",None)),Guarantee, (mk_nv "m"), (mk_nv "o"))],pure_e,pure_e,nob));
(*TODO These should be IP_start *)
("to_vec_inc",Base(([("a",{k=K_Typ})],{t=Tfn(nat_typ,{t=Tvar "a"},IP_none,pure_e)}),
- External None,[],pure_e,pure_e,nob));
+ (External None),[],pure_e,pure_e,nob));
("to_vec_dec",Base(([("a",{k=K_Typ})],{t=Tfn(nat_typ,{t=Tvar "a"},IP_none,pure_e)}),
- External None,[],pure_e,pure_e,nob));
+ (External None),[],pure_e,pure_e,nob));
(*Correct types again*)
("==",
Overload(
Base((mk_typ_params ["a";"b"],(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) bit_t)),
- External (Some "eq"),[],pure_e,pure_e,nob),
+ (External (Some "eq")),[],pure_e,pure_e,nob),
false,
[Base((mk_nat_params["n";"m";],
mk_pure_fun (mk_tup [mk_atom (mk_nv "n") ;mk_atom (mk_nv "m")]) bit_t),
- External (Some "eq"),
+ (External (Some "eq")),
[Predicate(Specc(Parse_ast.Int("==",None)),
Eq(Specc(Parse_ast.Int("==",None)), mk_nv "n", mk_nv "m"),
NtEq(Specc(Parse_ast.Int("==",None)), mk_nv "n", mk_nv "m"))],
@@ -1855,25 +1845,25 @@ let initial_typ_env =
(mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")])
bit_t)),
- External (Some "eq_range_vec"),[],pure_e,pure_e,nob);
+ (External (Some "eq_range_vec")),[],pure_e,pure_e,nob);
(* == : [:'o:] * bit['n] -> bit_t *)
Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
mk_atom (mk_nv "o")])
bit_t)),
- External (Some "eq_vec_range"),[],pure_e,pure_e,nob);
+ (External (Some "eq_vec_range")),[],pure_e,pure_e,nob);
Base((["a",{k=K_Typ}],(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "a"}]) bit_t)),
- External (Some "eq"),[],pure_e,pure_e,nob)]));
+ (External (Some "eq")),[],pure_e,pure_e,nob)]));
("!=",Base((["a",{k=K_Typ}; "b",{k=K_Typ}], (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) bit_t)),
- External (Some "neq"),[],pure_e,pure_e,nob));
+ (External (Some "neq")),[],pure_e,pure_e,nob));
("<",
Overload(
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,pure_e,nob),
+ (External (Some "lt")),[],pure_e,pure_e,nob),
false,
[Base(((mk_nat_params ["n"; "m";]),
(mk_pure_fun (mk_tup [mk_atom (mk_nv "n") ;mk_atom (mk_nv "m")]) bit_t)),
- External (Some "lt"),
+ (External (Some "lt")),
[Predicate(Specc(Parse_ast.Int("<",None)),
Lt(Specc(Parse_ast.Int("<",None)),Guarantee, mk_nv "n", mk_nv "m"),
GtEq(Specc(Parse_ast.Int("<",None)),Guarantee, mk_nv "n", mk_nv "m"))],
@@ -1881,20 +1871,20 @@ let initial_typ_env =
Base((((mk_nat_params ["n";"o";"p"])@["ord",{k=K_Ord}]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)),
- External (Some "lt_vec"),[],pure_e,pure_e,nob);
+ (External (Some "lt_vec")),[],pure_e,pure_e,nob);
Base(((mk_nat_params ["n";"m";"o"]@["ord",{k=K_Ord}]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
mk_atom (mk_nv "o")]) bit_t)),
- External (Some "lt_vec_range"), [], pure_e,pure_e, nob);
+ (External (Some "lt_vec_range")), [], pure_e,pure_e, nob);
]));
("<_s",
Overload(
Base((["a",{k=K_Typ}],(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "a"}]) bit_t)),
- External (Some "lt"),[],pure_e,pure_e,nob),
+ (External (Some "lt")),[],pure_e,pure_e,nob),
false,
[Base(((mk_nat_params ["n"; "m";]),
(mk_pure_fun (mk_tup [mk_atom (mk_nv "n");mk_atom (mk_nv "m")]) bit_t)),
- External (Some "lt_signed"),
+ (External (Some "lt_signed")),
[Predicate(Specc(Parse_ast.Int("<_s",None)),
Lt(Specc(Parse_ast.Int("<_s",None)),Guarantee, mk_nv "n", mk_nv "m"),
GtEq(Specc(Parse_ast.Int("<_s",None)),Guarantee, mk_nv "n", mk_nv "m"))],
@@ -1902,16 +1892,16 @@ let initial_typ_env =
Base((((mk_nat_params ["n";"o";"p"])@["ord",{k=K_Ord}]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)),
- External (Some "lt_vec_signed"),[],pure_e,pure_e,nob);
+ (External (Some "lt_vec_signed")),[],pure_e,pure_e,nob);
]));
("<_u",
Overload(
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,pure_e,nob),
+ (External (Some "lt")),[],pure_e,pure_e,nob),
false,
[Base(((mk_nat_params ["n"; "m";]),
(mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")]) bit_t)),
- External (Some "lt_unsigned"),
+ (External (Some "lt_unsigned")),
[Predicate(Specc(Parse_ast.Int("<",None)),
Lt(Specc(Parse_ast.Int("<_u",None)),Guarantee, mk_nv "n", mk_nv "m"),
GtEq(Specc(Parse_ast.Int("<_u",None)),Guarantee, mk_nv "n", mk_nv "m"))],
@@ -1919,16 +1909,16 @@ let initial_typ_env =
Base((((mk_nat_params ["n";"o";"p"])@["ord",{k=K_Ord}]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)),
- External (Some "lt_vec_unsigned"),[],pure_e,pure_e,nob);
+ (External (Some "lt_vec_unsigned")),[],pure_e,pure_e,nob);
]));
(">",
Overload(
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,pure_e,nob),
+ (External (Some "gt")),[],pure_e,pure_e,nob),
false,
[Base(((mk_nat_params ["n";"m"]),
(mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")]) bit_t)),
- External (Some "gt"),
+ (External (Some "gt")),
[Predicate(Specc(Parse_ast.Int(">",None)),
Gt(Specc(Parse_ast.Int(">",None)),Guarantee, mk_nv "n", mk_nv "m"),
LtEq(Specc(Parse_ast.Int(">",None)),Guarantee, mk_nv "n", mk_nv "m"))],
@@ -1936,20 +1926,20 @@ let initial_typ_env =
Base((((mk_nat_params ["n";"o";"p"])@[("ord",{k=K_Ord})]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)),
- External (Some "gt_vec"),[],pure_e,pure_e,nob);
+ (External (Some "gt_vec")),[],pure_e,pure_e,nob);
Base(((mk_nat_params ["n";"m";"o";]@["ord",{k=K_Ord}]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
mk_atom (mk_nv "o")]) bit_t)),
- External (Some "gt_vec_range"), [], pure_e,pure_e, nob);
+ (External (Some "gt_vec_range")), [], pure_e,pure_e, nob);
]));
(">_s",
Overload(
Base((["a",{k=K_Typ}],(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "a"}]) bit_t)),
- External (Some "gt"),[],pure_e,pure_e,nob),
+ (External (Some "gt")),[],pure_e,pure_e,nob),
false,
[Base(((mk_nat_params ["n";"m";]),
(mk_pure_fun (mk_tup [mk_atom (mk_nv "n");mk_atom (mk_nv "m")]) bit_t)),
- External (Some "gt_signed"),
+ (External (Some "gt_signed")),
[Predicate(Specc(Parse_ast.Int(">_s",None)),
Gt(Specc(Parse_ast.Int(">_s",None)),Guarantee, mk_nv "n", mk_nv "m"),
LtEq(Specc(Parse_ast.Int(">_s",None)),Guarantee, mk_nv "m", mk_nv "m"))],
@@ -1957,16 +1947,16 @@ let initial_typ_env =
Base((((mk_nat_params ["n";"o";"p"])@[("ord",{k=K_Ord})]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)),
- External (Some "gt_vec_signed"),[],pure_e,pure_e,nob);
+ (External (Some "gt_vec_signed")),[],pure_e,pure_e,nob);
]));
(">_u",
Overload(
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,pure_e,nob),
+ (External (Some "gt")),[],pure_e,pure_e,nob),
false,
[Base(((mk_nat_params ["n";"m";]),
(mk_pure_fun (mk_tup [mk_atom (mk_nv "n");mk_atom (mk_nv "m")]) bit_t)),
- External (Some "gt_unsigned"),
+ (External (Some "gt_unsigned")),
[Predicate(Specc(Parse_ast.Int(">_u",None)),
Gt(Specc(Parse_ast.Int(">_u",None)),Guarantee, mk_nv "n", mk_nv "m"),
LtEq(Specc(Parse_ast.Int(">_u",None)),Guarantee, mk_nv "n", mk_nv "n"))],
@@ -1974,74 +1964,90 @@ let initial_typ_env =
Base((((mk_nat_params ["n";"o";"p"])@[("ord",{k=K_Ord})]),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)),
- External (Some "gt_vec_unsigned"),[],pure_e,pure_e,nob);
+ (External (Some "gt_vec_unsigned")),[],pure_e,pure_e,nob);
]));
("<=",
Overload(
- Base((["a",{k=K_Typ}],(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "a"}]) bit_t)),
- External (Some "lteq"),[],pure_e,pure_e,nob),
+ Base((["a",{k=K_Typ};"b",{k=K_Typ}],(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) bit_t)),
+ (External (Some "lteq")),[],pure_e,pure_e,nob),
false,
[Base(((mk_nat_params ["n"; "m";]),
(mk_pure_fun (mk_tup [mk_atom (mk_nv "n");mk_atom (mk_nv "m")]) bit_t)),
- External (Some "lteq"),
+ (External (Some "lteq")),
[Predicate(Specc(Parse_ast.Int("<=",None)),
LtEq(Specc(Parse_ast.Int("<=",None)),Guarantee,mk_nv "n",mk_nv "m"),
Gt(Specc(Parse_ast.Int("<=",None)),Guarantee,mk_nv "n",mk_nv "m"))],
pure_e,pure_e,nob);
+ Base(((mk_nat_params ["n";"m";"o";]@["ord",{k=K_Ord}]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
+ mk_atom (mk_nv "o")]) bit_t)),
+ (External (Some "lteq_vec_range")), [], pure_e,pure_e, nob);
+ Base(((mk_nat_params ["n";"m";"o";]@["ord",{k=K_Ord}]),
+ (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
+ mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")]) bit_t)),
+ (External (Some "lteq_range_vec")), [], pure_e,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") (mk_nv "o") (mk_nv "n");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)),
- External (Some "lteq_vec"),[],pure_e,pure_e,nob);
+ (External (Some "lteq_vec")),[],pure_e,pure_e,nob);
]));
("<=_s",
Overload(
Base((["a",{k=K_Typ}],(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "a"}]) bit_t)),
- External (Some "lteq"),[],pure_e,pure_e,nob),
+ (External (Some "lteq")),[],pure_e,pure_e,nob),
false,
[Base(((mk_nat_params ["n"; "m";]),
(mk_pure_fun (mk_tup [mk_atom (mk_nv "n");mk_atom (mk_nv "m")]) bit_t)),
- External (Some "lteq_signed"),
+ (External (Some "lteq_signed")),
[LtEq(Specc(Parse_ast.Int("<=",None)),Guarantee,mk_nv "n",mk_nv "o");
LtEq(Specc(Parse_ast.Int("<=",None)),Guarantee,mk_nv "m",mk_nv "p")],
pure_e,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") (mk_nv "o") (mk_nv "n");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)),
- External (Some "lteq_vec_signed"),[],pure_e,pure_e,nob);
+ (External (Some "lteq_vec_signed")),[],pure_e,pure_e,nob);
]));
(">=",
Overload(
Base((["a",{k=K_Typ}],(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "a"}]) bit_t)),
- External (Some "gteq"),[],pure_e,pure_e,nob),
+ (External (Some "gteq")),[],pure_e,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 "gteq"),
+ (External (Some "gteq")),
[GtEq(Specc(Parse_ast.Int(">=",None)),Guarantee, mk_nv "n", mk_nv "o");
GtEq(Specc(Parse_ast.Int(">=",None)),Guarantee, mk_nv "m", mk_nv "p")],
pure_e,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") (mk_nv "o") (mk_nv "n");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)),
- External (Some "gteq_vec"),[],pure_e,pure_e,nob);
+ (External (Some "gteq_vec")),[],pure_e,pure_e,nob);
+ Base(((mk_nat_params ["n";"m";"o";]@["ord",{k=K_Ord}]),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");
+ mk_atom (mk_nv "o")]) bit_t)),
+ (External (Some "gteq_vec_range")), [], pure_e,pure_e, nob);
+ Base(((mk_nat_params ["n";"m";"o";]@["ord",{k=K_Ord}]),
+ (mk_pure_fun (mk_tup [mk_atom (mk_nv "o");
+ mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")]) bit_t)),
+ (External (Some "gteq_range_vec")), [], pure_e,pure_e, nob);
]));
(">=_s",
Overload(
Base((["a",{k=K_Typ}],(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "a"}]) bit_t)),
- External (Some "gteq"),[],pure_e,pure_e,nob),
+ (External (Some "gteq")),[],pure_e,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 "gteq_signed"),
+ (External (Some "gteq_signed")),
[GtEq(Specc(Parse_ast.Int(">=_s",None)),Guarantee, mk_nv "n", mk_nv "o");
GtEq(Specc(Parse_ast.Int(">=_s",None)),Guarantee, mk_nv "m", mk_nv "p")],
pure_e,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") (mk_nv "o") (mk_nv "n");
mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)),
- External (Some "gteq_vec_signed"),[],pure_e,pure_e,nob);
+ (External (Some "gteq_vec_signed")),[],pure_e,pure_e,nob);
]));
- ("is_one",Base(([],(mk_pure_fun bit_t bit_t)),External (Some "is_one"),[],pure_e,pure_e,nob));
+ ("is_one",Base(([],(mk_pure_fun bit_t bit_t)),(External (Some "is_one")),[],pure_e,pure_e,nob));
("signed",Base((mk_nat_params["n";"m";"o"]@[("ord",{k=K_Ord})],
(mk_pure_fun (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"))
(mk_atom (mk_nv "o")))),
diff --git a/src/type_internal.mli b/src/type_internal.mli
index f38a7fe5..ac1ae525 100644
--- a/src/type_internal.mli
+++ b/src/type_internal.mli
@@ -87,7 +87,7 @@ type tag =
| Emp_set (* Local mutable expression being set *)
| External of string option (* External function or register name *)
| Default (* Variable has default type, has not been bound *)
- | Constructor (* Variable is a data constructor *)
+ | Constructor of int (* Variable is a data constructor, int says how many variants are in this family *)
| Enum of int (* Variable came from an enumeration, int tells me the highest possible numeric value *)
| Alias of alias_inf (* Variable came from a register alias *)
| Spec (* Variable came from a val specification *)