--- /dev/null
+/*
+ The Sieve of Erathostenes
+ Prints all prime numbers up to PRIME_MAX
+*/
+#define PRIME_MAX 100
+
+chan count = [0] of { int };
+byte tries = 2;
+
+proctype sieve(chan c; int prime)
+{ int i, haschild;
+
+end: do
+ :: c?i ->
+ if
+ :: (i%prime) ->
+ if
+ :: !haschild ->
+ /* found a new prime */
+ printf("MSC: %d\n", i);
+ haschild++;
+ chan child = [0] of { int };
+ run sieve(child, i);
+ :: else ->
+ child!i
+ fi;
+ :: else
+ /* i is divisible by prime */
+ fi
+ od
+}
+
+init
+{
+ run sieve(count, 2);
+ do
+ :: (tries < PRIME_MAX) -> count!tries; tries++
+ :: (tries >= PRIME_MAX) -> break
+ od
+}