summaryrefslogtreecommitdiff
path: root/src/lem_interp/0.11/interp_utilities.lem
diff options
context:
space:
mode:
Diffstat (limited to 'src/lem_interp/0.11/interp_utilities.lem')
-rw-r--r--src/lem_interp/0.11/interp_utilities.lem212
1 files changed, 212 insertions, 0 deletions
diff --git a/src/lem_interp/0.11/interp_utilities.lem b/src/lem_interp/0.11/interp_utilities.lem
new file mode 100644
index 00000000..1e6c59ff
--- /dev/null
+++ b/src/lem_interp/0.11/interp_utilities.lem
@@ -0,0 +1,212 @@
+(*========================================================================*)
+(* Sail *)
+(* *)
+(* Copyright (c) 2013-2017 *)
+(* Kathyrn Gray *)
+(* Shaked Flur *)
+(* Stephen Kell *)
+(* Gabriel Kerneis *)
+(* Robert Norton-Wright *)
+(* Christopher Pulte *)
+(* Peter Sewell *)
+(* Alasdair Armstrong *)
+(* Brian Campbell *)
+(* Thomas Bauereiss *)
+(* Anthony Fox *)
+(* Jon French *)
+(* Dominic Mulligan *)
+(* Stephen Kell *)
+(* Mark Wassell *)
+(* *)
+(* All rights reserved. *)
+(* *)
+(* This software was developed by the University of Cambridge Computer *)
+(* Laboratory as part of the Rigorous Engineering of Mainstream Systems *)
+(* (REMS) project, funded by EPSRC grant EP/K008528/1. *)
+(* *)
+(* Redistribution and use in source and binary forms, with or without *)
+(* modification, are permitted provided that the following conditions *)
+(* are met: *)
+(* 1. Redistributions of source code must retain the above copyright *)
+(* notice, this list of conditions and the following disclaimer. *)
+(* 2. Redistributions in binary form must reproduce the above copyright *)
+(* notice, this list of conditions and the following disclaimer in *)
+(* the documentation and/or other materials provided with the *)
+(* distribution. *)
+(* *)
+(* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' *)
+(* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *)
+(* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *)
+(* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR *)
+(* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, *)
+(* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT *)
+(* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF *)
+(* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND *)
+(* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, *)
+(* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT *)
+(* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF *)
+(* SUCH DAMAGE. *)
+(*========================================================================*)
+
+open import Interp_ast
+open import Pervasives
+open import Show_extra
+
+let rec power (a: integer) (b: integer) : integer =
+ if b <= 0
+ then 1
+ else a * (power a (b-1))
+
+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')
+
+let get_exp_l (E_aux e (l,annot)) = l
+
+val pure : effect
+let pure = Effect_aux(Effect_set []) Unknown
+let unit_t = Typ_aux(Typ_app (Id_aux (Id "unit") Unknown) []) Unknown
+
+let mk_typ_app str args = Typ_aux (Typ_app (Id_aux (Id str) Unknown) (List.map (fun aux -> Typ_arg_aux aux Unknown) args)) Unknown
+let mk_typ_id str = Typ_aux (Typ_id (Id_aux (Id str) Unknown)) Unknown
+
+let mk_typ_var str = Typ_aux (Typ_var (Kid_aux (Var ("'" ^ str)) Unknown)) Unknown
+let mk_typ_tup typs = Typ_aux (Typ_tup typs) Unknown
+
+let nconstant n = Nexp_aux (Nexp_constant n) Unknown
+
+(* Workaround Lem's inability to scrap my (type classes) boilerplate.
+ * Implementing only Eq, and only for literals - hopefully this will
+ * be enough, but we should in principle implement ordering for everything in
+ * Interp_ast *)
+
+val lit_eq: lit -> lit -> bool
+let {ocaml;coq} lit_eq (L_aux left _) (L_aux right _) =
+ match (left, right) with
+ | (L_zero, L_zero) -> true
+ | (L_one, L_one) -> true
+ | (L_bin b, L_bin b') -> b = b'
+ | (L_hex h, L_hex h') -> h = h'
+ | (L_zero, L_num i) -> i = 0
+ | (L_num i,L_zero) -> i = 0
+ | (L_one, L_num i) -> i = 1
+ | (L_num i, L_one) -> i = 1
+ | (L_num n, L_num m) -> n = m
+ | (L_unit, L_unit) -> true
+ | (L_true, L_true) -> true
+ | (L_false, L_false) -> true
+ | (L_undef, L_undef) -> true
+ | (L_string s, L_string s') -> s = s'
+ | (_, _) -> false
+end
+let {isabelle;hol} lit_eq = unsafe_structural_equality
+
+let {ocaml;coq} lit_ineq n1 n2 = not (lit_eq n1 n2)
+let {isabelle;hol} lit_ineq = unsafe_structural_inequality
+
+instance (Eq lit)
+ let (=) = lit_eq
+ let (<>) = lit_ineq
+end
+
+let get_id id = match id with (Id_aux (Id s) _) -> s | (Id_aux (DeIid s) _ ) -> s end
+
+let rec {ocaml} list_to_string format sep lst = match lst with
+ | [] -> ""
+ | [last] -> format last
+ | one::rest -> (format one) ^ sep ^ (list_to_string format sep rest)
+end
+let ~{ocaml} list_to_string format sep list = ""
+
+val has_rmem_effect : list base_effect -> bool
+val has_rmemt_effect : list base_effect -> bool
+val has_barr_effect : list base_effect -> bool
+val has_wmem_effect : list base_effect -> bool
+val has_depend_effect : list base_effect -> bool
+let rec has_effect which efcts =
+ match efcts with
+ | [] -> false
+ | (BE_aux e _)::efcts ->
+ match (which,e) with
+ | (BE_rreg,BE_rreg) -> true
+ | (BE_wreg,BE_wreg) -> true
+ | (BE_rmem,BE_rmem) -> true
+ | (BE_rmemt,BE_rmemt) -> true
+ | (BE_wmem,BE_wmem) -> true
+ | (BE_wmv,BE_wmv) -> true
+ | (BE_wmvt,BE_wmvt) -> true
+ | (BE_eamem,BE_eamem) -> true
+ | (BE_exmem,BE_exmem) -> true
+ | (BE_barr,BE_barr) -> true
+ | (BE_undef,BE_undef) -> true
+ | (BE_unspec,BE_unspec) -> true
+ | (BE_nondet,BE_nondet) -> true
+ | (BE_depend,BE_depend) -> true
+ | _ -> has_effect which efcts
+ end
+ end
+let has_rmem_effect = has_effect BE_rmem
+let has_rmemt_effect = has_effect BE_rmemt
+let has_barr_effect = has_effect BE_barr
+let has_wmem_effect = has_effect BE_wmem
+let has_eamem_effect = has_effect BE_eamem
+let has_exmem_effect = has_effect BE_exmem
+let has_wmv_effect = has_effect BE_wmv
+let has_wmvt_effect = has_effect BE_wmvt
+let has_depend_effect = has_effect BE_depend
+
+let get_typ (TypSchm_aux (TypSchm_ts tq t) _) = t
+let get_effects (Typ_aux t _) =
+ match t with
+ | Typ_fn a r (Effect_aux (Effect_set eff) _) -> eff
+ | _ -> []
+ end
+
+let {ocaml} string_of_tag tag = match tag with
+ | Tag_empty -> "empty"
+ | Tag_global -> "global"
+ | Tag_ctor -> "ctor"
+ | Tag_extern (Just n) -> "extern " ^ n
+ | Tag_extern _ -> "extern"
+ | Tag_default -> "default"
+ | Tag_spec -> "spec"
+ | Tag_enum i -> "enum"
+ | Tag_alias -> "alias"
+end
+let ~{ocaml} string_of_tag tag = ""
+
+val find_type_def : defs tannot -> id -> maybe (type_def tannot)
+val find_function : defs tannot -> id -> maybe (list (funcl tannot))
+
+let get_funcls id (FD_aux (FD_function _ _ _ fcls) _) =
+ List.filter (fun (FCL_aux (FCL_Funcl name pexp) _) -> (get_id id) = (get_id name)) fcls
+
+let rec find_function (Defs defs) id =
+ match defs with
+ | [] -> Nothing
+ | def::defs ->
+ match def with
+ | DEF_fundef f -> match get_funcls id f with
+ | [] -> find_function (Defs defs) id
+ | funcs -> Just funcs end
+ | _ -> find_function (Defs defs) id
+ end end
+
+
+let rec get_first_index_range (BF_aux i _) = match i with
+ | BF_single i -> (natFromInteger i)
+ | BF_range i j -> (natFromInteger i)
+ | BF_concat s _ -> get_first_index_range s
+end
+
+let rec get_index_range_size (BF_aux i _) = match i with
+ | BF_single _ -> 1
+ | BF_range i j -> (natFromInteger (abs (i-j))) + 1
+ | BF_concat i j -> (get_index_range_size i) + (get_index_range_size j)
+end
+
+let rec string_of_loc l = match l with
+ | Unknown -> "Unknown"
+ | Int s Nothing -> "Internal " ^ s
+ | Int s (Just l) -> "Internal " ^ s ^ " " ^ (string_of_loc l)
+ | Range file n1 n2 n3 n4 -> "File " ^ file ^ ": " ^ (show n1) ^ ": " ^ (show (n2:nat)) ^ ": " ^ (show (n3:nat)) ^ ": " ^ (show (n4:nat))
+end