summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lem_interp/interp.lem1
-rw-r--r--src/lexer.mll2
-rw-r--r--src/test/power.sail10
-rw-r--r--src/type_internal.ml8
4 files changed, 14 insertions, 7 deletions
diff --git a/src/lem_interp/interp.lem b/src/lem_interp/interp.lem
index 9cdb1246..94c3e283 100644
--- a/src/lem_interp/interp.lem
+++ b/src/lem_interp/interp.lem
@@ -1841,7 +1841,6 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) =
(fun a -> update_stack a (add_to_top_frame (fun e env-> (E_aux (E_block(e::exps)) (l,tannot), env))))
end
-(*TODO The rebuilder function should take an environment and thread through as in to_exp and add_to_top_frame *)
and create_write_message_or_update mode t_level value l_env l_mem is_top_level ((LEXP_aux lexp (l,annot)):lexp tannot) : ((outcome * lmem * lenv) * maybe ((exp tannot) -> lenv -> ((lexp tannot) * lenv))) =
let (Env defs lets regs ctors subregs aliases) = t_level in
let (typ,tag,ncs,ef) = match annot with
diff --git a/src/lexer.mll b/src/lexer.mll
index 5b18026b..1dfcfe12 100644
--- a/src/lexer.mll
+++ b/src/lexer.mll
@@ -121,7 +121,7 @@ let kw_table =
]
-let default_type_names = ["bool";"unit";"vector";"range";"list";"bit";"nat"; "uint8";"uint16";"uint32";"uint64";"implicit"]
+let default_type_names = ["bool";"unit";"vector";"range";"list";"bit";"nat"; "int"; "uint8";"uint16";"uint32";"uint64";"implicit"]
let custom_type_names : string list ref = ref []
}
diff --git a/src/test/power.sail b/src/test/power.sail
index fd2a87fc..75238732 100644
--- a/src/test/power.sail
+++ b/src/test/power.sail
@@ -27,14 +27,14 @@ val forall Nat 'n, Nat 'm, 0 <= 'n, 'n <= 'm, 'm <= 63 .
MASK
function (bit[64]) MASK(start, stop) = {
- (bit[64]) mask := 0;
+ (bit[64]) mask_temp := 0;
if(start > stop) then {
- mask[start .. 63] := bitone ^^ (64 - start);
- mask[0 .. stop] := bitone ^^ (stop + 1);
+ mask_temp[start .. 63] := bitone ^^ (64 - start);
+ mask_temp[0 .. stop] := bitone ^^ (stop + 1);
} else {
- mask[start .. stop ] := bitone ^^ (stop - start + 1);
+ mask_temp[start .. stop ] := bitone ^^ (stop - start + 1);
};
- mask;
+ mask_temp;
}
val forall Nat 'n, 0 <= 'n, 'n <= 63 .
diff --git a/src/type_internal.ml b/src/type_internal.ml
index 79251d5b..d619b2e9 100644
--- a/src/type_internal.ml
+++ b/src/type_internal.ml
@@ -739,6 +739,7 @@ let rec fresh_evar bindings e =
| _ -> None
let nat_t = {t = Tapp("range",[TA_nexp{nexp= Nconst zero};TA_nexp{nexp = Npos_inf};])}
+let int_t = {t = Tapp("range",[TA_nexp{nexp=Nneg_inf};TA_nexp{nexp = Npos_inf};])}
let uint8_t = {t = Tapp("range",[TA_nexp{nexp = Nconst zero}; TA_nexp{nexp = N2n({nexp = Nconst (big_int_of_int 8)},Some (big_int_of_int 256))}])}
let uint16_t = {t = Tapp("range",[TA_nexp{nexp = Nconst zero}; TA_nexp{nexp = N2n({nexp = Nconst (big_int_of_int 16)},Some (big_int_of_int 65536))}])}
let uint32_t = {t = Tapp("range",[TA_nexp{nexp = Nconst zero}; TA_nexp{nexp = N2n({nexp = Nconst (big_int_of_int 32)},Some (big_int_of_int 4294967296))}])}
@@ -761,6 +762,7 @@ let initial_kind_env =
Envmap.from_list [
("bool", {k = K_Typ});
("nat", {k = K_Typ});
+ ("int", {k = K_Typ});
("uint8", {k = K_Typ});
("uint16", {k= K_Typ});
("uint32", {k=K_Typ});
@@ -778,6 +780,7 @@ let initial_kind_env =
let initial_abbrev_env =
Envmap.from_list [
("nat",Base(([],nat_t),Emp_global,[],pure_e));
+ ("int",Base(([],int_t),Emp_global,[],pure_e));
("uint8",Base(([],uint8_t),Emp_global,[],pure_e));
("uint16",Base(([],uint16_t),Emp_global,[],pure_e));
("uint32",Base(([],uint32_t),Emp_global,[],pure_e));
@@ -957,6 +960,11 @@ let initial_typ_env =
(* incorrect types for typechecking processed sail code; do we care? *)
("to_num_inc",Base(([("a",{k=K_Typ})],({t= Tfn ({t=Tvar "a"},nat_typ,IP_length,pure_e)})),External None,[],pure_e));
("to_num_dec",Base(([("a",{k=K_Typ})],{t= Tfn ({t=Tvar "a"},nat_typ,IP_length,pure_e)}),External None,[],pure_e));
+ ("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") (Nvar "n") (Nvar "m"))
+ (mk_vector {t=Tvar "a"} (Ovar "ord") (Nvar "p") (Nvar "o")))),
+ External (Some "mask"),
+ [GtEq(Specc(Parse_ast.Int("mask",None)), (mk_nv "m"), (mk_nv "o"))],pure_e));
(*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));
("to_vec_dec",Base(([("a",{k=K_Typ})],{t= Tfn (nat_typ,{t=Tvar "a"},IP_none,pure_e)}),External None,[],pure_e));