blob: 383ae4efcc124f17506d4e99af29b86b77cf2fa1 [file]
(*
* Copyright 2018, Data61
* Commonwealth Scientific and Industrial Research Organisation (CSIRO)
* ABN 41 687 119 230.
*
* This software may be distributed and modified according to the terms of
* the BSD 2-Clause license. Note that NO WARRANTY is provided.
* See "LICENSE_BSD2.txt" for details.
*
* @TAG(DATA61_BSD)
*)
(*
The cogent_C_val class provides val_rel and type_rel,
generic predicates for matching Cogent and C values and types.
This file also gives program-independent instances for cogent_C_val.
*)
theory Value_Relation
imports
"AutoCorres.AutoCorres"
"HOL-Word.Word"
"Cogent.UpdateSemantics"
"Type_Args"
begin
(* Mechanism to get different instances of cogent_C_val for signed and unsigned words. *)
class knows_sign = fixes is_signed :: "'a itself \<Rightarrow> bool"
instantiation signed :: (type) knows_sign begin
definition is_signed_signed_def:
"is_signed (_ :: 'a signed itself) = True"
instance ..
end
instantiation bit0 :: (type) knows_sign begin
definition is_signed_bit0_def:
"is_signed (_ :: 'a bit0 itself) = False"
instance ..
end
instantiation bit1 :: (type) knows_sign begin
definition is_signed_bit1_def:
"is_signed (_ :: 'a bit1 itself) = False"
instance ..
end
class cogent_C_val = c_type +
fixes val_rel :: "(funtyp, abstyp, ptrtyp) uval \<Rightarrow>'a \<Rightarrow> bool"
fixes type_rel :: "repr \<Rightarrow> 'a itself \<Rightarrow> bool"
(* The signed word relation is the relation for function tags, so we can only
* define it after reading the program.
* Here is a hack to defer this task. *)
consts cogent_function_val_rel :: "(funtyp, abstyp, ptrtyp) uval \<Rightarrow> int \<Rightarrow> bool"
consts cogent_function_type_rel :: "repr \<Rightarrow> 'a word itself \<Rightarrow> bool"
instantiation word :: ("{len8, knows_sign}") cogent_C_val
begin
definition type_rel_word_def:
"type_rel a (t :: 'a word itself) \<equiv>
if is_signed TYPE ('a) then cogent_function_type_rel a t
else (
if len_of TYPE('a) = 64 then a = RPrim (Num U64)
else if len_of TYPE('a) = 32 then a = RPrim (Num U32)
else if len_of TYPE('a) = 16 then a = RPrim (Num U16)
else if len_of TYPE('a) = 8 then a = RPrim (Num U8)
else False)"
definition val_rel_word_def:
"val_rel uv (x :: 'a word) \<equiv>
if is_signed TYPE('a) then cogent_function_val_rel uv (sint x) else
if size x = 64 then uv = UPrim (LU64 (ucast x))
else if size x = 32 then uv = UPrim (LU32 (ucast x))
else if size x = 16 then uv = UPrim (LU16 (ucast x))
else if size x = 8 then uv = UPrim (LU8 (ucast x))
else False"
instance ..
end
lemmas is_signed_simps = is_signed_signed_def is_signed_bit0_def is_signed_bit1_def
lemmas val_rel_word64 = val_rel_word_def [where 'a=64, simplified word_size ucast_id is_signed_simps, simplified]
lemmas val_rel_word32 = val_rel_word_def [where 'a=32, simplified word_size ucast_id is_signed_simps, simplified]
lemmas val_rel_word16 = val_rel_word_def [where 'a=16, simplified word_size ucast_id is_signed_simps, simplified]
lemmas val_rel_word8 = val_rel_word_def [where 'a= 8, simplified word_size ucast_id is_signed_simps, simplified]
lemmas val_rel_word = val_rel_word64 val_rel_word32 val_rel_word16 val_rel_word8
lemmas val_rel_fun_tag = val_rel_word_def [where 'a="32 signed", simplified is_signed_simps, simplified]
lemmas type_rel_word64 = type_rel_word_def [where 'a=64, simplified is_signed_simps, simplified]
lemmas type_rel_word32 = type_rel_word_def [where 'a=32, simplified is_signed_simps, simplified]
lemmas type_rel_word16 = type_rel_word_def [where 'a=16, simplified is_signed_simps, simplified]
lemmas type_rel_word8 = type_rel_word_def [where 'a= 8, simplified is_signed_simps, simplified]
lemmas type_rel_word = type_rel_word64 type_rel_word32 type_rel_word16 type_rel_word8
lemmas type_rel_fun_tag = type_rel_word_def [where 'a="32 signed", simplified is_signed_simps, simplified]
instantiation unit :: cogent_C_val
begin
definition type_rel_unit_def:
"type_rel typ (_ :: unit itself) \<equiv> typ = RUnit"
definition val_rel_unit_def:
"val_rel uv (x :: unit) \<equiv> uv = UUnit"
instance ..
end
instantiation ptr :: (cogent_C_val) cogent_C_val
begin
definition val_rel_ptr_def:
"val_rel uv (x :: 'a ptr) \<equiv> \<exists>repr. uv = (UPtr (ptr_val x) repr)"
definition type_rel_ptr_def:
"type_rel typ (_:: 'a ptr itself) \<equiv> \<exists>repr. typ = RPtr repr \<and> type_rel repr TYPE('a)"
instance ..
end
end