// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/3/a/PC.hdl
/**
 * A 16-bit counter.
 * if      reset(t): out(t+1) = 0
 * else if load(t):  out(t+1) = in(t)
 * else if inc(t):   out(t+1) = out(t) + 1
 * else              out(t+1) = out(t)
 */
CHIP PC {
    IN in[16],inc, load, reset;
    OUT out[16];

    PARTS:
    // inc current value
    Inc16(in=regOut, out=incOut);

    // choose current or inc'd val (based on inc)
    Mux16(a=regOut, b=incOut, sel=inc, out=postInc);
    // choose ^ vs input (based on load)
    Mux16(a=postInc, b=in, sel=load, out=postLoad);
    // choose ^ vs zero (based on reset)
    Mux16(a=postLoad, b=false, sel=reset, out=nextVal);

    // load register if any control signal is active
    Or(a=reset, b=load, out=resetOrLoad);
    Or(a=resetOrLoad, b=inc, out=shouldLoad);

    // stores state
    Register(in=nextVal, load=shouldLoad, out=regOut, out=out);
}
