--- /dev/null
+// output ///////////////////////////////////////////////////////////////////
+#expect 14
+#expect 13
+#expect 12
+#expect 11
+
+// program //////////////////////////////////////////////////////////////////
+#ship debug : Debug
+#ship dscratch : Dscratch
+#ship fifo : Fifo
+
+// dumb configurations
+debug.data: [*] take, deliver;
+dscratch.write_addr: [*] take, deliver;
+dscratch.write_data: [*] take, deliver;
+dscratch.read_addr: [*] take, deliver;
+fifo.in: [*] take, deliver;
+
+// addresses and values to initialize the dscratch with
+1: sendto dscratch.write_addr;
+2: sendto dscratch.write_addr;
+3: sendto dscratch.write_addr;
+4: sendto dscratch.write_addr;
+11: sendto dscratch.write_data;
+12: sendto dscratch.write_data;
+13: sendto dscratch.write_data;
+14: sendto dscratch.write_data;
+
+// send write-completion tokens to the fifo output
+dscratch.write_done:
+ [*] take, sendto fifo.out;
+
+// when the write-completion tokens accumulate, unleash
+// the read addresses
+fifo.out:
+ [4] wait;
+ [4] take, sendto dscratch.read_addr;
+
+// read addresses
+4: sendto fifo.in;
+3: sendto fifo.in;
+2: sendto fifo.in;
+1: sendto fifo.in;
+
+// data read from dscratch goes to the debug ship
+dscratch.read_data:
+ [*] take, sendto debug.data;
+
--- /dev/null
+// expected output
+#expect 9
+#expect 9
+#expect 8
+#expect 9
+#expect 9
+#expect 9
+#expect 9
+#expect 9
+#expect 9
+#expect 9
+
+// ships required in order to run this code
+#ship debug : Debug
+#ship fifo : Fifo
+
+debug.data: [*] take, deliver;
+9: sendto fifo.in;
+fifo.in:
+ take;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+ [100] deliver;
+fifo.out:
+ [100r] take, discard;
+ [100r] take, discard;
+ [1r] take, sendto debug.data;
+ [100r] take, discard;
+ [100r] take, discard;
+ [1r] take, sendto debug.data;
+ [100r] take, discard;
+ [100r] take, discard;
+ [1r] take, sendto debug.data;
+ [100r] take, discard;
+ [100r] take, discard;
+ [1r] take, sendto debug.data;
+ [100r] take, discard;
+ [100r] take, discard;
+ [1r] take, sendto debug.data;
+ [100r] take, discard;
+ [100r] take, discard;
+ [1r] take, sendto debug.data;
+ [100r] take, discard;
+ [100r] take, discard;
+ [1r] take, sendto debug.data;
+ [100r] take, discard;
+ [100r] take, discard;
+ [1r] take, sendto debug.data;
+ [100r] take, discard;
+ [100r] take, discard;
+ [1r] take, sendto debug.data;
+ [100r] take, discard;
+ [100r] take, discard;
+ [1r] take, sendto debug.data;
--- /dev/null
+// expected output
+#expect 12
+#expect 13
+#expect 14
+
+// ships required in order to run this code
+#ship debug : Debug
+#ship iscratch : Iscratch
+
+// instructions not in any codebag are part of the "root codebag"
+// which is dispatched when the code is loaded
+
+BOB: sendto iscratch.cbd;
+iscratch.cbd: [*] take, deliver;
+debug.data: [*] take, deliver;
+
+
+// This codebag illustrates how to do a loop. Notice that this
+// is actually an uncontrolled data emitter -- it could clog the
+// switch fabric!
+
+BOB: {
+ 12: sendto debug.data;
+ 13: sendto debug.data;
+ 14: sendto debug.data;
+}
+