In the last tutorial, we encountered a problem with representing 1 as
and 0 as
— if we want to transform 0 into
, we have to source a marble from somewhere. This can make our circuits messy.
revisiting representations
How did we end up here, anyway?
Ages ago, we chose to label
with 1s and
with 0s:
This was our reasoning:
- roons treats all marbles identically
- So we have to write the same value (1) on each

- Because we need 2 values, the only other place to write 0 is on each

It turns out this isn’t actually true. roons doesn’t treat all marbles identically. If it did, none of our patterns would work in the first place.
Consider this pattern:
Did the distributor
treat A and B identically?
Put on your pedantry hats. A and B are not identical, because they are in different places.
This means we can trick the universe into encoding data in the positions of the marbles.
In circuit design, this is known as dual-rail logic. Instead of a single wire (“rail”) carrying a signal, the wires are paired up. Exactly one of them carries a signal; and it’s the choice of wire that determines whether the value is a 1 or a 0.
Applying this to roons: for each pair of paths
above, we always have exactly one
and one
, and it’s the position of the
that determines whether we have a 1 or a 0.
By contrast, our previous approach is called single-rail logic, as the bitstream is carried on a single “rail” (i.e. sequence of paths).
For short, let’s call these R1 (single-rail) and R2 (dual-rail).
We’re exploiting the arbitrariness of representations yet again — there was nothing special about our original scheme, so it’s perfectly fine to create another one when it’s convenient.
why dual rail logic?
R2 has some nice features. The main one is that it gives us a consistent marble supply — whether we get
or
, we always receive 1
and 1
.
This is very convenient for building a NOT gate:
This makes sense — we’re representing our data as
and
, and a crossing
swaps
and
. Under R2 our NOT gate doesn’t need a reservoir; it’s just a single common roon.
So why don’t we use R2 for everything? In the next tutorial we’ll look at the tradeoffs.
continue
