week4.md - huahua6207/co110a Wiki

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);
}