// ************************************************************************** //
//                                                                            //
//    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                                             //
//                                                                            //
// ************************************************************************** //
// In contrast to Esterel, Quartz has no trap statements. However, programs   //
// with trap statements can be translated to programs without trap statements //
// as indicated by the program below. The sequence "emit(t);never:pause;"     //
// replaces thereby an "exit(t)" which is similar to a break/goto statement   //
// in that it executes the parts "above" it, while it skips the parts "below" //
// of it. Note that the pause statements denoted with never1 and never2 are   //
// will never hold a control flow.                                            //
// ************************************************************************** //


module Trap(event ?i,a1,b1,a2,b2) {
    event t;
    weak immediate abort {
        emit(a1);
        if(i) {
            emit(t);
            never1: pause;
        }
        emit(b1);
        w: pause;
        emit(a2);
        emit(t);
        if(i) {
            emit(t);
            never2: pause;
        }
        emit(b2);
    } when(t);
}
drivenby {
    pause;
    emit(i);
}
drivenby {
    emit(i);
}