--- /dev/null
+/*
+ The Sieve of Eratosthenes (c. 276-196 BC)
+ Prints all prime numbers up to MAX
+*/
+#define MAX 25
+
+mtype = { number, eof };
+
+chan root = [0] of { mtype, int };
+
+proctype sieve(chan c; int prime)
+{ chan child = [0] of { mtype, int };
+ bool haschild;
+ int n;
+
+ printf("MSC: %d is prime\n", prime);
+end: do
+ :: c?number(n) ->
+ if
+ :: (n%prime) == 0 ->
+ printf("MSC: %d = %d*%d\n", n, prime, n/prime)
+ :: else ->
+ if
+ :: !haschild -> /* new prime */
+ haschild = true;
+ run sieve(child, n);
+ :: else ->
+ child!number(n)
+ fi;
+ fi
+ :: c?eof(0) ->
+ break
+ od;
+ if
+ :: haschild ->
+ child!eof(0)
+ :: else
+ fi
+}
+
+init
+{ int n = 2;
+
+ run sieve(root, n);
+ do
+ :: (n < MAX) -> n++; root!number(n)
+ :: (n >= MAX) -> root!eof(0); break
+ od
+}