Mercurial > hg > Members > nobuyasu > Spin
diff Samples/App.F.flow_cl.h @ 0:86e67be8bc5f draft
add some files
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 29 Jun 2012 01:14:43 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Samples/App.F.flow_cl.h Fri Jun 29 01:14:43 2012 +0900 @@ -0,0 +1,114 @@ +/* + * Flow Control Layer Validation Model + */ + +#define true 1 +#define false 0 + +#define M 4 /* range sequence numbers */ +#define W 2 /* window size: M/2 */ + +proctype fc(bit n) +{ bool busy[M]; /* outstanding messages */ + byte q; /* seq# oldest unacked msg */ + byte m; /* seq# last msg received */ + byte s; /* seq# next msg to send */ + byte window; /* nr of outstanding msgs */ + byte type; /* msg type */ + bit received[M]; /* receiver housekeeping */ + bit x; /* scratch variable */ + byte p; /* seq# of last msg acked */ + byte I_buf[M], O_buf[M]; /* message buffers */ + + /* sender part */ +end: do + :: atomic { + (window < W && len(ses_to_flow[n]) > 0 + && len(flow_to_dll[n]) < QSZ) -> + ses_to_flow[n]?type,x; + window = window + 1; + busy[s] = true; + O_buf[s] = type; + flow_to_dll[n]!type,s; + if + :: (type != sync) -> + s = (s+1)%M + :: (type == sync) -> + window = 0; + s = M; + do + :: (s > 0) -> + s = s-1; + busy[s] = false + :: (s == 0) -> + break + od + fi + } + :: atomic { + (window > 0 && busy[q] == false) -> + window = window - 1; + q = (q+1)%M + } +#if DUPS + :: atomic { + (len(flow_to_dll[n]) < QSZ + && window > 0 && busy[q] == true) -> + flow_to_dll[n]! O_buf[q],q + } +#endif + :: atomic { + (timeout && len(flow_to_dll[n]) < QSZ + && window > 0 && busy[q] == true) -> + flow_to_dll[n]! O_buf[q],q + } + + /* receiver part */ +#if LOSS + :: dll_to_flow[n]?type,m /* lose any message */ +#endif + :: dll_to_flow[n]?type,m -> + if + :: atomic { + (type == ack) -> + busy[m] = false + } + :: atomic { + (type == sync) -> + flow_to_dll[n]!sync_ack,m; + m = 0; + do + :: (m < M) -> + received[m] = 0; + m = m+1 + :: (m == M) -> + break + od + } + :: (type == sync_ack) -> + flow_to_ses[n]!sync_ack,m + :: (type != ack && type != sync && type != sync_ack)-> + if + :: atomic { + (received[m] == true) -> + x = ((0<p-m && p-m<=W) + || (0<p-m+M && p-m+M<=W)) }; + if + :: (x) -> flow_to_dll[n]!ack,m + :: (!x) /* else skip */ + fi + :: atomic { + (received[m] == false) -> + I_buf[m] = type; + received[m] = true; + received[(m-W+M)%M] = false + } + fi + fi + :: (received[p] == true && len(flow_to_ses[n])<QSZ + && len(flow_to_dll[n])<QSZ) -> + flow_to_ses[n]!I_buf[p],0; + flow_to_dll[n]!ack,p; + p = (p+1)%M + od +}