Theory Ffi
chapter ‹Generated by Lem from ‹semantics/ffi/ffi.lem›.›
theory "Ffi"
imports
Main
"HOL-Library.Datatype_Records"
"LEM.Lem_pervasives"
"LEM.Lem_pervasives_extra"
"Lib"
begin
datatype 'ffi oracle_result = Oracle_return " 'ffi " " 8 word list " | Oracle_diverge | Oracle_fail
type_synonym 'ffi oracle_function =" 'ffi ⇒ 8 word list ⇒ 8 word list ⇒ 'ffi oracle_result "
type_synonym 'ffi oracle0 =" string ⇒ 'ffi oracle_function "
datatype io_event = IO_event " string " " 8 word list " " ( (8 word * 8 word)list)"
datatype ffi_outcome = FFI_diverged | FFI_failed
datatype final_event = Final_event " string " " 8 word list " " 8 word list " " ffi_outcome "
datatype_record 'ffi ffi_state =
oracle0 ::" 'ffi oracle0 "
ffi_state ::" 'ffi "
final_event ::" final_event option "
io_events ::" io_event list "
definition initial_ffi_state :: "(string ⇒ 'ffi oracle_function)⇒ 'ffi ⇒ 'ffi ffi_state " where
" initial_ffi_state oc ffi1 = (
(| oracle0 = oc
, ffi_state = ffi1
, final_event = None
, io_events = ([])
|) )"
definition call_FFI :: " 'ffi ffi_state ⇒ string ⇒(8 word)list ⇒(8 word)list ⇒ 'ffi ffi_state*(8 word)list " where
" call_FFI st s conf bytes = (
if ((final_event st) = None) ∧ ¬ (s = ('''')) then
(case (oracle0 st) s(ffi_state st) conf bytes of
Oracle_return ffi' bytes' =>
if List.length bytes' = List.length bytes then
(( st (| ffi_state := ffi'
, io_events :=
((io_events st) @
[IO_event s conf (zipSameLength bytes bytes')])
|)), bytes')
else (( st (| final_event := (Some (Final_event s conf bytes FFI_failed)) |)), bytes)
| Oracle_diverge =>
(( st (| final_event := (Some (Final_event s conf bytes FFI_diverged)) |)), bytes)
| Oracle_fail =>
(( st (| final_event := (Some (Final_event s conf bytes FFI_failed)) |)), bytes)
)
else (st, bytes))"
datatype outcome = Success | Resource_limit_hit | FFI_outcome " final_event "
datatype behaviour =
Diverge " io_event llist "
| Terminate " outcome " " io_event list "
| Fail
definition trace_oracle :: " string ⇒(io_event)llist ⇒(8 word)list ⇒(8 word)list ⇒((io_event)llist)oracle_result " where
" trace_oracle s io_trace conf input1 = (
(case lhd' io_trace of
Some (IO_event s' conf' bytes2) =>
if (s = s') ∧ ((List.map fst bytes2 = input1) ∧ (conf = conf')) then
Oracle_return (Option.the (ltl' io_trace)) (List.map snd bytes2)
else Oracle_fail
| _ => Oracle_fail
))"
end