// **************************************************************************
//
//    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
//
// **************************************************************************

// ----------------------------------------------------------------------------
// NatSub implements subtrcation of radix-B numbers x1 and x2 which have lengths
// len1 and len2, respectively. The difference is stored in array y whose length is 
// lenY which must therefore be at least max(len1,len2).
// ----------------------------------------------------------------------------

bool correct;
function NatAdd ([]nat x1,x2, []nat y, nat len1, len2): []nat {   
    nat c;          // carry digit
    nat g,p;        // generate and propagate digits
    nat s;          // intermediate sum digit
    nat i;          // loop variable
    nat lmin, lmax; // minimal and maximal length of x1 and x2, respectively
    
    // determine lmin and lmax
    if(len1<len2) {
        lmin = len1;
        lmax = len2;
    } else {
        lmin = len2;
        lmax = len1;
    }

    // add digits up to lmin
    c = 0;
    for (i=0..lmin-1) {
        g,s = x1[i] - x2[i];                // g:generate carry; s:preliminary sum
        p,y[i] = s + c;                     // p:propagate carry; add previous carry
        c = (nat) ((bool) g | (bool) p);    // define next carry digit (0 or 1)
    }

    // propagate remaining carry through the remaining array
    if(len1<len2)
        for (i=lmin..lmax-1) 
            c,y[i] = x2[i] + c;
    else
        for (i=lmin..lmax-1) 
            c,y[i] = x1[i] + c;

	
    return y;
}


thread test{
    [4]nat a;
    [3]nat b; 
    [4]nat s;
    [0]nat d;


    a[0] = 4;
    a[1] = 3;
    a[2] = 1;
    a[3] = 6;
 

    b[0] = 5;
    b[1] = 7;
    b[2] = 3;

    d = NatAdd(a,b,s,4,3);

    if (s[0]==65535&s[1]==65531&s[2]==65533&s[3]==5){
		correct = true;	
	}else{
		correct = false;	
	}
}