ALU
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 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:
// Put you code here:
// zx
Mux16(a=x, b=false, sel=zx, out=x1);
// nx
Not16(in=x1, out=notx1);
Mux16(a=x1, b=notx1, sel=nx, out=x2);
// zy
Mux16(a=y, b=false, sel=zy, out=y1);
// ny
Not16(in=y1, out=noty1);
Mux16(a=y1, b=noty1, sel=ny, out=y2);
// f
And16(a=x2, b=y2, out=and);
Add16(a=x2, b=y2, out=add);
Mux16(a=and, b=add, sel=f, out=func);
// no, ng
Not16(in=func, out=notfunc);
Mux16(a=func, b=notfunc, sel=no, out=out, out[0..7]=lower, out[8..15]=upper, out[15]=ng);
// zr
Or8Way(in=lower, out=or1);
Or8Way(in=upper, out=or2);
Or(a=or1, b=or2, out=or);
Not(in=or, out=zr);
}