From 1c7acc37c44f914f60a27164b2bacb4e099db049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr> Date: Wed, 25 Mar 2020 16:10:05 +0100 Subject: [PATCH] [wp] upgrade float literals wrt Why3 api --- src/plugins/wp/ProverWhy3.ml | 52 ++++++++++--------- .../wp_acsl/oracle/float_const.res.oracle | 18 +++---- .../frama_c_hashtbl_solved.res.oracle | 4 +- 3 files changed, 38 insertions(+), 36 deletions(-) diff --git a/src/plugins/wp/ProverWhy3.ml b/src/plugins/wp/ProverWhy3.ml index 520183929b0..bb567fd2468 100644 --- a/src/plugins/wp/ProverWhy3.ml +++ b/src/plugins/wp/ProverWhy3.ml @@ -236,51 +236,55 @@ let rec of_tau ~cnv (t:Lang.F.tau) = | Record _ -> why3_failure "Type %a not (yet) convertible" Lang.F.pp_tau t -module Literal = struct +module Literal = +struct + + open Why3 + let const_int (z:Z.t) = - Why3.(Term.t_const Constant.(const_of_big_int (BigInt.of_string (Z.to_string z)))) Why3.Ty.ty_int + let k = BigInt.of_string (Z.to_string z) in + Term.t_const (Constant.int_const k) Ty.ty_int - let why3_real ty ~use_hex sign integer decimal exp = - let rc = Why3.Number.ConstReal { - rc_negative = sign ; - rc_abs = - if use_hex then Why3.Number.real_const_hex integer decimal exp - else Why3.Number.real_const_dec integer decimal exp - } in - Why3.Term.t_const rc ty + let why3_real ty ~radix ~neg ~int ?(frac="") ?exp () = + let rc = Number.real_literal ~radix ~neg ~int ~frac ~exp in + Term.t_const (Constant.ConstReal rc) ty let const_real ~cnv (q:Q.t) = let mk_real_int z = - let use_hex = false in - let str = Z.to_string (Z.abs z) in - why3_real Why3.Ty.ty_real ~use_hex (Z.sign z < 0) str "" None + let neg = Z.sign z < 0 in + let int = Z.to_string (Z.abs z) in + why3_real Why3.Ty.ty_real ~radix:10 ~neg ~int () in if Z.equal Z.one q.den then mk_real_int q.num else - t_app ~cnv ~f:["real"] ~l:"Real" ~p:["infix /"] [mk_real_int q.num;mk_real_int q.den] + t_app ~cnv ~f:["real"] ~l:"Real" ~p:["infix /"] + [mk_real_int q.num;mk_real_int q.den] let cfloat_of_tau tau = if Lang.F.Tau.equal tau Cfloat.t32 then Ctypes.Float32 else if Lang.F.Tau.equal tau Cfloat.t64 then Ctypes.Float64 else raise Not_found + let re_float = Str.regexp + "-?0x\\([0-9a-f]+\\).\\([0-9a-f]+\\)?0*p?\\([+-]?[0-9a-f]+\\)?$" + let float_literal_from_q ~cnv tau q = let use_hex = true in + let qf = Q.to_float q in let f = match cfloat_of_tau tau with - | Float32 -> Floating_point.round_to_single_precision_float (Q.to_float q) - | Float64 -> Q.to_float q - in - let s = Format.asprintf "%a" (Floating_point.pretty_normal ~use_hex) f in - let re_float = - Str.regexp "-?0x\\([0-9a-f]+\\).\\([0-9a-f]+\\)?p?\\([+-]?[0-9a-f]+\\)?$" + | Float32 -> Floating_point.round_to_single_precision_float qf + | Float64 -> qf in + let s = Pretty_utils.to_string (Floating_point.pretty_normal ~use_hex) f in + let s = String.lowercase_ascii s in if Str.string_match re_float s 0 then let group n r = try Str.matched_group n r with Not_found -> "" in - let (i,d,e) = (group 1 s), (group 2 s), (group 3 s) in - let e = if String.equal e "" then None else Some e in - let t = Extlib.the (of_tau ~cnv tau) in - why3_real t ~use_hex (Q.sign q < 0) i d e + let neg = Q.sign q < 0 in + let int,frac,exp = (group 1 s), (group 2 s), (group 3 s) in + let exp = if String.equal exp "" then None else Some exp in + let ty = Extlib.the (of_tau ~cnv tau) in + why3_real ty ~radix:16 ~neg ~int ~frac ?exp () else raise Not_found let const_float ~cnv tau (repr:Lang.F.QED.repr) = diff --git a/src/plugins/wp/tests/wp_acsl/oracle/float_const.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/float_const.res.oracle index 36c2f74c363..d1a648f8189 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/float_const.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/float_const.res.oracle @@ -37,7 +37,7 @@ goal wp_goal : forall f:t. let r = of_f32 (to_f32 (of_f64 f)) in - eq_f64 f (0x1.999999999999ap-4:t) -> of_f64 (to_f64 r) = r + eq_f64 f (0x1.999999999999Ap-4:t) -> of_f64 (to_f64 r) = r end [wp:print-generated] theory WP1 @@ -67,7 +67,7 @@ goal wp_goal : forall f:t. - eq_f64 f (0x1.999999999999ap-4:t) -> + eq_f64 f (0x1.999999999999Ap-4:t) -> not of_f64 f = (13421773.0 / 134217728.0) end [wp:print-generated] @@ -98,7 +98,7 @@ goal wp_goal : forall f:t. - eq_f64 f (0x1.999999999999ap-4:t) -> + eq_f64 f (0x1.999999999999Ap-4:t) -> of_f64 f = (3602879701896397.0 / 36028797018963968.0) end [wp:print-generated] @@ -129,7 +129,7 @@ goal wp_goal : forall f:t. - eq_f64 f (0x1.999999999999ap-4:t) -> not of_f64 f = (1.0 / 10.0) + eq_f64 f (0x1.999999999999Ap-4:t) -> not of_f64 f = (1.0 / 10.0) end [wp:print-generated] theory WP4 @@ -160,7 +160,7 @@ goal wp_goal : forall f:t1. let r = of_f321 f in - eq_f32 f (0x1.99999a0000000p-4:t1) -> + eq_f32 f (0x1.99999Ap-4:t1) -> of_f321 (to_f321 (of_f641 (to_f641 r))) = r end [wp:print-generated] @@ -191,7 +191,7 @@ goal wp_goal : forall f:t1. - eq_f32 f (0x1.99999a0000000p-4:t1) -> + eq_f32 f (0x1.99999Ap-4:t1) -> not of_f321 f = (3602879701896397.0 /' 36028797018963968.0) end [wp:print-generated] @@ -222,8 +222,7 @@ goal wp_goal : forall f:t1. - eq_f32 f (0x1.99999a0000000p-4:t1) -> - of_f321 f = (13421773.0 /' 134217728.0) + eq_f32 f (0x1.99999Ap-4:t1) -> of_f321 f = (13421773.0 /' 134217728.0) end [wp:print-generated] theory WP7 @@ -252,8 +251,7 @@ (* use frama_c_wp.cfloat.Cfloat1 *) goal wp_goal : - forall f:t1. - eq_f32 f (0x1.99999a0000000p-4:t1) -> not of_f321 f = (1.0 /' 10.0) + forall f:t1. eq_f32 f (0x1.99999Ap-4:t1) -> not of_f321 f = (1.0 /' 10.0) end [wp] 8 goals generated ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_hashtbl_solved.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_hashtbl_solved.res.oracle index edd11a46ad8..6e3fc54c35c 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_hashtbl_solved.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_hashtbl_solved.res.oracle @@ -109,7 +109,7 @@ [wp] [Qed] Goal typed_size_assigns : Valid [wp] Proved goals: 102 / 102 Qed: 69 - Script: 1 + Script: 1 Alt-Ergo: 32 ------------------------------------------------------------ Functions WP Alt-Ergo Total Success @@ -273,7 +273,7 @@ [wp] [Qed] Goal typed_size_assigns : Valid [wp] Proved goals: 74 / 143 Qed: 16 - Script: 1 + Script: 1 Alt-Ergo: 57 ------------------------------------------------------------ Functions WP Alt-Ergo Total Success -- GitLab