summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gen_lib/prompt.lem13
-rw-r--r--src/gen_lib/prompt_monad.lem6
-rw-r--r--src/gen_lib/sail_values.lem1
-rw-r--r--src/gen_lib/state.lem1
-rw-r--r--src/gen_lib/state_monad.lem19
5 files changed, 36 insertions, 4 deletions
diff --git a/src/gen_lib/prompt.lem b/src/gen_lib/prompt.lem
index 9642c714..1d8623df 100644
--- a/src/gen_lib/prompt.lem
+++ b/src/gen_lib/prompt.lem
@@ -30,6 +30,19 @@ end
declare {isabelle} termination_argument foreachM = automatic
+val bool_of_bitU_undef : forall 'rv 'e. bitU -> monad 'rv bool 'e
+let bool_of_bitU_undef = function
+ | B0 -> return false
+ | B1 -> return true
+ | BU -> undefined_bool ()
+end
+
+val bools_of_bitUs : forall 'rv 'e. list bitU -> monad 'rv (list bool) 'e
+let bools_of_bitUs bits =
+ foreachM bits []
+ (fun b bools ->
+ bool_of_bitU_undef b >>= (fun b ->
+ return (bools ++ [b])))
val whileM : forall 'rv 'vars 'e. 'vars -> ('vars -> monad 'rv bool 'e) ->
('vars -> monad 'rv 'vars 'e) -> monad 'rv 'vars 'e
diff --git a/src/gen_lib/prompt_monad.lem b/src/gen_lib/prompt_monad.lem
index 0966f911..b4b8436f 100644
--- a/src/gen_lib/prompt_monad.lem
+++ b/src/gen_lib/prompt_monad.lem
@@ -29,6 +29,7 @@ type monad 'regval 'a 'e =
| Read_reg of register_name * ('regval -> monad 'regval 'a 'e)
(* Request to write register *)
| Write_reg of register_name * 'regval * monad 'regval 'a 'e
+ | Undefined of (bool -> monad 'regval 'a 'e)
(*Result of a failed assert with possible error message to report*)
| Fail of string
| Error of string
@@ -48,6 +49,7 @@ let rec bind m f = match m with
| Write_tagv t k -> Write_tagv t (fun v -> bind (k v) f)
| Read_reg descr k -> Read_reg descr (fun v -> bind (k v) f)
| Excl_res k -> Excl_res (fun v -> bind (k v) f)
+ | Undefined k -> Undefined (fun v -> bind (k v) f)
| Write_ea wk a sz k -> Write_ea wk a sz (bind k f)
| Footprint k -> Footprint (bind k f)
| Barrier bk k -> Barrier bk (bind k f)
@@ -64,6 +66,9 @@ let inline (>>) m n = m >>= fun (_ : unit) -> n
val exit : forall 'rv 'a 'e. unit -> monad 'rv 'a 'e
let exit () = Fail "exit"
+val undefined_bool : forall 'rv 'e. unit -> monad 'rv bool 'e
+let undefined_bool () = Undefined return
+
val assert_exp : forall 'rv 'e. bool -> string -> monad 'rv unit 'e
let assert_exp exp msg = if exp then Done () else Fail msg
@@ -79,6 +84,7 @@ let rec try_catch m h = match m with
| Write_tagv t k -> Write_tagv t (fun v -> try_catch (k v) h)
| Read_reg descr k -> Read_reg descr (fun v -> try_catch (k v) h)
| Excl_res k -> Excl_res (fun v -> try_catch (k v) h)
+ | Undefined k -> Undefined (fun v -> try_catch (k v) h)
| Write_ea wk a sz k -> Write_ea wk a sz (try_catch k h)
| Footprint k -> Footprint (try_catch k h)
| Barrier bk k -> Barrier bk (try_catch k h)
diff --git a/src/gen_lib/sail_values.lem b/src/gen_lib/sail_values.lem
index fce595e0..edb8da88 100644
--- a/src/gen_lib/sail_values.lem
+++ b/src/gen_lib/sail_values.lem
@@ -622,6 +622,7 @@ type register_ref 'regstate 'regval 'a =
of_regval : 'regval -> maybe 'a;
regval_of : 'a -> 'regval |>
+(* Register accessors: pair of functions for reading and writing register values *)
type register_accessors 'regstate 'regval =
((string -> 'regstate -> maybe 'regval) *
(string -> 'regval -> 'regstate -> maybe 'regstate))
diff --git a/src/gen_lib/state.lem b/src/gen_lib/state.lem
index 1366e605..85fa15e8 100644
--- a/src/gen_lib/state.lem
+++ b/src/gen_lib/state.lem
@@ -17,6 +17,7 @@ let rec liftState ra s = match s with
| (Write_tagv t k) -> bindS (write_tagS t) (fun v -> liftState ra (k v))
| (Read_reg r k) -> bindS (read_regvalS ra r) (fun v -> liftState ra (k v))
| (Excl_res k) -> bindS (excl_resultS ()) (fun v -> liftState ra (k v))
+ | (Undefined k) -> bindS (undefined_boolS ()) (fun v -> liftState ra (k v))
| (Write_ea wk a sz k) -> seqS (write_mem_eaS wk a sz) (liftState ra k)
| (Write_reg r v k) -> seqS (write_regvalS ra r v) (liftState ra k)
| (Footprint k) -> liftState ra k
diff --git a/src/gen_lib/state_monad.lem b/src/gen_lib/state_monad.lem
index 8ff39d62..26179244 100644
--- a/src/gen_lib/state_monad.lem
+++ b/src/gen_lib/state_monad.lem
@@ -13,15 +13,20 @@ type sequential_state 'regs =
memstate : memstate;
tagstate : tagstate;
write_ea : maybe (write_kind * integer * integer);
- last_exclusive_operation_was_load : bool|>
+ last_exclusive_operation_was_load : bool;
+ (* Random bool generator for use as an undefined bit oracle *)
+ next_bool : nat -> (bool * nat);
+ seed : nat |>
-val init_state : forall 'regs. 'regs -> sequential_state 'regs
-let init_state regs =
+val init_state : forall 'regs. 'regs -> (nat -> (bool* nat)) -> nat -> sequential_state 'regs
+let init_state regs o s =
<| regstate = regs;
memstate = Map.empty;
tagstate = Map.empty;
write_ea = Nothing;
- last_exclusive_operation_was_load = false |>
+ last_exclusive_operation_was_load = false;
+ next_bool = o;
+ seed = s |>
type ex 'e =
| Failure of string
@@ -63,6 +68,12 @@ let updateS f = (fun s -> returnS () (f s))
val failS : forall 'regs 'a 'e. string -> monadS 'regs 'a 'e
let failS msg s = [(Ex (Failure msg), s)]
+val undefined_boolS : forall 'regval 'regs 'a 'e. unit -> monadS 'regs bool 'e
+let undefined_boolS () =
+ readS (fun s -> s.next_bool (s.seed)) >>$= (fun (b, seed) ->
+ updateS (fun s -> <| s with seed = seed |>) >>$
+ returnS b)
+
val exitS : forall 'regs 'e 'a. unit -> monadS 'regs 'a 'e
let exitS () = failS "exit"