// 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)
 */

 /*
 * Personal Notes
 * 
 * 
 */
CHIP PC {
    
    IN in[16], reset, load, inc;
    OUT out[16];
    
    PARTS:

    // Inc
    Inc16(in=regOut, out=inc16Out);
    Mux16(a=regOut, b=inc16Out, sel=inc, out=incOut);

    // Load
    Mux16(a=incOut, b=in, sel=load, out=loadOut);
    
    // Reset
    Mux16(a=loadOut, b[0..15]=false, sel=reset, out=resetOut);
    
    
    Register(in=resetOut, load=true , out=regOut, out=out);


}