let propagates_pre_post_constraints file root =
  Hashtbl.clear functions_pre_usecase ;
  Hashtbl.clear functions_post_usecase;
  spec_modified:=false;

  let visitor = 
    new visit_propagating_pre_post_constraints (Data_for_aorai.getAutomata()) 
  in
  Cil.visitCilFile (visitor :> Cil.cilVisitor) file;

  List.iter
    (fun name ->
       if name <> root then
         begin
           let old_pre  = (Data_for_aorai.get_func_pre name) in
           let old_post = (Data_for_aorai.get_func_post name) in
           let pre = 
             try Hashtbl.find functions_pre_usecase  name 
             with Not_found -> (mk_empty_pre_or_post())
           in
           let post = 
             try Hashtbl.find functions_post_usecase name 
             with Not_found -> (mk_empty_pre_or_post()) 
           in
           let cur_pre  = double_bool_array_and pre  old_pre  in
           let cur_post = double_bool_array_and post old_post in
           if   (not (double_bool_array_eq old_pre  cur_pre ) )
           then begin spec_modified:=true;  end;
           if   (not (double_bool_array_eq old_post cur_post) )
           then begin spec_modified:=true;  end;
           Data_for_aorai.set_func_pre  name cur_pre;
           Data_for_aorai.set_func_post name cur_post
         end
    )
    (Data_for_aorai.getFunctions_from_c ());
  !spec_modified