Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
benlazzero authored Feb 28, 2023
1 parent 134efd3 commit 6ed0cc3
Show file tree
Hide file tree
Showing 5 changed files with 161 additions and 0 deletions.
71 changes: 71 additions & 0 deletions Adders and ALU/ALU.hdl
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// 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 (Arithmetic Logic Unit).
* 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.
* In addition, the ALU computes two 1-bit outputs:
* if the ALU output == 0, zr is set to 1; otherwise zr is set to 0;
* if the ALU output < 0, ng is set to 1; otherwise ng is set to 0.
*/

// Implementation: the ALU logic manipulates the x and y inputs
// and 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 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:
Mux16(a=x, b=false, sel=zx, out=mx);
Mux16(a=y, b=false, sel=zy, out=my);

Not16(in=mx, out=nmx);
Not16(in=my, out=nmy);

Mux16(a=mx, b=nmx, sel=nx, out=mx2);
Mux16(a=my, b=nmy, sel=ny, out=my2);

Add16(a=mx2, b=my2, out=adxy);
And16(a=mx2, b=my2, out=axy);

Mux16(a=axy, b=adxy, sel=f, out=xy);

Not16(in=xy, out=nxy);

Mux16(a=xy, b=nxy, sel=no, out=out, out[0..7]=fin1, out[8..15]=fin2, out[15]=neg);

// start the ZR then Ng outputs
Or8Way(in=fin1, out=zr1);
Or8Way(in=fin2, out=zr2);
Or(a=zr1, b=zr2, out=zrfin);
Not(in=zrfin, out=zr);

Xor(a=neg, b=false, out=ng);
}
33 changes: 33 additions & 0 deletions Adders and ALU/Add16.hdl
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// 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/Adder16.hdl

/**
* Adds two 16-bit values.
* The most significant carry bit is ignored.
*/

CHIP Add16 {
IN a[16], b[16];
OUT out[16];

PARTS:
// Put you code here:
HalfAdder(a=a[0], b=b[0], carry=c1, sum=out[0]);
FullAdder(a=a[1], b=b[1], c=c1, carry=c2, sum=out[1]);
FullAdder(a=a[2], b=b[2], c=c2, carry=c3, sum=out[2]);
FullAdder(a=a[3], b=b[3], c=c3, carry=c4, sum=out[3]);
FullAdder(a=a[4], b=b[4], c=c4, carry=c5, sum=out[4]);
FullAdder(a=a[5], b=b[5], c=c5, carry=c6, sum=out[5]);
FullAdder(a=a[6], b=b[6], c=c6, carry=c7, sum=out[6]);
FullAdder(a=a[7], b=b[7], c=c7, carry=c8, sum=out[7]);
FullAdder(a=a[8], b=b[8], c=c8, carry=c9, sum=out[8]);
FullAdder(a=a[9], b=b[9], c=c9, carry=c10, sum=out[9]);
FullAdder(a=a[10], b=b[10], c=c10, carry=c11, sum=out[10]);
FullAdder(a=a[11], b=b[11], c=c11, carry=c12, sum=out[11]);
FullAdder(a=a[12], b=b[12], c=c12, carry=c13, sum=out[12]);
FullAdder(a=a[13], b=b[13], c=c13, carry=c14, sum=out[13]);
FullAdder(a=a[14], b=b[14], c=c14, carry=c15, sum=out[14]);
FullAdder(a=a[15], b=b[15], c=c15, carry=c16, sum=out[15]);
}
20 changes: 20 additions & 0 deletions Adders and ALU/FullAdder.hdl
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// 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/FullAdder.hdl

/**
* Computes the sum of three bits.
*/

CHIP FullAdder {
IN a, b, c; // 1-bit inputs
OUT sum, // Right bit of a + b + c
carry; // Left bit of a + b + c

PARTS:
// Put you code here:
HalfAdder(a=a, b=b, carry=c1, sum=s1);
HalfAdder(a=s1, b=c, carry=c2, sum=sum);
Or(a=c1, b=c2, out=carry);
}
19 changes: 19 additions & 0 deletions Adders and ALU/HalfAdder.hdl
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// 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/HalfAdder.hdl

/**
* Computes the sum of two bits.
*/

CHIP HalfAdder {
IN a, b; // 1-bit inputs
OUT sum, // Right bit of a + b
carry; // Left bit of a + b

PARTS:
// Put you code here:
And(a=a, b=b, out=carry);
Xor(a=a, b=b, out=sum);
}
18 changes: 18 additions & 0 deletions Adders and ALU/Inc16.hdl
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// 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/Inc16.hdl

/**
* 16-bit incrementer:
* out = in + 1 (arithmetic addition)
*/

CHIP Inc16 {
IN in[16];
OUT out[16];

PARTS:
// Put you code here:
Add16(a=in, b[0]=true, out=out);
}

0 comments on commit 6ed0cc3

Please sign in to comment.