CHIP LEDSTRIPS{
// Our output has 6 bits.
// To adress the right-most output bit, we write out[0].
// The left-most output bit is out[5].
OUT out[6];
PARTS:
// Each time we call the Program Counter, we increment its state by 1.
// We only reset it if all LED lights are currently activated.
PC(in = false , load = false , inc = true, reset = out[5], out = pcout);
// Negated versions of the last three output bits of the PC.
Not(in = pcout[0], out = not0);
Not(in = pcout[1], out = not1);
Not(in = pcout[2], out = not2);
// We check the PC's state. If it's just been reset, it is now in state zero.
// To save one line of code, we write "out[5]" instead of "six", because the last LEDs are only on in state "six".
And3Way(in0 = not0, in1 = not1, in2 = not2, out = zero);
And3Way(in0 = pcout[0], in1 = not1, in2 = not2, out = one);
And3Way(in0 = not0, in1 = pcout[1], in2 = not2, out = two);
And3Way(in0 = pcout[0], in1 = pcout[1], in2 = not2, out = three);
And3Way(in0 = not0, in1 = not1, in2 = pcout[2], out = four);
And3Way(in0 = pcout[0], in1 = not1, in2 = pcout[2], out = five);
And3Way(in0 = not0, in1 = pcout[1], in2 = pcout[2], out = out[5]);
// Create the six bit output by checking which LEDs should be on depending on the state we are in.
// For example, the first LED strip is always on unless we are in state zero.
// The third LED strip is on if we are in either state three, four, five or six (here called out[5]).
Not(in = zero, out = out[0]);
Or5Way(in0 = two, in1 = three, in2 = four, in3 = five, in4 = out[5], out = out[1]);
Or4Way(in0 = three, in1 = four, in2 = five, in3 = out[5], out = out[2]);
Or3Way(in0 = four, in1 = five, in2 = out[5], out = out[3]);
Or(a = five, b = out[5], out = out[4]);
}