Changeset dfdc4d812bfe…
Parent d7c07f5bca84…
by Benjamin Pollack
Changes to one file · Browse files at dfdc4d812bfe Showing diff from parent d7c07f5bca84 Diff from another changeset...
@@ -6,17 +6,17 @@ /**
* 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,
+ * 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
+ * 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,
+// 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"
@@ -39,11 +39,32 @@ f, // compute out = x + y (if 1) or out = x & y (if 0)
no; // negate the out output?
- OUT
+ 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:
+ Mux16(a=x, b[0..15]=false, sel=zx, out=maybex);
+ Mux16(a=y, b[0..15]=false, sel=zy, out=maybey);
+
+ Not16(in=maybex, out=notmaybex);
+ Not16(in=maybey, out=notmaybey);
+
+ Mux16(a=maybex, b=notmaybex, sel=nx, out=realx);
+ Mux16(a=maybey, b=notmaybey, sel=ny, out=realy);
+
+ And16(a=realx, b=realy, out=andout);
+ Add16(a=realx, b=realy, out=addout);
+ Mux16(a=andout, b=addout, sel=f, out=maybeout);
+
+ Not16(in=maybeout, out=notmaybeout);
+ Mux16(a=maybeout, b=notmaybeout, sel=no, out=realout);
+
+ Or16Way(in=realout, out=notzr);
+ And16(a=realout, b[15]=true, b[0..14]=false, out=neg);
+
+ Not(in=notzr, out=zr);
+ Or16Way(in=neg, out=ng);
+ Or16(a=realout, b=realout, out=out);
}
|
Loading...