You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
6.3 KiB

  1. // model of randomised consensus
  2. mdp
  3. const int N = 3; // num processes
  4. const int MAX = 5; // num rounds (R)
  5. const int K = 2; // Parameter for coins
  6. // need to turn these into local copies later so the reading phase is complete?
  7. formula leaders_agree1 = (p1=1 | r1<max(r1,r2,r3)) & (p2=1 | r2<max(r1,r2,r3)) & (p3=1 | r3<max(r1,r2,r3));
  8. formula leaders_agree2 = (p1=2 | r1<max(r1,r2,r3)) & (p2=2 | r2<max(r1,r2,r3)) & (p3=2 | r3<max(r1,r2,r3));
  9. formula decide1 = leaders_agree1 & (p1=1 | r1<max(r1,r2,r3)-1) & (p2=1 | r2<max(r1,r2,r3)-1) & (p3=1 | r3<max(r1,r2,r3)-1);
  10. formula decide2 = leaders_agree2 & (p1=2 | r1<max(r1,r2,r3)-1) & (p2=2 | r2<max(r1,r2,r3)-1) & (p3=2 | r3<max(r1,r2,r3)-1);
  11. module process1
  12. s1 : [0..5]; // local state
  13. // 0 initialise/read registers
  14. // 1 finish reading registers (make a decision)
  15. // 1 warn of change
  16. // 2 enter shared coin protocol
  17. // 4 finished
  18. // 5 error (reached max round and cannot decide)
  19. r1 : [0..MAX]; // round of the process
  20. p1 : [0..2]; // preference (0 corresponds to null)
  21. // nondeterministic choice as to initial preference
  22. [] s1=0 & r1=0 -> (p1'=1) & (r1'=1);
  23. [] s1=0 & r1=0 -> (p1'=2) & (r1'=1);
  24. // read registers (currently does nothing because read vs from other processes
  25. [] s1=0 & r1>0 & r1<=MAX -> (s1'=1);
  26. // maxke a decision
  27. [] s1=1 & decide1 -> (s1'=4) & (p1'=1);
  28. [] s1=1 & decide2 -> (s1'=4) & (p1'=2);
  29. [] s1=1 & r1<MAX & leaders_agree1 & !decide1 -> (s1'=0) & (p1'=1) & (r1'=r1+1);
  30. [] s1=1 & r1<MAX & leaders_agree2 & !decide2 -> (s1'=0) & (p1'=2) & (r1'=r1+1);
  31. [] s1=1 & r1<MAX & !(leaders_agree1 | leaders_agree2) -> (s1'=2) & (p1'=0);
  32. [] s1=1 & r1=MAX & !(decide1 | decide2) -> (s1'=5); // run out of rounds so error
  33. // enter the coin procotol for the current round
  34. [coin1_s1_start] s1=2 & r1=1 -> (s1'=3);
  35. [coin2_s1_start] s1=2 & r1=2 -> (s1'=3);
  36. [coin3_s1_start] s1=2 & r1=3 -> (s1'=3);
  37. [coin4_s1_start] s1=2 & r1=4 -> (s1'=3);
  38. // get response from the coin protocol
  39. [coin1_s1_p1] s1=3 & r1=1 -> (s1'=0) & (p1'=1) & (r1'=r1+1);
  40. [coin1_s1_p2] s1=3 & r1=1 -> (s1'=0) & (p1'=2) & (r1'=r1+1);
  41. [coin2_s1_p1] s1=3 & r1=2 -> (s1'=0) & (p1'=1) & (r1'=r1+1);
  42. [coin2_s1_p2] s1=3 & r1=2 -> (s1'=0) & (p1'=2) & (r1'=r1+1);
  43. [coin3_s1_p1] s1=3 & r1=3 -> (s1'=0) & (p1'=1) & (r1'=r1+1);
  44. [coin3_s1_p2] s1=3 & r1=3 -> (s1'=0) & (p1'=2) & (r1'=r1+1);
  45. [coin4_s1_p1] s1=3 & r1=4 -> (s1'=0) & (p1'=1) & (r1'=r1+1);
  46. [coin4_s1_p2] s1=3 & r1=4 -> (s1'=0) & (p1'=2) & (r1'=r1+1);
  47. // done so loop
  48. [done] s1>=4 -> true;
  49. endmodule
  50. module process2 = process1[ s1=s2,
  51. p1=p2,p2=p3,p3=p1,
  52. r1=r2,r2=r3,r3=r1,
  53. coin1_s1_start=coin1_s2_start,coin2_s1_start=coin2_s2_start,coin3_s1_start=coin3_s2_start,coin4_s1_start=coin4_s2_start,
  54. coin1_s1_p1=coin1_s2_p1,coin2_s1_p1=coin2_s2_p1,coin3_s1_p1=coin3_s2_p1,coin4_s1_p1=coin4_s2_p1,
  55. coin1_s1_p2=coin1_s2_p2,coin2_s1_p2=coin2_s2_p2,coin3_s1_p2=coin3_s2_p2,coin4_s1_p2=coin4_s2_p2 ]
  56. endmodule
  57. module process3 = process1[ s1=s3,
  58. p1=p3,p2=p1,p3=p2,
  59. r1=r3,r2=r1,r3=r2,
  60. coin1_s1_start=coin1_s3_start,coin2_s1_start=coin2_s3_start,coin3_s1_start=coin3_s3_start,coin4_s1_start=coin4_s3_start,
  61. coin1_s1_p1=coin1_s3_p1,coin2_s1_p1=coin2_s3_p1,coin3_s1_p1=coin3_s3_p1,coin4_s1_p1=coin4_s3_p1,
  62. coin1_s1_p2=coin1_s3_p2,coin2_s1_p2=coin2_s3_p2,coin3_s1_p2=coin3_s3_p2,coin4_s1_p2=coin4_s3_p2 ]
  63. endmodule
  64. module coin1_error
  65. c1 : [0..1]; // 1 is the error state
  66. v1 : [0..2]; // value of the coin returned the first time
  67. // first returned value (any processes)
  68. [coin1_s1_p1] v1=0 -> (v1'=1);
  69. [coin1_s2_p1] v1=0 -> (v1'=1);
  70. [coin1_s3_p1] v1=0 -> (v1'=1);
  71. [coin1_s1_p2] v1=0 -> (v1'=2);
  72. [coin1_s2_p2] v1=0 -> (v1'=2);
  73. [coin1_s3_p2] v1=0 -> (v1'=2);
  74. // later values returned
  75. [coin1_s1_p1] v1=1 -> true; // good behaviour
  76. [coin1_s2_p1] v1=1 -> true; // good behaviour
  77. [coin1_s3_p1] v1=1 -> true; // good behaviour
  78. [coin1_s1_p2] v1=2 -> true; // good behaviour
  79. [coin1_s2_p2] v1=2 -> true; // good behaviour
  80. [coin1_s3_p2] v1=2 -> true; // good behaviour
  81. [coin1_s1_p1] v1=2 -> (c1'=1); // error
  82. [coin1_s2_p1] v1=2 -> (c1'=1); // error
  83. [coin1_s3_p1] v1=2 -> (c1'=1); // error
  84. [coin1_s1_p2] v1=1 -> (c1'=1); // error
  85. [coin1_s2_p2] v1=1 -> (c1'=1); // error
  86. [coin1_s3_p2] v1=1 -> (c1'=1); // error
  87. endmodule
  88. module coin2_error
  89. c2 : [0..1]; // 1 is the error state
  90. v2 : [0..2]; // value of the coin returned the first time
  91. // first returned value (any processes)
  92. [coin2_s1_p1] v2=0 -> (v2'=1);
  93. [coin2_s2_p1] v2=0 -> (v2'=1);
  94. [coin2_s3_p1] v2=0 -> (v2'=1);
  95. [coin2_s1_p2] v2=0 -> (v2'=2);
  96. [coin2_s2_p2] v2=0 -> (v2'=2);
  97. [coin2_s3_p2] v2=0 -> (v2'=2);
  98. // later values returned
  99. [coin2_s1_p1] v2=1 -> true; // good behaviour
  100. [coin2_s2_p1] v2=1 -> true; // good behaviour
  101. [coin2_s3_p1] v2=1 -> true; // good behaviour
  102. [coin2_s1_p2] v2=2 -> true; // good behaviour
  103. [coin2_s2_p2] v2=2 -> true; // good behaviour
  104. [coin2_s3_p2] v2=2 -> true; // good behaviour
  105. [coin2_s1_p1] v2=2 -> (c2'=1); // error
  106. [coin2_s2_p1] v2=2 -> (c2'=1); // error
  107. [coin2_s3_p1] v2=2 -> (c2'=1); // error
  108. [coin2_s1_p2] v2=1 -> (c2'=1); // error
  109. [coin2_s2_p2] v2=1 -> (c2'=1); // error
  110. [coin2_s3_p2] v2=1 -> (c2'=1); // error
  111. endmodule
  112. module coin3_error
  113. c3 : [0..1]; // 1 is the error state
  114. v3 : [0..2]; // value of the coin returned the first time
  115. // first returned value (any processes)
  116. [coin3_s1_p1] v3=0 -> (v3'=1);
  117. [coin3_s2_p1] v3=0 -> (v3'=1);
  118. [coin3_s3_p1] v3=0 -> (v3'=1);
  119. [coin3_s1_p2] v3=0 -> (v3'=2);
  120. [coin3_s2_p2] v3=0 -> (v3'=2);
  121. [coin3_s3_p2] v3=0 -> (v3'=2);
  122. // later values returned
  123. [coin3_s1_p1] v3=1 -> true; // good behaviour
  124. [coin3_s2_p1] v3=1 -> true; // good behaviour
  125. [coin3_s3_p1] v3=1 -> true; // good behaviour
  126. [coin3_s1_p2] v3=2 -> true; // good behaviour
  127. [coin3_s2_p2] v3=2 -> true; // good behaviour
  128. [coin3_s3_p2] v3=2 -> true; // good behaviour
  129. [coin3_s1_p1] v3=2 -> (c3'=1); // error
  130. [coin3_s2_p1] v3=2 -> (c3'=1); // error
  131. [coin3_s3_p1] v3=2 -> (c3'=1); // error
  132. [coin3_s1_p2] v3=1 -> (c3'=1); // error
  133. [coin3_s2_p2] v3=1 -> (c3'=1); // error
  134. [coin3_s3_p2] v3=1 -> (c3'=1); // error
  135. endmodule
  136. // Labels
  137. label "one_proc_err" = (s1=5 | s2=5 | s3=5);
  138. label "one_coin_ok" = (c1=0 | c2=0 | c3=0);