// ************************************************************************** //
//                                                                            //
//    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 implements a simple counter that can increment and decrement //
// its current value. Note that write conflicts that would occur by           //
// incrementing and decrementing at the same time are elegantly solved by this//
// module.                                                                    //
// ************************************************************************** //

package IslandTrafficControl;

macro MaxCars = 5;

module Counter(event ?inc,?dec,nat{MaxCars+1} v) {
   loop {
      if(inc & !dec)
         next(v) = v+1;
      else if(!inc & dec)
         next(v) = v-1;
      pause;
   }
}