-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathALU.hdl
79 lines (57 loc) · 2.26 KB
/
ALU.hdl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// 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/02/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,
* according to 6 input bits denoted zx,nx,zy,ny,f,no.
* The bit-combinations that yield each function are
* documented in the book. In addition, the ALU
* computes two 1-bit outputs: if the ALU output
* is 0, zr is set to 1; otherwise zr is set to 0;
* If out<0, ng is set to 1; otherwise ng is set to 0.
*/
// Implementation: the ALU manipulates the x and y
// inputs and then operates on the resulting values,
// as follows:
// if (zx==1) set x = 0 // 16-bit constant
// if (nx==1) set x = ~x // bitwise "not"
// if (zy==1) set y = 0 // 16-bit constant
// if (ny==1) set y = ~y // bitwise "not"
// if (f==1) set out = x + y // integer 2's complement addition
// if (f==0) set out = x & y // bitwise "and"
// if (no==1) set out = ~out // bitwise "not"
// if (out==0) set zr = 1
// if (out<0) set ng = 1
CHIP ALU {
IN
x[16], y[16], // 16-bit inputs
zx, // zero the x input?
nx, // negate the x input?
zy, // zero the y input?
ny, // negate the y input?
f, // compute out = x + y (if 1) or out = x & y (if 0)
no; // negate the out output?
OUT
out[16], // 16-bit output
zr, // 1 if (out==0), 0 otherwise
ng; // 1 if (out<0), 0 otherwise
PARTS:
Mux16(a=x,b[0..15]=false,sel=zx,out=zdx);
Not16(in=zdx,out=notx);
Mux16(a=zdx,b=notx,sel=nx,out=ndx);
Mux16(a=y,b[0..15]=false,sel=zy,out=zdy);
Not16(in=zdy,out=noty);
Mux16(a=zdy,b=noty,sel=ny,out=ndy);
Add16(a=ndx,b=ndy,out=xplusy);
And16(a=ndx,b=ndy,out=xandy);
Mux16(a=xandy,b=xplusy,sel=f,out=fxy);
Not16(in=fxy,out=nfxy);
Mux16(a=fxy,b=nfxy,sel=no,out=oo);
Or16Way(in=oo,out=o);
Not(in=o,out=zr);
And16(a[0..15]=true,b=oo,out[15]=ng,out[0..14]=drop);
Or16(a=oo,b[0..15]=false,out=out);
}