let add_loop_invariant_annot config vloop s ca b_list inv acc =
  let assigns, loop_entry, loop_back , loop_core = acc in
    (* we have to prove that inv is true for each edge that goes
    * in the loop, so we can assume that inv is true for each edge
    * starting from this point. *)

    match is_annot_for_config config vloop s b_list with
      | TBRok
      | TBRpart (* TODO: PKPartial *)
        ->
          if Wp_parameters.Invariants.get() then begin
            let loop_core = add_prop_inv_fixpoint config loop_core 
                              (WpStrategy.AcutB true) s ca inv
            in assigns, loop_entry , loop_back , loop_core
          end
          else begin
            let loop_entry = add_prop_inv_establish config loop_entry 
                               WpStrategy.Agoal s ca inv in
            let loop_back = add_prop_inv_preserve config loop_back 
                              WpStrategy.Agoal s ca inv in
            let loop_core = add_prop_inv_fixpoint config loop_core 
                              WpStrategy.Ahyp s ca inv in
              assigns, loop_entry , loop_back , loop_core
          end
      | TBRhyp -> (* TODO : add more inv hyp ? *)
          let kind =
            if Wp_parameters.Invariants.get() 
            then (WpStrategy.AcutB falseelse WpStrategy.Ahyp
          in
          let loop_core =
            add_prop_inv_fixpoint config loop_core kind s ca inv
          in assigns, loop_entry , loop_back , loop_core
      | TBRno -> acc