include "sequence_aux.csp"
include "function_aux.csp"
include "auxiliar.csp"
include "rules.csp"
datatype Direction = req | ack
Value = {1..3}
CellId = {0..3}
channel rd : Direction.Value
channel wrt : Direction.Value
channel write : CellId.Direction.Value
channel read : CellId.Direction.Value
channel input : Value
channel output : Value
maxbuff = 4
maxring = maxbuff - 1
Controller =
let ControllerState(cache,size,top,bot) =
InputController(cache,size,top,bot) [] OutputController(cache,size,top,bot)
InputController(cache,size,top,bot) =
size < maxbuff & input?x -> (size == 0 & ControllerState(x,1,top,bot)
[]
size > 0 & write.top.req!x -> write.top.ack?dumb -> ControllerState(cache,size+1,(top%maxring)+1,bot))
OutputController(cache,size,top,bot) =
size > 0 & output!cache -> (size > 1 &
-- A requisição de leitura não ser uma "escolha externa (via input on dumb)" para que o processo seja Strong Output Decisive
-- read.bot.req?dumb -> read.bot.ack?x -> ControllerState(x,size-1,top,(bot%maxring)+1)
(|~| dumb:Value @ read.bot.req.dumb -> read.bot.ack?x -> ControllerState(x,size-1,top,(bot%maxring)+1))
[]
size == 1 & ControllerState(cache,0,top,bot))
within
-- The initial value of the cache is irrelevant, since the size is 0.
ControllerState(0,0,1,1)
channel input0 : Value
channel output0 : Value
channel write0 : CellId.Direction.Value
channel read0 : CellId.Direction.Value
PROT_CTRL(e) = |~| v1:Value @ e.req.v1 -> e.ack?v2 -> PROT_CTRL(e)
DUAL_PROT_CTRL(e) = |~| v2:Value @ e.req?v1 -> e.ack.v2 -> DUAL_PROT_CTRL(e)
Inst_Controller0 = <(input,input0),(output,output0),(write,write0),(read,read0)>
Controller0 = rename(Controller, Inst_Controller0)
GET_CHANNELS(P) =
let f =
<
(Controller0, { input0,output0,write0,read0 }),
(PROT_IMP_Controller0_write0,{write0}),
(PROT_IMP_Controller0_read0,{read0}) >
within apply(f,P )
inputs( P ) =
let f =
<
( Controller0, {| input0,write0.1.ack,write0.2.ack,write0.3.ack,read0.1.ack,read0.2.ack,read0.3.ack |}),
(PROT_IMP_Controller0_write0,inputs_PROT_IMP(Controller0,write0)),
(PROT_IMP_Controller0_read0,inputs_PROT_IMP(Controller0,read0)),
(PROT_IMP_Controller0_write0_R_IO_read0,inputs_R_IO(PROT_IMP_Controller0_write0,write0,read0)),
(PROT_IMP_Controller0_read0_R_IO_write0,inputs_R_IO(PROT_IMP_Controller0_read0,read0,write0)),
(DUAL_PROT_IMP_Controller0_write0_R_IO_read0,outputs(PROT_IMP_Controller0_write0_R_IO_read0)),
(DUAL_PROT_IMP_Controller0_read0_R_IO_write0,outputs(PROT_IMP_Controller0_read0_R_IO_write0))
>
within apply(f, P )
outputs( P ) =
let f =
<
( Controller0, {| output0,write0.1.req,write0.2.req,write0.3.req,read0.1.req,read0.2.req,read0.3.req |}),
(PROT_IMP_Controller0_write0,outputs_PROT_IMP(Controller0,write0)),
(PROT_IMP_Controller0_read0,outputs_PROT_IMP(Controller0,read0)),
(PROT_IMP_Controller0_write0_R_IO_read0,outputs_R_IO(Controller0,write0,read0)),
(PROT_IMP_Controller0_read0_R_IO_write0,outputs_R_IO(Controller0,read0,write0)),
(DUAL_PROT_IMP_Controller0_write0_R_IO_read0,inputs(PROT_IMP_Controller0_write0_R_IO_read0)),
(DUAL_PROT_IMP_Controller0_read0_R_IO_write0,inputs(PROT_IMP_Controller0_read0_R_IO_write0))
>
within apply(f, P )
PROT_IMP_Controller0_write0 = PROT_CTRL(write.1)
PROT_IMP_Controller0_read0 = PROT_CTRL(read.1)
DUAL_PROT_IMP_Controller0_write0 = DUAL_PROT_CTRL(write.1)
DUAL_PROT_IMP_Controller0_read0 = DUAL_PROT_CTRL(read.1)
PROT_IMP_Controller0_write0_R_IO_read0 = PROT_IMP_R(PROT_IMP_Controller0_write0,R_IO(Controller0,write0,read0))
PROT_IMP_Controller0_read0_R_IO_write0 = PROT_IMP_R(PROT_IMP_Controller0_read0,R_IO(Controller0,read0,write0))
DUAL_PROT_IMP_Controller0_write0_R_IO_read0 = DUAL_PROT_IMP_R(DUAL_PROT_IMP_Controller0_write0,R_IO(Controller0,write0,read0))
DUAL_PROT_IMP_Controller0_read0_R_IO_write0 = DUAL_PROT_IMP_R(DUAL_PROT_IMP_Controller0_read0,R_IO(Controller0,read0,write0))
--REFLEXIVE COMPOSITION
Controller0_Controller0 = REF(Controller0, write0, read0)
--D.1 channel1 is in the alphabet of contract
assert not Controller0 \ {|write0|} [T= Controller0
--D.1 channel1 is in the alphabet of contract
assert not Controller0 \ {|read0|} [T= Controller0
--D.4 : I/O confluence for first component
--D.4.1 It is divergence-free
assert PROT_IMP_Controller0_write0 :[divergence free [FD]]
--D.4.2 It is refined by the projection on the channel
assert PROT_IMP_Controller0_write0 [F= PROT_IMP_def(Controller0,write0)
--D.4.3 It is a refinement of the projection on the channel
assert PROT_IMP_def(Controller0,write0) [FD= PROT_IMP_Controller0_write0
--D.4.4 It is a port-protocol (communication protocol)
--D.4.4.1
assert not Test(subseteq(inputs_PROT_IMP(Controller0,write0),{|write0|})) [T= ERROR
--D.4.4.2
assert not Test(subseteq(outputs_PROT_IMP(Controller0,write0),{|write0|})) [T= ERROR
--D.4.5 : The renamed version is I/O Confluent
assert InBufferProt(PROT_IMP_Controller0_write0_R_IO_read0, write0) :[deterministic [F]]
--D.5 : I/O confluence for second component
--D.5.1
assert PROT_IMP_Controller0_read0 :[divergence free [FD]]
--D.5.2
assert PROT_IMP_Controller0_read0 [F= PROT_IMP_def(Controller0,read0)
--D.5.3
assert PROT_IMP_def(Controller0,read0) [FD= PROT_IMP_Controller0_read0
--D.5.4
--D.5.4.1
assert not Test(subseteq(inputs_PROT_IMP(Controller0,read0),{|read0|})) [T= ERROR
--D.5.4.2
assert not Test(subseteq(outputs_PROT_IMP(Controller0,read0),{|read0|})) [T= ERROR
--D.5.5 : The renamed version is I/O Confluent
assert InBufferProt(PROT_IMP_Controller0_read0_R_IO_write0, read0) :[deterministic [F]]
---- D.6: Protocols are Strong Compatible
assert PROT_IMP_Controller0_write0_R_IO_read0 :[deadlock free [FD]]
---- * D.6.2: Protocols are communication protocols
assert not Test(subseteq(inputs(PROT_IMP_Controller0_write0_R_IO_read0), {| write0|})) [T= ERROR
assert not Test(subseteq(outputs(PROT_IMP_Controller0_write0_R_IO_read0), {|read0|})) [T= ERROR
assert not Test(inputs(PROT_IMP_Controller0_write0_R_IO_read0) == outputs(DUAL_PROT_IMP_Controller0_write0_R_IO_read0)) [T= ERROR
assert not Test(outputs(PROT_IMP_Controller0_write0_R_IO_read0) == inputs(DUAL_PROT_IMP_Controller0_write0_R_IO_read0)) [T= ERROR
assert DUAL_PROT_IMP_Controller0_write0_R_IO_read0 [T= PROT_IMP_Controller0_write0_R_IO_read0
assert PROT_IMP_Controller0_write0_R_IO_read0 [T= DUAL_PROT_IMP_Controller0_write0_R_IO_read0
assert DUAL_PROT_IMP_Controller0_write0_R_IO_read0 [F= PROT_IMP_Controller0_read0_R_IO_write0
assert PROT_IMP_Controller0_read0_R_IO_write0 [F= DUAL_PROT_IMP_Controller0_write0_R_IO_read0
---- D.6: Protocols are Strong Compatible
assert PROT_IMP_Controller0_write0_R_IO_read0 :[deadlock free [FD]]
---- * D.6.2: Protocols are communication protocols
assert not Test(subseteq(inputs(PROT_IMP_Controller0_write0_R_IO_read0), {| write0|})) [T= ERROR
assert not Test(subseteq(outputs(PROT_IMP_Controller0_write0_R_IO_read0), {|read0|})) [T= ERROR
assert not Test(inputs(PROT_IMP_Controller0_write0_R_IO_read0) == outputs(DUAL_PROT_IMP_Controller0_write0_R_IO_read0)) [T= ERROR
assert not Test(outputs(PROT_IMP_Controller0_write0_R_IO_read0) == inputs(DUAL_PROT_IMP_Controller0_write0_R_IO_read0)) [T= ERROR
assert DUAL_PROT_IMP_Controller0_write0_R_IO_read0 [T= PROT_IMP_Controller0_write0_R_IO_read0
assert PROT_IMP_Controller0_write0_R_IO_read0 [T= DUAL_PROT_IMP_Controller0_write0_R_IO_read0
assert DUAL_PROT_IMP_Controller0_write0_R_IO_read0 [F= PROT_IMP_Controller0_read0_R_IO_write0
assert PROT_IMP_Controller0_read0_R_IO_write0 [F= DUAL_PROT_IMP_Controller0_write0_R_IO_read0
assert PROT_IMP_Controller0_read0_R_IO_write0 :[deadlock free [FD]]
assert not Test(subseteq(inputs(PROT_IMP_Controller0_read0_R_IO_write0), {| read0|})) [T= ERROR
assert not Test(subseteq(outputs(PROT_IMP_Controller0_read0_R_IO_write0), {| write0|})) [T= ERROR
assert not Test(inputs(PROT_IMP_Controller0_read0_R_IO_write0) == outputs(DUAL_PROT_IMP_Controller0_read0_R_IO_write0)) [T= ERROR
assert not Test(outputs(PROT_IMP_Controller0_read0_R_IO_write0) == inputs(DUAL_PROT_IMP_Controller0_read0_R_IO_write0)) [T= ERROR
assert DUAL_PROT_IMP_Controller0_read0_R_IO_write0 [T= PROT_IMP_Controller0_read0_R_IO_write0
assert PROT_IMP_Controller0_read0_R_IO_write0 [T= DUAL_PROT_IMP_Controller0_read0_R_IO_write0
assert DUAL_PROT_IMP_Controller0_read0_R_IO_write0 [F= PROT_IMP_Controller0_write0_R_IO_read0
assert PROT_IMP_Controller0_write0_R_IO_read0 [F= DUAL_PROT_IMP_Controller0_read0_R_IO_write0
--D.7: Protocols have Finite Output Property
--D.7.1
assert PROT_IMP_Controller0_write0_R_IO_read0 \ outputs(PROT_IMP_Controller0_write0_R_IO_read0):[divergence free [FD]]
assert PROT_IMP_Controller0_read0_R_IO_write0 \ outputs(PROT_IMP_Controller0_read0_R_IO_write0):[divergence free [FD]]
Controller0_LR1 = <(write0.1.req.v) | v <- seq(Value)>
Controller0_LR2 = <(read0.1.ack.v) | v <- seq(Value)>
assert PROJECTION(Controller0, {write0, read0}) [| {| write0, read0 |} |] BUFF_IO_1(Controller0_LR1, Controller0_LR2):[deadlock free [F]]