From c5017302127f2e467ca64eb1f9a6f7f00e49cb98 Mon Sep 17 00:00:00 2001
From: Allan Blanchard <allan.blanchard@cea.fr>
Date: Thu, 6 Jan 2022 16:05:02 +0100
Subject: [PATCH] [wp] test tactic modmask

---
 src/plugins/wp/tests/wp_tip/modmask.i         |  18 ++
 .../tests/wp_tip/oracle/modmask.0.res.oracle  |  79 +++++++++
 .../script/check_lemma_and_modulo_u.json      | 162 ++++++++++++++++++
 .../script/check_lemma_and_modulo_us_255.json |  14 ++
 .../tests/wp_tip/oracle/modmask.1.res.oracle  |  79 +++++++++
 .../script/check_lemma_and_modulo_u.json      | 162 ++++++++++++++++++
 .../script/check_lemma_and_modulo_us_255.json |  14 ++
 7 files changed, 528 insertions(+)
 create mode 100644 src/plugins/wp/tests/wp_tip/modmask.i
 create mode 100644 src/plugins/wp/tests/wp_tip/oracle/modmask.0.res.oracle
 create mode 100644 src/plugins/wp/tests/wp_tip/oracle/modmask.0.session/script/check_lemma_and_modulo_u.json
 create mode 100644 src/plugins/wp/tests/wp_tip/oracle/modmask.0.session/script/check_lemma_and_modulo_us_255.json
 create mode 100644 src/plugins/wp/tests/wp_tip/oracle/modmask.1.res.oracle
 create mode 100644 src/plugins/wp/tests/wp_tip/oracle/modmask.1.session/script/check_lemma_and_modulo_u.json
 create mode 100644 src/plugins/wp/tests/wp_tip/oracle/modmask.1.session/script/check_lemma_and_modulo_us_255.json

diff --git a/src/plugins/wp/tests/wp_tip/modmask.i b/src/plugins/wp/tests/wp_tip/modmask.i
new file mode 100644
index 00000000000..1970a5e6202
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/modmask.i
@@ -0,0 +1,18 @@
+/* run.config
+   OPT: -wp-par 1 -wp-no-print -wp-prover qed,tip -wp-msg-key script -wp-session @PTEST_SUITE_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.@PTEST_NUMBER@.session
+   OPT: -wp-par 1 -wp-no-print -wp-prover qed,tip -wp-msg-key script -wp-session @PTEST_SUITE_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.@PTEST_NUMBER@.session
+*/
+/* run.config_qualif
+   DONTRUN:
+*/
+
+/*@
+  check lemma and_modulo_us_255:
+    \forall unsigned short us ; (us & 0xFF) == us % 0x100 ;
+*/
+
+/*@
+  check lemma and_modulo_u:
+    \forall unsigned us, integer shift;
+      0 <= shift < (sizeof(us) *  8) ==> (us & ((1 << shift) - 1)) == us % (1 << shift);
+*/
diff --git a/src/plugins/wp/tests/wp_tip/oracle/modmask.0.res.oracle b/src/plugins/wp/tests/wp_tip/oracle/modmask.0.res.oracle
new file mode 100644
index 00000000000..dd1cd3edf7d
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle/modmask.0.res.oracle
@@ -0,0 +1,79 @@
+# frama-c -wp [...]
+[kernel] Parsing modmask.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] 2 goals scheduled
+[wp:script:allgoals] 
+  Lemma and_modulo_u:
+  Prove: let x_0 = (lsl 1 shift_0) in
+         (0<=shift_0) -> (shift_0<=31) -> (is_uint32 us_0)
+         -> ((us_0 mod x_0)=(land us_0 (x_0-1)))
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  Lemma and_modulo_us_255:
+  Prove: (is_uint16 us_0) -> ((us_0 mod 256)=(land 255 us_0))
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_check_lemma_and_modulo_u subgoal:
+  
+  Goal Wp.Tactical.typed_check_lemma_and_modulo_u-0 (generated):
+  Let x = lsl(1, shift_0).
+  Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). }
+  Prove: (0 <= us_0) /\ (0 < x) /\ (exists i : Z. (lsl(1, i) = x) /\ (0 <= i)).
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_check_lemma_and_modulo_u subgoal:
+  
+  Goal Wp.Tactical.typed_check_lemma_and_modulo_u-1 (generated):
+  Prove: true.
+  Prover Qed returns Valid
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_check_lemma_and_modulo_us_255 subgoal:
+  
+  Goal Wp.Tactical.typed_check_lemma_and_modulo_us_255-0 (generated):
+  Assume { Have: is_uint16(us_0). }
+  Prove: 0 <= us_0.
+  
+  ------------------------------------------------------------
+[wp] [Script] Goal typed_check_lemma_and_modulo_us_255 : Valid
+[wp:script:allgoals] 
+  typed_check_lemma_and_modulo_us_255 subgoal:
+  
+  Goal Wp.Tactical.typed_check_lemma_and_modulo_us_255-1 (generated):
+  Prove: true.
+  Prover Qed returns Valid
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_check_lemma_and_modulo_u subgoal:
+  
+  Goal Wp.Tactical.typed_check_lemma_and_modulo_u-2 (generated):
+  Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). }
+  Prove: 0 <= us_0.
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_check_lemma_and_modulo_u subgoal:
+  
+  Goal Wp.Tactical.typed_check_lemma_and_modulo_u-3 (generated):
+  Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). }
+  Prove: 0 < lsl(1, shift_0).
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_check_lemma_and_modulo_u subgoal:
+  
+  Goal Wp.Tactical.typed_check_lemma_and_modulo_u-4 (generated):
+  Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). }
+  Prove: exists i : Z. (lsl(1, i) = lsl(1, shift_0)) /\ (0 <= i).
+  
+  ------------------------------------------------------------
+[wp] [Script] Goal typed_check_lemma_and_modulo_u : Valid
+[wp] Proved goals:    2 / 2
+  Qed:             0 
+  Script:          2
+[wp] Updated session with 2 new valid scripts.
diff --git a/src/plugins/wp/tests/wp_tip/oracle/modmask.0.session/script/check_lemma_and_modulo_u.json b/src/plugins/wp/tests/wp_tip/oracle/modmask.0.session/script/check_lemma_and_modulo_u.json
new file mode 100644
index 00000000000..e40e8863e3c
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle/modmask.0.session/script/check_lemma_and_modulo_u.json
@@ -0,0 +1,162 @@
+[ { "header": "Mod-Mask", "tactic": "Wp.modmask",
+    "params": { "Wp.modmask.revert": false },
+    "select": { "select": "inside-goal", "occur": 0,
+                "target": "us_0 mod (lsl 1 shift_0)",
+                "pattern": "%$uslsl1$shift" },
+    "children": { "Mask Guard": [ { "header": "Split", "tactic": "Wp.split",
+                                    "params": {},
+                                    "select": { "select": "clause-goal",
+                                                "target": "let x_0 = (lsl 1 shift_0) in\n(0<=us_0) /\\ (0<x_0) /\\ (exists i_0:int.\n                         ((lsl 1 i_0)=x_0) /\\ (0<=i_0))",
+                                                "pattern": "&<=<\\E0$us0lsl1$shiftlsl011$shift" },
+                                    "children": { "Goal 1/3": [ { "header": "Definition",
+                                                                  "tactic": "Wp.unfold",
+                                                                  "params": {},
+                                                                  "select": 
+                                                                    { "select": "clause-step",
+                                                                    "at": 2,
+                                                                    "kind": "have",
+                                                                    "target": "(is_uint32 us_0)",
+                                                                    "pattern": "is_uint32$us" },
+                                                                  "children": 
+                                                                    { "Unfold 'is_uint32'": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ] } } ],
+                                                  "Goal 2/3": [ { "header": "Range",
+                                                                  "tactic": "Wp.range",
+                                                                  "params": 
+                                                                    { "inf": 0,
+                                                                    "sup": 31 },
+                                                                  "select": 
+                                                                    { "select": "inside-goal",
+                                                                    "occur": 0,
+                                                                    "target": "shift_0",
+                                                                    "pattern": "$shift" },
+                                                                  "children": 
+                                                                    { "Lower 0": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 0": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 1": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 2": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 3": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 4": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 5": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 6": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 7": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 8": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 9": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 10": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 11": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 12": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 13": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 14": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 15": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 16": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 17": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 18": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 19": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 20": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 21": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 22": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 23": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 24": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 25": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 26": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 27": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 28": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 29": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 30": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 31": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Upper 31": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ] } } ],
+                                                  "Goal 3/3": [ { "header": "Instance",
+                                                                  "tactic": "Wp.instance",
+                                                                  "params": 
+                                                                    { "P1": 
+                                                                    { "select": "inside-goal",
+                                                                    "occur": 0,
+                                                                    "target": "shift_0",
+                                                                    "pattern": "$shift" },
+                                                                    "P2": null,
+                                                                    "P3": null,
+                                                                    "P4": null,
+                                                                    "P5": null,
+                                                                    "P6": null,
+                                                                    "P7": null,
+                                                                    "P8": null,
+                                                                    "P9": null,
+                                                                    "P10": null },
+                                                                  "select": 
+                                                                    { "select": "clause-goal",
+                                                                    "target": "exists i_0:int. ((lsl 1 i_0)=(lsl 1 shift_0)) /\\ (0<=i_0)",
+                                                                    "pattern": "\\Elsl011$shift" },
+                                                                  "children": 
+                                                                    { "Witness": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ] } } ] } } ],
+                  "Mask": [ { "prover": "qed", "verdict": "valid" } ] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/oracle/modmask.0.session/script/check_lemma_and_modulo_us_255.json b/src/plugins/wp/tests/wp_tip/oracle/modmask.0.session/script/check_lemma_and_modulo_us_255.json
new file mode 100644
index 00000000000..0232433c576
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle/modmask.0.session/script/check_lemma_and_modulo_us_255.json
@@ -0,0 +1,14 @@
+[ { "header": "Mod-Mask", "tactic": "Wp.modmask",
+    "params": { "Wp.modmask.revert": false },
+    "select": { "select": "inside-goal", "occur": 0,
+                "target": "us_0 mod 256", "pattern": "%$us256" },
+    "children": { "Mask Guard": [ { "header": "Definition",
+                                    "tactic": "Wp.unfold", "params": {},
+                                    "select": { "select": "clause-step",
+                                                "at": 0, "kind": "have",
+                                                "target": "(is_uint16 us_0)",
+                                                "pattern": "is_uint16$us" },
+                                    "children": { "Unfold 'is_uint16'": 
+                                                    [ { "prover": "qed",
+                                                        "verdict": "valid" } ] } } ],
+                  "Mask": [ { "prover": "qed", "verdict": "valid" } ] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/oracle/modmask.1.res.oracle b/src/plugins/wp/tests/wp_tip/oracle/modmask.1.res.oracle
new file mode 100644
index 00000000000..dd1cd3edf7d
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle/modmask.1.res.oracle
@@ -0,0 +1,79 @@
+# frama-c -wp [...]
+[kernel] Parsing modmask.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] 2 goals scheduled
+[wp:script:allgoals] 
+  Lemma and_modulo_u:
+  Prove: let x_0 = (lsl 1 shift_0) in
+         (0<=shift_0) -> (shift_0<=31) -> (is_uint32 us_0)
+         -> ((us_0 mod x_0)=(land us_0 (x_0-1)))
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  Lemma and_modulo_us_255:
+  Prove: (is_uint16 us_0) -> ((us_0 mod 256)=(land 255 us_0))
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_check_lemma_and_modulo_u subgoal:
+  
+  Goal Wp.Tactical.typed_check_lemma_and_modulo_u-0 (generated):
+  Let x = lsl(1, shift_0).
+  Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). }
+  Prove: (0 <= us_0) /\ (0 < x) /\ (exists i : Z. (lsl(1, i) = x) /\ (0 <= i)).
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_check_lemma_and_modulo_u subgoal:
+  
+  Goal Wp.Tactical.typed_check_lemma_and_modulo_u-1 (generated):
+  Prove: true.
+  Prover Qed returns Valid
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_check_lemma_and_modulo_us_255 subgoal:
+  
+  Goal Wp.Tactical.typed_check_lemma_and_modulo_us_255-0 (generated):
+  Assume { Have: is_uint16(us_0). }
+  Prove: 0 <= us_0.
+  
+  ------------------------------------------------------------
+[wp] [Script] Goal typed_check_lemma_and_modulo_us_255 : Valid
+[wp:script:allgoals] 
+  typed_check_lemma_and_modulo_us_255 subgoal:
+  
+  Goal Wp.Tactical.typed_check_lemma_and_modulo_us_255-1 (generated):
+  Prove: true.
+  Prover Qed returns Valid
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_check_lemma_and_modulo_u subgoal:
+  
+  Goal Wp.Tactical.typed_check_lemma_and_modulo_u-2 (generated):
+  Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). }
+  Prove: 0 <= us_0.
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_check_lemma_and_modulo_u subgoal:
+  
+  Goal Wp.Tactical.typed_check_lemma_and_modulo_u-3 (generated):
+  Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). }
+  Prove: 0 < lsl(1, shift_0).
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_check_lemma_and_modulo_u subgoal:
+  
+  Goal Wp.Tactical.typed_check_lemma_and_modulo_u-4 (generated):
+  Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). }
+  Prove: exists i : Z. (lsl(1, i) = lsl(1, shift_0)) /\ (0 <= i).
+  
+  ------------------------------------------------------------
+[wp] [Script] Goal typed_check_lemma_and_modulo_u : Valid
+[wp] Proved goals:    2 / 2
+  Qed:             0 
+  Script:          2
+[wp] Updated session with 2 new valid scripts.
diff --git a/src/plugins/wp/tests/wp_tip/oracle/modmask.1.session/script/check_lemma_and_modulo_u.json b/src/plugins/wp/tests/wp_tip/oracle/modmask.1.session/script/check_lemma_and_modulo_u.json
new file mode 100644
index 00000000000..7d2e4b041e8
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle/modmask.1.session/script/check_lemma_and_modulo_u.json
@@ -0,0 +1,162 @@
+[ { "header": "Mod-Mask", "tactic": "Wp.modmask",
+    "params": { "Wp.modmask.revert": false },
+    "select": { "select": "inside-goal", "occur": 0,
+                "target": "(land us_0 ((lsl 1 shift_0)-1))",
+                "pattern": "land$us+-1lsl1$shift" },
+    "children": { "Mod Guard": [ { "header": "Split", "tactic": "Wp.split",
+                                   "params": {},
+                                   "select": { "select": "clause-goal",
+                                               "target": "let x_0 = (lsl 1 shift_0) in\n(0<=us_0) /\\ (0<x_0) /\\ (exists i_0:int.\n                         ((lsl 1 i_0)=x_0) /\\ (0<=i_0))",
+                                               "pattern": "&<=<\\E0$us0lsl1$shiftlsl011$shift" },
+                                   "children": { "Goal 1/3": [ { "header": "Definition",
+                                                                 "tactic": "Wp.unfold",
+                                                                 "params": {},
+                                                                 "select": 
+                                                                   { "select": "clause-step",
+                                                                    "at": 2,
+                                                                    "kind": "have",
+                                                                    "target": "(is_uint32 us_0)",
+                                                                    "pattern": "is_uint32$us" },
+                                                                 "children": 
+                                                                   { "Unfold 'is_uint32'": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ] } } ],
+                                                 "Goal 2/3": [ { "header": "Range",
+                                                                 "tactic": "Wp.range",
+                                                                 "params": 
+                                                                   { "inf": 0,
+                                                                    "sup": 31 },
+                                                                 "select": 
+                                                                   { "select": "inside-goal",
+                                                                    "occur": 0,
+                                                                    "target": "shift_0",
+                                                                    "pattern": "$shift" },
+                                                                 "children": 
+                                                                   { "Lower 0": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 0": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 1": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 2": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 3": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 4": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 5": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 6": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 7": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 8": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 9": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 10": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 11": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 12": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 13": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 14": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 15": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 16": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 17": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 18": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 19": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 20": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 21": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 22": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 23": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 24": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 25": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 26": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 27": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 28": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 29": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 30": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Value 31": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ],
+                                                                    "Upper 31": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ] } } ],
+                                                 "Goal 3/3": [ { "header": "Instance",
+                                                                 "tactic": "Wp.instance",
+                                                                 "params": 
+                                                                   { "P1": 
+                                                                    { "select": "inside-goal",
+                                                                    "occur": 0,
+                                                                    "target": "shift_0",
+                                                                    "pattern": "$shift" },
+                                                                    "P2": null,
+                                                                    "P3": null,
+                                                                    "P4": null,
+                                                                    "P5": null,
+                                                                    "P6": null,
+                                                                    "P7": null,
+                                                                    "P8": null,
+                                                                    "P9": null,
+                                                                    "P10": null },
+                                                                 "select": 
+                                                                   { "select": "clause-goal",
+                                                                    "target": "exists i_0:int. ((lsl 1 i_0)=(lsl 1 shift_0)) /\\ (0<=i_0)",
+                                                                    "pattern": "\\Elsl011$shift" },
+                                                                 "children": 
+                                                                   { "Witness": 
+                                                                    [ { "prover": "qed",
+                                                                    "verdict": "valid" } ] } } ] } } ],
+                  "Mod": [ { "prover": "qed", "verdict": "valid" } ] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/oracle/modmask.1.session/script/check_lemma_and_modulo_us_255.json b/src/plugins/wp/tests/wp_tip/oracle/modmask.1.session/script/check_lemma_and_modulo_us_255.json
new file mode 100644
index 00000000000..a56490bac7a
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle/modmask.1.session/script/check_lemma_and_modulo_us_255.json
@@ -0,0 +1,14 @@
+[ { "header": "Mod-Mask", "tactic": "Wp.modmask",
+    "params": { "Wp.modmask.revert": false },
+    "select": { "select": "inside-goal", "occur": 0,
+                "target": "(land 255 us_0)", "pattern": "land255$us" },
+    "children": { "Mod Guard": [ { "header": "Definition",
+                                   "tactic": "Wp.unfold", "params": {},
+                                   "select": { "select": "clause-step",
+                                               "at": 0, "kind": "have",
+                                               "target": "(is_uint16 us_0)",
+                                               "pattern": "is_uint16$us" },
+                                   "children": { "Unfold 'is_uint16'": 
+                                                   [ { "prover": "qed",
+                                                       "verdict": "valid" } ] } } ],
+                  "Mod": [ { "prover": "qed", "verdict": "valid" } ] } } ]
-- 
GitLab