Module WpFroms


module WpFroms: sig .. end
This file groups functions needed to check the fonctional dependencies

Build xi = Init (i) /\ ... forall inputs part of the assigns property.


val mk_linfo_type : Cil_types.logic_type option * Cil_types.logic_type list ->
Cil_types.logic_type
Build the logic type of the function that takes parameters of in_types and return an out_type result (None for a predicate)
val make_logic_info : string ->
Cil_types.logic_type option * Cil_types.logic_type list ->
Cil_types.logic_info
Build a logic_info with fname and the signature given by (out_type, in_types) (see WpFroms.mk_linfo_type) TODO: should be Cil_const.make_logic_info when it be finished.
val get_linfo_cpt : int Pervasives.ref
Find the logic_info for the given name and signature. Build and register it if it doesn't exist yet. Notice that the returned logic_info can have a different name than the asked one because we cannot create several function with same input signature and different output type. TODO: the detection to know if we have to build a new name or not could be enhanced.
val get_linfo : string ->
Cil_types.logic_type option * Cil_types.logic_type list ->
Cil_types.logic_info
val get_implicit_fun : Kernel_function.t ->
Cil_types.kinstr ->
('a, 'b) Cil_types.behavior ->
int ->
Cil_types.logic_type * Cil_types.logic_type list -> Cil_types.logic_info
Build the implicit function for the nth assign clause of behavior b in the ki element of function kf.
val get_pred_linfo : Cil_types.logic_type -> Cil_types.logic_info
val get_init_linfo : Cil_types.logic_type -> Cil_types.logic_info
val mk_assign_post : Cil_types.termination_kind ->
Cil_types.identified_term Cil_types.zone * 'a ->
Cil_types.identified_predicate option
Build P(output)

Build P(out) where out is the left part of the assigns property. Process \result and \exit_status according to termination_kind.

val mk_assign_pre : 'a * Cil_types.identified_term Cil_types.zone list ->
Cil_types.identified_predicate
Build xi = Init (i) /\ ... forall inputs.

Build xi = Init (i) /\ ... forall inputs part of the assigns property.

val build_bhv_assumes : (Cil_types.identified_predicate, 'a) Cil_types.behavior ->
Cil_types.predicate Cil_types.named
val build_fimpl_call : Kernel_function.t ->
Cil_types.kinstr ->
('a, 'b) Cil_types.behavior ->
int ->
Cil_types.term ->
Cil_types.identified_term Cil_types.zone list ->
Cil_types.predicate Cil_types.named
Build out = f_n (inputs)
val post_of_assigns_in_spec : Kernel_function.t ->
Cil_types.kinstr ->
('a, Cil_types.identified_predicate, Cil_types.identified_term)
Cil_types.spec ->
Cil_types.termination_kind ->
((Cil_types.identified_predicate, Cil_types.identified_term)
Cil_types.behavior * Cil_types.identified_predicate)
list
For each behavior of the specification, return a predicate which is a conjonction of out_i = implicit_fun_i (inputs) for each out_i \from inputs assigns property of the behavior. implicit_fun_i is the implicit fonction for the output. kf and ki give information to know there the specification comes from in order to build the names for the implicit functions. termination_kind is used to filter \result and \exit_status when needed.