diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lem_interp/interp.lem | 197 | ||||
| -rw-r--r-- | src/lem_interp/interp_lib.lem | 19 | ||||
| -rw-r--r-- | src/pretty_print.ml | 3 | ||||
| -rw-r--r-- | src/type_check.ml | 8 |
4 files changed, 169 insertions, 58 deletions
diff --git a/src/lem_interp/interp.lem b/src/lem_interp/interp.lem index 888d17a7..ab4aa7ff 100644 --- a/src/lem_interp/interp.lem +++ b/src/lem_interp/interp.lem @@ -86,7 +86,8 @@ and value_eq left right = t = t' && listEqualBy id_value_eq l l' | (V_ctor i t v, V_ctor i' t' v') -> t = t' && id_value_eq (i, v) (i', v') - | (V_unknown,V_unknown) -> true + | (V_unknown,_) -> true + | (_,V_unknown) -> true | (_, _) -> false end @@ -440,6 +441,7 @@ let rec val_typ v = T_app "list" (T_args [T_arg_typ t]) | V_ctor id t vals -> t | V_register reg -> reg_to_t reg + | V_unknown -> T_var "fresh" (*consider carrying the type along*) end let rec to_exp v = @@ -462,9 +464,36 @@ let rec to_exp v = | V_list(vals) -> E_list (List.map to_exp vals) | V_ctor id t vals -> E_app id [to_exp vals] | V_register (Reg id tan) -> E_id id + | V_unknown -> E_id (id_of_string "-100") end) (Unknown,(val_annot (val_typ v))) +val env_to_let : env -> (exp tannot) -> (exp tannot) +let rec env_to_let_help env = match env with + | [] -> [] + | (i,v)::env -> + let t = (val_typ v) in + let tan = (val_annot t) in + (((P_aux (P_id i) (Unknown,tan)),(to_exp v)),t)::(env_to_let_help env) +end + +let env_to_let env (E_aux e annot) = + match env_to_let_help env with + | [] -> E_aux e annot + | [((p,e),t)] -> E_aux (E_let (LB_aux (LB_val_implicit p e) (Unknown,(val_annot t))) e) annot + | pts -> let ts = List.map snd pts in + let pes = List.map fst pts in + let ps = List.map fst pes in + let es = List.map snd pes in + let t = T_tup ts in + let tan = val_annot t in + E_aux (E_let (LB_aux (LB_val_implicit (P_aux (P_tup ps) (Unknown,tan)) + (E_aux (E_tuple es) (Unknown,tan))) (Unknown,tan)) + (E_aux e annot)) + annot +end + + val find_type_def : defs tannot -> id -> maybe (type_def tannot) val find_function : defs tannot -> id -> maybe (list (funcl tannot)) @@ -657,24 +686,38 @@ and vec_concat_match pats r_vals = end -val find_funcl : list (funcl tannot) -> value -> maybe (env * (exp tannot)) -let rec find_funcl funcls value = +(* If the first match uses an Unknown value, then returns all subsequent matches, otherwise just the first one or [] *) +val find_funcl : list (funcl tannot) -> value -> list (env * bool * (exp tannot)) +let rec find_funcl_helper find_all funcls value = match funcls with - | [] -> Nothing + | [] -> [] | (FCL_aux (FCL_Funcl id pat exp) _)::funcls -> let (is_matching,used_unknown,env) = match_pattern pat value in - if is_matching then Just (env,exp) else find_funcl funcls value + if is_matching + then if (used_unknown || find_all) + then (env,used_unknown,exp)::(find_funcl_helper true funcls value) + else [(env,used_unknown,exp)] + else find_funcl_helper find_all funcls value end -val find_case : list (pexp tannot) -> value -> maybe (env * (exp tannot)) -let rec find_case pexps value = +let find_funcl = (find_funcl_helper false) + +(*see above comment*) +val find_case : list (pexp tannot) -> value -> list (env * bool * (exp tannot)) +let rec find_case_helper find_all pexps value = match pexps with - | [] -> Nothing + | [] -> [] | (Pat_aux (Pat_exp p e) _)::pexps -> let (is_matching,used_unknown,env) = match_pattern p value in - if is_matching then Just(env,e) else find_case pexps value + if is_matching + then if (used_unknown || find_all) + then (env,used_unknown,e)::find_case_helper true pexps value + else [(env,used_unknown,e)] + else find_case_helper find_all pexps value end +let find_case = (find_case_helper false) + val interp_main : interp_mode -> top_level -> env -> lmem -> (exp tannot) -> (outcome * lmem * env) val exp_list : interp_mode -> top_level -> (list (exp tannot) -> (exp tannot)) -> (list value -> value) -> env -> lmem -> list value -> list (exp tannot) -> (outcome * lmem * env) val interp_lbind : interp_mode -> top_level -> env -> lmem -> (letbind tannot) -> ((outcome * lmem * env) * (maybe ((exp tannot) -> (letbind tannot)))) @@ -707,7 +750,8 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = | Just(t, tag, ncs, ef) -> (t,tag,ncs,ef) end in match exp with | E_lit lit -> - if is_lit_vector lit then (Value (litV_to_vec lit) Tag_empty,l_mem,l_env) + if is_lit_vector lit + then (Value (litV_to_vec lit) Tag_empty,l_mem,l_env) else (Value (V_lit lit) Tag_empty, l_mem,l_env) | E_cast ((Typ_aux typ _) as ctyp) exp -> resolve_outcome (interp_main mode t_level l_env l_mem exp) @@ -734,14 +778,14 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = | Just(value) -> match value with | V_boxref n t -> (Value (in_mem l_mem n) Tag_empty,l_mem,l_env) | _ -> (Value value Tag_empty,l_mem,l_env) end - | Nothing -> - match in_env lets id with - | Just(value) -> (Value value Tag_empty,l_mem,l_env) - | Nothing -> - match in_env regs id with - | Just(value) -> (Value value Tag_empty, l_mem,l_env) - | Nothing -> (Error l (String.stringAppend "Internal error: unbound id on Tag_none " name), l_mem,l_env) - end end end + | Nothing -> (Value V_unknown Tag_empty,l_mem,l_env) end + | Tag_global -> + match in_env lets id with + | Just(value) -> (Value value Tag_empty, l_mem,l_env) + | Nothing -> + (match in_env regs id with + | Just(value) -> (Value value Tag_empty, l_mem,l_env) + | Nothing -> (Error l (String.stringAppend "Internal error: unbound id on Tag_global " name),l_mem,l_env) end) end | Tag_enum -> match in_env lets id with | Just(value) -> (Value value Tag_empty,l_mem,l_env) @@ -766,6 +810,7 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = match (value,mode.eager_eval) with | (V_lit(L_aux L_true _),true) -> interp_main mode t_level l_env lm thn | (V_lit(L_aux L_true _),false) -> debug_out thn t_level lm l_env + | (V_unknown,_) -> interp_main mode t_level l_env lm (E_aux (E_block [thn;els]) (l,annot)) | (_,true) -> interp_main mode t_level l_env lm els | (_,false) -> debug_out els t_level lm l_env end) (fun a -> update_stack a (add_to_top_frame (fun c -> (E_aux (E_if c thn els) (l,annot))))) @@ -809,7 +854,12 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = if mode.eager_eval then interp_main mode t_level le lm e else debug_out e t_level lm le - + | V_unknown -> let e = (E_aux (E_let + (LB_aux (LB_val_implicit (P_aux (P_id id) (fl, val_annot (val_typ fval))) + (E_aux (E_lit (L_aux (L_num from_num) fl)) (fl, val_annot (val_typ fval)))) + (fl, val_annot (val_typ fval))) + exp) (l,annot)) in + interp_main mode t_level le lm e | _ -> (Error l "internal error: by must be a number",lm,le) end) (fun a -> update_stack a (add_to_top_frame (fun b -> @@ -828,11 +878,14 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = resolve_outcome (interp_main mode t_level l_env l_mem exp) (fun v lm le -> match find_case pats v with - | Nothing -> (Error l "No matching patterns in case",lm,le) - | Just (env,exp) -> + | [] -> (Error l "No matching patterns in case",lm,le) + | [(env,used_unknown,exp)] -> if mode.eager_eval then interp_main mode t_level (env++l_env) lm exp else debug_out exp t_level lm (env++l_env) + | multi_matches -> + let lets = List.map (fun (env,_,exp) -> env_to_let env exp) multi_matches in + interp_main mode t_level l_env lm (E_aux (E_block lets) (l,annot)) end) (fun a -> update_stack a (add_to_top_frame (fun e -> (E_aux (E_case e pats) (l,annot))))) | E_record(FES_aux (FES_Fexps fexps _) fes_annot) -> @@ -860,6 +913,7 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = (fun vs lm le -> (Value (fupdate_record rv vs) Tag_empty, lm, le)) (fun a -> a) + | V_unknown -> (Value V_unknown Tag_empty, lm, le) | _ -> (Error l "record upate requires record",lm,le) end) (fun a -> update_stack a (add_to_top_frame (fun e -> E_aux(E_record_update e (FES_aux(FES_Fexps fexps false) fes_annot)) (l,annot)))) @@ -871,6 +925,7 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = (interp_main mode t_level l_env lm tl) (fun tlv lm le -> match tlv with | V_list t -> (Value(V_list (hdv::t)) Tag_empty,lm,le) + | V_unknwon -> (Value V_unknown Tag_empty,lm,le) | _ -> (Error l ":: of non-list value",lm,le) end) (fun a -> update_stack a (add_to_top_frame (fun t ->E_aux (E_cons (to_exp hdv) t) (l,annot))))) (fun a -> update_stack a (add_to_top_frame (fun h -> E_aux (E_cons h tl) (l,annot)))) @@ -881,7 +936,8 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = | V_record t fexps -> match in_env fexps id with | Just v -> (Value v Tag_empty,lm,l_env) | Nothing -> (Error l "Field not found in record",lm,le) end - | _ -> (Error l "Field access of vectors not implemented",lm,le) + | V_unknown -> (Value V_unknown Tag_empty,lm,l_env) + | _ -> (Error l "Field access of vectors not implemented",lm,le) end ) (fun a -> match (exp,a) with @@ -916,9 +972,11 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = (fun vvec lm le -> match vvec with | V_vector base inc vals -> (Value (access_vector vvec n) Tag_empty,lm,le) + | V_unknown -> (Value V_unknown Tag_empty,lm,le) | _ -> (Error l "Vector access of non-vector",lm,le)end) (fun a -> update_stack a (add_to_top_frame (fun v -> (E_aux (E_vector_access v (E_aux (E_lit (L_aux (L_num n) ln)) (ln,Nothing))) (l,annot))))) + | V_unknown -> (Value V_unknown Tag_empty,lm,le) | _ -> (Error l "Vector access not given a number for index",lm,l_env) end) (fun a -> update_stack a (add_to_top_frame (fun i -> E_aux (E_vector_access vec i) (l,annot)))) | E_vector_subrange vec i1 i2 -> @@ -935,6 +993,7 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = (fun vvec lm le -> match vvec with | V_vector base inc vals -> (Value (slice_vector vvec n1 n2) Tag_empty,lm,le) + | V_unknown -> (Value V_unknown Tag_empty,lm,le) | _ -> (Error l "Vector slice of non-vector",lm,le)end) (fun a -> update_stack a (add_to_top_frame @@ -942,12 +1001,14 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = (E_aux (E_lit (L_aux (L_num n1) ln1)) (ln1,Nothing)) (E_aux (E_lit (L_aux (L_num n2) ln2)) (ln2,Nothing))) (l,annot))))) + | V_unknown -> (Value V_unknown Tag_empty, lm,le) | _ -> (Error l "vector slice given non number for last index",lm,le) end) (fun a -> update_stack a (add_to_top_frame (fun i2 -> (E_aux (E_vector_subrange vec (E_aux (E_lit (L_aux (L_num n1) ln1)) (ln1,Nothing)) i2) (l,annot))))) + | V_unknown -> (Value V_unknown Tag_empty,lm,le) | _ -> (Error l "Vector slice given non-number for first index",lm,le) end) (fun a -> update_stack a (add_to_top_frame (fun i1 -> (E_aux (E_vector_subrange vec i1 i2) (l,annot))))) | E_vector_update vec i exp -> @@ -961,6 +1022,7 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = (fun vec lm le -> match vec with | V_vector base inc vals -> (Value (fupdate_vec vec n1 vup) Tag_empty, lm,le) + | V_unknown -> (Value V_unknown Tag_empty, lm, le) | _ -> (Error l "Update of vector given non-vector",lm,le) end) (fun a -> update_stack a (add_to_top_frame @@ -971,6 +1033,7 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = (add_to_top_frame (fun e -> E_aux (E_vector_update vec (E_aux (E_lit (L_aux (L_num n1) ln1)) (ln1,Nothing)) e) (l,annot)))) + | V_unknown -> (Value V_unknown Tag_empty,lm,l_env) | _ -> (Error l "Update of vector requires number for access",lm,le) end) (fun a -> update_stack a (add_to_top_frame (fun i -> E_aux (E_vector_update vec i exp) (l,annot)))) | E_vector_update_subrange vec i1 i2 exp -> @@ -990,6 +1053,7 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = (fun vvec lm le -> match vvec with | V_vector m inc vals -> (Value (fupdate_vector_slice vvec v_rep n1 n2) Tag_empty,lm,le) + | V_unknown -> (Value V_unknown Tag_empty,lm,le) | _ -> (Error l "Vector update requires vector",lm,le) end) (fun a -> update_stack a (add_to_top_frame @@ -1000,9 +1064,11 @@ 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 -> E_aux (E_vector_update_subrange vec (to_exp vi1) (to_exp vi2) e) (l,annot)))) + | V_unknown -> (Value V_unknown Tag_empty,lm,l_env) | _ -> (Error l "vector update requires number",lm,le) end) (fun a -> update_stack a (add_to_top_frame (fun i2 -> E_aux (E_vector_update_subrange vec (to_exp vi1) i2 exp) (l,annot)))) + | V_unknown -> (Value V_unknown Tag_empty,lm,le) | _ -> (Error l "vector update requires number",lm,le) end) (fun a -> update_stack a (add_to_top_frame (fun i1 -> E_aux (E_vector_update_subrange vec i1 i2 exp) (l,annot)))) | E_vector_append e1 e2 -> @@ -1014,9 +1080,11 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = (fun v2 lm le -> match v2 with | V_vector _ _ vals2 -> (Value (V_vector m inc (vals1++vals2)) Tag_empty,lm,l_env) + | V_unknown -> (Value V_unknown Tag_empty,lm,l_env) | _ -> (Error l "vector concat requires vector",lm,le) end) (fun a -> update_stack a (add_to_top_frame (fun e -> E_aux (E_vector_append (to_exp v1) e) (l,annot))))) + | V_unknown -> (Value V_unknown Tag_empty,lm,l_env) | _ -> (Error l "vector concat requires vector",lm,le) end) (fun a -> update_stack a (add_to_top_frame (fun e -> E_aux (E_vector_append e e2) (l,annot)))) | E_tuple(exps) -> @@ -1038,20 +1106,37 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = | (Value v tag_e,lm,le) -> let name = get_id f in (match tag with - | Tag_empty -> + | Tag_global -> + (match find_function defs f with + | Just(funcls) -> + (match find_funcl funcls v with + | [] -> + (Error l (String.stringAppend "No matching pattern for function " name ),l_mem,l_env) + | [(env,used_unknown,exp)] -> + resolve_outcome (if mode.eager_eval + then (interp_main mode t_level env emem exp) + else (debug_out exp t_level emem env)) + (fun ret lm le -> (Value ret Tag_empty, l_mem,l_env)) + (fun a -> update_stack a + (fun stack -> (Hole_frame (id_of_string "0") + (E_aux (E_id (Id_aux (Id "0") l)) (l,(intern_annot annot))) + t_level l_env l_mem stack))) + end) + | Nothing -> (Error l (String.stringAppend "Internal error: function with empty tag unfound " name),lm,le) end) + | Tag_empty -> (match find_function defs f with | Just(funcls) -> (match find_funcl funcls v with - | Nothing -> + | [] -> (Error l (String.stringAppend "No matching pattern for function " name ),l_mem,l_env) - | Just(env,exp) -> + | [(env,used_unknown,exp)] -> resolve_outcome (if mode.eager_eval then (interp_main mode t_level env emem exp) else (debug_out exp t_level emem env)) (fun ret lm le -> (Value ret Tag_empty, l_mem,l_env)) (fun a -> update_stack a (fun stack -> (Hole_frame (id_of_string "0") - (E_aux (E_id (Id_aux (Id "0") l)) (l,annot)) + (E_aux (E_id (Id_aux (Id "0") l)) (l,(intern_annot annot))) t_level l_env l_mem stack))) end) | Nothing -> (Error l (String.stringAppend "Internal error: function with empty tag unfound " name),lm,le) end) @@ -1059,15 +1144,15 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = (match find_function defs f with | Just(funcls) -> (match find_funcl funcls v with - | Nothing -> + | [] -> (Error l (String.stringAppend "No matching pattern for function " name ),l_mem,l_env) - | Just(env,exp) -> + | [(env,used_unknown,exp)] -> resolve_outcome (if mode.eager_eval then (interp_main mode t_level env emem exp) else (debug_out exp t_level emem env)) (fun ret lm le -> (Value ret Tag_empty, l_mem,l_env)) (fun a -> update_stack a - (fun stack -> (Hole_frame (id_of_string "0") (E_aux (E_id (Id_aux (Id "0") l)) (l,annot)) t_level l_env l_mem stack))) + (fun stack -> (Hole_frame (id_of_string "0") (E_aux (E_id (Id_aux (Id "0") l)) (l,(intern_annot annot))) t_level l_env l_mem stack))) end) | Nothing -> (Error l (String.stringAppend "Specified function must be defined before executing " name),lm,le) end) | Tag_ctor -> @@ -1097,13 +1182,28 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = resolve_outcome (interp_main mode t_level l_env lm r) (fun rv lm le -> match tag with - | Tag_empty -> + | Tag_global -> + (match find_function defs op with + | Nothing -> (Error l (String.stringAppend "Internal error, no function def for " name),lm,le) + | Just (funcls) -> + (match find_funcl funcls (V_tuple [lv;rv]) with + | [] -> (Error l (String.stringAppend "No matching pattern for function " name),lm,l_env) + | [(env,used_unknown,exp)] -> + resolve_outcome (if mode.eager_eval + then (interp_main mode t_level env emem exp) + else (debug_out exp t_level emem env)) + (fun ret lm le -> (Value ret Tag_empty,l_mem,l_env)) + (fun a -> update_stack a + (fun stack -> (Hole_frame (Id_aux (Id "0") l) + (E_aux (E_id (Id_aux (Id "0") l)) (l,(intern_annot annot))) t_level l_env l_mem stack))) + end)end) + | Tag_empty -> (match find_function defs op with | Nothing -> (Error l (String.stringAppend "Internal error, no function def for " name),lm,le) | Just (funcls) -> (match find_funcl funcls (V_tuple [lv;rv]) with - | Nothing -> (Error l (String.stringAppend "No matching pattern for function " name),lm,l_env) - | Just(env,exp) -> + | [] -> (Error l (String.stringAppend "No matching pattern for function " name),lm,l_env) + | [(env,used_unknown,exp)] -> resolve_outcome (if mode.eager_eval then (interp_main mode t_level env emem exp) else (debug_out exp t_level emem env)) @@ -1117,15 +1217,15 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = | Nothing -> (Error l (String.stringAppend "No function definition found for " name),lm,le) | Just (funcls) -> (match find_funcl funcls (V_tuple [lv;rv]) with - | Nothing -> (Error l (String.stringAppend "No matching pattern for function " name),lm,l_env) - | Just(env,exp) -> + | [] -> (Error l (String.stringAppend "No matching pattern for function " name),lm,l_env) + | [(env,used_unknown,exp)] -> resolve_outcome (if mode.eager_eval then (interp_main mode t_level env emem exp) else (debug_out exp t_level emem env)) (fun ret lm le -> (Value ret Tag_empty,l_mem,l_env)) (fun a -> update_stack a (fun stack -> (Hole_frame (Id_aux (Id "0") l) - (E_aux (E_id (Id_aux (Id "0") l)) (l,annot)) t_level l_env l_mem stack))) + (E_aux (E_id (Id_aux (Id "0") l)) (l,(intern_annot annot))) t_level l_env l_mem stack))) end)end) | Tag_extern ext_name -> let ext_name = match ext_name with Just s -> s | Nothing -> name end in @@ -1197,19 +1297,20 @@ and create_write_message_or_update mode t_level value l_env l_mem is_top_level ( | Just v -> if is_top_level then ((Error l "Writes must be to reg values",l_mem,l_env),Nothing) else ((Value v Tag_empty,l_mem,l_env),Just (fun e -> LEXP_aux(LEXP_id id) (l,annot))) - | Nothing -> - (match in_env lets id with - | Just v -> - if is_top_level then ((Error l "Writes must be to reg or registers",l_mem,l_env),Nothing) - else ((Value v Tag_empty,l_mem,l_env),Just (fun e -> LEXP_aux(LEXP_id id) (l,annot))) - | Nothing -> - if is_top_level then begin - let (LMem c m) = l_mem in - let l_mem = (LMem (c+1) m) in - ((Value (V_lit (L_aux L_unit l)) Tag_empty, update_mem l_mem c value, (id,(V_boxref c typ))::l_env),Nothing) - end - else ((Error l (String.stringAppend "Undefined id " (get_id id)),l_mem,l_env),Nothing) end) - end + | Nothing -> + if is_top_level then + let (LMem c m) = l_mem in + let l_mem = (LMem (c+1) m) in + ((Value (V_lit (L_aux L_unit l)) Tag_empty, update_mem l_mem c value, (id,(V_boxref c typ))::l_env),Nothing) + else ((Error l (String.stringAppend "Undefined id1 " (get_id id)),l_mem,l_env),Nothing) + end + | Tag_global -> + (match in_env lets id with + | Just v -> + if is_top_level then ((Error l "Writes must be to reg or registers",l_mem,l_env),Nothing) + else ((Value v Tag_empty,l_mem,l_env),Just (fun e -> LEXP_aux(LEXP_id id) (l,annot))) + | Nothing -> ((Error l (String.stringAppend "Undefined id " (get_id id)),l_mem,l_env),Nothing) + end) | Tag_extern _ -> let regf = Reg id annot in let request = (Action (Write_reg regf Nothing value) diff --git a/src/lem_interp/interp_lib.lem b/src/lem_interp/interp_lib.lem index 5289be88..7d77224b 100644 --- a/src/lem_interp/interp_lib.lem +++ b/src/lem_interp/interp_lib.lem @@ -11,12 +11,19 @@ let ignore_sail x = V_lit (L_aux L_unit Unknown) ;; let compose f g x = f (V_tuple [g x]) ;; -let is_one (V_lit (L_aux b lb)) = V_lit (L_aux (if b = L_one then L_true else L_false) lb) ;; +let is_one v = match v with + | V_lit (L_aux b lb) -> V_lit (L_aux (if b = L_one then L_true else L_false) lb) + | V_unknown -> V_unknown +end ;; -let lt_range (V_tuple[V_lit (L_aux (L_num l1) lr);V_lit (L_aux (L_num l2) ll);]) = - if l1 < l2 - then V_lit (L_aux L_one Unknown) - else V_lit (L_aux L_zero Unknown) +let lt_range (V_tuple[v1;v2]) = match (v1,v2) with + | (V_lit (L_aux (L_num l1) lr),V_lit (L_aux (L_num l2) ll)) -> + if l1 < l2 + then V_lit (L_aux L_one Unknown) + else V_lit (L_aux L_zero Unknown) + | (V_unknown,_) -> V_unknown + | (_,V_unknown) -> V_unknown +end ;; let bit_to_bool b = match b with V_lit (L_aux L_zero _) -> false @@ -84,6 +91,8 @@ let neg (V_tuple [V_lit (L_aux arg la)]) = V_lit (L_aux (match arg with let neq = compose neg eq ;; let arith_op op (V_tuple args) = match args with + | [V_unknown;_] -> V_unknown + | [_;V_unknown] -> V_unknown | [V_lit(L_aux (L_num x) lx); V_lit(L_aux (L_num y) ly)] -> V_lit(L_aux (L_num (op x y)) lx) end ;; let arith_op_vec op (V_tuple args) = match args with diff --git a/src/pretty_print.ml b/src/pretty_print.ml index 32f4218c..0f1f461f 100644 --- a/src/pretty_print.ml +++ b/src/pretty_print.ml @@ -242,7 +242,8 @@ and pp_format_o o = ^ " Unknown)" let pp_format_tag = function - | Emp_local | Emp_global -> "Tag_empty" + | Emp_local -> "Tag_empty" + | Emp_global -> "Tag_global" | External (Some s) -> "(Tag_extern (Just \""^s^"\"))" | External None -> "(Tag_extern Nothing)" | Default -> "Tag_default" diff --git a/src/type_check.ml b/src/type_check.ml index d198b525..1ef44a75 100644 --- a/src/type_check.ml +++ b/src/type_check.ml @@ -375,9 +375,9 @@ let rec check_exp envs expect_t (E_aux(e,(l,annot)) : tannot exp) : (tannot exp (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')]) -> - let tannot = Base(([],t),Emp_local,cs,ef) in - let t',cs',e' = type_coerce (Expr l) d_env false t' (rebuild tannot) expect_t' in - (e',t,t_env,cs@cs',ef) + let tannot = Base(([],t),Emp_global,cs,ef) in + let t',cs' = type_consistent (Expr l) d_env t' expect_t' in + (rebuild tannot,t,t_env,cs@cs',ef) | Tapp("register",[TA_typ(t')]),Tuvar _ -> let ef' = add_effect (BE_aux(BE_rreg,l)) ef in let tannot = Base(([],t),External (Some i),cs,ef') in @@ -1025,7 +1025,7 @@ and check_lexp envs is_top (LEXP_aux(lexp,(l,annot))) : (tannot lexp * typ * tan | Tapp("reg",[TA_typ u]),_ -> (LEXP_aux(lexp,(l,(Base(([],t),Emp_local,cs@cs',pure_e)))),u,Envmap.empty,Emp_local,[],pure_e) | Tapp("vector",_),false -> - (LEXP_aux(lexp,(l,(Base(([],t),Emp_local,cs@cs',pure_e)))),t,Envmap.empty,Emp_local,[],pure_e) + (LEXP_aux(lexp,(l,(Base(([],t),tag,cs@cs',pure_e)))),t,Envmap.empty,Emp_local,[],pure_e) | _,_ -> if is_top then typ_error l |
