// ************************************************************************** //
//                                                                            //
//    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                                             //
//                                                                            //
// ************************************************************************** //
// This module computes Euler's number 2.718... with N decimal digits by the  //
// well-known formula e = sum(i=0..oo) 1/i!. All computations are made on type//
// nat using a fixpoint arithmetic where the decimal point is moved N decimal //
// digits to the left.                                                        //
// ************************************************************************** //

macro N = 300;

module EulerNumber(nat e,event !rdy) {
    nat s,i;
    s = exp(10,N);
    i = 2;
    e = s;
    do {
        next(s) = s/i;
        next(e) = e + s;
        next(i) = i+1;
        pause;
    } while(s>0);
    emit(rdy);
}
drivenby {
    await(rdy);
}