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

macro NumBus = 4;       // number of busses
macro AW =  8;          // address width
macro DW =  8;          // data width
macro PL = 10;          // length of program

macro SrcBus(x) = x.0;
macro TgtBus(x) = x.1;
macro ValBus(x) = x.2;


module BusRegConnect(
    event [NumBus](bv{AW} * bv{AW} * bv{DW}) bus,
    event bool !ev1,!ev2,!ev3,!ev4,
    event bv{DW} !x1,!x2,!x3,?x4,
    event nat ?a1,?a2,?a3,?a4) {
    
    loop {
        for(i=0.. NumBus-1) {
            if(bv2nat(TgtBus(bus[i]))==a1) {
                x1 = ValBus(bus[i]);
                emit(ev1);
            }
            if(bv2nat(TgtBus(bus[i]))==a2) {
                x2 = ValBus(bus[i]);
                emit(ev2);
            }
            if(bv2nat(TgtBus(bus[i]))==a3) {
                x3 = ValBus(bus[i]);
                emit(ev3);
            }
            if(bv2nat(SrcBus(bus[i]))==a4) {
                ValBus(bus[i]) = x4;
                emit(ev4);
            }
        }
        pause;
    }
}