include "auxiliar.csp"
include "rules.csp"
datatype Direction = req | ack
Value = {1..3}
channel write : Direction.Value
channel read : Direction.Value
BUF = write.req?x -> read.req.x -> write.ack!x -> read.ack.x -> BUF
channel write0 : Direction.Value
channel read0 : Direction.Value
channel write1 : Direction.Value
channel read1 : Direction.Value
Rename1(i) = BUF [[write <- write0,read <- read0]]
Rename2(i) = BUF [[write <- write1,read <- read1]]
Inst_BUF0 = <(write,write0),(read,read0)>
BUF0 = rename(BUF, Inst_BUF0)
Inst_BUF1 = <(write,write1),(read,read1)>
BUF1 = rename(BUF, Inst_BUF1)
GET_CHANNELS(P) =
let f =
<
(BUF0, { write0,read0 }),
(BUF1, { write1,read1 })
>
within apply(f,P )
inputs( P ) =
let f =
<
( BUF0, {| write0.req,read0.req |}),
( BUF1, {| write1.req,read1.req |})
>
within apply(f, P )
outputs( P ) =
let f =
<
( BUF0, {| write0.ack,read0.ack |}),
( BUF1, {| write1.ack,read1.ack |})
>
within apply(f, P )
--INTERLEAVING COMPOSITION
newComponent = INTER(BUF0,BUF1)
assert STOP [T= RUN(inter(events(BUF0),events(BUF1)))
assert newComponent:[deadlock free[FD]]