Averest
// ************************************************************************** //
//                                                                            //
//    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 implements an analogon to the full adder of radix-B   //
// numbers that is used for subtraction.                                      //
// To see that sm and cout are of types int{B} and nat{2}, respectively, note //
// that 0-(B-1+1) <= +x-(y+cin) <= B-1-(0+0), i.e., -B <= +x-(y+cin) <= B-1.  //
// Note further that -B = (-1)*B+0 and B-1 = 0*B+(B-1).                       //
// ************************************************************************** //

macro B = 4;      // base of the radix numbers


module FullSub(nat{B} ?x,?y,nat{2} ?cin,!cout,nat{B} !s) {
    event int{B} sm;
    sm   = +x - (y + cin);
    cout = -(sm / B);
    s    =   sm % B;
}

           

averest