diff options
| author | Kathy Gray | 2016-01-20 13:47:07 +0000 |
|---|---|---|
| committer | Kathy Gray | 2016-01-20 13:51:44 +0000 |
| commit | 222fdc8a12a37fe2d44a0cdeb7a49279b2cf56d8 (patch) | |
| tree | e9274dedab1a317356ba886b9f2a7154bf0eaaf8 /src/lem_interp | |
| parent | b27fed4f2e3e5c8032d191dd860c1ea9724e647e (diff) | |
Assorted bug fixes that gets one mips instruction running (then fails for expected reasons) :)
Diffstat (limited to 'src/lem_interp')
| -rw-r--r-- | src/lem_interp/interp.lem | 90 | ||||
| -rw-r--r-- | src/lem_interp/interp_lib.lem | 6 | ||||
| -rw-r--r-- | src/lem_interp/run_interp_model.ml | 26 |
3 files changed, 116 insertions, 6 deletions
diff --git a/src/lem_interp/interp.lem b/src/lem_interp/interp.lem index f4c19362..1e30a0dc 100644 --- a/src/lem_interp/interp.lem +++ b/src/lem_interp/interp.lem @@ -2186,7 +2186,59 @@ and create_write_message_or_update mode t_level value l_env l_mem is_top_level ( | LEXP_id id -> let name = get_id id in match tag with - | Tag_empty -> + | Tag_intro -> + match detaint (in_lenv l_env id) with + | V_unknown -> + if is_top_level then + if name = "0" then + ((Value (V_lit (L_aux L_unit l)), update_mem true l_mem 0 value, l_env), Nothing) + else + let (LMem owner c m s) = l_mem in + let l_mem = (LMem owner (c+1) m s) in + ((Value (V_lit (L_aux L_unit l)), + update_mem mode.track_lmem l_mem c value, + (add_to_env (id,(V_boxref c typ)) l_env)),Nothing) + else ((Error l ("Unknown local id " ^ (get_id id)),l_mem,l_env),Nothing) + | v -> + if is_top_level + then + if name = "0" then + ((Value (V_lit (L_aux L_unit l)), update_mem true l_mem 0 value, l_env), Nothing) + else + ((Error l ("Writes must be to reg values given " ^ (string_of_value v)),l_mem,l_env), + Nothing) + else ((Value v,l_mem,l_env),Just (fun e env -> (LEXP_aux(LEXP_id id) (l,annot), env))) + end + | Tag_set -> + match detaint (in_lenv l_env id) with + | ((V_boxref n t) as v) -> + if is_top_level + then ((Value (V_lit (L_aux L_unit l)), + update_mem mode.track_lmem l_mem n (recenter_val t value), l_env),Nothing) + else ((Value v, l_mem, l_env),Just (fun e env -> (LEXP_aux (LEXP_id id) (l,annot), env))) + | V_unknown -> + if is_top_level then + if name = "0" then + ((Value (V_lit (L_aux L_unit l)), update_mem true l_mem 0 value, l_env), Nothing) + else + let (LMem owner c m s) = l_mem in + let l_mem = (LMem owner (c+1) m s) in + ((Value (V_lit (L_aux L_unit l)), + update_mem mode.track_lmem l_mem c value, + (add_to_env (id,(V_boxref c typ)) l_env)),Nothing) + else ((Error l ("Unknown local id " ^ (get_id id)),l_mem,l_env),Nothing) + | v -> + if is_top_level + then + if name = "0" then + ((Value (V_lit (L_aux L_unit l)), update_mem true l_mem 0 value, l_env), Nothing) + else + ((Error l ("Writes must be to reg values given " ^ (string_of_value v)),l_mem,l_env), + Nothing) + else ((Value v,l_mem,l_env),Just (fun e env -> (LEXP_aux(LEXP_id id) (l,annot), env))) + end + + | Tag_empty -> match detaint (in_lenv l_env id) with | ((V_boxref n t) as v) -> if is_top_level @@ -2406,6 +2458,42 @@ and create_write_message_or_update mode t_level value l_env l_mem is_top_level ( | LEXP_cast typc id -> let name = get_id id in match tag with + | Tag_intro -> + match detaint (in_lenv l_env id) with + | V_unknown -> + if is_top_level + then begin + let (LMem owner c m s) = l_mem in + let l_mem = (LMem owner (c+1) m s) in + ((Value (V_lit (L_aux L_unit l)), update_mem mode.track_lmem l_mem c value, + (add_to_env (id,(V_boxref c typ)) l_env)),Nothing) + end + else ((Error l ("Undefined id " ^ (get_id id)),l_mem,l_env),Nothing) + | v -> + if is_top_level then ((Error l "Writes must be to reg values",l_mem,l_env),Nothing) + else ((Value v,l_mem,l_env),Just (fun e env -> (LEXP_aux(LEXP_cast typc id) (l,annot), env))) + end + | Tag_set -> + match detaint (in_lenv l_env id) with + | ((V_boxref n t) as v) -> + if is_top_level + then ((Value (V_lit (L_aux L_unit l)), + update_mem mode.track_lmem l_mem n (recenter_val t value), l_env),Nothing) + else ((Value v, l_mem, l_env), + Just (fun e env -> (LEXP_aux (LEXP_cast typc id) (l,annot), env))) + | V_unknown -> + if is_top_level + then begin + let (LMem owner c m s) = l_mem in + let l_mem = (LMem owner (c+1) m s) in + ((Value (V_lit (L_aux L_unit l)), update_mem mode.track_lmem l_mem c value, + (add_to_env (id,(V_boxref c typ)) l_env)),Nothing) + end + else ((Error l ("Undefined id " ^ (get_id id)),l_mem,l_env),Nothing) + | v -> + if is_top_level then ((Error l "Writes must be to reg values",l_mem,l_env),Nothing) + else ((Value v,l_mem,l_env),Just (fun e env -> (LEXP_aux(LEXP_cast typc id) (l,annot), env))) + end | Tag_empty -> match detaint (in_lenv l_env id) with | ((V_boxref n t) as v) -> diff --git a/src/lem_interp/interp_lib.lem b/src/lem_interp/interp_lib.lem index c1267fc6..e49c38e2 100644 --- a/src/lem_interp/interp_lib.lem +++ b/src/lem_interp/interp_lib.lem @@ -235,7 +235,7 @@ let to_vec_inc (V_tuple[v1;v2]) = let to_vec_dec (V_tuple([v1;v2])) = let tv_fun v1 v2 = - match (v1,v2) with + match (v1,v2) with | (V_lit(L_aux (L_num len) _), (V_lit(L_aux (L_num n) ln))) -> let len = if len < 0 then 0 else natFromInteger len in let l = boolListFrombitSeq len (bitSeqFromInteger Nothing n) in @@ -705,8 +705,8 @@ let library_functions direction = [ ("EXTZ", extz direction); ("to_vec_inc", to_vec_inc); ("to_vec_inc_undef", to_vec_inc_undef); - ("to_vec_dec", to_vec_dec_undef); - ("to_vec_dec_undef", to_vec_dec); + ("to_vec_dec", to_vec_dec); + ("to_vec_dec_undef", to_vec_dec_undef); ("bitwise_not", bitwise_not); ("bitwise_not_bit", bitwise_not_bit); ("bitwise_and", bitwise_binop (&&) "&"); diff --git a/src/lem_interp/run_interp_model.ml b/src/lem_interp/run_interp_model.ml index d5ec53f7..8ec1b4df 100644 --- a/src/lem_interp/run_interp_model.ml +++ b/src/lem_interp/run_interp_model.ml @@ -222,7 +222,7 @@ let run mode in let (return,env') = perform_action env action in let (mode', env', next) = - match action with + (match action with | Read_reg0(reg,next_thunk) -> (match return with | Some(value) -> @@ -269,6 +269,9 @@ let run | Internal((Some fn),None,next) -> show "breakpoint" fn "" ""; (step ~force:true next, env',next) + | Internal(None,Some vdisp,next) -> + show "breakpoint" (vdisp ()) "" ""; + (step ~force:true next,env', next) | Internal((Some fn),(Some vdisp),next) -> show "breakpoint" (fn ^ " " ^ (vdisp ())) "" ""; (step ~force:true next, env', next) @@ -281,10 +284,29 @@ let run choose_order (false,mode,!track_dependencies,env'); in show "nondeterministic evaluation ended" "" "" ""; (step next,env',next) + | Analysis_non_det (possible_istates, i_state) -> + let choose_order = List.sort (fun (_,i1) (_,i2) -> Pervasives.compare i1 i2) + (List.combine possible_istates (List.map (fun _ -> Random.bits ()) possible_istates)) in + if possible_istates = [] + then (step i_state,env',i_state) + else begin + show "undefined triggered a non_det" "" "" ""; + let (_,_,_,env') = List.fold_right (fun (next,_) (_,_,_,env') -> + loop mode env' (interp0 (make_mode (mode=Run) !track_dependencies !default_endian) next)) + choose_order (false,mode,!track_dependencies,env'); in + (step i_state,env',i_state) end | Escape(Some e,_) -> show "exiting current evaluation" "" "" ""; step e,env', e - | _ -> assert false + | Escape _ -> assert false + | Error0 _ -> assert false + | Done -> + show "done evalution" "" "" ""; + assert false + | Footprint0 _ -> assert false + | Write_ea0 _ -> assert false + | Write_memv0 _ -> assert false) + (*| _ -> assert false*) in loop mode' env' (Interp_inter_imp.interp0 (make_mode (mode' = Run) !track_dependencies !default_endian) next) in let mode = match mode with |
