Skip to content

Building a full computer including Operating System and one high-level language implementation from NAND Gates only

Notifications You must be signed in to change notification settings

rscircus/komputa

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

27 Commits
 
 
 
 
 
 

Repository files navigation

komputa

Building a full computer including Operating System and one High-Level Language implementation from NAND Gates only.

Process

Using a generic Hardware Description Language for all chips and gates.

Structure

  • ./hardware/basics - contains basic Gates, like And, Or, Not, Xor and a set of Multiplexers and Demultiplexers. Not optimized for performance yet. Also 4-way, 8-way and 16 bit variants.
  • ./hardware/advanced - contains all the higher level chips to create a simple ALU, which covers the following operations:
/**
 * This ALU (Arithmetic Logic Unit).
 * computes 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.
 */

|        x         |        y         |zx |nx |zy |ny | f |no |       out        |zr |ng |
| 0000000000010001 | 0000000000000011 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 |
| 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 |
| 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 |
| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000010001 | 0 | 0 |
| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 0 | 0000000000000011 | 0 | 0 |
| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111101110 | 0 | 1 |
| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 1 | 1111111111111100 | 0 | 1 |
| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 1 | 1 | 1111111111101111 | 0 | 1 |
| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 1 | 1 | 1111111111111101 | 0 | 1 |
| 0000000000010001 | 0000000000000011 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000010010 | 0 | 0 |
| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000100 | 0 | 0 |
| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 1 | 0 | 0000000000010000 | 0 | 0 |
| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 1 | 0 | 0000000000000010 | 0 | 0 |
| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 0 | 1 | 0 | 0000000000010100 | 0 | 0 |
| 0000000000010001 | 0000000000000011 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000001110 | 0 | 0 |
| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111110010 | 0 | 1 |
| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000001 | 0 | 0 |
| 0000000000010001 | 0000000000000011 | 0 | 1 | 0 | 1 | 0 | 1 | 0000000000010011 | 0 | 0 |

Addendum / Errata

The reading material is not very explicit about how to wire stuff directly. Say, if you need bits to be at specific places: 0 (0 Volts) or 1 (5 Volts) at a specific bit in a chip. You can define this, however, using the HDL by:

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

  PARTS:
  Add16(a=in, b[0]=true, out=out);
  }

This will give b the following input: b=0000000000000001, as true is interpreted as 1 and b[0] addresses the least significant bit.

Why?

Because I recently climbed up the ladder of abstraction in the other direction: 1 to many computers -- that is, Cloud Stack (Rancher, Kubernetes, Ansible, Helm, you name it...), and wanted to go the other way now: From high-level languages down to 0V and 5V currents.

This is all based upon Nisan and Schocken's excellent "The Elements of Computer Science".

About

Building a full computer including Operating System and one high-level language implementation from NAND Gates only

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages