open Preamble open Hints_declaration open Core_notation open Pts open Logic open Proper open PositiveMap open Deqsets open ErrorMessages open PreIdentifiers open Errors open Extralib open Lists open Positive open Identifiers open Exp open Arithmetic open Vector open Div_and_mod open Util open FoldStuff open BitVector open Jmeq open Russell open List open Setoids open Monad open Option open Extranat open Bool open Relations open Nat open Integers open Types open AST open CostLabel open FrontEndVal open Hide open ByteValues open GenMem open FrontEndMem open Division open Z open BitVectorZ open Pointers open Coqlib open Values open FrontEndOps open Order open Registers open BitVectorTrie open Graphs type statement = | St_skip of Graphs.label | St_cost of CostLabel.costlabel * Graphs.label | St_const of AST.typ * Registers.register * FrontEndOps.constant * Graphs.label | St_op1 of AST.typ * AST.typ * FrontEndOps.unary_operation * Registers.register * Registers.register * Graphs.label | St_op2 of AST.typ * AST.typ * AST.typ * FrontEndOps.binary_operation * Registers.register * Registers.register * Registers.register * Graphs.label | St_load of AST.typ * Registers.register * Registers.register * Graphs.label | St_store of AST.typ * Registers.register * Registers.register * Graphs.label | St_call_id of AST.ident * Registers.register List.list * Registers.register Types.option * Graphs.label | St_call_ptr of Registers.register * Registers.register List.list * Registers.register Types.option * Graphs.label | St_cond of Registers.register * Graphs.label * Graphs.label | St_return val statement_rect_Type4 : (Graphs.label -> 'a1) -> (CostLabel.costlabel -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> FrontEndOps.constant -> Graphs.label -> 'a1) -> (AST.typ -> AST.typ -> FrontEndOps.unary_operation -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> AST.typ -> AST.typ -> FrontEndOps.binary_operation -> Registers.register -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.ident -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> 'a1) -> (Registers.register -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> 'a1) -> (Registers.register -> Graphs.label -> Graphs.label -> 'a1) -> 'a1 -> statement -> 'a1 val statement_rect_Type5 : (Graphs.label -> 'a1) -> (CostLabel.costlabel -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> FrontEndOps.constant -> Graphs.label -> 'a1) -> (AST.typ -> AST.typ -> FrontEndOps.unary_operation -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> AST.typ -> AST.typ -> FrontEndOps.binary_operation -> Registers.register -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.ident -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> 'a1) -> (Registers.register -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> 'a1) -> (Registers.register -> Graphs.label -> Graphs.label -> 'a1) -> 'a1 -> statement -> 'a1 val statement_rect_Type3 : (Graphs.label -> 'a1) -> (CostLabel.costlabel -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> FrontEndOps.constant -> Graphs.label -> 'a1) -> (AST.typ -> AST.typ -> FrontEndOps.unary_operation -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> AST.typ -> AST.typ -> FrontEndOps.binary_operation -> Registers.register -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.ident -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> 'a1) -> (Registers.register -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> 'a1) -> (Registers.register -> Graphs.label -> Graphs.label -> 'a1) -> 'a1 -> statement -> 'a1 val statement_rect_Type2 : (Graphs.label -> 'a1) -> (CostLabel.costlabel -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> FrontEndOps.constant -> Graphs.label -> 'a1) -> (AST.typ -> AST.typ -> FrontEndOps.unary_operation -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> AST.typ -> AST.typ -> FrontEndOps.binary_operation -> Registers.register -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.ident -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> 'a1) -> (Registers.register -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> 'a1) -> (Registers.register -> Graphs.label -> Graphs.label -> 'a1) -> 'a1 -> statement -> 'a1 val statement_rect_Type1 : (Graphs.label -> 'a1) -> (CostLabel.costlabel -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> FrontEndOps.constant -> Graphs.label -> 'a1) -> (AST.typ -> AST.typ -> FrontEndOps.unary_operation -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> AST.typ -> AST.typ -> FrontEndOps.binary_operation -> Registers.register -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.ident -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> 'a1) -> (Registers.register -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> 'a1) -> (Registers.register -> Graphs.label -> Graphs.label -> 'a1) -> 'a1 -> statement -> 'a1 val statement_rect_Type0 : (Graphs.label -> 'a1) -> (CostLabel.costlabel -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> FrontEndOps.constant -> Graphs.label -> 'a1) -> (AST.typ -> AST.typ -> FrontEndOps.unary_operation -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> AST.typ -> AST.typ -> FrontEndOps.binary_operation -> Registers.register -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> 'a1) -> (AST.ident -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> 'a1) -> (Registers.register -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> 'a1) -> (Registers.register -> Graphs.label -> Graphs.label -> 'a1) -> 'a1 -> statement -> 'a1 val statement_inv_rect_Type4 : statement -> (Graphs.label -> __ -> 'a1) -> (CostLabel.costlabel -> Graphs.label -> __ -> 'a1) -> (AST.typ -> Registers.register -> FrontEndOps.constant -> Graphs.label -> __ -> 'a1) -> (AST.typ -> AST.typ -> FrontEndOps.unary_operation -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.typ -> AST.typ -> AST.typ -> FrontEndOps.binary_operation -> Registers.register -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.ident -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> __ -> 'a1) -> (Registers.register -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> __ -> 'a1) -> (Registers.register -> Graphs.label -> Graphs.label -> __ -> 'a1) -> (__ -> 'a1) -> 'a1 val statement_inv_rect_Type3 : statement -> (Graphs.label -> __ -> 'a1) -> (CostLabel.costlabel -> Graphs.label -> __ -> 'a1) -> (AST.typ -> Registers.register -> FrontEndOps.constant -> Graphs.label -> __ -> 'a1) -> (AST.typ -> AST.typ -> FrontEndOps.unary_operation -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.typ -> AST.typ -> AST.typ -> FrontEndOps.binary_operation -> Registers.register -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.ident -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> __ -> 'a1) -> (Registers.register -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> __ -> 'a1) -> (Registers.register -> Graphs.label -> Graphs.label -> __ -> 'a1) -> (__ -> 'a1) -> 'a1 val statement_inv_rect_Type2 : statement -> (Graphs.label -> __ -> 'a1) -> (CostLabel.costlabel -> Graphs.label -> __ -> 'a1) -> (AST.typ -> Registers.register -> FrontEndOps.constant -> Graphs.label -> __ -> 'a1) -> (AST.typ -> AST.typ -> FrontEndOps.unary_operation -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.typ -> AST.typ -> AST.typ -> FrontEndOps.binary_operation -> Registers.register -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.ident -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> __ -> 'a1) -> (Registers.register -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> __ -> 'a1) -> (Registers.register -> Graphs.label -> Graphs.label -> __ -> 'a1) -> (__ -> 'a1) -> 'a1 val statement_inv_rect_Type1 : statement -> (Graphs.label -> __ -> 'a1) -> (CostLabel.costlabel -> Graphs.label -> __ -> 'a1) -> (AST.typ -> Registers.register -> FrontEndOps.constant -> Graphs.label -> __ -> 'a1) -> (AST.typ -> AST.typ -> FrontEndOps.unary_operation -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.typ -> AST.typ -> AST.typ -> FrontEndOps.binary_operation -> Registers.register -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.ident -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> __ -> 'a1) -> (Registers.register -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> __ -> 'a1) -> (Registers.register -> Graphs.label -> Graphs.label -> __ -> 'a1) -> (__ -> 'a1) -> 'a1 val statement_inv_rect_Type0 : statement -> (Graphs.label -> __ -> 'a1) -> (CostLabel.costlabel -> Graphs.label -> __ -> 'a1) -> (AST.typ -> Registers.register -> FrontEndOps.constant -> Graphs.label -> __ -> 'a1) -> (AST.typ -> AST.typ -> FrontEndOps.unary_operation -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.typ -> AST.typ -> AST.typ -> FrontEndOps.binary_operation -> Registers.register -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.typ -> Registers.register -> Registers.register -> Graphs.label -> __ -> 'a1) -> (AST.ident -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> __ -> 'a1) -> (Registers.register -> Registers.register List.list -> Registers.register Types.option -> Graphs.label -> __ -> 'a1) -> (Registers.register -> Graphs.label -> Graphs.label -> __ -> 'a1) -> (__ -> 'a1) -> 'a1 val statement_jmdiscr : statement -> statement -> __ type internal_function = { f_labgen : Identifiers.universe; f_reggen : Identifiers.universe; f_result : (Registers.register, AST.typ) Types.prod Types.option; f_params : (Registers.register, AST.typ) Types.prod List.list; f_locals : (Registers.register, AST.typ) Types.prod List.list; f_stacksize : Nat.nat; f_graph : statement Graphs.graph; f_entry : Graphs.label Types.sig0; f_exit : Graphs.label Types.sig0 } val internal_function_rect_Type4 : (Identifiers.universe -> Identifiers.universe -> (Registers.register, AST.typ) Types.prod Types.option -> (Registers.register, AST.typ) Types.prod List.list -> (Registers.register, AST.typ) Types.prod List.list -> Nat.nat -> statement Graphs.graph -> __ -> __ -> Graphs.label Types.sig0 -> Graphs.label Types.sig0 -> __ -> 'a1) -> internal_function -> 'a1 val internal_function_rect_Type5 : (Identifiers.universe -> Identifiers.universe -> (Registers.register, AST.typ) Types.prod Types.option -> (Registers.register, AST.typ) Types.prod List.list -> (Registers.register, AST.typ) Types.prod List.list -> Nat.nat -> statement Graphs.graph -> __ -> __ -> Graphs.label Types.sig0 -> Graphs.label Types.sig0 -> __ -> 'a1) -> internal_function -> 'a1 val internal_function_rect_Type3 : (Identifiers.universe -> Identifiers.universe -> (Registers.register, AST.typ) Types.prod Types.option -> (Registers.register, AST.typ) Types.prod List.list -> (Registers.register, AST.typ) Types.prod List.list -> Nat.nat -> statement Graphs.graph -> __ -> __ -> Graphs.label Types.sig0 -> Graphs.label Types.sig0 -> __ -> 'a1) -> internal_function -> 'a1 val internal_function_rect_Type2 : (Identifiers.universe -> Identifiers.universe -> (Registers.register, AST.typ) Types.prod Types.option -> (Registers.register, AST.typ) Types.prod List.list -> (Registers.register, AST.typ) Types.prod List.list -> Nat.nat -> statement Graphs.graph -> __ -> __ -> Graphs.label Types.sig0 -> Graphs.label Types.sig0 -> __ -> 'a1) -> internal_function -> 'a1 val internal_function_rect_Type1 : (Identifiers.universe -> Identifiers.universe -> (Registers.register, AST.typ) Types.prod Types.option -> (Registers.register, AST.typ) Types.prod List.list -> (Registers.register, AST.typ) Types.prod List.list -> Nat.nat -> statement Graphs.graph -> __ -> __ -> Graphs.label Types.sig0 -> Graphs.label Types.sig0 -> __ -> 'a1) -> internal_function -> 'a1 val internal_function_rect_Type0 : (Identifiers.universe -> Identifiers.universe -> (Registers.register, AST.typ) Types.prod Types.option -> (Registers.register, AST.typ) Types.prod List.list -> (Registers.register, AST.typ) Types.prod List.list -> Nat.nat -> statement Graphs.graph -> __ -> __ -> Graphs.label Types.sig0 -> Graphs.label Types.sig0 -> __ -> 'a1) -> internal_function -> 'a1 val f_labgen : internal_function -> Identifiers.universe val f_reggen : internal_function -> Identifiers.universe val f_result : internal_function -> (Registers.register, AST.typ) Types.prod Types.option val f_params : internal_function -> (Registers.register, AST.typ) Types.prod List.list val f_locals : internal_function -> (Registers.register, AST.typ) Types.prod List.list val f_stacksize : internal_function -> Nat.nat val f_graph : internal_function -> statement Graphs.graph val f_entry : internal_function -> Graphs.label Types.sig0 val f_exit : internal_function -> Graphs.label Types.sig0 val internal_function_inv_rect_Type4 : internal_function -> (Identifiers.universe -> Identifiers.universe -> (Registers.register, AST.typ) Types.prod Types.option -> (Registers.register, AST.typ) Types.prod List.list -> (Registers.register, AST.typ) Types.prod List.list -> Nat.nat -> statement Graphs.graph -> __ -> __ -> Graphs.label Types.sig0 -> Graphs.label Types.sig0 -> __ -> __ -> 'a1) -> 'a1 val internal_function_inv_rect_Type3 : internal_function -> (Identifiers.universe -> Identifiers.universe -> (Registers.register, AST.typ) Types.prod Types.option -> (Registers.register, AST.typ) Types.prod List.list -> (Registers.register, AST.typ) Types.prod List.list -> Nat.nat -> statement Graphs.graph -> __ -> __ -> Graphs.label Types.sig0 -> Graphs.label Types.sig0 -> __ -> __ -> 'a1) -> 'a1 val internal_function_inv_rect_Type2 : internal_function -> (Identifiers.universe -> Identifiers.universe -> (Registers.register, AST.typ) Types.prod Types.option -> (Registers.register, AST.typ) Types.prod List.list -> (Registers.register, AST.typ) Types.prod List.list -> Nat.nat -> statement Graphs.graph -> __ -> __ -> Graphs.label Types.sig0 -> Graphs.label Types.sig0 -> __ -> __ -> 'a1) -> 'a1 val internal_function_inv_rect_Type1 : internal_function -> (Identifiers.universe -> Identifiers.universe -> (Registers.register, AST.typ) Types.prod Types.option -> (Registers.register, AST.typ) Types.prod List.list -> (Registers.register, AST.typ) Types.prod List.list -> Nat.nat -> statement Graphs.graph -> __ -> __ -> Graphs.label Types.sig0 -> Graphs.label Types.sig0 -> __ -> __ -> 'a1) -> 'a1 val internal_function_inv_rect_Type0 : internal_function -> (Identifiers.universe -> Identifiers.universe -> (Registers.register, AST.typ) Types.prod Types.option -> (Registers.register, AST.typ) Types.prod List.list -> (Registers.register, AST.typ) Types.prod List.list -> Nat.nat -> statement Graphs.graph -> __ -> __ -> Graphs.label Types.sig0 -> Graphs.label Types.sig0 -> __ -> __ -> 'a1) -> 'a1 val internal_function_jmdiscr : internal_function -> internal_function -> __ type rTLabs_program = (internal_function AST.fundef, AST.init_data List.list) AST.program