source: CIVL/examples/loop_invariants/Jans_example/invariant_arb_loop1.cvl@ 8dfcbb9

1.23 2.0 main test-branch
Last change on this file since 8dfcbb9 was fbff1ea6, checked in by Ziqing Luo <ziqing@…>, 8 years ago

add a carved out loop invariant example from Jan's new example

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@4977 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 4.6 KB
Line 
1#include <stdio.h>
2#ifdef _CIVL
3#include <civlc.cvh>
4#pragma CIVL ACSL
5#endif
6
7#define UP_ONE_REM(up, step) ((up) + (1 - (up) % (step)))
8#define UP_MUL_REM(up, step) ((up) - ((up) % (step) - 1) + (step))
9
10#ifdef _CIVL
11$input int ni,nj;
12$input int bi,bj; //TODO: bounds of block sizes ?
13$assume(ni > 1);
14$assume(nj > 1);
15$assume(bi > 0);
16$assume(bj > 0);
17$input double uin[ni][nj];
18#endif
19double u1[ni][nj];
20double u2[ni][nj];
21
22int main(int argc, char** argv) {
23 int i,j,ir,jr,ib,jb;
24
25 /*
26 for(i=0;i<ni;i++) {
27 for(j=0;j<nj;j++) {
28 u1[i][j] = 0;
29 u2[i][j] = 0;
30 }
31 }
32
33 // straightforward loop nest
34 for(i=1;i<ni-1;i++) {
35 for(j=1;j<nj-1;j++) {
36 u1[i][j] = uin[i][j]*uin[i][j];
37 }
38 }
39 */
40 $havoc(&u1);
41 $havoc(&u2);
42 $assume($forall (int i : 0 .. ni-1) u1[i][0] == 0 && u1[i][nj-1] == 0 && u2[i][0] == 0 && u2[i][nj-1] == 0);
43 $assume($forall (int j : 0 .. nj-1) u1[0][j] == 0 && u1[ni-1][j] == 0 && u2[0][j] == 0 && u2[ni-1][j] == 0);
44 $assume($forall (int i : 1 .. ni-2) ($forall (int j : 1 .. nj-2) u1[i][j] == uin[i][j] * uin[i][j]));
45
46 if (ni > 2) {
47 i = ni - 1;
48 if (nj > 2)
49 j = nj - 1;
50 else
51 j = 1;
52 } else {
53 i = 1;
54 j = nj;
55 }
56
57 /*@ predicate noRemain(int upper, int step) = upper % step == 1;
58 @
59 @ predicate oneRemain(int upper, int step) = upper % step == 0;
60 @*/
61
62 $choose {
63 $when (1) $assume(noRemain(ni-bi, bi));
64 $when (1) $assume(oneRemain(ni-bi, bi));
65 $when (1) $assume(!noRemain(ni-bi, bi) && !oneRemain(ni-bi, bi));
66 }
67
68 $choose {
69 $when (1) $assume(noRemain(nj-bj, bj));
70 $when (1) $assume(oneRemain(nj-bj, bj));
71 $when (1) $assume(!noRemain(nj-bj, bj) && !oneRemain(nj-bj, bj));
72 }
73
74 // blocked loop nest
75
76 /*@ loop invariant noRemain(ni-bi, bi) ==> (1 <= i <= ni-bi);
77 @ loop invariant oneRemain(ni-bi, bi) ==> 1 <= i <= UP_ONE_REM(ni-bi, bi);
78 @ loop invariant (!noRemain(ni-bi, bi) && !oneRemain(ni-bi, bi)) ==> 1 <= i <= UP_MUL_REM(ni-bi,bi);
79 @ loop invariant i % bi == 1;
80 @ loop invariant noRemain(nj-bj, bj) ==>
81 @ (\forall int t; 1 <= t < i ==>
82 @ (\forall int k; 1 <= k < nj-bj ==>
83 @ u2[t][k] == uin[t][k]*uin[t][k]));
84 @ loop invariant oneRemain(nj-bj, bj) ==>
85 @ (\forall int t; 1 <= t < i ==>
86 @ (\forall int k; 1 <= k < UP_ONE_REM(nj-bj, bj) ==>
87 @ u2[t][k] == uin[t][k]*uin[t][k]));
88 @ loop invariant !oneRemain(nj-bj, bj) && !noRemain(nj-bj, bj) ==>
89 @ (\forall int t; 1 <= t < i ==>
90 @ (\forall int k; 1 <= k < UP_MUL_REM(nj-bj, bj) ==>
91 @ u2[t][k] == uin[t][k]*uin[t][k]));
92 @ loop assigns i, j, ib, jb, u2[1 .. ni-2][1 .. nj-2];
93 @*/
94 for(i=1;i<ni-bi;i=i+bi) {
95 /*@ loop invariant noRemain(nj-bj, bj) ==> 1 <= j <= nj-bj;
96 @ loop invariant oneRemain(nj-bj, bj) ==> 1 <= j <= UP_ONE_REM(nj-bj,bj);
97 @ loop invariant !noRemain(nj-bj, bj) && !oneRemain(nj-bj, bj) ==> 1 <= j <= UP_MUL_REM(nj-bj,bj);
98 @ loop invariant j % bj == 1;
99 @ loop invariant noRemain(nj-bj, bj) ==>
100 @ (\forall int t; 0 <= t < bi ==>
101 @ (\forall int k; 1 <= k < nj-bj ==>
102 @ u2[i+t][k] == uin[i+t][k]*uin[i+t][k]));
103 @ loop invariant oneRemain(nj-bj, bj) ==>
104 @ (\forall int t; 0 <= t < bi ==>
105 @ (\forall int k; 1 <= k < UP_ONE_REM(nj-bj, bj) ==>
106 @ u2[i+t][k] == uin[i+t][k]*uin[i+t][k]));
107 @ loop invariant !noRemain(nj-bj, bj) && !oneRemain(nj-bj, bj) ==>
108 @ (\forall int t; 0 <= t < bi ==>
109 @ (\forall int k; 1 <= k < UP_MUL_REM(nj-bj, bj) ==>
110 @ u2[i+t][k] == uin[i+t][k]*uin[i+t][k]));
111 @ loop assigns j, ib, jb, u2[i .. i + bi - 1][1 .. nj - 2];
112 @*/
113 for(j=1;j<nj-bj;j=j+bj) {
114 /*@ loop invariant 0 <= ib <= bi;
115 @ loop invariant \forall int t; 0 <= t < ib ==>
116 @ (\forall int k; 0 <= k < bj ==> u2[i+t][j+k] == uin[i+t][j+k]*uin[i+t][j+k]);
117 @ loop assigns ib, jb, u2[i .. (i + bi - 1)][j .. (j + bj - 1)];
118 @*/
119 for(ib=0;ib<bi;ib++) {
120 /*@ loop invariant 0 <= jb <= bj;
121 @ loop invariant \forall int k; 0 <= k < jb ==> u2[i+ib][j+k] == uin[i+ib][j+k]*uin[i+ib][j+k];
122 @ loop assigns jb, u2[i + ib][j .. (j + bj - 1)];
123 @*/
124 for(jb=0;jb<bj;jb++) {
125 u2[i+ib][j+jb] = uin[i+ib][j+jb]*uin[i+ib][j+jb];
126 }
127 }
128 }
129 }
130}
Note: See TracBrowser for help on using the repository browser.