/* * This code has been generated by sdl2if (C) Verimag 2000,2003 * */ system brp; /*** BLOCK brp */ const maxp = 2; const max_retry = 4; const dt_repeat = 2; const dt_abort = 15; const dr_abort = 13; type data = enum first, middle, last endenum; type noofpackets = range 1 .. maxp; signal abort(pid); signal dk(pid); signal get(pid, noofpackets); signal put(pid, noofpackets); /*** BLOCK brpblock */ signal ack(pid, boolean); signal sdt(pid, data, boolean); /*** PROCESS receiver */ process receiver(1); fpar parent pid; var r_abort clock; var b boolean; var c boolean; var p integer; var m data; var sender pid := nil; var offspring pid := nil; state start #start ; task p := 0; nextstate idle; endstate; state idle; input sdt(sender,m,c); nextstate decision_4; when r_abort = 0; task sender := self; output abort(self); nextstate idle; endstate; state decision_4 #unstable ; provided (b = c or m = first) = true; output ack(self,c) to {transmitter}0; set r_abort := -(0 + dr_abort); task b := not c; nextstate decision_11; provided (b = c or m = first) = false; output ack(self,b) to {transmitter}0; nextstate idle; endstate; state decision_11 #unstable ; provided (m) = first; task p := 0; nextstate idle; provided (m) = middle; task p := p + 1; nextstate idle; provided (m) = last; output get(self,p); reset r_abort; nextstate idle; endstate; endprocess; /*** ENDPROCESS receiver */ /*** PROCESS transmitter */ process transmitter(1); fpar parent pid; var t_repeat clock; var t_abort clock; var b boolean; var c boolean; var p integer; var i integer; var j integer; var m data; var sender pid := nil; var offspring pid := nil; state start #start ; task b := false; nextstate idle; endstate; state idle; input put(sender,p); task j := 0; task m := first; task i := 1; nextstate send; input ack(void,void); nextstate -; endstate; state send; task sender := self; output sdt(self,m,b) to {receiver}0; set t_repeat := -(0 + dt_repeat); nextstate wait_ack; input ack(void,void); nextstate -; input put(void,void); nextstate -; endstate; state wait_ack; input ack(sender,c); nextstate decision_13; when t_repeat = 0; task sender := self; nextstate decision_14; input put(void,void); nextstate -; endstate; state decision_13 #unstable ; provided (c = b) = true; task b := not b; reset t_repeat; nextstate decision_18; provided (c = b) = false; nextstate wait_ack; endstate; state decision_14 #unstable ; provided (i < max_retry) = true; task i := i + 1; nextstate send; provided (i < max_retry) = false; nextstate decision_20; endstate; state decision_18 #unstable ; provided (m) = first; task j := 1; task m := middle; task i := 1; nextstate send; provided (m) = middle; nextstate decision_23; provided (m) = last; nextstate idle; endstate; state decision_20 #unstable ; provided (m = middle) = true; output abort(self); set t_abort := -(0 + dt_abort); nextstate wait_abort; provided (m = middle) = false; output dk(self); set t_abort := -(0 + dt_abort); nextstate wait_abort; endstate; state decision_23 #unstable ; provided (j < p) = true; task j := j + 1; task i := 1; nextstate send; provided (j < p) = false; task m := last; task i := 1; nextstate send; endstate; state wait_abort; when t_abort = 0; task sender := self; nextstate idle; input ack(void,void); nextstate -; input put(void,void); nextstate -; endstate; endprocess; /*** ENDPROCESS transmitter */ /*** ENDBLOCK brpblock */ /*** ENDBLOCK brp */ endsystem;