N2T/tools/builtInChips/ALU.hdl

56 lines
1.8 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 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, yx, 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;
}