Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --------- MODULE token -----------
- EXTENDS Naturals, Sequences, TLC
- CONSTANT MAXP IDs == 0 .. MAXP-1
- VARIABLE parent, deferred, holding, source, originator, req, pc, tok
- Vars == << parent, deferred, holding, source, originator, req, pc, tok >>
- Send(m,chan,i) == IF i=0 THEN chan' = chan ELSE chan' = [chan EXCEPT ![i] = Append(@,m)] \* "totalised" channel sending operation
- Receive(v,chan,i) == chan[i] # << >> /\ v = Head(chan[i]) /\ chan' = [chan EXCEPT ![i] = Tail(@)] \* channel reception operation
- Test(chan,i) == chan[i] # << >>
- Init == /\ parent = [n \in IDs |-> n-1]
- /\ deferred = [n \in IDs |-> 0]
- /\ holding = [n \in IDs |-> IF n = 1 THEN TRUE ELSE FALSE]
- /\ source = [n \in IDs |-> 1]
- /\ originator = [n \in IDs |-> 1]
- /\ req = [n \in IDs |-> << >>]
- /\ pc = [n \in IDs |-> 0]
- /\ tok = [n \in IDs |-> << >>]
- Driver(n) == /\ pc[n] = 0
- /\ IF Test(req,n) THEN pc' = [pc EXCEPT ![n] = 12] ELSE pc' = [pc EXCEPT ![n] = 1]
- /\ UNCHANGED(<<tok, parent, deferred, holding, source, originator, req >>) \*removed tok, critical from argument list
- Proc1(n) == /\ pc[n] = 1
- /\ pc' = [pc EXCEPT ![n] = 2]
- /\ UNCHANGED <<tok, parent, deferred, holding, source, originator, req>>
- Proc2(n) == /\ pc[n] = 2
- /\ ( \/ ( /\ holding[n] = FALSE
- /\ pc' = [pc EXCEPT ![n] = 3])
- \/ ( /\ holding[n] = TRUE
- /\ pc' = [pc EXCEPT ![n] = 6]))
- /\ UNCHANGED <<tok, parent, deferred, holding, source, originator, req >>
- Proc3(n) == /\ pc[n] = 3
- /\ Send([sender |-> n, origin |-> n], req, parent[n])
- /\ pc' = [pc EXCEPT ![n] = 4]
- /\ UNCHANGED <<tok, parent, deferred, holding, source, originator >>
- Proc4(n) == /\ pc[n] = 4
- /\ parent' = [parent EXCEPT ![n] = 0]
- /\ pc' = [pc EXCEPT ![n] = 5]
- /\ UNCHANGED <<tok, deferred, holding, source, originator, req >>
- Proc5(n) == /\ pc[n] = 5
- /\ Receive(0, tok, n)
- /\ pc' = [pc EXCEPT ![n] = 6]
- /\ UNCHANGED << parent, deferred, holding, source, originator, req >>
- Proc6(n) == /\ pc[n] = 6
- /\ holding' = [holding EXCEPT ![n] = FALSE]
- /\ pc' = [pc EXCEPT ![n] = 7]
- /\ UNCHANGED <<tok, parent, deferred, source, originator, req >>
- Proc7(n) == /\ pc[n] = 7
- /\ pc' = [pc EXCEPT ![n] = 8]
- /\ UNCHANGED <<tok, parent, deferred, holding, source, originator, req >>
- Proc8(n) == /\ pc[n] = 8
- /\ ( \/ ( /\ deferred[n] # 0
- /\ pc' = [pc EXCEPT ![n] = 9])
- \/ ( /\ deferred[n] = 0
- /\ pc' = [pc EXCEPT ![n] = 11]))
- /\ UNCHANGED <<deferred, tok, parent, holding, source, originator, req >>
- Proc9(n) == /\ pc[n] = 9
- /\ Send(0,tok,deferred[n])
- /\ pc' = [pc EXCEPT ![n] = 4]
- /\ UNCHANGED <<parent, holding, deferred, source, originator >>
- Proc10(n) == /\ pc[n] = 10
- /\ deferred' = [deferred EXCEPT ![n] = 0]
- /\ pc' = [pc EXCEPT ![n] = 0]
- /\ UNCHANGED <<tok, parent, holding, source, originator, req>>
- Proc11(n) == /\ pc[n] = 11
- /\ holding' = [holding EXCEPT ![n] = TRUE]
- /\ pc' = [pc EXCEPT ![n] = 0]
- /\ UNCHANGED <<tok, parent, deferred, source, originator, req>>
- Proc12(n) == /\ pc[n] = 12
- /\ (\E v \in [sender: IDs, origin: IDs]:
- /\ Receive(v,req,n)
- /\ source' = [source EXCEPT ![n] = v.sender]
- /\ originator' = [originator EXCEPT ![n] = v.origin])
- /\ pc' = [pc EXCEPT ![n] = 13]
- /\ UNCHANGED <<holding, tok, parent, deferred >>
- Proc13(n) == /\ pc[n] = 13
- /\ ( \/ ( /\ parent[n] = 0
- /\ pc' = [pc EXCEPT ![n] = 14])
- \/ ( /\ parent[n] # 0
- /\ pc' = [pc EXCEPT ![n] = 18]))
- /\ UNCHANGED <<deferred, tok, parent, holding, source, originator, req >>
- Proc14(n) == /\ pc[n] = 14
- /\ ( \/ ( /\ holding[n] = TRUE
- /\ pc' = [pc EXCEPT ![n] = 15])
- \/ ( /\ holding[n] = FALSE
- /\ pc' = [pc EXCEPT ![n] = 17]))
- /\ UNCHANGED <<deferred, tok, parent, holding, source, originator, req >>
- Proc15(n) == /\ pc[n] = 15
- /\ Send(0,tok,originator[n])
- /\ pc' = [pc EXCEPT ![n] = 16]
- /\ UNCHANGED <<req, parent, deferred, holding, source, originator >>
- Proc16(n) == /\ pc[n] = 16
- /\ holding' = [holding EXCEPT ![n] = FALSE]
- /\ pc' = [pc EXCEPT ![n] = 19]
- /\ UNCHANGED <<tok, parent, deferred, source, originator, req >>
- Proc17(n) == /\ pc[n] = 17
- /\ deferred' = [deferred EXCEPT ![n] = originator[n]]
- /\ pc' = [pc EXCEPT ![n] = 19]
- /\ UNCHANGED <<tok, parent, holding, source, originator, req >>
- Proc18(n) == /\ pc[n] = 18
- /\ Send([sender |-> n, origin |-> originator[n]],req,parent[n])
- /\ pc' = [pc EXCEPT ![n] = 19]
- /\ UNCHANGED <<holding, tok, parent, deferred, source, originator >>
- Proc19(n) == /\ pc[n] = 19
- /\ parent' = [parent EXCEPT ![n] = source[n]]
- /\ pc' = [pc EXCEPT ![n] = 0]
- /\ UNCHANGED <<req, tok, holding, deferred, source, originator >>
- NextMain(n) == \/ Proc1(n)
- \/ Proc2(n)
- \/ Proc3(n)
- \/ Proc4(n)
- \/ Proc5(n)
- \/ Proc6(n)
- \/ Proc7(n)
- \/ Proc8(n)
- \/ Proc9(n)
- \/ Proc10(n)
- \/ Proc11(n)
- NextReceive(n) == \/ Proc12(n)
- \/ Proc13(n)
- \/ Proc14(n)
- \/ Proc15(n)
- \/ Proc16(n)
- \/ Proc17(n)
- \/ Proc18(n)
- \/ Proc19(n)
- Algorithm(n) == \/ NextReceive(n)
- \/ NextMain(n)
- \/ Driver(n)
- Next == (\E n \in IDs: Algorithm(n))
- Spec == Init /\ [] [Next]_Vars /\ WF_Vars(Next)
- =======
- (*
- CONSTANT MAXP IDs == 0 .. MAXP-1
- VARIABLE phone, chan, pc
- TypeInv == phone \in [IDs -> BOOLEAN]
- /\ chan \in [IDs -> 0 .. 1]
- /\ pc \in [IDs -> 0 .. 4]
- Init == phone = [p \in IDs |-> FALSE]
- /\ chan = [[p \in IDs |-> 0] EXCEPT ![0] = 1]
- /\ pc = [p \in IDs |-> 1]
- Proc1(n) == pc[n] = 1
- /\ chan[n] = 1
- /\ pc' = [pc EXCEPT ![n]=2]
- /\ UNCHANGED <<chan, phone>>
- Proc2(n) == pc[n] = 2
- /\ phone' = [phone EXCEPT ![n] = TRUE]
- /\ pc' = [pc EXCEPT ![n]=3]
- /\ UNCHANGED <<chan>>
- Proc3(n) == pc[n] = 3
- /\ phone' = [phone EXCEPT ![n] = FALSE]
- /\ pc' = [pc EXCEPT ![n]=4]
- /\ UNCHANGED <<chan>>
- Proc4(n) == pc[n] = 4
- /\ chan' = [chan EXCEPT ![n] = 0, ![(n+1) % MAXP] = 1]
- /\ pc' = [pc EXCEPT ![n]=1]
- /\ UNCHANGED <<phone>>
- Proc(n) == Proc1(n) \/ Proc2(n) \/ Proc3(n) \/ Proc4(n)
- Next == \E n \in IDs : Proc(n)
- vars == <<phone, chan, pc>>
- Spec == Init /\ [][Next]_vars /\ WF_vars(Next)
- \* Wait for token. Receive token (chan,token). Pick up phone(phone) Hang up phone(phone). Send token(chan,token)
- \*node(x) ==
- ========
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement