diff options
| author | Kathy Gray | 2015-10-08 15:17:47 +0100 |
|---|---|---|
| committer | Kathy Gray | 2015-10-08 15:17:47 +0100 |
| commit | 8b0c5d3c15682ccada2c7087dc912e7487c81a08 (patch) | |
| tree | d807f88bdb75b11e3a1471392ea3f453bfa29a82 /src | |
| parent | 8c580a8b136a3abb188d2b24b81395fe06b8fee1 (diff) | |
augment annot of interpreter
Diffstat (limited to 'src')
| -rw-r--r-- | src/lem_interp/instruction_extractor.lem | 12 | ||||
| -rw-r--r-- | src/lem_interp/interp.lem | 77 | ||||
| -rw-r--r-- | src/lem_interp/interp_inter_imp.lem | 4 | ||||
| -rw-r--r-- | src/lem_interp/interp_utilities.lem | 3 |
4 files changed, 49 insertions, 47 deletions
diff --git a/src/lem_interp/instruction_extractor.lem b/src/lem_interp/instruction_extractor.lem index 3e4a0a40..73845fee 100644 --- a/src/lem_interp/instruction_extractor.lem +++ b/src/lem_interp/instruction_extractor.lem @@ -39,12 +39,12 @@ let extract_parm (E_aux e (_,tannot)) = match e with | E_id (Id_aux (Id i) _) -> match tannot with - | Just(t,tag,_,_) -> (i,(extract_ityp t tag)) + | Just(t,tag,_,_,_) -> (i,(extract_ityp t tag)) | _ -> (i,IOther) end | _ -> let i = "Unnamed" in match tannot with - | Just(t,tag,_,_) -> (i,(extract_ityp t tag)) + | Just(t,tag,_,_,_) -> (i,(extract_ityp t tag)) | _ -> (i,IOther) end end @@ -53,14 +53,14 @@ let rec extract_from_decode decoder = | [] -> [] | (FCL_aux (FCL_Funcl _ pat exp) _)::decoder -> (match exp with - | E_aux (E_app (Id_aux(Id id) _) parms) (_,(Just (_,Tag_ctor,_,_))) -> + | E_aux (E_app (Id_aux(Id id) _) parms) (_,(Just (_,Tag_ctor,_,_,_))) -> Instr_form id (List.map extract_parm parms) [] | _ -> Skipped end)::(extract_from_decode decoder) end let rec extract_effects_of_fcl id execute = match execute with | [] -> [] - | FCL_aux (FCL_Funcl _ (P_aux (P_app (Id_aux (Id i) _) _) _) _) (_,(Just(_,_,_,Effect_aux(Effect_set efs) _))) :: executes -> + | FCL_aux (FCL_Funcl _ (P_aux (P_app (Id_aux (Id i) _) _) _) _) (_,(Just(_,_,_,Effect_aux(Effect_set efs) _,_))) :: executes -> if i = id then efs else extract_effects_of_fcl id executes @@ -69,7 +69,7 @@ end let rec extract_patt_parm (P_aux p (_,tannot)) = let t = match tannot with - | Just(t,tag,_,_) -> extract_ityp t tag + | Just(t,tag,_,_,_) -> extract_ityp t tag | _ -> IOther end in match p with | P_lit lit -> ("",t) @@ -82,7 +82,7 @@ let rec extract_patt_parm (P_aux p (_,tannot)) = let rec extract_from_execute fcls = match fcls with | [] -> [] - | FCL_aux (FCL_Funcl _ (P_aux (P_app (Id_aux (Id i) _) parms) _) _) (_,Just(_,_,_,Effect_aux(Effect_set efs) _))::fcls -> + | FCL_aux (FCL_Funcl _ (P_aux (P_app (Id_aux (Id i) _) parms) _) _) (_,Just(_,_,_,Effect_aux(Effect_set efs) _,_))::fcls -> (Instr_form i (List.map extract_patt_parm parms) efs)::extract_from_execute fcls end diff --git a/src/lem_interp/interp.lem b/src/lem_interp/interp.lem index aa7edf37..dc522d5a 100644 --- a/src/lem_interp/interp.lem +++ b/src/lem_interp/interp.lem @@ -16,19 +16,19 @@ type tannot = Interp_utilities.tannot val intern_annot : tannot -> tannot let intern_annot annot = match annot with - | Just (t,_,ncs,effect) -> - Just (t,Tag_empty,ncs,pure) + | Just (t,_,ncs,effect,rec_effect) -> + Just (t,Tag_empty,ncs,pure,rec_effect) | Nothing -> Nothing end -let val_annot typ = Just(typ,Tag_empty,[],pure) +let val_annot typ = Just(typ,Tag_empty,[],pure,pure) -let ctor_annot typ = Just(typ,Tag_ctor,[],pure) +let ctor_annot typ = Just(typ,Tag_ctor,[],pure,pure) -let enum_annot typ max = Just(typ,Tag_enum max,[],pure) +let enum_annot typ max = Just(typ,Tag_enum max,[],pure,pure) let non_det_annot annot maybe_id = match annot with - | Just(t,_,cs,ef) -> Just(t,Tag_unknown maybe_id,cs,ef) + | Just(t,_,cs,ef,efr) -> Just(t,Tag_unknown maybe_id,cs,ef,efr) | _ -> Nothing end @@ -146,7 +146,7 @@ end let reg_start_pos reg = match reg with - | Reg _ (Just(typ,_,_,_)) _ -> + | Reg _ (Just(typ,_,_,_,_)) _ -> let start_from_vec targs = match targs with | T_args [T_arg_nexp (Ne_const s);_;_;_] -> natFromInteger s end in @@ -166,7 +166,7 @@ end let reg_size reg = match reg with - | Reg _ (Just(typ,_,_,_)) _ -> + | Reg _ (Just(typ,_,_,_,_)) _ -> let end_from_vec targs = match targs with | T_args [_;T_arg_nexp (Ne_const s);_;_] -> natFromInteger s end in @@ -297,7 +297,7 @@ let rec to_registers dd (Defs defs) = | DEF_reg_dec (DEC_aux (DEC_reg typ id) (l,tannot)) -> let dir = match tannot with | Nothing -> dd - | Just(t, _, _, _) -> dd (*TODO, lets pull the direction out properly*) + | Just(t, _, _, _,_) -> dd (*TODO, lets pull the direction out properly*) end in Map.insert (get_id id) (V_register(Reg id tannot dir)) (to_registers dd (Defs defs)) | DEF_reg_dec (DEC_aux (DEC_alias id aspec) (l,tannot)) -> @@ -840,7 +840,7 @@ let rec combine_typs ts = let reg_to_t r = match r with - | Reg _ (Just (t,_,_,_)) _ -> t + | Reg _ (Just (t,_,_,_,_)) _ -> t | _ -> T_var "fresh" end @@ -1004,7 +1004,7 @@ val match_pattern : top_level -> pat tannot -> value -> bool * bool * lenv let rec match_pattern t_level (P_aux p (_, annot)) value_whole = let (Env fdefs instrs default_dir lets regs ctors subregs aliases) = t_level in let (t,tag,cs) = match annot with - | Just(t,tag,cs,e) -> (t,tag,cs) + | Just(t,tag,cs,e,_) -> (t,tag,cs) | Nothing -> (T_var "fresh",Tag_empty,[]) end in let value = detaint value_whole in let taint_pat v = binary_taint (fun v _ -> v) v value_whole in @@ -1192,10 +1192,10 @@ let rec match_pattern t_level (P_aux p (_, annot)) value_whole = and vec_concat_match_top t_level pats r_vals dir : ((*matched_p*) bool * (*used_unknown*) bool * lenv * (list value)) = match pats with | [] -> (true,false,eenv,r_vals) - | [(P_aux p (l,Just(t,_,_,_)))] -> + | [(P_aux p (l,Just(t,_,_,_,_)))] -> let (matched_p,used_unknown,bounds,_,r_vals) = vec_concat_match_plev t_level p r_vals dir l true t in (matched_p,used_unknown,bounds,r_vals) - | (P_aux p (l,Just(t,_,_,_)))::pats -> + | (P_aux p (l,Just(t,_,_,_,_)))::pats -> let (matched_p,used_unknown,bounds,matcheds,r_vals) = vec_concat_match_plev t_level p r_vals dir l false t in if matched_p then let (matched_p',used_unknown',bounds',r_vals) = vec_concat_match_top t_level pats r_vals dir in @@ -1246,14 +1246,15 @@ and vec_concat_match_plev t_level pat r_vals dir l last_pat t = then (true,false,eenv,r_vals,[]) else (false,false,eenv,[],[]) end) - | P_as (P_aux pat (l',Just(t',_,_,_))) id -> - let (matched_p, used_unknown, bounds,matcheds,r_vals) = vec_concat_match_plev t_level pat r_vals dir l last_pat t' in + | P_as (P_aux pat (l',Just(t',_,_,_,_))) id -> + let (matched_p, used_unknown, bounds,matcheds,r_vals) = + vec_concat_match_plev t_level pat r_vals dir l last_pat t' in if matched_p then (matched_p, used_unknown, (add_to_env (id,V_vector (if is_inc(dir) then 0 else (List.length matcheds)) dir matcheds) bounds), matcheds,r_vals) else (false,false,eenv,[],[]) - | P_typ _ (P_aux p (l',Just(t',_,_,_))) -> vec_concat_match_plev t_level p r_vals dir l last_pat t + | P_typ _ (P_aux p (l',Just(t',_,_,_,_))) -> vec_concat_match_plev t_level p r_vals dir l last_pat t | _ -> (false,false,eenv,[],[]) end (*TODO Need to support indexed here, skipping intermediate numbers but consumming r_vals, and as *) @@ -1337,9 +1338,9 @@ let rec exp_list mode t_level build_e build_v l_env l_mem vals exps = and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = let (Env fdefs instrs default_dir lets regs ctors subregs aliases) = t_level in - let (typ,tag,ncs,effect) = match annot with - | Nothing -> (T_var "fresh_v", Tag_empty, [], (Effect_aux (Effect_set []) Unknown)) - | Just(t, tag, ncs, ef) -> (t,tag,ncs,ef) end in + let (typ,tag,ncs,effect,reffect) = match annot with + | Nothing -> (T_var "fresh_v", Tag_empty,[],(Effect_aux (Effect_set []) Unknown),(Effect_aux (Effect_set []) Unknown)) + | Just(t, tag, ncs, ef,efr) -> (t,tag,ncs,ef,efr) end in match exp with | E_lit lit -> if is_lit_vector lit @@ -1589,8 +1590,8 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = | Nothing -> (Error l "Internal_error: Field not found in record",lm,le) end) | V_register ((Reg _ annot _) as reg_form) -> let id' = match annot with - | Just((T_id id'),_,_,_) -> id' - | Just((T_abbrev (T_id id') _),_,_,_) -> id' + | Just((T_id id'),_,_,_,_) -> id' + | Just((T_abbrev (T_id id') _),_,_,_,_) -> id' end in (match in_env subregs id' with | Just(indexes) -> @@ -1608,8 +1609,8 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = ^ (string_of_value value_whole)),lm,le) end) (fun a -> match (exp,a) with - | (E_aux _ (l,Just(_,Tag_extern _,_,_)), - (Action (Read_reg ((Reg _ (Just((T_id id'),_,_,_)) _) as regf) Nothing) s)) -> + | (E_aux _ (l,Just(_,Tag_extern _,_,_,_)), + (Action (Read_reg ((Reg _ (Just((T_id id'),_,_,_,_)) _) as regf) Nothing) s)) -> match in_env subregs id' with | Just(indexes) -> (match in_env indexes (get_id id) with @@ -1618,8 +1619,8 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = | _ -> Error l "Internal error, unrecognized read, no id" end) | Nothing -> Error l "Internal error, unrecognized read, no reg" end - | (E_aux _ (l,Just(_,Tag_extern _,_,_)), - (Action (Read_reg ((Reg _ (Just((T_abbrev (T_id id') _),_,_,_)) _) as regf) Nothing) s))-> + | (E_aux _ (l,Just(_,Tag_extern _,_,_,_)), + (Action (Read_reg ((Reg _ (Just((T_abbrev (T_id id') _),_,_,_,_)) _) as regf) Nothing) s))-> match in_env subregs id' with | Just(indexes) -> match in_env indexes (get_id id) with @@ -1653,7 +1654,7 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = match a with | Action (Read_reg reg Nothing) stack -> (match vec with - | (E_aux _ (l,Just(_,Tag_extern _,_,_))) -> Action (Read_reg reg (Just(n,n))) stack + | (E_aux _ (l,Just(_,Tag_extern _,_,_,_))) -> Action (Read_reg reg (Just(n,n))) stack | _ -> Action (Read_reg reg Nothing) (add_to_top_frame (fun v env -> @@ -1661,7 +1662,7 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = (E_aux (E_vector_access v iv_e) (l,annot),env)) stack) end) | Action (Read_reg reg (Just (o,p))) stack -> (match vec with - | (E_aux _ (l,Just(_,Tag_extern _,_,_))) -> Action (Read_reg reg (Just(n,n))) stack + | (E_aux _ (l,Just(_,Tag_extern _,_,_,_))) -> Action (Read_reg reg (Just(n,n))) stack | _ -> Action (Read_reg reg (Just (o,p))) (add_to_top_frame (fun v env -> @@ -1716,12 +1717,12 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = match a with | Action (Read_reg reg Nothing) stack -> match vec with - | (E_aux _ (l,Just(_,Tag_extern _,_,_))) -> + | (E_aux _ (l,Just(_,Tag_extern _,_,_,_))) -> Action (Read_reg reg (Just((natFromInteger (get_num i1v)),(natFromInteger (get_num i2v))))) stack | _ -> Action (Read_reg reg Nothing) (add_to_top_frame rebuild stack) end | Action (Read_reg reg (Just (o,p))) stack -> match vec with - | (E_aux _ (l,Just(_,Tag_extern _,_,_))) -> + | (E_aux _ (l,Just(_,Tag_extern _,_,_,_))) -> Action (Read_reg reg (Just((natFromInteger (get_num i1v)),(natFromInteger (get_num i2v))))) stack | _ -> Action (Read_reg reg (Just (o,p))) (add_to_top_frame rebuild stack) end | _ -> update_stack a (add_to_top_frame rebuild) end) @@ -2143,9 +2144,9 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) = 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 fdefs instrs default_dir lets regs ctors subregs aliases) = t_level in - let (typ,tag,ncs,ef) = match annot with - | Nothing -> (T_var "fresh_v", Tag_empty, [], (Effect_aux (Effect_set []) Unknown)) - | Just(t, tag, ncs, ef) -> (t,tag,ncs,ef) end in + let (typ,tag,ncs,ef,efr) = match annot with + | Nothing -> (T_var "fresh_v", Tag_empty, [],(Effect_aux (Effect_set []) Unknown),(Effect_aux (Effect_set []) Unknown)) + | Just(t, tag, ncs, ef,efr) -> (t,tag,ncs,ef,efr) end in let recenter_val typ value = match typ with | T_app "reg" (T_args [T_arg_typ (T_app "vector" (T_args [T_arg_nexp (Ne_const start); T_arg_nexp (Ne_const size); _; _ ]))]) -> @@ -2211,7 +2212,7 @@ and create_write_message_or_update mode t_level value l_env l_mem is_top_level ( (match in_env aliases name with | Just (AL_aux aspec (l,_)) -> (match aspec with - | AL_subreg (RI_aux (RI_id reg) (li, ((Just((T_id id),_,_,_)) as annot'))) subreg -> + | AL_subreg (RI_aux (RI_id reg) (li, ((Just((T_id id),_,_,_,_)) as annot'))) subreg -> (match in_env subregs id with | Just indexes -> (match in_env indexes (get_id subreg) with @@ -2224,7 +2225,7 @@ and create_write_message_or_update mode t_level value l_env l_mem is_top_level ( | _ -> (Error l "Internal error, alias spec has unknown field", l_mem, l_env) end) | _ -> (Error l ("Internal error: alias spec has unknown register type " ^ id), l_mem, l_env) end) - | AL_subreg (RI_aux (RI_id reg) (li, ((Just((T_abbrev (T_id id) _),_,_,_)) as annot'))) subreg -> + | AL_subreg (RI_aux (RI_id reg) (li, ((Just((T_abbrev (T_id id) _),_,_,_,_)) as annot'))) subreg -> (match in_env subregs id with | Just indexes -> (match in_env indexes (get_id subreg) with @@ -2269,7 +2270,7 @@ and create_write_message_or_update mode t_level value l_env l_mem is_top_level ( | T_app "register" (T_args [T_arg_typ t]) -> t | T_abbrev _ (T_app "register" (T_args [T_arg_typ t])) -> t end in let (t1,t2) = match (annot1,annot2) with - | (Just (t1,_,_,_), (_,(Just (t2,_,_,_)))) -> (val_typ t1,val_typ t2) end in + | (Just (t1,_,_,_,_), (_,(Just (t2,_,_,_,_)))) -> (val_typ t1,val_typ t2) end in (match (t1,t2) with | (T_app "vector" (T_args [T_arg_nexp (Ne_const b1); T_arg_nexp (Ne_const r1); _;_]), T_app "vector" (T_args [T_arg_nexp (Ne_const b2); T_arg_nexp (Ne_const r2); _;_])) -> @@ -2608,7 +2609,7 @@ and create_write_message_or_update mode t_level value l_env l_mem is_top_level ( | Read_reg _ _ -> ((Action a s,lm,le), next_builder) | Read_mem _ _ _ -> ((Action a s,lm,le), next_builder) | Call_extern _ _ -> ((Action a s,lm,le), next_builder) - | Write_reg ((Reg _ (Just(T_id id',_,_,_)) _) as regf) Nothing value -> + | Write_reg ((Reg _ (Just(T_id id',_,_,_,_)) _) as regf) Nothing value -> match in_env subregs id' with | Just(indexes) -> match in_env indexes (get_id id) with @@ -2621,7 +2622,7 @@ and create_write_message_or_update mode t_level value l_env l_mem is_top_level ( | _ -> ((Error l "Internal error, unrecognized write, no field",lm,le),Nothing) end | Nothing -> ((Error l "Internal error, unrecognized write, no subreges",lm,le),Nothing) end - | Write_reg ((Reg _ (Just((T_abbrev(T_id id') _),_,_,_)) _) as regf) Nothing value -> + | Write_reg ((Reg _ (Just((T_abbrev(T_id id') _),_,_,_,_)) _) as regf) Nothing value -> match in_env subregs id' with | Just(indexes) -> match in_env indexes (get_id id) with @@ -2668,7 +2669,7 @@ and interp_alias_read mode t_level l_env l_mem (AL_aux alspec (l,annot)) = | T_abbrev (T_id i) _ -> i end in match alspec with - | AL_subreg (RI_aux (RI_id reg) (li,((Just (t,_,_,_)) as annot'))) subreg -> + | AL_subreg (RI_aux (RI_id reg) (li,((Just (t,_,_,_,_)) as annot'))) subreg -> let reg_ti = get_reg_typ_name t in (match in_env subregs reg_ti with | Just indexes -> diff --git a/src/lem_interp/interp_inter_imp.lem b/src/lem_interp/interp_inter_imp.lem index 88ce56e4..0f7d71c7 100644 --- a/src/lem_interp/interp_inter_imp.lem +++ b/src/lem_interp/interp_inter_imp.lem @@ -134,9 +134,9 @@ let extern_slice (d:direction) (start:nat) ((i,j):(nat*nat)) = end let extern_reg r slice = match (r,slice) with - | (Interp.Reg (Id_aux (Id x) _) (Just(t,_,_,_)) dir,Nothing) -> + | (Interp.Reg (Id_aux (Id x) _) (Just(t,_,_,_,_)) dir,Nothing) -> Reg x (Interp.reg_start_pos r) (Interp.reg_size r) (extern_direction dir) - | (Interp.Reg (Id_aux (Id x) _) (Just(t,_,_,_)) dir,Just(i1,i2)) -> + | (Interp.Reg (Id_aux (Id x) _) (Just(t,_,_,_,_)) dir,Just(i1,i2)) -> let start = Interp.reg_start_pos r in let edir = extern_direction dir in Reg_slice x start edir (extern_slice edir start (i1, i2)) diff --git a/src/lem_interp/interp_utilities.lem b/src/lem_interp/interp_utilities.lem index d2a6b784..63287a2e 100644 --- a/src/lem_interp/interp_utilities.lem +++ b/src/lem_interp/interp_utilities.lem @@ -10,7 +10,8 @@ let rec power (a: integer) (b: integer) : integer = let foldr2 f x l l' = List.foldr (Tuple.uncurry f) x (List.zip l l') let map2 f l l' = List.map (Tuple.uncurry f) (List.zip l l') -type tannot = maybe (t * tag * list nec * effect) +(*As in the type system, the first effect is local to the expression and the second is cummulative*) +type tannot = maybe (t * tag * list nec * effect * effect) let get_exp_l (E_aux e (l,annot)) = l |
