50 lines
1.6 KiB
Plaintext
50 lines
1.6 KiB
Plaintext
// 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/builtInChips/ALU.hdl
|
|
/**
|
|
* ALU (Arithmetic Logic Unit):
|
|
* Computes out = one of the following functions:
|
|
* 0, 1, -1,
|
|
* x, y, !x, !y, -x, -y,
|
|
* x + 1, y + 1, x - 1, y - 1,
|
|
* x + y, x - y, y - x,
|
|
* x & y, x | y
|
|
* on the 16-bit inputs x, y,
|
|
* according to the input bits zx, nx, zy, ny, f, no.
|
|
* In addition, computes the output bits:
|
|
* zr = (out == 0, 1, 0)
|
|
* ng = (out < 0, 1, 0)
|
|
*/
|
|
// Implementation: Manipulates the x and y inputs
|
|
// and 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
|
|
|
|
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;
|
|
}
|