Not16.hdl

/**
 * 16-bit Not:
 * for i=0..15: out[i] = not in[i]
 */

CHIP Not16 {
    IN in[16];
    OUT out[16];

    PARTS:
        Not(in=in[0],out=out[0]);
        Not(in=in[1],out=out[1]);
        Not(in=in[2],out=out[2]);
        Not(in=in[3],out=out[3]);
        Not(in=in[4],out=out[4]);
        Not(in=in[5],out=out[5]);
        Not(in=in[6],out=out[6]);
        Not(in=in[7],out=out[7]);
        Not(in=in[8],out=out[8]);
        Not(in=in[9],out=out[9]);
        Not(in=in[10],out=out[10]);
        Not(in=in[11],out=out[11]);
        Not(in=in[12],out=out[12]);
        Not(in=in[13],out=out[13]);
        Not(in=in[14],out=out[14]);
        Not(in=in[15],out=out[15]);
}

Or16.hdl

// 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/01/Or16.hdl

/**
 * 16-bit bitwise Or:
 * for i = 0..15 out[i] = (a[i] or b[i])
 */

CHIP Or16 {
        IN a[16], b[16];
        OUT out[16];

PARTS:
        Or(a=a[0],b=b[0],out=out[0]);
        Or(a=a[1],b=b[1],out=out[1]);
        Or(a=a[2],b=b[2],out=out[2]);
        Or(a=a[3],b=b[3],out=out[3]);
        Or(a=a[4],b=b[4],out=out[4]);
        Or(a=a[5],b=b[5],out=out[5]);
        Or(a=a[6],b=b[6],out=out[6]);
        Or(a=a[7],b=b[7],out=out[7]);
        Or(a=a[8],b=b[8],out=out[8]);
        Or(a=a[9],b=b[9],out=out[9]);
        Or(a=a[10],b=b[10],out=out[10]);
        Or(a=a[11],b=b[11],out=out[11]);
        Or(a=a[12],b=b[12],out=out[12]);
        Or(a=a[13],b=b[13],out=out[13]);
        Or(a=a[14],b=b[14],out=out[14]);
        Or(a=a[15],b=b[15],out=out[15]);
}

And16.hdl

// 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/01/And16.hdl

/**
 * 16-bit bitwise And:
 * for i = 0..15: out[i] = (a[i] and b[i])
 */

CHIP And16 {
        IN a[16], b[16];
        OUT out[16];

PARTS:
        Nand(a=a[0],b=b[0],out=x0);
        Not(in=x0,out=out[0]);
        Nand(a=a[1],b=b[1],out=x1);
        Not(in=x1,out=out[1]);
        Nand(a=a[2],b=b[2],out=x2);
        Not(in=x2,out=out[2]);
        Nand(a=a[3],b=b[3],out=x3);
        Not(in=x3,out=out[3]);
        Nand(a=a[4],b=b[4],out=x4);
        Not(in=x4,out=out[4]);
        Nand(a=a[5],b=b[5],out=x5);
        Not(in=x5,out=out[5]]);
        Nand(a=a[6],b=b[6],out=x6);
        Not(in=x6,out=out[6]);
        Nand(a=a[7],b=b[7],out=x7);
        Not(in=x7,out=out[7]);

        Nand(a=a[8],b=b[8],out=x8);
        Not(in=x8,out=out[8]);
        Nand(a=a[9],b=b[9],out=x9);
        Not(in=x1,out=out[9]);
        Nand(a=a[10],b=b[10],out=x10);
        Not(in=x10,out=out[10]);
        Nand(a=a[11],b=b[11],out=x11);
        Not(in=x11,out=out[11]);
        Nand(a=a[12],b=b[12],out=x12);
        Not(in=x12,out=out[12]);
        Nand(a=a[13],b=b[13],out=x13);
        Not(in=x13,out=out[13]]);
        Nand(a=a[14],b=b[14],out=x14);
        Not(in=x14,out=out[14]);
        Nand(a=a[15],b=b[15],out=x15);
        Not(in=x15,out=out[15]);
}

DMux.hdl

// 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/01/DMux.hdl

/**
 * Demultiplexor:
 * {a, b} = {in, 0} if sel == 0
 *          {0, in} if sel == 1
 */

CHIP DMux {
        IN in, sel;
        OUT a, b;

PARTS:
        Not(in=sel,out=notsel);
        And(a=in,b=notsel,out=a);
        And(a=in,b=sel,out=b);
}

Mux.hdl

// 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/01/Mux.hdl

/** 
 * Multiplexor:
 * out = a if sel == 0
 *       b otherwise
 */

CHIP Mux {
        IN a, b, sel;
        OUT out;

PARTS:
        Not(in=sel,out=notsel);
        And(a=a,b=notsel,out=x);
        And(a=b,b=sel,out=y);
        Or(a=x,b=y,out=out);
}

Xor.hdl

// 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/01/Xor.hdl

/**
 * Exclusive-or gate:
 * out = not (a == b)
 */

CHIP Xor {
        IN a, b;
        OUT out;

PARTS:
        Or(a=a,b=b,out=aorb);
        Not(in=a, out=nota);
        Not(in=b, out=notb);
        Or(a=nota,b=notb,out=x);
        And(a=aorb,b=x, out=out);

}

Or.hdl

// 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/01/Or.hdl

 /**
 * Or gate:
 * out = 1 if (a == 1 or b == 1)
 *       0 otherwise
 */

CHIP Or {
    IN a, b;
    OUT out;

    PARTS:
    Not(in=a, out=nota);
    Not(in=b, out=notb);
    And(a=nota, b=notb, out=x);
    Not(in=x, out=out);
}