aboutsummaryrefslogtreecommitdiff
path: root/tools/builtInChips
diff options
context:
space:
mode:
Diffstat (limited to 'tools/builtInChips')
-rw-r--r--tools/builtInChips/ALU.classbin0 -> 1754 bytes
-rw-r--r--tools/builtInChips/ALU.hdl55
-rw-r--r--tools/builtInChips/ARegister.classbin0 -> 337 bytes
-rw-r--r--tools/builtInChips/ARegister.hdl24
-rw-r--r--tools/builtInChips/Add16.classbin0 -> 343 bytes
-rw-r--r--tools/builtInChips/Add16.hdl18
-rw-r--r--tools/builtInChips/And.classbin0 -> 341 bytes
-rw-r--r--tools/builtInChips/And.hdl16
-rw-r--r--tools/builtInChips/And16.hdl17
-rw-r--r--tools/builtInChips/Bit.classbin0 -> 416 bytes
-rw-r--r--tools/builtInChips/Bit.hdl19
-rw-r--r--tools/builtInChips/DFF.classbin0 -> 401 bytes
-rw-r--r--tools/builtInChips/DFF.hdl18
-rw-r--r--tools/builtInChips/DMux.classbin0 -> 365 bytes
-rw-r--r--tools/builtInChips/DMux.hdl20
-rw-r--r--tools/builtInChips/DMux4Way.classbin0 -> 408 bytes
-rw-r--r--tools/builtInChips/DMux4Way.hdl22
-rw-r--r--tools/builtInChips/DMux8Way.classbin0 -> 488 bytes
-rw-r--r--tools/builtInChips/DMux8Way.hdl22
-rw-r--r--tools/builtInChips/DRegister.classbin0 -> 339 bytes
-rw-r--r--tools/builtInChips/DRegister.hdl24
-rw-r--r--tools/builtInChips/FullAdder.classbin0 -> 380 bytes
-rw-r--r--tools/builtInChips/FullAdder.hdl19
-rw-r--r--tools/builtInChips/HalfAdder.classbin0 -> 360 bytes
-rw-r--r--tools/builtInChips/HalfAdder.hdl18
-rw-r--r--tools/builtInChips/Inc16.classbin0 -> 333 bytes
-rw-r--r--tools/builtInChips/Inc16.hdl18
-rw-r--r--tools/builtInChips/Keyboard.classbin0 -> 1709 bytes
-rw-r--r--tools/builtInChips/Keyboard.hdl23
-rw-r--r--tools/builtInChips/Mux.classbin0 -> 356 bytes
-rw-r--r--tools/builtInChips/Mux.hdl16
-rw-r--r--tools/builtInChips/Mux16.hdl16
-rw-r--r--tools/builtInChips/Mux4Way16.classbin0 -> 435 bytes
-rw-r--r--tools/builtInChips/Mux4Way16.hdl21
-rw-r--r--tools/builtInChips/Mux8Way16.classbin0 -> 527 bytes
-rw-r--r--tools/builtInChips/Mux8Way16.hdl24
-rw-r--r--tools/builtInChips/Nand.classbin0 -> 344 bytes
-rw-r--r--tools/builtInChips/Nand.hdl16
-rw-r--r--tools/builtInChips/Not.classbin0 -> 331 bytes
-rw-r--r--tools/builtInChips/Not.hdl16
-rw-r--r--tools/builtInChips/Not16.classbin0 -> 327 bytes
-rw-r--r--tools/builtInChips/Not16.hdl16
-rw-r--r--tools/builtInChips/Or.classbin0 -> 340 bytes
-rw-r--r--tools/builtInChips/Or.hdl16
-rw-r--r--tools/builtInChips/Or16.hdl16
-rw-r--r--tools/builtInChips/Or8Way.classbin0 -> 340 bytes
-rw-r--r--tools/builtInChips/Or8Way.hdl16
-rw-r--r--tools/builtInChips/PC.classbin0 -> 1899 bytes
-rw-r--r--tools/builtInChips/PC.hdl22
-rw-r--r--tools/builtInChips/RAM.classbin0 -> 1928 bytes
-rw-r--r--tools/builtInChips/RAM16K.classbin0 -> 390 bytes
-rw-r--r--tools/builtInChips/RAM16K.hdl24
-rw-r--r--tools/builtInChips/RAM4K.classbin0 -> 309 bytes
-rw-r--r--tools/builtInChips/RAM4K.hdl24
-rw-r--r--tools/builtInChips/RAM512.classbin0 -> 311 bytes
-rw-r--r--tools/builtInChips/RAM512.hdl24
-rw-r--r--tools/builtInChips/RAM64.classbin0 -> 308 bytes
-rw-r--r--tools/builtInChips/RAM64.hdl24
-rw-r--r--tools/builtInChips/RAM8.classbin0 -> 306 bytes
-rw-r--r--tools/builtInChips/RAM8.hdl24
-rw-r--r--tools/builtInChips/ROM32K.classbin0 -> 3469 bytes
-rw-r--r--tools/builtInChips/ROM32K.hdl30
-rw-r--r--tools/builtInChips/Register.classbin0 -> 423 bytes
-rw-r--r--tools/builtInChips/Register.hdl19
-rw-r--r--tools/builtInChips/RegisterWithGUI.classbin0 -> 1769 bytes
-rw-r--r--tools/builtInChips/Screen.classbin0 -> 1322 bytes
-rw-r--r--tools/builtInChips/Screen.hdl35
-rw-r--r--tools/builtInChips/Xor.classbin0 -> 341 bytes
-rw-r--r--tools/builtInChips/Xor.hdl16
69 files changed, 748 insertions, 0 deletions
diff --git a/tools/builtInChips/ALU.class b/tools/builtInChips/ALU.class
new file mode 100644
index 0000000..03f95dc
--- /dev/null
+++ b/tools/builtInChips/ALU.class
Binary files differ
diff --git a/tools/builtInChips/ALU.hdl b/tools/builtInChips/ALU.hdl
new file mode 100644
index 0000000..e5fd1f0
--- /dev/null
+++ b/tools/builtInChips/ALU.hdl
@@ -0,0 +1,55 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/ALU.hdl
+
+/**
+ * The ALU. Computes one of the following functions:
+ * x+y, x-y, y–x, 0, 1, -1, x, y, -x, -y, !x, !y,
+ * x+1, y+1, x-1, y-1, x&y, x|y on two 16-bit inputs.
+ * Which function to compute is determined by 6 input bits
+ * denoted zx, nx, zy, ny, f, no.
+ * The computed function's value is called "out".
+ * In addition to computing out, the ALU computes two
+ * 1-bit outputs called zr and ng:
+ * if out == 0, zr = 1; otherwise zr = 0;
+ * If out < 0, ng = 1; otherwise ng = 0.
+ * The 6-bit combinations (zx,nx,zy,ny,f,no) and
+ * their effect are documented in the book.
+ */
+
+// Implementation: the ALU manipulates the x and y
+// inputs and then operates on the resulting values,
+// as follows:
+// if (zx == 1) sets x = 0 // 16-bit constant
+// if (nx == 1) sets x = ~x // bitwise "not"
+// if (zy == 1) sets y = 0 // 16-bit constant
+// if (ny == 1) sets y = ~y // bitwise "not"
+// if (f == 1) sets out = x + y // integer 2's-complement addition
+// if (f == 0) sets out = x & y // bitwise And
+// if (no == 1) sets out = ~out // bitwise Not
+// if (out == 0) sets zr = 1
+// if (out < 0) sets ng = 1
+
+
+CHIP ALU {
+
+ IN // 16-bit inputs:
+ x[16], y[16],
+ // Control bits:
+ zx, // Zero the x input
+ nx, // Negate the x input
+ zy, // Zero the y input
+ ny, // Negate the y input
+ f, // Function code: 1 for add, 0 for and
+ no; // Negate the out output
+
+ OUT // 16-bit output
+ out[16],
+
+ // ALU output flags
+ zr, // 1 if out=0, 0 otherwise
+ ng; // 1 if out<0, 0 otherwise
+
+ BUILTIN ALU;
+}
diff --git a/tools/builtInChips/ARegister.class b/tools/builtInChips/ARegister.class
new file mode 100644
index 0000000..ab9aadc
--- /dev/null
+++ b/tools/builtInChips/ARegister.class
Binary files differ
diff --git a/tools/builtInChips/ARegister.hdl b/tools/builtInChips/ARegister.hdl
new file mode 100644
index 0000000..23aee73
--- /dev/null
+++ b/tools/builtInChips/ARegister.hdl
@@ -0,0 +1,24 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/ARegister.hdl
+
+/**
+ * A 16-Bit register called "A Register".
+ * If load[t-1]=1 then out[t] = in[t-1]
+ * else out does not change (out[t] = out[t-1])
+ *
+ * This built-in chip implementation has the side effect of
+ * providing a GUI representation of a 16-bit register
+ * called "A register" (typically used to store an address).
+ */
+
+CHIP ARegister {
+
+ IN in[16], load;
+ OUT out[16];
+
+ BUILTIN ARegister;
+ CLOCKED in, load;
+}
+
diff --git a/tools/builtInChips/Add16.class b/tools/builtInChips/Add16.class
new file mode 100644
index 0000000..c3754ce
--- /dev/null
+++ b/tools/builtInChips/Add16.class
Binary files differ
diff --git a/tools/builtInChips/Add16.hdl b/tools/builtInChips/Add16.hdl
new file mode 100644
index 0000000..a494af4
--- /dev/null
+++ b/tools/builtInChips/Add16.hdl
@@ -0,0 +1,18 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Add16.hdl
+
+/*
+ * Adds two 16-bit values.
+ * The most significant carry bit is ignored.
+ */
+
+CHIP Add16 {
+
+ IN a[16], b[16];
+ OUT out[16];
+
+ BUILTIN Add16;
+}
+
diff --git a/tools/builtInChips/And.class b/tools/builtInChips/And.class
new file mode 100644
index 0000000..2c7492b
--- /dev/null
+++ b/tools/builtInChips/And.class
Binary files differ
diff --git a/tools/builtInChips/And.hdl b/tools/builtInChips/And.hdl
new file mode 100644
index 0000000..d2c48b5
--- /dev/null
+++ b/tools/builtInChips/And.hdl
@@ -0,0 +1,16 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/And.hdl
+
+/**
+ * And gate: out = 1 if {a == 1 and b == 1}, 0 otherwise
+ */
+
+CHIP And {
+
+ IN a, b;
+ OUT out;
+
+ BUILTIN And;
+}
diff --git a/tools/builtInChips/And16.hdl b/tools/builtInChips/And16.hdl
new file mode 100644
index 0000000..4c71874
--- /dev/null
+++ b/tools/builtInChips/And16.hdl
@@ -0,0 +1,17 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/And16.hdl
+
+/**
+ * 16-bit-wise And gate: for i = 0..15: out[i] = a[i] and b[i]
+ */
+
+CHIP And16 {
+
+ IN a[16], b[16];
+ OUT out[16];
+
+ BUILTIN And;
+}
+
diff --git a/tools/builtInChips/Bit.class b/tools/builtInChips/Bit.class
new file mode 100644
index 0000000..1e5a3c4
--- /dev/null
+++ b/tools/builtInChips/Bit.class
Binary files differ
diff --git a/tools/builtInChips/Bit.hdl b/tools/builtInChips/Bit.hdl
new file mode 100644
index 0000000..a0a76bb
--- /dev/null
+++ b/tools/builtInChips/Bit.hdl
@@ -0,0 +1,19 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Bit.hdl
+
+/**
+ * 1-bit register.
+ * If load[t] == 1 then out[t+1] = in[t]
+ * else out[t+1] = out[t] (no change)
+ */
+
+CHIP Bit {
+
+ IN in, load;
+ OUT out;
+
+ BUILTIN Bit;
+ CLOCKED in, load;
+}
diff --git a/tools/builtInChips/DFF.class b/tools/builtInChips/DFF.class
new file mode 100644
index 0000000..49efcf1
--- /dev/null
+++ b/tools/builtInChips/DFF.class
Binary files differ
diff --git a/tools/builtInChips/DFF.hdl b/tools/builtInChips/DFF.hdl
new file mode 100644
index 0000000..c66b796
--- /dev/null
+++ b/tools/builtInChips/DFF.hdl
@@ -0,0 +1,18 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/DFF.hdl
+
+/**
+ * Data Flip-flop: out(t) = in(t-1)
+ * where t is the current time unit, or clock cycle.
+ */
+
+CHIP DFF {
+
+ IN in;
+ OUT out;
+
+ BUILTIN DFF;
+ CLOCKED in;
+}
diff --git a/tools/builtInChips/DMux.class b/tools/builtInChips/DMux.class
new file mode 100644
index 0000000..8cf4e0b
--- /dev/null
+++ b/tools/builtInChips/DMux.class
Binary files differ
diff --git a/tools/builtInChips/DMux.hdl b/tools/builtInChips/DMux.hdl
new file mode 100644
index 0000000..80153d7
--- /dev/null
+++ b/tools/builtInChips/DMux.hdl
@@ -0,0 +1,20 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/DMux.hdl
+
+/**
+ * Dmultiplexor.
+ * {a,b} = {in,0} if sel == 0
+ * {0,in} if sel == 1
+ */
+
+
+CHIP DMux {
+
+ IN in, sel;
+ OUT a, b;
+
+ BUILTIN DMux;
+}
+
diff --git a/tools/builtInChips/DMux4Way.class b/tools/builtInChips/DMux4Way.class
new file mode 100644
index 0000000..ab72a17
--- /dev/null
+++ b/tools/builtInChips/DMux4Way.class
Binary files differ
diff --git a/tools/builtInChips/DMux4Way.hdl b/tools/builtInChips/DMux4Way.hdl
new file mode 100644
index 0000000..110bb4e
--- /dev/null
+++ b/tools/builtInChips/DMux4Way.hdl
@@ -0,0 +1,22 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/DMux4Way.hdl
+
+/**
+ * 4-way demultiplexor.
+ * {a,b,c,d} = {in,0,0,0} if sel == 00
+ * {0,in,0,0} if sel == 01
+ * {0,0,in,0} if sel == 10
+ * {0,0,0,in} if sel == 11
+ */
+
+
+CHIP DMux4Way {
+
+ IN in, sel[2];
+ OUT a, b, c, d;
+
+ BUILTIN DMux4Way;
+}
+
diff --git a/tools/builtInChips/DMux8Way.class b/tools/builtInChips/DMux8Way.class
new file mode 100644
index 0000000..80e7437
--- /dev/null
+++ b/tools/builtInChips/DMux8Way.class
Binary files differ
diff --git a/tools/builtInChips/DMux8Way.hdl b/tools/builtInChips/DMux8Way.hdl
new file mode 100644
index 0000000..c5536b8
--- /dev/null
+++ b/tools/builtInChips/DMux8Way.hdl
@@ -0,0 +1,22 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/DMux8Way.hdl
+
+/**
+ * 8-way demultiplexor.
+ * {a,b,c,d,e,f,g,h} = {in,0,0,0,0,0,0,0} if sel == 000
+ * {0,in,0,0,0,0,0,0} if sel == 001
+ * etc.
+ * {0,0,0,0,0,0,0,in} if sel == 111
+ */
+
+
+CHIP DMux8Way {
+
+ IN in, sel[3];
+ OUT a, b, c, d, e, f, g, h;
+
+ BUILTIN DMux8Way;
+}
+
diff --git a/tools/builtInChips/DRegister.class b/tools/builtInChips/DRegister.class
new file mode 100644
index 0000000..74a713d
--- /dev/null
+++ b/tools/builtInChips/DRegister.class
Binary files differ
diff --git a/tools/builtInChips/DRegister.hdl b/tools/builtInChips/DRegister.hdl
new file mode 100644
index 0000000..6c9a254
--- /dev/null
+++ b/tools/builtInChips/DRegister.hdl
@@ -0,0 +1,24 @@
+// This file is part of the materials accompanying the book
+// "The Elements of Computing Systems" by Nisan and Schocken,
+// MIT Press. Book site: www.idc.ac.il/tecs
+// File name: tools/builtIn/DRegister.hdl
+
+/**
+ * A 16-Bit register called "D Register".
+ * If load[t-1]=1 then out[t] = in[t-1]
+ * else out does not change (out[t] = out[t-1])
+ *
+ * This built-in chip implementation has the side effect of
+ * providing a GUI representation of a 16-bit register
+ * called "D register" (typically used to store data).
+ */
+
+CHIP DRegister {
+
+ IN in[16], load;
+ OUT out[16];
+
+ BUILTIN DRegister;
+ CLOCKED in, load;
+}
+
diff --git a/tools/builtInChips/FullAdder.class b/tools/builtInChips/FullAdder.class
new file mode 100644
index 0000000..2ed9ead
--- /dev/null
+++ b/tools/builtInChips/FullAdder.class
Binary files differ
diff --git a/tools/builtInChips/FullAdder.hdl b/tools/builtInChips/FullAdder.hdl
new file mode 100644
index 0000000..a4caa56
--- /dev/null
+++ b/tools/builtInChips/FullAdder.hdl
@@ -0,0 +1,19 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/FullAdder.hdl
+
+/**
+ * Full adder. Computes sum, the least significant bit of
+ * a + b + c, and carry, the most significant bit of a + b + c.
+ */
+
+CHIP FullAdder {
+
+ IN a, b, c;
+ OUT sum, // LSB of a + b + c
+ carry; // MSB of a + b + c
+
+ BUILTIN FullAdder;
+}
+
diff --git a/tools/builtInChips/HalfAdder.class b/tools/builtInChips/HalfAdder.class
new file mode 100644
index 0000000..e7741ed
--- /dev/null
+++ b/tools/builtInChips/HalfAdder.class
Binary files differ
diff --git a/tools/builtInChips/HalfAdder.hdl b/tools/builtInChips/HalfAdder.hdl
new file mode 100644
index 0000000..1591b96
--- /dev/null
+++ b/tools/builtInChips/HalfAdder.hdl
@@ -0,0 +1,18 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/HalfAdder.hdl
+
+/**
+ * Half adder. Computes sum, the least significnat bit of a + b,
+ * and carry, the most significnat bit of a + b.
+ */
+
+CHIP HalfAdder {
+
+ IN a, b;
+ OUT sum, // LSB of a + b
+ carry; // MSB of a + b
+
+ BUILTIN HalfAdder;
+}
diff --git a/tools/builtInChips/Inc16.class b/tools/builtInChips/Inc16.class
new file mode 100644
index 0000000..b5b2aeb
--- /dev/null
+++ b/tools/builtInChips/Inc16.class
Binary files differ
diff --git a/tools/builtInChips/Inc16.hdl b/tools/builtInChips/Inc16.hdl
new file mode 100644
index 0000000..9d2d49b
--- /dev/null
+++ b/tools/builtInChips/Inc16.hdl
@@ -0,0 +1,18 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Inc16.hdl
+
+/**
+ * 16-bit incrementer. out = in + 1 (16-bit addition).
+ * Overflow is neither detected nor handled.
+ */
+
+CHIP Inc16 {
+
+ IN in[16];
+ OUT out[16];
+
+ BUILTIN Inc16;
+}
+
diff --git a/tools/builtInChips/Keyboard.class b/tools/builtInChips/Keyboard.class
new file mode 100644
index 0000000..090b7cc
--- /dev/null
+++ b/tools/builtInChips/Keyboard.class
Binary files differ
diff --git a/tools/builtInChips/Keyboard.hdl b/tools/builtInChips/Keyboard.hdl
new file mode 100644
index 0000000..26ca5ed
--- /dev/null
+++ b/tools/builtInChips/Keyboard.hdl
@@ -0,0 +1,23 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Keyboard.hdl
+
+/**
+ * The keyboard (memory map).
+ * Outputs the code of the currently pressed key.
+ *
+ * The built-in chip implementation has two side effects supplied
+ * by the simulator. First, the keyboard memory map is continuously
+ * being refreshed from the physical keyboard unit. Second, it
+ * displays a keyboard icon and data entry GUI.
+ */
+
+CHIP Keyboard {
+
+ OUT out[16]; // The ASCII code of the pressed key,
+ // or 0 if no key is currently pressed,
+ // or one the special codes listed in Figure 5.5.
+
+ BUILTIN Keyboard;
+}
diff --git a/tools/builtInChips/Mux.class b/tools/builtInChips/Mux.class
new file mode 100644
index 0000000..75c6645
--- /dev/null
+++ b/tools/builtInChips/Mux.class
Binary files differ
diff --git a/tools/builtInChips/Mux.hdl b/tools/builtInChips/Mux.hdl
new file mode 100644
index 0000000..a0eefbc
--- /dev/null
+++ b/tools/builtInChips/Mux.hdl
@@ -0,0 +1,16 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Mux.hdl
+
+/**
+ * Multiplexor. If sel == 1 then out = b else out = a.
+ */
+
+CHIP Mux {
+
+ IN a, b, sel;
+ OUT out;
+
+ BUILTIN Mux;
+}
diff --git a/tools/builtInChips/Mux16.hdl b/tools/builtInChips/Mux16.hdl
new file mode 100644
index 0000000..676d1f4
--- /dev/null
+++ b/tools/builtInChips/Mux16.hdl
@@ -0,0 +1,16 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Mux16.hdl
+
+/**
+ * 16 bit multiplexor. If sel == 1 then out = b else out = a.
+ */
+
+CHIP Mux16 {
+
+ IN a[16], b[16], sel;
+ OUT out[16];
+
+ BUILTIN Mux;
+}
diff --git a/tools/builtInChips/Mux4Way16.class b/tools/builtInChips/Mux4Way16.class
new file mode 100644
index 0000000..b2e2ed7
--- /dev/null
+++ b/tools/builtInChips/Mux4Way16.class
Binary files differ
diff --git a/tools/builtInChips/Mux4Way16.hdl b/tools/builtInChips/Mux4Way16.hdl
new file mode 100644
index 0000000..9929e82
--- /dev/null
+++ b/tools/builtInChips/Mux4Way16.hdl
@@ -0,0 +1,21 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Mux4Way16.hdl
+
+/**
+ * 4-way 16-bit multiplexor.
+ * out = a if sel == 00
+ * b if sel == 01
+ * c if sel == 10
+ * d if sel == 11
+ */
+
+
+CHIP Mux4Way16 {
+
+ IN a[16], b[16], c[16], d[16], sel[2];
+ OUT out[16];
+
+ BUILTIN Mux4Way16;
+}
diff --git a/tools/builtInChips/Mux8Way16.class b/tools/builtInChips/Mux8Way16.class
new file mode 100644
index 0000000..d8040ef
--- /dev/null
+++ b/tools/builtInChips/Mux8Way16.class
Binary files differ
diff --git a/tools/builtInChips/Mux8Way16.hdl b/tools/builtInChips/Mux8Way16.hdl
new file mode 100644
index 0000000..dc16861
--- /dev/null
+++ b/tools/builtInChips/Mux8Way16.hdl
@@ -0,0 +1,24 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Mux8Way16.hdl
+
+/**
+ * 8-way 16-bit multiplexor.
+ * out = a if sel == 000
+ * b if sel == 001
+ * etc.
+ * h if sel == 111
+ */
+
+
+CHIP Mux8Way16 {
+
+ IN a[16], b[16], c[16], d[16],
+ e[16], f[16], g[16], h[16],
+ sel[3];
+
+ OUT out[16];
+
+ BUILTIN Mux8Way16;
+} \ No newline at end of file
diff --git a/tools/builtInChips/Nand.class b/tools/builtInChips/Nand.class
new file mode 100644
index 0000000..4b429ba
--- /dev/null
+++ b/tools/builtInChips/Nand.class
Binary files differ
diff --git a/tools/builtInChips/Nand.hdl b/tools/builtInChips/Nand.hdl
new file mode 100644
index 0000000..ae0204e
--- /dev/null
+++ b/tools/builtInChips/Nand.hdl
@@ -0,0 +1,16 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Nand.hdl
+
+/**
+ * Nand gate: out = a Nand b.
+ */
+
+CHIP Nand {
+
+ IN a, b;
+ OUT out;
+
+ BUILTIN Nand;
+}
diff --git a/tools/builtInChips/Not.class b/tools/builtInChips/Not.class
new file mode 100644
index 0000000..4726b67
--- /dev/null
+++ b/tools/builtInChips/Not.class
Binary files differ
diff --git a/tools/builtInChips/Not.hdl b/tools/builtInChips/Not.hdl
new file mode 100644
index 0000000..5b9d897
--- /dev/null
+++ b/tools/builtInChips/Not.hdl
@@ -0,0 +1,16 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Not.hdl
+
+/**
+ * Not gate: out = not in
+ */
+
+CHIP Not {
+
+ IN in;
+ OUT out;
+
+ BUILTIN Not;
+} \ No newline at end of file
diff --git a/tools/builtInChips/Not16.class b/tools/builtInChips/Not16.class
new file mode 100644
index 0000000..ff3e68f
--- /dev/null
+++ b/tools/builtInChips/Not16.class
Binary files differ
diff --git a/tools/builtInChips/Not16.hdl b/tools/builtInChips/Not16.hdl
new file mode 100644
index 0000000..c50dab9
--- /dev/null
+++ b/tools/builtInChips/Not16.hdl
@@ -0,0 +1,16 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Not16.hdl
+
+/**
+ * 16-bit Not gate: for i = 0..15: out[i] = not in[i]
+ */
+
+CHIP Not16 {
+
+ IN in[16];
+ OUT out[16];
+
+ BUILTIN Not16;
+} \ No newline at end of file
diff --git a/tools/builtInChips/Or.class b/tools/builtInChips/Or.class
new file mode 100644
index 0000000..a5b64f9
--- /dev/null
+++ b/tools/builtInChips/Or.class
Binary files differ
diff --git a/tools/builtInChips/Or.hdl b/tools/builtInChips/Or.hdl
new file mode 100644
index 0000000..4a3f14b
--- /dev/null
+++ b/tools/builtInChips/Or.hdl
@@ -0,0 +1,16 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Or.hdl
+
+/**
+ * Or gate: out = 1 if {a == 1 or b == 1}, 0 otherwise
+ */
+
+CHIP Or {
+
+ IN a, b;
+ OUT out;
+
+ BUILTIN Or;
+}
diff --git a/tools/builtInChips/Or16.hdl b/tools/builtInChips/Or16.hdl
new file mode 100644
index 0000000..6c124e8
--- /dev/null
+++ b/tools/builtInChips/Or16.hdl
@@ -0,0 +1,16 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Or16.hdl
+
+/**
+ * 16-bit bitwise Or gate: for i = 0..15 out[i] = a[i] or b[i].
+ */
+
+CHIP Or16 {
+
+ IN a[16], b[16];
+ OUT out[16];
+
+ BUILTIN Or;
+}
diff --git a/tools/builtInChips/Or8Way.class b/tools/builtInChips/Or8Way.class
new file mode 100644
index 0000000..104804b
--- /dev/null
+++ b/tools/builtInChips/Or8Way.class
Binary files differ
diff --git a/tools/builtInChips/Or8Way.hdl b/tools/builtInChips/Or8Way.hdl
new file mode 100644
index 0000000..dccd61d
--- /dev/null
+++ b/tools/builtInChips/Or8Way.hdl
@@ -0,0 +1,16 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Or8Way.hdl
+
+/**
+ * 8-way Or gate: out = in[0] or in[1] or ... or in[7].
+ */
+
+CHIP Or8Way {
+
+ IN in[8];
+ OUT out;
+
+ BUILTIN Or8Way;
+}
diff --git a/tools/builtInChips/PC.class b/tools/builtInChips/PC.class
new file mode 100644
index 0000000..1e6ada1
--- /dev/null
+++ b/tools/builtInChips/PC.class
Binary files differ
diff --git a/tools/builtInChips/PC.hdl b/tools/builtInChips/PC.hdl
new file mode 100644
index 0000000..f102d99
--- /dev/null
+++ b/tools/builtInChips/PC.hdl
@@ -0,0 +1,22 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/PC.hdl
+
+/**
+ * 16-bit counter with load and reset controls.
+ *
+ * If reset(t-1) then out(t) = 0
+ * else if load(t-1) then out(t) = in(t-1)
+ * else if inc(t-1) then out(t) = out(t-1) + 1 (integer addition)
+ * else out(t) = out(t-1)
+ */
+
+CHIP PC {
+
+ IN in[16], load, inc, reset;
+ OUT out[16];
+
+ BUILTIN PC;
+ CLOCKED in, load, inc, reset;
+}
diff --git a/tools/builtInChips/RAM.class b/tools/builtInChips/RAM.class
new file mode 100644
index 0000000..e17050f
--- /dev/null
+++ b/tools/builtInChips/RAM.class
Binary files differ
diff --git a/tools/builtInChips/RAM16K.class b/tools/builtInChips/RAM16K.class
new file mode 100644
index 0000000..2f1e3fe
--- /dev/null
+++ b/tools/builtInChips/RAM16K.class
Binary files differ
diff --git a/tools/builtInChips/RAM16K.hdl b/tools/builtInChips/RAM16K.hdl
new file mode 100644
index 0000000..7031bf9
--- /dev/null
+++ b/tools/builtInChips/RAM16K.hdl
@@ -0,0 +1,24 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/RAM16K.hdl
+
+/**
+ * Memory of 16K registers, each 16-bit wide.
+ * The chip facilitates read and write operations, as follows:
+ * Read: out(t) = RAM16K[address(t)](t)
+ * Write: If load(t-1) then RAM16K[address(t-1)](t) = in(t-1)
+ * In words: the chip always outputs the value stored at the memory
+ * location specified by address. If load=1, the in value is loaded
+ * into the memory location specified by address. This value becomes
+ * available through the out output starting from the next time step.
+ */
+
+CHIP RAM16K {
+
+ IN in[16], load, address[14];
+ OUT out[16];
+
+ BUILTIN RAM16K;
+ CLOCKED in, load;
+}
diff --git a/tools/builtInChips/RAM4K.class b/tools/builtInChips/RAM4K.class
new file mode 100644
index 0000000..164ebf8
--- /dev/null
+++ b/tools/builtInChips/RAM4K.class
Binary files differ
diff --git a/tools/builtInChips/RAM4K.hdl b/tools/builtInChips/RAM4K.hdl
new file mode 100644
index 0000000..8f1b211
--- /dev/null
+++ b/tools/builtInChips/RAM4K.hdl
@@ -0,0 +1,24 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/RAM4K.hdl
+
+/**
+ * Memory of 4K registers, each 16-bit wide.
+ * The chip facilitates read and write operations, as follows:
+ * Read: out(t) = RAM4K[address(t)](t)
+ * Write: If load(t-1) then RAM4K[address(t-1)](t) = in(t-1)
+ * In words: the chip always outputs the value stored at the memory
+ * location specified by address. If load == 1, the in value is loaded
+ * into the memory location specified by address. This value becomes
+ * available through the out output starting from the next time step.
+ */
+
+CHIP RAM4K {
+
+ IN in[16], load, address[12];
+ OUT out[16];
+
+ BUILTIN RAM4K;
+ CLOCKED in, load;
+}
diff --git a/tools/builtInChips/RAM512.class b/tools/builtInChips/RAM512.class
new file mode 100644
index 0000000..69bff7a
--- /dev/null
+++ b/tools/builtInChips/RAM512.class
Binary files differ
diff --git a/tools/builtInChips/RAM512.hdl b/tools/builtInChips/RAM512.hdl
new file mode 100644
index 0000000..2a2f433
--- /dev/null
+++ b/tools/builtInChips/RAM512.hdl
@@ -0,0 +1,24 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/RAM512.hdl
+
+/**
+ * Memory of 512 registers, each 16-bit wide.
+ * The chip facilitates read and write operations, as follows:
+ * Read: out(t) = RAM512[address(t)](t)
+ * Write: If load(t-1) then RAM512[address(t-1)](t) = in(t-1)
+ * In words: the chip always outputs the value stored at the memory
+ * location specified by address. If load == 1, the in value is loaded
+ * into the memory location specified by address. This value becomes
+ * available through the out output starting from the next time step.
+ */
+
+CHIP RAM512 {
+
+ IN in[16], load, address[9];
+ OUT out[16];
+
+ BUILTIN RAM512;
+ CLOCKED in, load;
+}
diff --git a/tools/builtInChips/RAM64.class b/tools/builtInChips/RAM64.class
new file mode 100644
index 0000000..a1fe78a
--- /dev/null
+++ b/tools/builtInChips/RAM64.class
Binary files differ
diff --git a/tools/builtInChips/RAM64.hdl b/tools/builtInChips/RAM64.hdl
new file mode 100644
index 0000000..6f32f47
--- /dev/null
+++ b/tools/builtInChips/RAM64.hdl
@@ -0,0 +1,24 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/RAM64.hdl
+
+/**
+ * Memory of 64 registers, each 16-bit wide.
+ * The chip facilitates read and write operations, as follows:
+ * Read: out(t) = RAM64[address(t)](t)
+ * Write: If load(t-1) then RAM64[address(t-1)](t) = in(t-1)
+ * In words: the chip always outputs the value stored at the memory
+ * location specified by address. If load == 1, the in value is loaded
+ * into the memory location specified by address. This value becomes
+ * available through the out output starting from the next time step.
+ */
+
+CHIP RAM64 {
+
+ IN in[16], load, address[6];
+ OUT out[16];
+
+ BUILTIN RAM64;
+ CLOCKED in, load;
+}
diff --git a/tools/builtInChips/RAM8.class b/tools/builtInChips/RAM8.class
new file mode 100644
index 0000000..88f106e
--- /dev/null
+++ b/tools/builtInChips/RAM8.class
Binary files differ
diff --git a/tools/builtInChips/RAM8.hdl b/tools/builtInChips/RAM8.hdl
new file mode 100644
index 0000000..c08d62c
--- /dev/null
+++ b/tools/builtInChips/RAM8.hdl
@@ -0,0 +1,24 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/RAM8.hdl
+
+/**
+ * Memory of 8 registers, each 16-bit wide.
+ * The chip facilitates read and write operations, as follows:
+ * Read: out(t) = RAM8[address(t)](t)
+ * Write: If load(t-1) then RAM8[address(t-1)](t) = in(t-1)
+ * In words: the chip always outputs the value stored at the memory
+ * location specified by address. If load == 1, the in value is loaded
+ * into the memory location specified by address. This value becomes
+ * available through the out output starting from the next time step.
+ */
+
+CHIP RAM8 {
+
+ IN in[16], load, address[3];
+ OUT out[16];
+
+ BUILTIN RAM8;
+ CLOCKED in, load;
+}
diff --git a/tools/builtInChips/ROM32K.class b/tools/builtInChips/ROM32K.class
new file mode 100644
index 0000000..c4320d8
--- /dev/null
+++ b/tools/builtInChips/ROM32K.class
Binary files differ
diff --git a/tools/builtInChips/ROM32K.hdl b/tools/builtInChips/ROM32K.hdl
new file mode 100644
index 0000000..929f824
--- /dev/null
+++ b/tools/builtInChips/ROM32K.hdl
@@ -0,0 +1,30 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/ROM32K.hdl
+
+/**
+ * Read-Only memory (ROM) of 16K registers, each 16-bit wide.
+ * The chip is designed to facilitate data read, as follows:
+ * out(t) = ROM32K[address(t)](t)
+ * In words: the chip always outputs the value stored at the
+ * memory location specified by address.
+ *
+ * The built-in chip implementation has a GUI side-effect,
+ * showing an array-like component that displays the ROM's
+ * contents. The ROM32K chip is supposed to be pre-loaded with
+ * a machine language program. To that end, the built-in chip
+ * implementation also knows how to handle the "ROM32K load Xxx"
+ * script command, where Xxx is the name of a text file containing
+ * a program written in the Hack machine language. When the
+ * simulator encounters such a command in a test script, the code
+ * found in the file is loaded into the simulated ROM32K unit.
+ */
+
+CHIP ROM32K {
+
+ IN address[15];
+ OUT out[16];
+
+ BUILTIN ROM32K;
+}
diff --git a/tools/builtInChips/Register.class b/tools/builtInChips/Register.class
new file mode 100644
index 0000000..3958fcd
--- /dev/null
+++ b/tools/builtInChips/Register.class
Binary files differ
diff --git a/tools/builtInChips/Register.hdl b/tools/builtInChips/Register.hdl
new file mode 100644
index 0000000..3b81e46
--- /dev/null
+++ b/tools/builtInChips/Register.hdl
@@ -0,0 +1,19 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Register.hdl
+
+/**
+ * 16-Bit register.
+ * If load[t-1]=1 then out[t] = in[t-1]
+ * else out does not change (out[t] = out[t-1])
+ */
+
+CHIP Register {
+
+ IN in[16], load;
+ OUT out[16];
+
+ BUILTIN Register;
+ CLOCKED in, load;
+}
diff --git a/tools/builtInChips/RegisterWithGUI.class b/tools/builtInChips/RegisterWithGUI.class
new file mode 100644
index 0000000..c80208c
--- /dev/null
+++ b/tools/builtInChips/RegisterWithGUI.class
Binary files differ
diff --git a/tools/builtInChips/Screen.class b/tools/builtInChips/Screen.class
new file mode 100644
index 0000000..100ed03
--- /dev/null
+++ b/tools/builtInChips/Screen.class
Binary files differ
diff --git a/tools/builtInChips/Screen.hdl b/tools/builtInChips/Screen.hdl
new file mode 100644
index 0000000..5e7837b
--- /dev/null
+++ b/tools/builtInChips/Screen.hdl
@@ -0,0 +1,35 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Screen.hdl
+
+/**
+ * The Screen (memory map).
+ * Functions exactly like a 16-bit 8K RAM:
+ * 1. out(t)=Screen[address(t)](t)
+ * 2. If load(t-1) then Screen[address(t-1)](t)=in(t-1)
+ *
+ * The built-in chip implementation has the side effect of continuously
+ * refreshing a visual 256 by 512 black-and-white screen, simulated
+ * by the simulator. Each row in the visual screen is represented
+ * by 32 consecutive 16-bit words, starting at the top left corner
+ * of the visual screen. Thus the pixel at row r from the top and
+ * column c from the left (0<=r<=255, 0<=c<=511) reflects the c%16
+ * bit (counting from LSB to MSB) of the word found in
+ * Screen[r*32+c/16].
+ */
+
+CHIP Screen {
+
+ IN in[16], // what to write
+ load, // write-enable bit
+ address[13]; // where to read/write
+ OUT out[16]; // Screen value at the given address
+
+ BUILTIN Screen;
+ CLOCKED in, load;
+}
+
+
+
+ \ No newline at end of file
diff --git a/tools/builtInChips/Xor.class b/tools/builtInChips/Xor.class
new file mode 100644
index 0000000..d99ad18
--- /dev/null
+++ b/tools/builtInChips/Xor.class
Binary files differ
diff --git a/tools/builtInChips/Xor.hdl b/tools/builtInChips/Xor.hdl
new file mode 100644
index 0000000..8452d73
--- /dev/null
+++ b/tools/builtInChips/Xor.hdl
@@ -0,0 +1,16 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: tools/builtIn/Xor.hdl
+
+/**
+ * Exclusive-or gate: out = !(a == b).
+ */
+
+CHIP Xor {
+
+ IN a, b;
+ OUT out;
+
+ BUILTIN Xor;
+}