This course explores the fundamental ideas and skills required for advanced computer engineering. Students gain understanding of the core components required in the construction of computing devices, from the low level logic gates, more complex circuitry (i.e. CPUs), machine language design, assemblers, virtual machines, high level programming languages, compilers, and all the way to operating systems.
This course follows the acclaimed Nand2Tetris projects and acompanying book, The Elements of Computing Systems, providing a complete journey from basic logic gates to a fully functional computer system. Students build every component from scratch, creating a unified understanding of how software and hardware work together.
Projects 1-6: The Physical Computer
- Implement fundamental logic gates (AND, OR, NOT, XOR, MUX, DMUX)
- Design half-adders, full-adders, and multi-bit adders
- Construct an Arithmetic Logic Unit (ALU)
- Build registers
- Create RAM units
- Implement the program counter
- Learn the Hack assembly language
- Write programs that perform calculations and do I/O
- Integrate ALU, memory, and control logic into a complete CPU
- Build a Hack computer
- Create a two-pass assembler
- Translate symbolic assembly code to binary machine language
Projects 7-12: The Software Ecosystem
- Implement a VM translator for a stack based VM
- Handle memory segment operations
- Add support for branching and function calls
- Implement program flow control
- Handle complex program structures
- Learn the Jack programming language
- Understand object-oriented concepts
- Write sophisticated applications in a high-level language
- Build a tokenizer and parser
- Generate XML parse trees
- Implement syntax analysis for the Jack language
- Complete the Jack compiler
- Generate VM code from parsed syntax trees
- Understand symbol tables and scope management
- Implement core OS functionality: Math, Memory, Screen, Keyboard
- Create system libraries and APIs
- Understand how applications interact with hardware
- HDL (Hardware Description Language) for hardware design
- Hack Assembly Language for low-level programming
- Jack Programming Language for application development
- Custom VM Architecture for intermediate code representation
- C++ Programming for file processing (Projects 6-8)