commit c8f06bc4dd522d4ee859e38879c38858b3da56cb Author: StepanovPlaton Date: Thu Nov 28 12:43:34 2024 +0400 Complete first project diff --git a/1_Boolean_Arithmetic/And.hdl b/1_Boolean_Arithmetic/And.hdl new file mode 100644 index 0000000..0874c41 --- /dev/null +++ b/1_Boolean_Arithmetic/And.hdl @@ -0,0 +1,16 @@ +// 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/1/And.hdl +/** + * And gate: + * if (a and b) out = 1, else out = 0 + */ +CHIP And { + IN a, b; + OUT out; + + PARTS: + Nand(a=a, b=b, out=outn); + Not(in=outn, out=out); +} \ No newline at end of file diff --git a/1_Boolean_Arithmetic/And16.hdl b/1_Boolean_Arithmetic/And16.hdl new file mode 100644 index 0000000..4ffcd9d --- /dev/null +++ b/1_Boolean_Arithmetic/And16.hdl @@ -0,0 +1,31 @@ +// 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/1/And16.hdl +/** + * 16-bit And gate: + * for i = 0, ..., 15: + * out[i] = a[i] And b[i] + */ +CHIP And16 { + IN a[16], b[16]; + OUT out[16]; + + PARTS: + And(a=a[0], b=b[0], out=out[0]); + And(a=a[1], b=b[1], out=out[1]); + And(a=a[2], b=b[2], out=out[2]); + And(a=a[3], b=b[3], out=out[3]); + And(a=a[4], b=b[4], out=out[4]); + And(a=a[5], b=b[5], out=out[5]); + And(a=a[6], b=b[6], out=out[6]); + And(a=a[7], b=b[7], out=out[7]); + And(a=a[8], b=b[8], out=out[8]); + And(a=a[9], b=b[9], out=out[9]); + And(a=a[10], b=b[10], out=out[10]); + And(a=a[11], b=b[11], out=out[11]); + And(a=a[12], b=b[12], out=out[12]); + And(a=a[13], b=b[13], out=out[13]); + And(a=a[14], b=b[14], out=out[14]); + And(a=a[15], b=b[15], out=out[15]); +} \ No newline at end of file diff --git a/1_Boolean_Arithmetic/DMux.hdl b/1_Boolean_Arithmetic/DMux.hdl new file mode 100644 index 0000000..8fd0727 --- /dev/null +++ b/1_Boolean_Arithmetic/DMux.hdl @@ -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/1/DMux.hdl +/** + * Demultiplexor: + * [a, b] = [in, 0] if sel = 0 + * [0, in] if sel = 1 + */ +CHIP DMux { + IN in, sel; + OUT a, b; + + PARTS: + Not(in=sel, out=nsel); + And(a=nsel, b=in, out=a); + And(a=sel, b=in, out=b); +} \ No newline at end of file diff --git a/1_Boolean_Arithmetic/DMux4Way.hdl b/1_Boolean_Arithmetic/DMux4Way.hdl new file mode 100644 index 0000000..99ebe85 --- /dev/null +++ b/1_Boolean_Arithmetic/DMux4Way.hdl @@ -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/1/DMux4Way.hdl +/** + * 4-way demultiplexor: + * [a, b, c, d] = [in, 0, 0, 0] if sel = 00 + * [0, in, 0, 0] if sel = 01 + * [0, 0, in, 0] if sel = 10 + * [0, 0, 0, in] if sel = 11 + */ +CHIP DMux4Way { + IN in, sel[2]; + OUT a, b, c, d; + + PARTS: + DMux(in=in, sel=sel[1], a=x, b=y); + DMux(in=x, sel=sel[0], a=a, b=b); + DMux(in=y, sel=sel[0], a=c, b=d); +} \ No newline at end of file diff --git a/1_Boolean_Arithmetic/DMux8Way.hdl b/1_Boolean_Arithmetic/DMux8Way.hdl new file mode 100644 index 0000000..69440d7 --- /dev/null +++ b/1_Boolean_Arithmetic/DMux8Way.hdl @@ -0,0 +1,24 @@ +// 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/1/DMux8Way.hdl +/** + * 8-way demultiplexor: + * [a, b, c, d, e, f, g, h] = [in, 0, 0, 0, 0, 0, 0, 0] if sel = 000 + * [0, in, 0, 0, 0, 0, 0, 0] if sel = 001 + * [0, 0, in, 0, 0, 0, 0, 0] if sel = 010 + * [0, 0, 0, in, 0, 0, 0, 0] if sel = 011 + * [0, 0, 0, 0, in, 0, 0, 0] if sel = 100 + * [0, 0, 0, 0, 0, in, 0, 0] if sel = 101 + * [0, 0, 0, 0, 0, 0, in, 0] if sel = 110 + * [0, 0, 0, 0, 0, 0, 0, in] if sel = 111 + */ +CHIP DMux8Way { + IN in, sel[3]; + OUT a, b, c, d, e, f, g, h; + + PARTS: + DMux(in=in, sel=sel[2], a=x, b=y); + DMux4Way(in=x, sel=sel[0..1], a=a, b=b, c=c, d=d); + DMux4Way(in=y, sel=sel[0..1], a=e, b=f, c=g, d=h); +} \ No newline at end of file diff --git a/1_Boolean_Arithmetic/Mux.hdl b/1_Boolean_Arithmetic/Mux.hdl new file mode 100644 index 0000000..9f89cd1 --- /dev/null +++ b/1_Boolean_Arithmetic/Mux.hdl @@ -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/1/Mux.hdl +/** + * Multiplexor: + * if (sel = 0) out = a, else out = b + */ +CHIP Mux { + IN a, b, sel; + OUT out; + + PARTS: + Not(in=sel, out=nsel); + And(a=nsel, b=a, out=aa); + And(a=sel, b=b, out=bb); + Or(a=aa, b=bb, out=out); +} \ No newline at end of file diff --git a/1_Boolean_Arithmetic/Mux16.hdl b/1_Boolean_Arithmetic/Mux16.hdl new file mode 100644 index 0000000..153f6d4 --- /dev/null +++ b/1_Boolean_Arithmetic/Mux16.hdl @@ -0,0 +1,31 @@ +// 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/1/Mux16.hdl +/** + * 16-bit multiplexor: + * for i = 0, ..., 15: + * if (sel = 0) out[i] = a[i], else out[i] = b[i] + */ +CHIP Mux16 { + IN a[16], b[16], sel; + OUT out[16]; + + PARTS: + Mux(a=a[0], b=b[0], sel=sel, out=out[0]); + Mux(a=a[1], b=b[1], sel=sel, out=out[1]); + Mux(a=a[2], b=b[2], sel=sel, out=out[2]); + Mux(a=a[3], b=b[3], sel=sel, out=out[3]); + Mux(a=a[4], b=b[4], sel=sel, out=out[4]); + Mux(a=a[5], b=b[5], sel=sel, out=out[5]); + Mux(a=a[6], b=b[6], sel=sel, out=out[6]); + Mux(a=a[7], b=b[7], sel=sel, out=out[7]); + Mux(a=a[8], b=b[8], sel=sel, out=out[8]); + Mux(a=a[9], b=b[9], sel=sel, out=out[9]); + Mux(a=a[10], b=b[10], sel=sel, out=out[10]); + Mux(a=a[11], b=b[11], sel=sel, out=out[11]); + Mux(a=a[12], b=b[12], sel=sel, out=out[12]); + Mux(a=a[13], b=b[13], sel=sel, out=out[13]); + Mux(a=a[14], b=b[14], sel=sel, out=out[14]); + Mux(a=a[15], b=b[15], sel=sel, out=out[15]); +} \ No newline at end of file diff --git a/1_Boolean_Arithmetic/Mux4Way16.hdl b/1_Boolean_Arithmetic/Mux4Way16.hdl new file mode 100644 index 0000000..b0031aa --- /dev/null +++ b/1_Boolean_Arithmetic/Mux4Way16.hdl @@ -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/1/Mux4Way16.hdl +/** + * 4-way 16-bit multiplexor: + * out = a if sel = 00 + * b if sel = 01 + * c if sel = 10 + * d if sel = 11 + */ +CHIP Mux4Way16 { + IN a[16], b[16], c[16], d[16], sel[2]; + OUT out[16]; + + PARTS: + Mux16(a=a, b=b, sel=sel[0], out=x); + Mux16(a=c, b=d, sel=sel[0], out=y); + Mux16(a=x, b=y, sel=sel[1], out=out); +} \ No newline at end of file diff --git a/1_Boolean_Arithmetic/Mux8Way16.hdl b/1_Boolean_Arithmetic/Mux8Way16.hdl new file mode 100644 index 0000000..7467eab --- /dev/null +++ b/1_Boolean_Arithmetic/Mux8Way16.hdl @@ -0,0 +1,26 @@ +// 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/1/Mux8Way16.hdl +/** + * 8-way 16-bit multiplexor: + * out = a if sel = 000 + * b if sel = 001 + * c if sel = 010 + * d if sel = 011 + * e if sel = 100 + * f if sel = 101 + * g if sel = 110 + * h if sel = 111 + */ +CHIP Mux8Way16 { + IN a[16], b[16], c[16], d[16], + e[16], f[16], g[16], h[16], + sel[3]; + OUT out[16]; + + PARTS: + Mux4Way16(a=a, b=b, c=c, d=d, sel=sel[0..1], out=x); + Mux4Way16(a=e, b=f, c=g, d=h, sel=sel[0..1], out=y); + Mux16(a=x, b=y, sel=sel[2], out=out); +} \ No newline at end of file diff --git a/1_Boolean_Arithmetic/Not.hdl b/1_Boolean_Arithmetic/Not.hdl new file mode 100644 index 0000000..5468324 --- /dev/null +++ b/1_Boolean_Arithmetic/Not.hdl @@ -0,0 +1,15 @@ +// 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/1/Not.hdl +/** + * Not gate: + * if (in) out = 0, else out = 1 + */ +CHIP Not { + IN in; + OUT out; + + PARTS: + Nand(a=in, b=in, out=out); +} \ No newline at end of file diff --git a/1_Boolean_Arithmetic/Not16.hdl b/1_Boolean_Arithmetic/Not16.hdl new file mode 100644 index 0000000..3677724 --- /dev/null +++ b/1_Boolean_Arithmetic/Not16.hdl @@ -0,0 +1,31 @@ +// 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/01/Not16.hdl +/** + * 16-bit Not gate: + * for i = 0, ..., 15: + * out[i] = Not(a[i]) + */ +CHIP Not16 { + IN in[16]; + OUT out[16]; + + PARTS: + Not(in=in[0], out=out[0]); + Not(in=in[1], out=out[1]); + Not(in=in[2], out=out[2]); + Not(in=in[3], out=out[3]); + Not(in=in[4], out=out[4]); + Not(in=in[5], out=out[5]); + Not(in=in[6], out=out[6]); + Not(in=in[7], out=out[7]); + Not(in=in[8], out=out[8]); + Not(in=in[9], out=out[9]); + Not(in=in[10], out=out[10]); + Not(in=in[11], out=out[11]); + Not(in=in[12], out=out[12]); + Not(in=in[13], out=out[13]); + Not(in=in[14], out=out[14]); + Not(in=in[15], out=out[15]); +} \ No newline at end of file diff --git a/1_Boolean_Arithmetic/Or.hdl b/1_Boolean_Arithmetic/Or.hdl new file mode 100644 index 0000000..3e68220 --- /dev/null +++ b/1_Boolean_Arithmetic/Or.hdl @@ -0,0 +1,17 @@ +// 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/1/Or.hdl +/** + * Or gate: + * if (a or b) out = 1, else out = 0 + */ +CHIP Or { + IN a, b; + OUT out; + + PARTS: + Not(in=a, out=na); + Not(in=b, out=nb); + Nand(a=na, b=nb, out=out); +} \ No newline at end of file diff --git a/1_Boolean_Arithmetic/Or16.hdl b/1_Boolean_Arithmetic/Or16.hdl new file mode 100644 index 0000000..17ad577 --- /dev/null +++ b/1_Boolean_Arithmetic/Or16.hdl @@ -0,0 +1,31 @@ +// 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/1/Or16.hdl +/** + * 16-bit Or gate: + * for i = 0, ..., 15: + * out[i] = a[i] Or b[i] + */ +CHIP Or16 { + IN a[16], b[16]; + OUT out[16]; + + PARTS: + Or(a=a[0], b=b[0], out=out[0]); + Or(a=a[1], b=b[1], out=out[1]); + Or(a=a[2], b=b[2], out=out[2]); + Or(a=a[3], b=b[3], out=out[3]); + Or(a=a[4], b=b[4], out=out[4]); + Or(a=a[5], b=b[5], out=out[5]); + Or(a=a[6], b=b[6], out=out[6]); + Or(a=a[7], b=b[7], out=out[7]); + Or(a=a[8], b=b[8], out=out[8]); + Or(a=a[9], b=b[9], out=out[9]); + Or(a=a[10], b=b[10], out=out[10]); + Or(a=a[11], b=b[11], out=out[11]); + Or(a=a[12], b=b[12], out=out[12]); + Or(a=a[13], b=b[13], out=out[13]); + Or(a=a[14], b=b[14], out=out[14]); + Or(a=a[15], b=b[15], out=out[15]); +} \ No newline at end of file diff --git a/1_Boolean_Arithmetic/Or8Way.hdl b/1_Boolean_Arithmetic/Or8Way.hdl new file mode 100644 index 0000000..2f6040d --- /dev/null +++ b/1_Boolean_Arithmetic/Or8Way.hdl @@ -0,0 +1,21 @@ +// 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/1/Or8Way.hdl +/** + * 8-way Or gate: + * out = in[0] Or in[1] Or ... Or in[7] + */ +CHIP Or8Way { + IN in[8]; + OUT out; + + PARTS: + Or(a=in[0], b=in[1], out=x1); + Or(a=in[2], b=in[3], out=x2); + Or(a=in[4], b=in[5], out=x3); + Or(a=in[6], b=in[7], out=x4); + Or(a=x1, b=x2, out=y1); + Or(a=x3, b=x4, out=y2); + Or(a=y1, b=y2, out=out); +} \ No newline at end of file diff --git a/1_Boolean_Arithmetic/Xor.hdl b/1_Boolean_Arithmetic/Xor.hdl new file mode 100644 index 0000000..12df696 --- /dev/null +++ b/1_Boolean_Arithmetic/Xor.hdl @@ -0,0 +1,17 @@ +// 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/1/Xor.hdl +/** + * Exclusive-or gate: + * if ((a and Not(b)) or (Not(a) and b)) out = 1, else out = 0 + */ +CHIP Xor { + IN a, b; + OUT out; + + PARTS: + Nand(a=a,b=b,out=nab); + Or(a=a,b=b,out=orab); + And(a=nab, b=orab, out=out); +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f6cbacc --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +# [Nand2Tetris](https://www.nand2tetris.org) + + From Nand to Tetris + Building a Modern Computer From First Principles + +В этом репозитории я сохраняю свои работы в ходе прохождения курса [nand2tetris](https://www.nand2tetris.org) + +Курс состоит из двух частей, в первой части 6 проектов: +- [Project 1: Boolean Logic](./1_Boolean_Arithmetic) - создание +- Project 2: Boolean Arithmetic +- Project 3: Memory +- Project 4: Machine Language +- Project 5: Computer Architecture +- Project 6: Assembler + +## Основная идея курса в коротком видео: +[![](./cover.jpg)](https://youtu.be/wTl5wRDT0CU) \ No newline at end of file diff --git a/cover.jpg b/cover.jpg new file mode 100644 index 0000000..46a7ba0 Binary files /dev/null and b/cover.jpg differ