module Producer:

%% Declarations

input	PROC_CH1(integer), user(integer); 
output	READY_CH1plus(integer);

%% Instructions 

var X:integer in
 loop
   await user; X:=?user;
   do
      sustain  READY_CH1plus(X);
   watching PROC_CH1;
 end;

end var
end module


module Consumer:

input 	PROC_CH2(integer);
output	READY_CH2minus, out(integer);

loop
   do
     sustain READY_CH2minus;
   watching PROC_CH2;
   emit out(?PROC_CH2)
end
end module


module Buffer:

input 	PROC_CH1(integer), PROC_CH2(integer); 
output	READY_CH1minus, READY_CH2plus(integer) ,out(integer);

 
loop
[
var X: integer in
	do
	  sustain  READY_CH1minus;			
	watching PROC_CH1; X:=?PROC_CH1;
	do
	  sustain  READY_CH2plus(X);		
	watching PROC_CH2;
end var;



]
end

end module


%%
%% This is the main module. It runs all the processes and the scheduler.
%%
module LINK:

input 	TRIGGER_CH1, TRIGGER_CH2, user(integer);
%%
%% There is one trigger signal for each channel.
%%

output	PROC_CH1(integer),       PROC_CH2(integer), out(integer);    	  

signal 	
	READY_CH1plus(integer),  READY_CH1minus,  
	READY_CH2plus(integer),  READY_CH2minus
in
	    run Producer 
	||
	    run	Consumer
	||  
	    run Buffer
	||
	    run Scheduler
end signal

end module

