| 1 | #pragma CIVL ACSL
|
|---|
| 2 | #include "loop_bounds.cvl"
|
|---|
| 3 | $input int ni,nj,bi,bj;
|
|---|
| 4 | $assume(0<bi && bi<ni && 0<bj && bj<nj);
|
|---|
| 5 | $input double uin[ni][nj];
|
|---|
| 6 | $input double u1[ni][nj];
|
|---|
| 7 | double u2[ni][nj];
|
|---|
| 8 | instantiate_theory_loop_bounds(ni,bi,1);
|
|---|
| 9 | instantiate_theory_loop_bounds(nj,bj,1);
|
|---|
| 10 |
|
|---|
| 11 | int main() {
|
|---|
| 12 | int i=0,j=1,ir,jr,ib,jb;
|
|---|
| 13 |
|
|---|
| 14 | $assume($forall (int i : 0 .. ni-1) u1[i][0] == 0 && u1[i][nj-1] == 0);
|
|---|
| 15 | $assume($forall (int j : 0 .. nj-1) u1[0][j] == 0 && u1[ni-1][j] == 0);
|
|---|
| 16 | $assume($forall (int i : 1 .. ni-2) ($forall (int j : 1 .. nj-2) u1[i][j] == uin[i][j] * uin[i][j]));
|
|---|
| 17 |
|
|---|
| 18 | /*@ loop invariant in_range(i, 1, ni-bi, bi);
|
|---|
| 19 | @ loop invariant 1 <= j <= loop_max(1, nj-bj, bj); // frame condition for j
|
|---|
| 20 | @ loop invariant \forall int t; 1 <= t < i ==>
|
|---|
| 21 | @ (\forall int j0; 1 <= j0 < loop_max(1, nj-bj, bj) ==>
|
|---|
| 22 | @ u2[t][j0] == uin[t][j0]*uin[t][j0]);
|
|---|
| 23 | @ loop assigns i, j, ib, jb, u2[1 .. ni - 2][1 .. nj - 2];
|
|---|
| 24 | @*/
|
|---|
| 25 | for(i=1;i<ni-bi;i=i+bi) {
|
|---|
| 26 | /*@ loop invariant in_range(j, 1, nj-bj,bj);
|
|---|
| 27 | @ loop invariant \forall int t; i <= t < i + bi ==>
|
|---|
| 28 | @ (\forall int j0; 1 <= j0 < j ==>
|
|---|
| 29 | @ u2[t][j0] == uin[t][j0]*uin[t][j0]);
|
|---|
| 30 | @ loop assigns j, ib, jb, u2[i .. i + bi - 1][1 .. nj - 2];
|
|---|
| 31 | @*/
|
|---|
| 32 | for(j=1;j<nj-bj;j=j+bj) {
|
|---|
| 33 | /*@ loop invariant 0 <= ib <= bi;
|
|---|
| 34 | @ loop invariant \forall int t; i <= t < i + ib ==>
|
|---|
| 35 | @ (\forall int k; j <= k < j + bj ==> u2[t][k] == uin[t][k]*uin[t][k]);
|
|---|
| 36 | @ loop assigns ib, jb, u2[i .. (i + bi - 1)][j .. (j + bj - 1)];
|
|---|
| 37 | @*/
|
|---|
| 38 | for(ib=0;ib<bi;ib++) {
|
|---|
| 39 | /*@ loop invariant 0 <= jb <= bj;
|
|---|
| 40 | @ loop invariant \forall int k; j <= k < j + jb ==> u2[i+ib][k] == uin[i+ib][k]*uin[i+ib][k];
|
|---|
| 41 | @ loop assigns jb, u2[i + ib][j .. (j + bj - 1)];
|
|---|
| 42 | @*/
|
|---|
| 43 | for(jb=0;jb<bj;jb++) {
|
|---|
| 44 | u2[i+ib][j+jb] = uin[i+ib][j+jb]*uin[i+ib][j+jb];
|
|---|
| 45 | }
|
|---|
| 46 | }
|
|---|
| 47 | }
|
|---|
| 48 | }
|
|---|
| 49 | $assert(i == loop_max(1,ni-bi,bi));
|
|---|
| 50 | $assert($forall (int i0 | 1 <= i0 && i0 < loop_max(1,ni-bi, bi))
|
|---|
| 51 | $forall (int j0 | 1 <= j0 && j0 < j) u2[i0][j0] == uin[i0][j0]*uin[i0][j0]);
|
|---|
| 52 |
|
|---|
| 53 | // remainder i
|
|---|
| 54 | /*@ loop invariant i <= ir <= ni-1;
|
|---|
| 55 | @ loop invariant \forall int t; i <= t < ir ==>
|
|---|
| 56 | @ (\forall int k; 1 <= k < loop_max(1, nj - bj, bj) ==>
|
|---|
| 57 | @ u2[t][k] == uin[t][k]*uin[t][k]);
|
|---|
| 58 | @ loop assigns ir, jr, jb, u2[i .. ni - 2][1 .. nj - 2];
|
|---|
| 59 | @*/
|
|---|
| 60 | for(ir=i;ir<ni-1;ir++) {
|
|---|
| 61 | /*@ loop invariant in_range(jr, 1, nj-bj, bj);
|
|---|
| 62 | @ loop invariant \forall int t; 1 <= t < jr ==>
|
|---|
| 63 | @ u2[ir][t] == uin[ir][t]*uin[ir][t];
|
|---|
| 64 | @ loop assigns jr, jb, u2[ir][1 .. nj - 2];
|
|---|
| 65 | @*/
|
|---|
| 66 | for(jr=1;jr<nj-bj;jr=jr + bj) {
|
|---|
| 67 | /*@ loop invariant 0 <= jb <= bj;
|
|---|
| 68 | @ loop invariant \forall int t; jr <= t < jr + jb ==>
|
|---|
| 69 | @ u2[ir][t] == uin[ir][t]*uin[ir][t];
|
|---|
| 70 | @ loop assigns jb, u2[ir][jr .. jr+bj-1];
|
|---|
| 71 | @*/
|
|---|
| 72 | for(jb=0;jb<bj;jb++) {
|
|---|
| 73 | u2[ir][jr+jb] = uin[ir][jr+jb]*uin[ir][jr+jb];
|
|---|
| 74 | }
|
|---|
| 75 | }
|
|---|
| 76 | }
|
|---|
| 77 |
|
|---|
| 78 | $assert($forall (int i0 | loop_max(1,ni-bi,bi) <= i0 && i0 < ni - 1)
|
|---|
| 79 | $forall (int j0 | 1 <= j0 && j0 < j) u2[i0][j0] == uin[i0][j0] * uin[i0][j0]);
|
|---|
| 80 |
|
|---|
| 81 | // remainder j
|
|---|
| 82 | /*@ loop invariant j <= jr <= nj-1;
|
|---|
| 83 | @ loop invariant \forall int t; 1 <= t < loop_max(1, ni - bi, bi) ==>
|
|---|
| 84 | @ (\forall int k; j <= k < jr ==>
|
|---|
| 85 | @ u2[t][k] == uin[t][k]*uin[t][k]);
|
|---|
| 86 | @ loop assigns jr, ir, ib, u2[1 .. ni - 2][j .. nj-2];
|
|---|
| 87 | @*/
|
|---|
| 88 | for(jr = j; jr < nj-1; jr++) {
|
|---|
| 89 | /*@ loop invariant in_range(ir, 1, ni-bi, bi);
|
|---|
| 90 | @ loop invariant \forall int t; 1 <= t < ir ==>
|
|---|
| 91 | @ u2[t][jr] == uin[t][jr]*uin[t][jr];
|
|---|
| 92 | @ loop assigns ir, ib, u2[1 .. ni - 2][jr];
|
|---|
| 93 | @*/
|
|---|
| 94 | for(ir = 1; ir < ni-bi; ir+=bi) {
|
|---|
| 95 | /*@ loop invariant 0 <= ib <= bi;
|
|---|
| 96 | @ loop invariant \forall int t; ir <= t < ir + ib ==>
|
|---|
| 97 | @ u2[t][jr] == uin[t][jr]*uin[t][jr];
|
|---|
| 98 | @ loop assigns ib, u2[ir .. ir + bi - 1][jr];
|
|---|
| 99 | @*/
|
|---|
| 100 | for(ib = 0; ib < bi; ib++) {
|
|---|
| 101 | u2[ir+ib][jr] = uin[ir+ib][jr]*uin[ir+ib][jr];
|
|---|
| 102 | }
|
|---|
| 103 | }
|
|---|
| 104 | }
|
|---|
| 105 |
|
|---|
| 106 | $assert($forall (int i0 | 1 <= i0 && i0 < loop_max(1, ni-bi, bi))
|
|---|
| 107 | $forall (int j0 | j <= j0 && j0 < nj - 1) u2[i0][j0] == uin[i0][j0] * uin[i0][j0]);
|
|---|
| 108 |
|
|---|
| 109 | // remainder ij
|
|---|
| 110 |
|
|---|
| 111 | /*@ loop invariant i <= ir <= ni-1;
|
|---|
| 112 | @ loop invariant \forall int t; i <= t < ir ==>
|
|---|
| 113 | @ (\forall int k; j <= k < nj-1 ==> u2[t][k] == uin[t][k]*uin[t][k]);
|
|---|
| 114 | @ loop assigns ir, jr, u2[i .. ni-2][j .. nj-2];
|
|---|
| 115 | @*/
|
|---|
| 116 | for(ir = i;ir < ni-1;ir++) {
|
|---|
| 117 | /*@ loop invariant j <= jr <= nj-1;
|
|---|
| 118 | @ loop invariant \forall int t; j <= t < jr ==> u2[ir][t] == uin[ir][t]*uin[ir][t];
|
|---|
| 119 | @ loop assigns jr, u2[ir][j .. nj-2];
|
|---|
| 120 | @*/
|
|---|
| 121 | for(jr = j;jr < nj-1;jr++) {
|
|---|
| 122 | u2[ir][jr] = uin[ir][jr]*uin[ir][jr];
|
|---|
| 123 | }
|
|---|
| 124 | }
|
|---|
| 125 |
|
|---|
| 126 | $assert($forall (int i0 | i <= i0 && i0 < ni-1)
|
|---|
| 127 | $forall (int j0 | j <= j0 && j0 < nj-1) u2[i0][j0] == uin[i0][j0]*uin[i0][j0]);
|
|---|
| 128 |
|
|---|
| 129 | // final assertion:
|
|---|
| 130 | $assert($forall (int i : 0 .. ni-1) $forall (int j : 0 .. nj-1) u1[i][j] != u2[i][j]);
|
|---|
| 131 | }
|
|---|