// ************************************************************************** //
//                                                                            //
//    eses                   eses                                             //
//   eses                     eses                                            //
//  eses    eseses  esesese    eses   Embedded Systems Group                  //
//  ese    ese  ese ese         ese                                           //
//  ese    eseseses eseseses    ese   Department of Computer Science          //
//  eses   eses          ese   eses                                           //
//   eses   eseses  eseseses  eses    University of Kaiserslautern            //
//    eses                   eses                                             //
//                                                                            //
// ************************************************************************** //
// The following module multiplies two given polynomials. Note that the Quartz//
// compiler generates a balanced binary tree of generic sums, so that the     //
// module below has depth O(log(M)) using O(M*(M+N-2)) processors.            //
// ************************************************************************** //

macro M = 4;
macro N = 4;

macro min(x,y) = (x<y ? x : y);

module MultPolynomial([M]int ?a,[N]int ?b,[M+N-1]int c) {
    for(k=0..M+N-2)
        c[k] = sum(j=0..min(k,M-1)) (k-j<N ? a[j]*b[k-j] : 0);
}
drivenby {
    for(i=0..M-1)
        a[i] = i+1;
    for(i=0..N-1)
        b[i] = i+1;
}
drivenby {
    a = [9,-10,7,6]; //  6 x^3 + 7 x^2 - 10 x + 9 
    b = [-5,4,0,-2]; // -5 x^3 + 4 x^2        - 2
}