Example 3, SVD

In this example, observe that the for-loop statements use a step size other than 1 but 2. Consequently, a lattice is introduced in this program. In the single assignment program, this will introduce many DIV-statements. The introduction of a lattice introduces a large increase in complexity of the result.

To understand how MatParser works and how to interpret the Single Assignment Programs, have a look at the documentation for MatParser.

Bart Kienhuis
[PDF]``MatParser: An array dataflow analysis compiler.'',
Technical Report UCB/ERL M00/9.

This paper presents MatParser, which is an array analysis compiler that automatically converts an affine nested loop program into a single assignment program. The nested loop programs may contain non-linear operators like div/mod/floor/ceil and stepsizes other than one. The focus of this article is on the software architecture used in MatParser to resolve the data dependencies. Finding that two variables are dependent on each other and at which iteration, is a very computational intensive procedure. MatParser employs a particular linear programming technique to find the data-dependencies, based on parametric integer programming (PIP) as proposed by Paul Feautrier. To appreciate the implementation of MatParser, we will explain in this paper in enough detail the basics of the linear programming technique used.

Singular Value Decomposition

%parameter M 1 10;
%parameter N 1 5;

%matlab
N = 100;
M = 6;
a = magic( M );
fprintf(1,'\n --- MYSVD --- \n\n');
%end

for j = 1:1:N,
  for i = 1:1:N,
    [A(j,i)] = _ReadMatrix_Zeros_64x64();
  end
end

for i = 1:1:N,
    [ phi(i) ] = _ReadMatrix_Zeros_64();
end

for i = 1:1:N,
    [ theta(i) ] = _ReadMatrix_Zeros_64();
end


for stage = 1 : 1 : N,
	for i = 1 : 2 : M-1,
		[phi(i),thetha(i)] = vector(a(i,i), a(i,i+1), a(i+1,i), a(i+1,i+1));
	end

	for i = 1 : 2 : M-1,
		for j = 1 : 1 : M,
			[ a(i,j), a(i+1,j) ] = phiSAC(phi(i), a(i,j), a(i+1,j));
		end
	end
	
	for i = 1 : 2 : M-1,
		for j = 1 : 1 : M,
			[ a(j,i), a(j,i+1) ] = thethaSAC(a(j,i), a(j,i+1), thetha(i));
		end
	end

	for i = 2 : 2 : M-2,
	  [phi(i),thetha(i)] = vector(a(i,i), a(i,i+1), a(i+1,i), a(i+1,i+1));
	end

	for i = 2 : 2 : M-2,
		for j = 1 : 1 : M,
			[ a(i,j), a(i+1,j) ] = phiSAC(phi(i), a(i,j), a(i+1,j));
		end
	end
	for i = 2 : 2 : M-2,
		for j = 1 : 1 : M,
			[ a(j,i), a(j,i+1) ] = thethaSAC(a(j,i), a(j,i+1), thetha(i));
		end
	end
end

for x = 1 : 1 : M,
	for y = 1 : 1 : M,
		[Sink(x,y)] = Pass(a(x,y));
	end
end

%matlab
disp( Sink );
%end

 

Single Assignment Program

%% SAP Generated for HiPars version 3.0 Compliance 
%parameter M 1 10;
%parameter N 1 5;

%matlab
N = 100;
M = 6;
a = magic( M );
fprintf(1,'\n --- MYSVD --- \n\n');
%end

for j = 1 : 1 : N,
   for i = 1 : 1 : N,
      [ out_0 ] = _ReadMatrix_Zeros_64x64(  );
      [ A_1( j, i) ]  = opd( out_0 );

   end
end
for i = 1 : 1 : N,
   [ out_0 ] = _ReadMatrix_Zeros_64(  );
   [ phi_1( i) ]  = opd( out_0 );

end
for i = 1 : 1 : N,
   [ out_0 ] = _ReadMatrix_Zeros_64(  );
   [ theta_1( i) ]  = opd( out_0 );

end
for stage = 1 : 1 : N,
   for i = 1 : 2 : M-1,
      
      
      %% SAP Generated for HiPars version 3.0 Compliance 
      if stage-2>= 0, 
         d1 = div(i+1,2);
         if -i+2*d1-1>= 0, 
            if i-2>= 0, 
               d2 = div(i,2);
               if i-2*d2-1>= 0, 
                  [ in_0 ] = ipd( a_8( stage-1, 2*d1-2, i ) );
               end
            else %% if -i+1 >= 0
               [ in_0 ] = ipd( a_3( stage-1, 2*d1-1, i ) );
            end
         end
      else %% if -stage+1 >= 0
         [ in_0 ] = ipd( a( i, i ) );
      end


      
      
      %% SAP Generated for HiPars version 3.0 Compliance 
      if stage-2>= 0, 
         d9 = div(i+1,2);
         if -i+2*d9-1>= 0, 
            if i-2>= 0, 
               d10 = div(i,2);
               if i-2*d10-1>= 0, 
                  if M-i-2>= 0, 
                     if i-2*d10-1>= 0, 
                        if M-i-3>= 0, 
                           [ in_1 ] = ipd( a_7( stage-1, 2*d9, i ) );
                        else %% if -M+i+2 >= 0
                           [ in_1 ] = ipd( a_6( stage-1, 2*d9-2, i+1 ) );
                        end
                     end
                  else %% if -M+i+1 >= 0
                     if -i+2*d9-1>= 0, 
                        [ in_1 ] = ipd( a_6( stage-1, 2*d9-2, i+1 ) );
                     end
                  end
               end
            else %% if -i+1 >= 0
               if M-i-2>= 0, 
                  d11 = div(i,2);
                  if i-2*d11-1>= 0, 
                     if M-i-3>= 0, 
                        [ in_1 ] = ipd( a_7( stage-1, 2*d9, i ) );
                     else %% if -M+i+2 >= 0
                        [ in_1 ] = ipd( a_4( stage-1, 2*d9-1, i ) );
                     end
                  end
               else %% if -M+i+1 >= 0
                  [ in_1 ] = ipd( a_4( stage-1, 2*d9-1, i ) );
               end
            end
         end
      else %% if -stage+1 >= 0
         [ in_1 ] = ipd( a( i, i+1 ) );
      end


      
      
      %% SAP Generated for HiPars version 3.0 Compliance 
      if stage-2>= 0, 
         if M-i-2>= 0, 
            d17 = div(i,2);
            if i-2*d17-1>= 0, 
               d18 = div(i+1,2);
               if -i+2*d18-1>= 0, 
                  if i-2>= 0, 
                     [ in_2 ] = ipd( a_8( stage-1, 2*d18-2, i+1 ) );
                  else %% if -i+1 >= 0
                     if M-i-3>= 0, 
                        [ in_2 ] = ipd( a_5( stage-1, 2*d18, i ) );
                     else %% if -M+i+2 >= 0
                        [ in_2 ] = ipd( a_3( stage-1, 2*d18-1, i+1 ) );
                     end
                  end
               end
            end
         else %% if -M+i+1 >= 0
            d18 = div(i+1,2);
            if -i+2*d18-1>= 0, 
               if i-2>= 0, 
                  d20 = div(i,2);
                  if i-2*d20-1>= 0, 
                     [ in_2 ] = ipd( a_8( stage-1, 2*d18-2, i+1 ) );
                  end
               else %% if -i+1 >= 0
                  [ in_2 ] = ipd( a_3( stage-1, 2*d18-1, i+1 ) );
               end
            end
         end
      else %% if -stage+1 >= 0
         [ in_2 ] = ipd( a( i+1, i ) );
      end


      
      
      %% SAP Generated for HiPars version 3.0 Compliance 
      if stage-2>= 0, 
         if M-i-2>= 0, 
            d25 = div(i,2);
            if i-2*d25-1>= 0, 
               d26 = div(i+1,2);
               if -i+2*d26-1>= 0, 
                  if M-i-3>= 0, 
                     [ in_3 ] = ipd( a_7( stage-1, 2*d26, i+1 ) );
                  else %% if -M+i+2 >= 0
                     [ in_3 ] = ipd( a_4( stage-1, 2*d26-1, i+1 ) );
                  end
               end
            end
         else %% if -M+i+1 >= 0
            d26 = div(i+1,2);
            if -i+2*d26-1>= 0, 
               [ in_3 ] = ipd( a_4( stage-1, 2*d26-1, i+1 ) );
            end
         end
      else %% if -stage+1 >= 0
         [ in_3 ] = ipd( a( i+1, i+1 ) );
      end


      [ out_0, out_1 ] = vector( in_0, in_1, in_2, in_3 );
      [ phi_2( stage, i) ]  = opd( out_0 );

      [ thetha_1( stage, i) ]  = opd( out_1 );

   end
   for i = 1 : 2 : M-1,
      for j = 1 : 1 : M,
         
         
         %% SAP Generated for HiPars version 3.0 Compliance 
         if N-i>= 0, 
            if stage-2>= 0, 
               d33 = div(i+1,2);
               if -i+2*d33-1>= 0, 
                  [ in_0 ] = ipd( phi_2( stage, 2*d33-1 ) );
               end
            else %% if -stage+1 >= 0
               d34 = div(i+1,2);
               if -i+2*d34-1>= 0, 
                  [ in_0 ] = ipd( phi_2( stage, 2*d34-1 ) );
               end
            end
         else %% if -N+i-1 >= 0
            if stage-2>= 0, 
               d33 = div(i+1,2);
               if -i+2*d33-1>= 0, 
                  if i-2>= 0, 
                     [ in_0 ] = ipd( phi_2( stage, 2*d33-1 ) );
                  end
               end
            else %% if -stage+1 >= 0
               d34 = div(i+1,2);
               if -i+2*d34-1>= 0, 
                  [ in_0 ] = ipd( phi_2( stage, 2*d34-1 ) );
               end
            end
         end


         
         
         %% SAP Generated for HiPars version 3.0 Compliance 
         if stage-2>= 0, 
            d36 = div(i+1,2);
            if -i+2*d36-1>= 0, 
               if i-2>= 0, 
                  d37 = div(i,2);
                  if i-2*d37-1>= 0, 
                     if M-j-1>= 0, 
                        d39 = div(j+1,2);
                        if -j+2*d39-1>= 0, 
                           if j-2>= 0, 
                              d40 = div(j,2);
                              if j-2*d40-1>= 0, 
                                 [ in_1 ] = ipd( a_8( stage-1, 2*d39-2, i ) );
                              end
                           else %% if -j+1 >= 0
                              [ in_1 ] = ipd( a_6( stage-1, 2*d36-2, j ) );
                           end
                        else %% if j-2*d39 >= 0
                           if j-2>= 0, 
                              d40 = div(j,2);
                              if -j+2*d40>= 0, 
                                 if M-i-2>= 0, 
                                    if M-j-2>= 0, 
                                       [ in_1 ] = ipd( a_7( stage-1, 2*d40, i ) );
                                    else %% if -M+j+1 >= 0
                                       [ in_1 ] = ipd( a_6( stage-1, 2*d36-2, j ) );
                                    end
                                 else %% if -M+i+1 >= 0
                                    [ in_1 ] = ipd( a_7( stage-1, 2*d40, i ) );
                                 end
                              end
                           end
                        end
                     else %% if -M+j >= 0
                        if j-2>= 0, 
                           [ in_1 ] = ipd( a_6( stage-1, 2*d36-2, j ) );
                        end
                     end
                  end
               else %% if -i+1 >= 0
                  if M-j-1>= 0, 
                     d39 = div(j+1,2);
                     if -j+2*d39-1>= 0, 
                        if j-2>= 0, 
                           d40 = div(j,2);
                           if j-2*d40-1>= 0, 
                              [ in_1 ] = ipd( a_8( stage-1, 2*d39-2, i ) );
                           end
                        else %% if -j+1 >= 0
                           [ in_1 ] = ipd( a_3( stage-1, 2*d39-1, i ) );
                        end
                     else %% if j-2*d39 >= 0
                        if j-2>= 0, 
                           d40 = div(j,2);
                           if -j+2*d40>= 0, 
                              if M-j-2>= 0, 
                                 [ in_1 ] = ipd( a_7( stage-1, 2*d40, i ) );
                              else %% if -M+j+1 >= 0
                                 [ in_1 ] = ipd( a_4( stage-1, 2*d40-1, i ) );
                              end
                           end
                        end
                     end
                  else %% if -M+j >= 0
                     if j-2>= 0, 
                        d40 = div(j,2);
                        if -j+2*d40>= 0, 
                           if -M+j+1>= 0, 
                              [ in_1 ] = ipd( a_4( stage-1, 2*d40-1, i ) );
                           end
                        else %% if j-2*d40-1 >= 0
                           if -M+j+1>= 0, 
                              [ in_1 ] = ipd( a_1( stage-1, 2*d36-1, j ) );
                           end
                        end
                     end
                  end
               end
            end
         else %% if -stage+1 >= 0
            [ in_1 ] = ipd( a( i, j ) );
         end


         
         
         %% SAP Generated for HiPars version 3.0 Compliance 
         if stage-2>= 0, 
            if M-i-2>= 0, 
               d45 = div(i,2);
               if i-2*d45-1>= 0, 
                  d46 = div(i+1,2);
                  if -i+2*d46-1>= 0, 
                     if M-j-1>= 0, 
                        d47 = div(j+1,2);
                        if -j+2*d47-1>= 0, 
                           if j-2>= 0, 
                              d48 = div(j,2);
                              if j-2*d48-1>= 0, 
                                 [ in_2 ] = ipd( a_8( stage-1, 2*d47-2, i+1 ) );
                              end
                           else %% if -j+1 >= 0
                              if M-i-3>= 0, 
                                 [ in_2 ] = ipd( a_5( stage-1, 2*d46, j ) );
                              else %% if -M+i+2 >= 0
                                 [ in_2 ] = ipd( a_3( stage-1, 2*d47-1, i+1 ) );
                              end
                           end
                        else %% if j-2*d47 >= 0
                           if j-2>= 0, 
                              d48 = div(j,2);
                              if -j+2*d48>= 0, 
                                 if M-i-3>= 0, 
                                    if i-2>= 0, 
                                       if M-j-2>= 0, 
                                          [ in_2 ] = ipd( a_7( stage-1, 2*d48, i+1 ) );
                                       else %% if -M+j+1 >= 0
                                          [ in_2 ] = ipd( a_5( stage-1, 2*d46, j ) );
                                       end
                                    else %% if -i+1 >= 0
                                       if M-j-2>= 0, 
                                          [ in_2 ] = ipd( a_7( stage-1, 2*d48, i+1 ) );
                                       else %% if -M+j+1 >= 0
                                          [ in_2 ] = ipd( a_5( stage-1, 2*d46, j ) );
                                       end
                                    end
                                 else %% if -M+i+2 >= 0
                                    if i-2>= 0, 
                                       if M-j-2>= 0, 
                                          [ in_2 ] = ipd( a_7( stage-1, 2*d48, i+1 ) );
                                       else %% if -M+j+1 >= 0
                                          [ in_2 ] = ipd( a_4( stage-1, 2*d48-1, i+1 ) );
                                       end
                                    else %% if -i+1 >= 0
                                       [ in_2 ] = ipd( a_4( stage-1, 2*d48-1, i+1 ) );
                                    end
                                 end
                              end
                           end
                        end
                     else %% if -M+j >= 0
                        if j-2>= 0, 
                           d48 = div(j,2);
                           if -j+2*d48>= 0, 
                              [ in_2 ] = ipd( a_5( stage-1, 2*d46, j ) );
                           else %% if j-2*d48-1 >= 0
                              if M-i-3>= 0, 
                                 [ in_2 ] = ipd( a_5( stage-1, 2*d46, j ) );
                              else %% if -M+i+2 >= 0
                                 [ in_2 ] = ipd( a_2( stage-1, 2*d46-1, j ) );
                              end
                           end
                        end
                     end
                  end
               end
            else %% if -M+i+1 >= 0
               d46 = div(i+1,2);
               if -i+2*d46-1>= 0, 
                  if M-j-1>= 0, 
                     d47 = div(j+1,2);
                     if -j+2*d47-1>= 0, 
                        if j-2>= 0, 
                           d48 = div(j,2);
                           if j-2*d48-1>= 0, 
                              if i-2>= 0, 
                                 [ in_2 ] = ipd( a_8( stage-1, 2*d47-2, i+1 ) );
                              end
                           end
                        else %% if -j+1 >= 0
                           [ in_2 ] = ipd( a_3( stage-1, 2*d47-1, i+1 ) );
                        end
                     else %% if j-2*d47 >= 0
                        if j-2>= 0, 
                           d48 = div(j,2);
                           if -j+2*d48>= 0, 
                              if i-2>= 0, 
                                 [ in_2 ] = ipd( a_7( stage-1, 2*d48, i+1 ) );
                              end
                           end
                        end
                     end
                  else %% if -M+j >= 0
                     if j-2>= 0, 
                        d48 = div(j,2);
                        if -j+2*d48>= 0, 
                           [ in_2 ] = ipd( a_4( stage-1, 2*d48-1, i+1 ) );
                        end
                     end
                  end
               end
            end
         else %% if -stage+1 >= 0
            [ in_2 ] = ipd( a( i+1, j ) );
         end


         [ out_0, out_1 ] = phiSAC( in_0, in_1, in_2 );
         [ a_1( stage, i, j) ]  = opd( out_0 );

         [ a_2( stage, i, j) ]  = opd( out_1 );

      end
   end
   for i = 1 : 2 : M-1,
      for j = 1 : 1 : M,
         
         
         %% SAP Generated for HiPars version 3.0 Compliance 
         if stage-2>= 0, 
            if M-j-1>= 0, 
               d53 = div(j+1,2);
               if -j+2*d53-1>= 0, 
                  [ in_0 ] = ipd( a_1( stage, 2*d53-1, i ) );
               else %% if j-2*d53 >= 0
                  if j-2>= 0, 
                     d55 = div(j,2);
                     if -j+2*d55>= 0, 
                        d57 = div(i+1,2);
                        if -i+2*d57-1>= 0, 
                           [ in_0 ] = ipd( a_2( stage, 2*d55-1, i ) );
                        end
                     end
                  end
               end
            else %% if -M+j >= 0
               if j-2>= 0, 
                  d55 = div(j,2);
                  if -j+2*d55>= 0, 
                     d57 = div(i+1,2);
                     if -i+2*d57-1>= 0, 
                        [ in_0 ] = ipd( a_2( stage, 2*d55-1, i ) );
                     end
                  else %% if j-2*d55-1 >= 0
                     d57 = div(i+1,2);
                     if -i+2*d57-1>= 0, 
                        if i-2>= 0, 
                           d58 = div(i,2);
                           if i-2*d58-1>= 0, 
                              if i-2*d58-1>= 0, 
                                 if -M+j+1>= 0, 
                                    if M-i-2>= 0, 
                                       [ in_0 ] = ipd( a_8( stage-1, 2*d57-2, j ) );
                                    end
                                 end
                              end
                           end
                        else %% if -i+1 >= 0
                           if -M+j+1>= 0, 
                              [ in_0 ] = ipd( a_3( stage-1, 2*d57-1, j ) );
                           end
                        end
                     end
                  end
               end
            end
         else %% if -stage+1 >= 0
            if M-j-1>= 0, 
               d54 = div(j+1,2);
               if -j+2*d54-1>= 0, 
                  [ in_0 ] = ipd( a_1( stage, 2*d54-1, i ) );
               else %% if j-2*d54 >= 0
                  if j-2>= 0, 
                     d56 = div(j,2);
                     if -j+2*d56>= 0, 
                        [ in_0 ] = ipd( a_2( stage, 2*d56-1, i ) );
                     end
                  end
               end
            else %% if -M+j >= 0
               if j-2>= 0, 
                  d56 = div(j,2);
                  if -j+2*d56>= 0, 
                     [ in_0 ] = ipd( a_2( stage, 2*d56-1, i ) );
                  else %% if j-2*d56-1 >= 0
                     [ in_0 ] = ipd( a( j, i ) );
                  end
               end
            end
         end


         
         
         %% SAP Generated for HiPars version 3.0 Compliance 
         if stage-2>= 0, 
            if M-j-1>= 0, 
               d64 = div(j+1,2);
               if -j+2*d64-1>= 0, 
                  [ in_1 ] = ipd( a_1( stage, 2*d64-1, i+1 ) );
               else %% if j-2*d64 >= 0
                  if j-2>= 0, 
                     d66 = div(j,2);
                     if -j+2*d66>= 0, 
                        [ in_1 ] = ipd( a_2( stage, 2*d66-1, i+1 ) );
                     end
                  end
               end
            else %% if -M+j >= 0
               if j-2>= 0, 
                  d66 = div(j,2);
                  if -j+2*d66>= 0, 
                     [ in_1 ] = ipd( a_2( stage, 2*d66-1, i+1 ) );
                  else %% if j-2*d66-1 >= 0
                     if M-i-2>= 0, 
                        d68 = div(i,2);
                        if i-2*d68-1>= 0, 
                           d69 = div(i+1,2);
                           if -i+2*d69-1>= 0, 
                              if -M+j+1>= 0, 
                                 if M-i-3>= 0, 
                                    [ in_1 ] = ipd( a_7( stage-1, 2*d69, j ) );
                                 else %% if -M+i+2 >= 0
                                    [ in_1 ] = ipd( a_4( stage-1, 2*d69-1, j ) );
                                 end
                              end
                           end
                        end
                     end
                  end
               end
            end
         else %% if -stage+1 >= 0
            if M-j-1>= 0, 
               d65 = div(j+1,2);
               if -j+2*d65-1>= 0, 
                  [ in_1 ] = ipd( a_1( stage, 2*d65-1, i+1 ) );
               else %% if j-2*d65 >= 0
                  if j-2>= 0, 
                     d67 = div(j,2);
                     if -j+2*d67>= 0, 
                        [ in_1 ] = ipd( a_2( stage, 2*d67-1, i+1 ) );
                     end
                  end
               end
            else %% if -M+j >= 0
               if j-2>= 0, 
                  d67 = div(j,2);
                  if -j+2*d67>= 0, 
                     [ in_1 ] = ipd( a_2( stage, 2*d67-1, i+1 ) );
                  else %% if j-2*d67-1 >= 0
                     [ in_1 ] = ipd( a( j, i+1 ) );
                  end
               end
            end
         end


         
         
         %% SAP Generated for HiPars version 3.0 Compliance 
         if stage-2>= 0, 
            d74 = div(i+1,2);
            if -i+2*d74-1>= 0, 
               [ in_2 ] = ipd( thetha_1( stage, 2*d74-1 ) );
            end
         else %% if -stage+1 >= 0
            d75 = div(i+1,2);
            if -i+2*d75-1>= 0, 
               [ in_2 ] = ipd( thetha_1( stage, 2*d75-1 ) );
            end
         end


         [ out_0, out_1 ] = thethaSAC( in_0, in_1, in_2 );
         [ a_3( stage, i, j) ]  = opd( out_0 );

         [ a_4( stage, i, j) ]  = opd( out_1 );

      end
   end
   for i = 2 : 2 : M-2,
      
      
      %% SAP Generated for HiPars version 3.0 Compliance 
      if stage-2>= 0, 
         d77 = div(i+1,2);
         if i-2*d77>= 0, 
            if i-2*d77>= 0, 
               d79 = div(i,2);
               if -i+2*d79>= 0, 
                  if -i+2*d79>= 0, 
                     if -i+2*d79>= 0, 
                        [ in_0 ] = ipd( a_4( stage, 2*d79-1, i ) );
                     end
                  end
               end
            end
         end
      else %% if -stage+1 >= 0
         d78 = div(i+1,2);
         if i-2*d78>= 0, 
            d80 = div(i,2);
            if -i+2*d80>= 0, 
               [ in_0 ] = ipd( a_4( stage, 2*d80-1, i ) );
            end
         end
      end


      
      
      %% SAP Generated for HiPars version 3.0 Compliance 
      if stage-2>= 0, 
         d89 = div(i+1,2);
         if i-2*d89>= 0, 
            if i-2*d89>= 0, 
               d91 = div(i,2);
               if -i+2*d91>= 0, 
                  if -i+2*d91>= 0, 
                     if -i+2*d91>= 0, 
                        [ in_1 ] = ipd( a_3( stage, 2*d91+1, i ) );
                     end
                  end
               end
            end
         end
      else %% if -stage+1 >= 0
         d90 = div(i+1,2);
         if i-2*d90>= 0, 
            d92 = div(i,2);
            if -i+2*d92>= 0, 
               [ in_1 ] = ipd( a_3( stage, 2*d92+1, i ) );
            end
         end
      end


      
      
      %% SAP Generated for HiPars version 3.0 Compliance 
      if stage-2>= 0, 
         d101 = div(i,2);
         if -i+2*d101>= 0, 
            if -i+2*d101>= 0, 
               d103 = div(i+1,2);
               if i-2*d103>= 0, 
                  if i-2*d103>= 0, 
                     [ in_2 ] = ipd( a_4( stage, 2*d101-1, i+1 ) );
                  end
               end
            end
         end
      else %% if -stage+1 >= 0
         d102 = div(i,2);
         if -i+2*d102>= 0, 
            d104 = div(i+1,2);
            if i-2*d104>= 0, 
               [ in_2 ] = ipd( a_4( stage, 2*d102-1, i+1 ) );
            end
         end
      end


      
      
      %% SAP Generated for HiPars version 3.0 Compliance 
      if stage-2>= 0, 
         d113 = div(i,2);
         if -i+2*d113>= 0, 
            if -i+2*d113>= 0, 
               d115 = div(i+1,2);
               if i-2*d115>= 0, 
                  if i-2*d115>= 0, 
                     [ in_3 ] = ipd( a_3( stage, 2*d113+1, i+1 ) );
                  end
               end
            end
         end
      else %% if -stage+1 >= 0
         d114 = div(i,2);
         if -i+2*d114>= 0, 
            d116 = div(i+1,2);
            if i-2*d116>= 0, 
               [ in_3 ] = ipd( a_3( stage, 2*d114+1, i+1 ) );
            end
         end
      end


      [ out_0, out_1 ] = vector( in_0, in_1, in_2, in_3 );
      [ phi_3( stage, i) ]  = opd( out_0 );

      [ thetha_2( stage, i) ]  = opd( out_1 );

   end
   for i = 2 : 2 : M-2,
      for j = 1 : 1 : M,
         
         
         %% SAP Generated for HiPars version 3.0 Compliance 
         if stage-2>= 0, 
            d125 = div(i+1,2);
            if i-2*d125>= 0, 
               d127 = div(i,2);
               if -i+2*d127>= 0, 
                  [ in_0 ] = ipd( phi_3( stage, 2*d127 ) );
               end
            end
         else %% if -stage+1 >= 0
            d126 = div(i+1,2);
            if i-2*d126>= 0, 
               d128 = div(i,2);
               if -i+2*d128>= 0, 
                  [ in_0 ] = ipd( phi_3( stage, 2*d128 ) );
               end
            end
         end


         
         
         %% SAP Generated for HiPars version 3.0 Compliance 
         if stage-2>= 0, 
            d129 = div(i+1,2);
            if i-2*d129>= 0, 
               d131 = div(i,2);
               if -i+2*d131>= 0, 
                  if M-j-1>= 0, 
                     d133 = div(j+1,2);
                     if -j+2*d133-1>= 0, 
                        [ in_1 ] = ipd( a_3( stage, 2*d133-1, i ) );
                     else %% if j-2*d133 >= 0
                        if j-2>= 0, 
                           d135 = div(j,2);
                           if -j+2*d135>= 0, 
                              [ in_1 ] = ipd( a_4( stage, 2*d135-1, i ) );
                           end
                        end
                     end
                  else %% if -M+j >= 0
                     if j-2>= 0, 
                        d135 = div(j,2);
                        if -j+2*d135>= 0, 
                           [ in_1 ] = ipd( a_4( stage, 2*d135-1, i ) );
                        else %% if j-2*d135-1 >= 0
                           [ in_1 ] = ipd( a_2( stage, 2*d131-1, j ) );
                        end
                     end
                  end
               end
            end
         else %% if -stage+1 >= 0
            d130 = div(i+1,2);
            if i-2*d130>= 0, 
               d132 = div(i,2);
               if -i+2*d132>= 0, 
                  if M-j-1>= 0, 
                     d134 = div(j+1,2);
                     if -j+2*d134-1>= 0, 
                        [ in_1 ] = ipd( a_3( stage, 2*d134-1, i ) );
                     else %% if j-2*d134 >= 0
                        if j-2>= 0, 
                           d136 = div(j,2);
                           if -j+2*d136>= 0, 
                              [ in_1 ] = ipd( a_4( stage, 2*d136-1, i ) );
                           end
                        end
                     end
                  else %% if -M+j >= 0
                     if j-2>= 0, 
                        d136 = div(j,2);
                        if -j+2*d136>= 0, 
                           [ in_1 ] = ipd( a_4( stage, 2*d136-1, i ) );
                        else %% if j-2*d136-1 >= 0
                           [ in_1 ] = ipd( a_2( stage, 2*d132-1, j ) );
                        end
                     end
                  end
               end
            end
         end


         
         
         %% SAP Generated for HiPars version 3.0 Compliance 
         if stage-2>= 0, 
            d142 = div(i,2);
            if -i+2*d142>= 0, 
               d144 = div(i+1,2);
               if i-2*d144>= 0, 
                  if M-j-1>= 0, 
                     d146 = div(j+1,2);
                     if -j+2*d146-1>= 0, 
                        [ in_2 ] = ipd( a_3( stage, 2*d146-1, i+1 ) );
                     else %% if j-2*d146 >= 0
                        if j-2>= 0, 
                           d148 = div(j,2);
                           if -j+2*d148>= 0, 
                              [ in_2 ] = ipd( a_4( stage, 2*d148-1, i+1 ) );
                           end
                        end
                     end
                  else %% if -M+j >= 0
                     if j-2>= 0, 
                        d148 = div(j,2);
                        if -j+2*d148>= 0, 
                           [ in_2 ] = ipd( a_4( stage, 2*d148-1, i+1 ) );
                        else %% if j-2*d148-1 >= 0
                           if M-i-3>= 0, 
                              if -M+j+1>= 0, 
                                 [ in_2 ] = ipd( a_1( stage, 2*d142+1, j ) );
                              end
                           end
                        end
                     end
                  end
               end
            end
         else %% if -stage+1 >= 0
            d143 = div(i,2);
            if -i+2*d143>= 0, 
               d145 = div(i+1,2);
               if i-2*d145>= 0, 
                  if M-j-1>= 0, 
                     d147 = div(j+1,2);
                     if -j+2*d147-1>= 0, 
                        [ in_2 ] = ipd( a_3( stage, 2*d147-1, i+1 ) );
                     else %% if j-2*d147 >= 0
                        if j-2>= 0, 
                           d149 = div(j,2);
                           if -j+2*d149>= 0, 
                              [ in_2 ] = ipd( a_4( stage, 2*d149-1, i+1 ) );
                           end
                        end
                     end
                  else %% if -M+j >= 0
                     if j-2>= 0, 
                        d149 = div(j,2);
                        if -j+2*d149>= 0, 
                           [ in_2 ] = ipd( a_4( stage, 2*d149-1, i+1 ) );
                        else %% if j-2*d149-1 >= 0
                           [ in_2 ] = ipd( a_1( stage, 2*d143+1, j ) );
                        end
                     end
                  end
               end
            end
         end


         [ out_0, out_1 ] = phiSAC( in_0, in_1, in_2 );
         [ a_5( stage, i, j) ]  = opd( out_0 );

         [ a_6( stage, i, j) ]  = opd( out_1 );

      end
   end
   for i = 2 : 2 : M-2,
      for j = 1 : 1 : M,
         
         
         %% SAP Generated for HiPars version 3.0 Compliance 
         if stage-2>= 0, 
            if M-j-1>= 0, 
               d154 = div(j+1,2);
               if -j+2*d154-1>= 0, 
                  if j-2>= 0, 
                     d156 = div(j,2);
                     if j-2*d156-1>= 0, 
                        d158 = div(i+1,2);
                        if i-2*d158>= 0, 
                           d160 = div(i,2);
                           if -i+2*d160>= 0, 
                              [ in_0 ] = ipd( a_6( stage, 2*d154-2, i ) );
                           end
                        end
                     end
                  else %% if -j+1 >= 0
                     d158 = div(i+1,2);
                     if i-2*d158>= 0, 
                        d160 = div(i,2);
                        if -i+2*d160>= 0, 
                           if -i+2*d160>= 0, 
                              [ in_0 ] = ipd( a_4( stage, 2*d160-1, j ) );
                           end
                        end
                     end
                  end
               else %% if j-2*d154 >= 0
                  if j-2>= 0, 
                     d156 = div(j,2);
                     if -j+2*d156>= 0, 
                        d158 = div(i+1,2);
                        if i-2*d158>= 0, 
                           d160 = div(i,2);
                           if -i+2*d160>= 0, 
                              if M-j-2>= 0, 
                                 [ in_0 ] = ipd( a_5( stage, 2*d156, i ) );
                              else %% if -M+j+1 >= 0
                                 if j-2*d154>= 0, 
                                    [ in_0 ] = ipd( a_4( stage, 2*d160-1, j ) );
                                 end
                              end
                           end
                        end
                     end
                  end
               end
            else %% if -M+j >= 0
               if j-2>= 0, 
                  d160 = div(i,2);
                  [ in_0 ] = ipd( a_4( stage, 2*d160-1, j ) );
               end
            end
         else %% if -stage+1 >= 0
            if M-j-1>= 0, 
               d155 = div(j+1,2);
               if -j+2*d155-1>= 0, 
                  if j-2>= 0, 
                     d157 = div(j,2);
                     if j-2*d157-1>= 0, 
                        d159 = div(i+1,2);
                        if i-2*d159>= 0, 
                           d161 = div(i,2);
                           if -i+2*d161>= 0, 
                              [ in_0 ] = ipd( a_6( stage, 2*d155-2, i ) );
                           end
                        end
                     end
                  else %% if -j+1 >= 0
                     d159 = div(i+1,2);
                     if i-2*d159>= 0, 
                        d161 = div(i,2);
                        if -i+2*d161>= 0, 
                           [ in_0 ] = ipd( a_4( stage, 2*d161-1, j ) );
                        end
                     end
                  end
               else %% if j-2*d155 >= 0
                  if j-2>= 0, 
                     d157 = div(j,2);
                     if -j+2*d157>= 0, 
                        d159 = div(i+1,2);
                        if i-2*d159>= 0, 
                           d161 = div(i,2);
                           if -i+2*d161>= 0, 
                              if M-j-2>= 0, 
                                 [ in_0 ] = ipd( a_5( stage, 2*d157, i ) );
                              else %% if -M+j+1 >= 0
                                 [ in_0 ] = ipd( a_4( stage, 2*d161-1, j ) );
                              end
                           end
                        end
                     end
                  end
               end
            else %% if -M+j >= 0
               if j-2>= 0, 
                  d161 = div(i,2);
                  [ in_0 ] = ipd( a_4( stage, 2*d161-1, j ) );
               end
            end
         end


         
         
         %% SAP Generated for HiPars version 3.0 Compliance 
         if stage-2>= 0, 
            if M-j-1>= 0, 
               d169 = div(j+1,2);
               if -j+2*d169-1>= 0, 
                  if j-2>= 0, 
                     d171 = div(j,2);
                     if j-2*d171-1>= 0, 
                        d173 = div(i,2);
                        if -i+2*d173>= 0, 
                           d175 = div(i+1,2);
                           if i-2*d175>= 0, 
                              [ in_1 ] = ipd( a_6( stage, 2*d169-2, i+1 ) );
                           end
                        end
                     end
                  else %% if -j+1 >= 0
                     d173 = div(i,2);
                     if -i+2*d173>= 0, 
                        d175 = div(i+1,2);
                        if i-2*d175>= 0, 
                           [ in_1 ] = ipd( a_3( stage, 2*d173+1, j ) );
                        end
                     end
                  end
               else %% if j-2*d169 >= 0
                  if j-2>= 0, 
                     d171 = div(j,2);
                     if -j+2*d171>= 0, 
                        d173 = div(i,2);
                        if -i+2*d173>= 0, 
                           d175 = div(i+1,2);
                           if i-2*d175>= 0, 
                              if M-j-2>= 0, 
                                 [ in_1 ] = ipd( a_5( stage, 2*d171, i+1 ) );
                              else %% if -M+j+1 >= 0
                                 if j-2*d169>= 0, 
                                    if M-i-3>= 0, 
                                       [ in_1 ] = ipd( a_3( stage, 2*d173+1, j ) );
                                    end
                                 end
                              end
                           end
                        end
                     end
                  end
               end
            else %% if -M+j >= 0
               if j-2>= 0, 
                  d173 = div(i,2);
                  [ in_1 ] = ipd( a_3( stage, 2*d173+1, j ) );
               end
            end
         else %% if -stage+1 >= 0
            if M-j-1>= 0, 
               d170 = div(j+1,2);
               if -j+2*d170-1>= 0, 
                  if j-2>= 0, 
                     d172 = div(j,2);
                     if j-2*d172-1>= 0, 
                        d174 = div(i,2);
                        if -i+2*d174>= 0, 
                           d176 = div(i+1,2);
                           if i-2*d176>= 0, 
                              [ in_1 ] = ipd( a_6( stage, 2*d170-2, i+1 ) );
                           end
                        end
                     end
                  else %% if -j+1 >= 0
                     d174 = div(i,2);
                     if -i+2*d174>= 0, 
                        d176 = div(i+1,2);
                        if i-2*d176>= 0, 
                           [ in_1 ] = ipd( a_3( stage, 2*d174+1, j ) );
                        end
                     end
                  end
               else %% if j-2*d170 >= 0
                  if j-2>= 0, 
                     d172 = div(j,2);
                     if -j+2*d172>= 0, 
                        d174 = div(i,2);
                        if -i+2*d174>= 0, 
                           d176 = div(i+1,2);
                           if i-2*d176>= 0, 
                              if M-j-2>= 0, 
                                 [ in_1 ] = ipd( a_5( stage, 2*d172, i+1 ) );
                              else %% if -M+j+1 >= 0
                                 [ in_1 ] = ipd( a_3( stage, 2*d174+1, j ) );
                              end
                           end
                        end
                     end
                  end
               end
            else %% if -M+j >= 0
               if j-2>= 0, 
                  d174 = div(i,2);
                  [ in_1 ] = ipd( a_3( stage, 2*d174+1, j ) );
               end
            end
         end


         
         
         %% SAP Generated for HiPars version 3.0 Compliance 
         if stage-2>= 0, 
            d183 = div(i+1,2);
            if i-2*d183>= 0, 
               d185 = div(i,2);
               if -i+2*d185>= 0, 
                  [ in_2 ] = ipd( thetha_2( stage, 2*d185 ) );
               end
            end
         else %% if -stage+1 >= 0
            d184 = div(i+1,2);
            if i-2*d184>= 0, 
               d186 = div(i,2);
               if -i+2*d186>= 0, 
                  [ in_2 ] = ipd( thetha_2( stage, 2*d186 ) );
               end
            end
         end


         [ out_0, out_1 ] = thethaSAC( in_0, in_1, in_2 );
         [ a_7( stage, i, j) ]  = opd( out_0 );

         [ a_8( stage, i, j) ]  = opd( out_1 );

      end
   end
end
for x = 1 : 1 : M,
   for y = 1 : 1 : M,
      
      
      %% SAP Generated for HiPars version 3.0 Compliance 
      if M-x-1>= 0, 
         d187 = div(x+1,2);
         if -x+2*d187-1>= 0, 
            if x-2>= 0, 
               d188 = div(x,2);
               if x-2*d188-1>= 0, 
                  if M-y-1>= 0, 
                     d189 = div(y+1,2);
                     if -y+2*d189-1>= 0, 
                        if y-2>= 0, 
                           d190 = div(y,2);
                           if y-2*d190-1>= 0, 
                              [ in_0 ] = ipd( a_8( N, 2*d189-2, x ) );
                           end
                        else %% if -y+1 >= 0
                           [ in_0 ] = ipd( a_6( N, 2*d187-2, y ) );
                        end
                     else %% if y-2*d189 >= 0
                        if y-2>= 0, 
                           d190 = div(y,2);
                           if -y+2*d190>= 0, 
                              if M-x-2>= 0, 
                                 if M-y-2>= 0, 
                                    [ in_0 ] = ipd( a_7( N, 2*d190, x ) );
                                 else %% if -M+y+1 >= 0
                                    [ in_0 ] = ipd( a_6( N, 2*d187-2, y ) );
                                 end
                              else %% if -M+x+1 >= 0
                                 [ in_0 ] = ipd( a_7( N, 2*d190, x ) );
                              end
                           end
                        end
                     end
                  else %% if -M+y >= 0
                     if y-2>= 0, 
                        [ in_0 ] = ipd( a_6( N, 2*d187-2, y ) );
                     end
                  end
               end
            else %% if -x+1 >= 0
               if M-y-1>= 0, 
                  d189 = div(y+1,2);
                  if -y+2*d189-1>= 0, 
                     if y-2>= 0, 
                        d190 = div(y,2);
                        if y-2*d190-1>= 0, 
                           [ in_0 ] = ipd( a_8( N, 2*d189-2, x ) );
                        end
                     else %% if -y+1 >= 0
                        [ in_0 ] = ipd( a_3( N, 2*d189-1, x ) );
                     end
                  else %% if y-2*d189 >= 0
                     if y-2>= 0, 
                        d190 = div(y,2);
                        if -y+2*d190>= 0, 
                           if M-y-2>= 0, 
                              [ in_0 ] = ipd( a_7( N, 2*d190, x ) );
                           else %% if -M+y+1 >= 0
                              [ in_0 ] = ipd( a_4( N, 2*d190-1, x ) );
                           end
                        end
                     end
                  end
               else %% if -M+y >= 0
                  if y-2>= 0, 
                     d190 = div(y,2);
                     if -y+2*d190>= 0, 
                        if -M+y+1>= 0, 
                           [ in_0 ] = ipd( a_4( N, 2*d190-1, x ) );
                        end
                     else %% if y-2*d190-1 >= 0
                        if -M+y+1>= 0, 
                           [ in_0 ] = ipd( a_1( N, 2*d187-1, y ) );
                        end
                     end
                  end
               end
            end
         else %% if x-2*d187 >= 0
            if x-2>= 0, 
               d188 = div(x,2);
               if -x+2*d188>= 0, 
                  if M-y-1>= 0, 
                     d189 = div(y+1,2);
                     if -y+2*d189-1>= 0, 
                        if y-2>= 0, 
                           d190 = div(y,2);
                           if y-2*d190-1>= 0, 
                              [ in_0 ] = ipd( a_8( N, 2*d189-2, x ) );
                           end
                        else %% if -y+1 >= 0
                           if M-x-2>= 0, 
                              [ in_0 ] = ipd( a_5( N, 2*d188, y ) );
                           else %% if -M+x+1 >= 0
                              [ in_0 ] = ipd( a_3( N, 2*d189-1, x ) );
                           end
                        end
                     else %% if y-2*d189 >= 0
                        if y-2>= 0, 
                           d190 = div(y,2);
                           if -y+2*d190>= 0, 
                              if M-x-2>= 0, 
                                 if x-3>= 0, 
                                    if M-y-2>= 0, 
                                       [ in_0 ] = ipd( a_7( N, 2*d190, x ) );
                                    else %% if -M+y+1 >= 0
                                       [ in_0 ] = ipd( a_5( N, 2*d188, y ) );
                                    end
                                 else %% if -x+2 >= 0
                                    if M-y-2>= 0, 
                                       [ in_0 ] = ipd( a_7( N, 2*d190, x ) );
                                    else %% if -M+y+1 >= 0
                                       [ in_0 ] = ipd( a_5( N, 2*d188, y ) );
                                    end
                                 end
                              else %% if -M+x+1 >= 0
                                 if x-3>= 0, 
                                    if M-y-2>= 0, 
                                       [ in_0 ] = ipd( a_7( N, 2*d190, x ) );
                                    else %% if -M+y+1 >= 0
                                       [ in_0 ] = ipd( a_4( N, 2*d190-1, x ) );
                                    end
                                 else %% if -x+2 >= 0
                                    [ in_0 ] = ipd( a_4( N, 2*d190-1, x ) );
                                 end
                              end
                           end
                        end
                     end
                  else %% if -M+y >= 0
                     if y-2>= 0, 
                        d190 = div(y,2);
                        if -y+2*d190>= 0, 
                           [ in_0 ] = ipd( a_5( N, 2*d188, y ) );
                        else %% if y-2*d190-1 >= 0
                           if M-x-2>= 0, 
                              [ in_0 ] = ipd( a_5( N, 2*d188, y ) );
                           else %% if -M+x+1 >= 0
                              [ in_0 ] = ipd( a_2( N, 2*d188-1, y ) );
                           end
                        end
                     end
                  end
               end
            end
         end
      else %% if -M+x >= 0
         if x-2>= 0, 
            d188 = div(x,2);
            if -x+2*d188>= 0, 
               if M-y-1>= 0, 
                  d189 = div(y+1,2);
                  if -y+2*d189-1>= 0, 
                     if y-2>= 0, 
                        d190 = div(y,2);
                        if y-2*d190-1>= 0, 
                           if -M+x+1>= 0, 
                              [ in_0 ] = ipd( a_8( N, 2*d189-2, x ) );
                           end
                        end
                     else %% if -y+1 >= 0
                        if -M+x+1>= 0, 
                           [ in_0 ] = ipd( a_3( N, 2*d189-1, x ) );
                        end
                     end
                  else %% if y-2*d189 >= 0
                     if y-2>= 0, 
                        d190 = div(y,2);
                        if -y+2*d190>= 0, 
                           if -M+x+1>= 0, 
                              [ in_0 ] = ipd( a_7( N, 2*d190, x ) );
                           end
                        end
                     end
                  end
               else %% if -M+y >= 0
                  if y-2>= 0, 
                     d190 = div(y,2);
                     if -y+2*d190>= 0, 
                        if -M+x+1>= 0, 
                           [ in_0 ] = ipd( a_4( N, 2*d190-1, x ) );
                        end
                     end
                  end
               end
            else %% if x-2*d188-1 >= 0
               if M-y-1>= 0, 
                  d189 = div(y+1,2);
                  if -y+2*d189-1>= 0, 
                     if y-2>= 0, 
                        d190 = div(y,2);
                        if y-2*d190-1>= 0, 
                           if -M+x+1>= 0, 
                              [ in_0 ] = ipd( a_8( N, 2*d189-2, x ) );
                           end
                        end
                     else %% if -y+1 >= 0
                        if -M+x+1>= 0, 
                           [ in_0 ] = ipd( a_3( N, 2*d189-1, x ) );
                        end
                     end
                  else %% if y-2*d189 >= 0
                     if y-2>= 0, 
                        d190 = div(y,2);
                        if -y+2*d190>= 0, 
                           if -M+x+1>= 0, 
                              if M-y-2>= 0, 
                                 [ in_0 ] = ipd( a_7( N, 2*d190, x ) );
                              else %% if -M+y+1 >= 0
                                 [ in_0 ] = ipd( a_4( N, 2*d190-1, x ) );
                              end
                           end
                        end
                     end
                  end
               else %% if -M+y >= 0
                  if y-2>= 0, 
                     d190 = div(y,2);
                     if y-2*d190-1>= 0, 
                        if -M+x+1>= 0, 
                           if -M+y+1>= 0, 
                              [ in_0 ] = ipd( a( x, y ) );
                           end
                        end
                     end
                  end
               end
            end
         else %% if -x+1 >= 0
            if -M+y>= 0, 
               if -y+1>= 0, 
                  [ in_0 ] = ipd( a( x, y ) );
               end
            end
         end
      end


      [ out_0 ] = Pass( in_0 );
      [ Sink_1( x, y) ]  = opd( out_0 );

   end
end

%matlab
disp( Sink );
%end