|
I've built my ALU, but whenever I try to load it into the Hardware Simulator I get the error message:
"In HDL file C:\nand2tetris\nand2tetris\projects\02\ALU.hdl, line 51, a pin name is expected."
line 51 is the first component of my ALU, a Mux:
Mux(a=x[0], b=zero, sel=zx, out=1x0);
To my understanding, the error message implies that this line is missing some component pin, but i can't figure out where I went wrong. The only thing I can think of is the b=zero component, since I did not define what "zero" is, but that should default the value to 0 (since it's an unconnected input pin). Ive also tried explicitly defining "zero" by adding this Xor:
Xor(a=x[0], b=x[0], out=zero);
but this changed nothing.
Here's my full ALU:
// 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.
* 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
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 f == 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:
Mux(a=x[0], b=zero, sel=zx, out=1x0);
Mux(a=x[1], b=zero, sel=zx, out=1x1);
Mux(a=x[2], b=zero, sel=zx, out=1x2);
Mux(a=x[3], b=zero, sel=zx, out=1x3);
Mux(a=x[4], b=zero, sel=zx, out=1x4);
Mux(a=x[5], b=zero, sel=zx, out=1x5);
Mux(a=x[6], b=zero, sel=zx, out=1x6);
Mux(a=x[7], b=zero, sel=zx, out=1x7);
Mux(a=x[8], b=zero, sel=zx, out=1x8);
Mux(a=x[9], b=zero, sel=zx, out=1x9);
Mux(a=x[10], b=zero, sel=zx, out=1x10);
Mux(a=x[11], b=zero, sel=zx, out=1x11);
Mux(a=x[12], b=zero, sel=zx, out=1x12);
Mux(a=x[13], b=zero, sel=zx, out=1x13);
Mux(a=x[14], b=zero, sel=zx, out=1x14);
Mux(a=x[15], b=zero, sel=zx, out=1x15);
Xor(a=1x0, b=nx, out=2x0);
Xor(a=1x1, b=nx, out=2x1);
Xor(a=1x2, b=nx, out=2x2);
Xor(a=1x3, b=nx, out=2x3);
Xor(a=1x4, b=nx, out=2x4);
Xor(a=1x5, b=nx, out=2x5);
Xor(a=1x6, b=nx, out=2x6);
Xor(a=1x7, b=nx, out=2x7);
Xor(a=1x8, b=nx, out=2x8);
Xor(a=1x9, b=nx, out=2x9);
Xor(a=1x10, b=nx, out=2x10);
Xor(a=1x11, b=nx, out=2x11);
Xor(a=1x12, b=nx, out=2x12);
Xor(a=1x13, b=nx, out=2x13);
Xor(a=1x14, b=nx, out=2x14);
Xor(a=1x15, b=nx, out=2x15);
Mux(a=y[0], b=zero, sel=zy, out=1y0);
Mux(a=y[1], b=zero, sel=zy, out=1y1);
Mux(a=y[2], b=zero, sel=zy, out=1y2);
Mux(a=y[3], b=zero, sel=zy, out=1y3);
Mux(a=y[4], b=zero, sel=zy, out=1y4);
Mux(a=y[5], b=zero, sel=zy, out=1y5);
Mux(a=y[6], b=zero, sel=zy, out=1y6);
Mux(a=y[7], b=zero, sel=zy, out=1y7);
Mux(a=y[8], b=zero, sel=zy, out=1y8);
Mux(a=y[9], b=zero, sel=zy, out=1y9);
Mux(a=y[10], b=zero, sel=zy, out=1y10);
Mux(a=y[11], b=zero, sel=zy, out=1y11);
Mux(a=y[12], b=zero, sel=zy, out=1y12);
Mux(a=y[13], b=zero, sel=zy, out=1y13);
Mux(a=y[14], b=zero, sel=zy, out=1y14);
Mux(a=y[15], b=zero, sel=zy, out=1y15);
Xor(a=1y0, b=ny, out=2y0);
Xor(a=1y1, b=ny, out=2y1);
Xor(a=1y2, b=ny, out=2y2);
Xor(a=1y3, b=ny, out=2y3);
Xor(a=1y4, b=ny, out=2y4);
Xor(a=1y5, b=ny, out=2y5);
Xor(a=1y6, b=ny, out=2y6);
Xor(a=1y7, b=ny, out=2y7);
Xor(a=1y8, b=ny, out=2y8);
Xor(a=1y9, b=ny, out=2y9);
Xor(a=1y10, b=ny, out=2y10);
Xor(a=1y11, b=ny, out=2y11);
Xor(a=1y12, b=ny, out=2y12);
Xor(a=1y13, b=ny, out=2y13);
Xor(a=1y14, b=ny, out=2y14);
Xor(a=1y15, b=ny, out=2y15);
HalfAdd(a=2x0, b=2y0, sum=sum0, carry=carry1);
FullAdd(a=2x1, b=2y1, c=carry1, sum=sum1, carry=carry2);
FullAdd(a=2x2, b=2y2, c=carry2, sum=sum2, carry=carry3);
FullAdd(a=2x3, b=2y3, c=carry3, sum=sum3, carry=carry4);
FullAdd(a=2x4, b=2y4, c=carry4, sum=sum4, carry=carry5);
FullAdd(a=2x5, b=2y5, c=carry5, sum=sum5, carry=carry6);
FullAdd(a=2x6, b=2y6, c=carry6, sum=sum6, carry=carry7);
FullAdd(a=2x7, b=2y7, c=carry7, sum=sum7, carry=carry8);
FullAdd(a=2x8, b=2y8, c=carry8, sum=sum8, carry=carry9);
FullAdd(a=2x9, b=2y9, c=carry9, sum=sum9, carry=carry10);
FullAdd(a=2x10, b=2y10, c=carry10, sum=sum10, carry=carry11);
FullAdd(a=2x11, b=2y11, c=carry11, sum=sum11, carry=carry12);
FullAdd(a=2x12, b=2y12, c=carry12, sum=sum12, carry=carry13);
FullAdd(a=2x13, b=2y13, c=carry13, sum=sum13, carry=carry14);
FullAdd(a=2x14, b=2y14, c=carry14, sum=sum14, carry=carry15);
FullAdd(a=2x15, b=2y15, c=carry15, sum=sum15, carry=carry16);
And(a=2x0, b=2y0, out=and0);
And(a=2x1, b=2y1, out=and1);
And(a=2x2, b=2y2, out=and2);
And(a=2x3, b=2y3, out=and3);
And(a=2x4, b=2y4, out=and4);
And(a=2x5, b=2y5, out=and5);
And(a=2x6, b=2y6, out=and6);
And(a=2x7, b=2y7, out=and7);
And(a=2x8, b=2y8, out=and8);
And(a=2x9, b=2y9, out=and9);
And(a=2x10, b=2y10, out=and10);
And(a=2x11, b=2y11, out=and11);
And(a=2x12, b=2y12, out=and12);
And(a=2x13, b=2y13, out=and13);
And(a=2x14, b=2y14, out=and14);
And(a=2x15, b=2y15, out=and15);
Dmux(a=and0, b=sum0, sel=f, out=almost0);
Dmux(a=and1, b=sum1, sel=f, out=almost1);
Dmux(a=and2, b=sum2, sel=f, out=almost2);
Dmux(a=and3, b=sum3, sel=f, out=almost3);
Dmux(a=and4, b=sum4, sel=f, out=almost4);
Dmux(a=and5, b=sum5, sel=f, out=almost5);
Dmux(a=and6, b=sum6, sel=f, out=almost6);
Dmux(a=and7, b=sum7, sel=f, out=almost7);
Dmux(a=and8, b=sum8, sel=f, out=almost8);
Dmux(a=and9, b=sum9, sel=f, out=almost9);
Dmux(a=and10, b=sum10, sel=f, out=almost10);
Dmux(a=and11, b=sum11, sel=f, out=almost11);
Dmux(a=and12, b=sum12, sel=f, out=almost12);
Dmux(a=and13, b=sum13, sel=f, out=almost13);
Dmux(a=and14, b=sum14, sel=f, out=almost14);
Dmux(a=and15, b=sum15, sel=f, out=almost15);
Not(in=almost0, out=notout0);
Not(in=almost1, out=notout1);
Not(in=almost2, out=notout2);
Not(in=almost3, out=notout3);
Not(in=almost4, out=notout4);
Not(in=almost5, out=notout5);
Not(in=almost6, out=notout6);
Not(in=almost7, out=notout7);
Not(in=almost8, out=notout8);
Not(in=almost9, out=notout9);
Not(in=almost10, out=notout10);
Not(in=almost11, out=notout11);
Not(in=almost12, out=notout12);
Not(in=almost13, out=notout13);
Not(in=almost14, out=notout14);
Not(in=almost15, out=notout15);
Dmux(a=almost0, b=notout0, sel=no, out=out[0]);
Dmux(a=almost1, b=notout1, sel=no, out=out[1]);
Dmux(a=almost2, b=notout2, sel=no, out=out[2]);
Dmux(a=almost3, b=notout3, sel=no, out=out[3]);
Dmux(a=almost4, b=notout4, sel=no, out=out[4]);
Dmux(a=almost5, b=notout5, sel=no, out=out[5]);
Dmux(a=almost6, b=notout6, sel=no, out=out[6]);
Dmux(a=almost7, b=notout7, sel=no, out=out[7]);
Dmux(a=almost8, b=notout8, sel=no, out=out[8]);
Dmux(a=almost9, b=notout9, sel=no, out=out[9]);
Dmux(a=almost10, b=notout10, sel=no, out=out[10]);
Dmux(a=almost11, b=notout11, sel=no, out=out[11]);
Dmux(a=almost12, b=notout12, sel=no, out=out[12]);
Dmux(a=almost13, b=notout13, sel=no, out=out[13]);
Dmux(a=almost14, b=notout14, sel=no, out=out[14]);
Dmux(a=almost15, b=notout15, sel=no, out=out[15]);
Or(a=out[0], b=out[1], out=1nzr);
Or(a=1nzr, b=out[2], out=2nzr);
Or(a=2nzr, b=out[3], out=3nzr);
Or(a=3nzr, b=out[4], out=4nzr);
Or(a=4nzr, b=out[5], out=5nzr);
Or(a=5nzr, b=out[6], out=6nzr);
Or(a=6nzr, b=out[7], out=7nzr);
Or(a=7nzr, b=out[8], out=8nzr);
Or(a=8nzr, b=out[9], out=9nzr);
Or(a=9nzr, b=out[10], out=10nzr);
Or(a=10nzr, b=out[11], out=11nzr);
Or(a=11nzr, b=out[12], out=12nzr);
Or(a=12nzr, b=out[13], out=13nzr);
Or(a=13nzr, b=out[14], out=14nzr);
Or(a=14nzr, b=out[15], out=ng);
Not(in=ng, out=zr);
}
|