source: CIVL/examples/focus/matMult.cvl

main
Last change on this file was f0e5dea, checked in by Alex Wilton <awilton@…>, 2 months ago

Enhanced matrix multiplication focus example to require no bounds

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

  • Property mode set to 100644
File size: 880 bytes
Line 
1#pragma CIVL ACSL
2typedef double T;
3$input int B1, B2, B3, N1, N2, N3;
4$assume(1<=N1 && N1<=B1 && 1<=N2 && N2<=B2 && 1<=N3 && N3<=B3);
5$input T A[N1][N2], B[N2][N3];
6T C[N1][N3];
7
8void mul(T a[][], T b[][], T c[][], int n1, int n2, int n3) {
9 /*@ loop assigns c[0..n1-1][0..n3-1];
10 @ focus I | c[I][0..n3-1];
11 @*/
12 for (int i=0; i<n1; i++) {
13 /*@ loop assigns c[i][0..n3-1];
14 @ focus J | c[i][J];
15 @*/
16 for (int j=0; j<n3; j++) {
17 T sum = (T)0;
18 /*@ loop invariant 0 <= k <= n2;
19 @ loop invariant sum == \sum(0, k-1, \lambda int t; a[i][t]*b[t][j]);
20 @*/
21 for (int k=0; k<n2; k++) {
22 sum += a[i][k]*b[k][j];
23 }
24 c[i][j] = sum;
25 }
26 }
27}
28
29int main(void) {
30 mul(A, B, C, N1, N2, N3);
31 //@ focus I J;
32 $assert($forall(int i : 0 .. N1-1; int j : 0 .. N3-1) C[i][j] == $sum(int k: 0..N2-1) A[i][k]*B[k][j]);
33}
Note: See TracBrowser for help on using the repository browser.