Back to the portfolio
№ 00NewestComputer Architecture

Zenith

A 64-bit CPU and NPU, designed from the ground up.

Overview

Zenith is a broad project that attempts to implement every piece of a simple computer. Its end goal is to run a quantized small language model all by itself. In order to achieve this, Zenith implements a PCBA, digital logic for the CPU and NPU, an emulator to do native debug, an assembler and C-like compiler for writing userspace programs, a kernel and standard library for helping these programs, and a website that packages the emulator to debug on the web.

At its core is a 32×32 systolic array that enables fast processing of tensor-related instructions. In addition to the memory mapped I/O features such as a VGA framebuffer, PS/2 keyboard and mouse, and SD card persistent storage, Zenith becomes a complete simple computer.

Today Zenith is 2/3rds of the way complete, with further implementation planned for the rest of the summer of 2026.

There are two mistakes you can make when building a processor: using someone else's processor, and designing your own processor. The latter will take at least two years longer.

William Allan Wulf

Motivation

I have always been interested in how computers work. My interest was peaked in 2025 when I decided to combine my experience in programming language development to write a just-in-time compiler, Tachyon. At least on the bytecode interpreter side, I was essentially building a register-based computer. This was running in my head going into my second year University of Toronto course, ECE243. This is a computer organization course with a focus on simple CPU design. We were taught various concepts that I found interesting, like the digital logic CPU seen below. For the culminating project, my partner and I wrote a CHIP-8 emulator, which put the same thought in my head again: if I can write an emulator/bytecode interpreter, and I know the basic theory behind the digital CPU, surely I can make my own!

digital logic cpu from ece243 (simproc)

Figure 1: ECE243 simple processor digital outline

This is what motivated me to build Zenith. On this page, I'll give an outline of the architecture and my thought process behind Zenith. For more information, see docs/v0.1.0.md: it's a 500+ LOC markdown describing the architecture of the CPU and NPU. It outlines a standard for everything in the stack between the digital logic and the executable format. Parts of the project like the PCBA, compiler, etc., have their own documentation if needed. So far, working on Zenith has been a highly educational process, and I'm proud of what I have accomplished.

Architecture

At the start of the stack is the Zenith PCBA, a printed circuit board designed on KiCad and assembled by JLCPCB. It primarily contains the Xilinx Kintex-7 FPGA, specifically XC7K70T-3FBG676E. This allows us to run digital logic on the board without needing a true photolithography print (like consumer CPUs). The first factor I took into account when choosing an FPGA is the brand: I chose Xilinx as I have worked with AMD FPGAs before and find them very reliable. I enjoy the Vivado platform, and at the time of writing Vivado's free edition was released to allow non-Artix-7 FPGA deployments (you had to pay before). I chose the Kintex-7 by comparing speeds of the different devices: Artix-7 is generally too small for run an NPU of the scale that I want, and the UltraScale+ products are great but out of my budget. I found Kintex-7 to be fast (the -3 speed helps too) and in the right price range (~40 CAD) for me. And, importantly, it was in stock at JLC! In order to interface with the FPGA, the PCBA has a USB-C JTAG/UART controller, where the JTAG elements are connected to the JTAG pins of the FPGA itself. Other I/O includes a VGA port, two PS/2 ports, an SD card, and DDR3 memory. These are all connected to various I/O ports across the FPGA, and a record of which is which is kept as a map in Vivado so RTL can know which pins to designate which names.

io schematic

Figure 2: I/O schematic page

The next element in the stack is the digital logic. This is written in SystemVerilog that compiles on Vivado to the FPGA, but in theory represents any kind of digital logic, so I could implement it with real muxes or with photolithography + nanometer-scale transistors. The most interesting thing to me is how CPUs are basically a giant switch case with a state machine: based on the state, and the current instruction, execute some controller. The general process for a CPU cycle is:

  1. FETCH / FETCH_WAIT: read memory at the position of program counter, load that into the instruction register.
  2. DECODE: split the instruction register's values up and load them into the right registers. For example, some instructions encode register indices or immediate values in the instruction itself.
  3. EXECUTE: run what the instruction wants. This may be running the ALU, memory controller, or something else.
  4. MEMORY_WAIT: loading information from memory (l64, l32, etc.) takes a long time relative to CPU time, so we spin on this state until we're done.
System Verilog
typedef enum logic [2:0] {
    FETCH = 3'b000,
    FETCH_WAIT = 3'b001,
    DECODE = 3'b010,
    EXECUTE = 3'b011,
    MEMORY_WAIT = 3'b100
} state_t;

Some future work I want to do with this is pipelining these instructions.

As mentioned earlier, Zenith also has an emulator implementation. This tries its best to mirror the hardware implementation (actually, it implements the standard as outlined in docs/v0.1.0.md, but it tries to mimic edge cases/undefined behaviour in the hardware as well). This is written in C++ and runs natively by default - however, you can run this on your browser with WebAssembly. This emulator has been great for debugging userspace applications, the standard library and the kernel.

The next step in the stack is the assembly language. This is a simple language that allows users to write instructions with prose commands and have a computer compile this to the numerical representation of the instructions or into the Zenith Executable Linker Format.

A usual handwritten file may look like this.
Assembly
# Draw three RGB lines into the framebuffer.
#
# Framebuffer pixel base is 0xFFFF_FFFF_FFA1_1400, which is -6220800
# as a signed 64-bit value.
.main
  addi t0, zero, 379
  sub t0, zero, t0
  addi t1, zero, 128
  mul t0, t0, t1
  mul t0, t0, t1
  addi t1, zero, 11264
  sub t0, t0, t1

  addi t2, zero, 255
  addi t3, zero, 1
  addi t6, zero, 5760

  add t5, t0, zero
  addi t4, zero, 120

redstart:
  add t5, t5, t6
  sub t4, t4, t3
  bgt t4, zero, redstart

  add t7, t5, zero
  addi t1, zero, 4

redrows:
  add t5, t7, zero
  addi t4, zero, 640

redline:
  s8 t2, t5, 0
  addi t5, t5, 3
  sub t4, t4, t3
  bgt t4, zero, redline
  add t7, t7, t6
  sub t1, t1, t3
  bgt t1, zero, redrows

  add t5, t0, zero
  addi t5, t5, 720
  addi t4, zero, 360

greenline:
  s8 t2, t5, 1
  addi t5, t5, 5760
  sub t4, t4, t3
  bgt t4, zero, greenline

  add t5, t0, zero
  addi t4, zero, 120

bluestart:
  add t5, t5, t6
  sub t4, t4, t3
  bgt t4, zero, bluestart
  addi t5, t5, 1440
  addi t4, zero, 360

bluediagonal:
  s8 t2, t5, 2
  s8 t2, t5, 5
  s8 t2, t5, 8
  addi t5, t5, 5763
  sub t4, t4, t3
  bgt t4, zero, bluediagonal

done:
  j done

I know - not great. It would be crazy to want to write a small language model in this! Fortunately, the next step in the stack is Zenith C, which is a C-like programming language that compiles down to this. As Zenith C developers, we don't have to worry about hand writing this assembly.

Here's what some Zenith C looks like.
C
#define WIDTH 1920
#define FB 0xFFFFFFFFFFA11400

void main() {
    uint8_t *fb = FB;

    // red bar
    for (int y = 120; y < 124; y++) {
        for (int x = 0; x < 640; x++) {
            fb[(y * WIDTH + x) * 3 + 0] = 255;
        }
    }

    // green vertical line
    for (int y = 0; y < 360; y++) {
        fb[((y + 120) * WIDTH + 240) * 3 + 1] = 255;
    }

    // blue diagonal
    for (int i = 0; i < 360; i++) {
        int x = 480 + i;
        int y = 120 + i;

        fb[(y * WIDTH + x + 0) * 3 + 2] = 255;
        fb[(y * WIDTH + x + 1) * 3 + 2] = 255;
        fb[(y * WIDTH + x + 2) * 3 + 2] = 255;
    }
}
We can define a function to take a starting point, ending point, and color.
C
#define WIDTH 1920
#define FB 0xFFFFFFFFFFA11400

void draw_line(int x0, int y0, int x1, int y1,
               uint8_t r, uint8_t g, uint8_t b) {
    int dx = x1 - x0;
    int dy = y1 - y0;

    int sx = (dx >= 0) ? 1 : -1;
    int sy = (dy >= 0) ? 1 : -1;

    if (dx < 0) dx = -dx;
    if (dy < 0) dy = -dy;

    int err = dx - dy;

    while (1) {
        uint8_t *pixel = FB + ((y0 * WIDTH + x0) * 3);

        pixel[0] = r;
        pixel[1] = g;
        pixel[2] = b;

        if (x0 == x1 && y0 == y1)
            break;

        int e2 = 2 * err;

        if (e2 > -dy) {
            err -= dy;
            x0 += sx;
        }

        if (e2 < dx) {
            err += dx;
            y0 += sy;
        }
    }
}

void main() {
    // red horizontal line
    draw_line(
        0, 120,
        639, 120,
        255, 0, 0
    );

    // green vertical line
    draw_line(
        240, 120,
        240, 479,
        0, 255, 0
    );

    // blue diagonal line
    draw_line(
        480, 120,
        839, 479,
        0, 0, 255
    );
}
And we can even see what that compiled to.
Assembly
.main
start:
  addi sp, zero, 16000
  jal ra, F1
exit:
  j exit
F0:
  addi t6, zero, 128
  sub sp, sp, t6
  s64 ra, sp, 0
  s64 s0, sp, 8
  add s0, sp, zero
  s64 a0, s0, 16
  s64 a1, s0, 24
  s64 a2, s0, 32
  s64 a3, s0, 40
  s64 a4, s0, 48
  s64 a5, s0, 56
  s64 a6, s0, 64
  l64 t0, s0, 32
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 16
  l64 t1, sp, 0
  addi sp, sp, 8
  sub t0, t1, t0
  s64 t0, s0, 72
  l64 t0, s0, 40
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 24
  l64 t1, sp, 0
  addi sp, sp, 8
  sub t0, t1, t0
  s64 t0, s0, 80
  l64 t0, s0, 72
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 0
  l64 t1, sp, 0
  addi sp, sp, 8
  bge t1, t0, L3
  addi t0, zero, 0
  j L4
L3:
  addi t0, zero, 1
L4:
  beq t0, zero, L1
  addi t0, zero, 1
  j L2
L1:
  addi t0, zero, 1
  sub t0, zero, t0
L2:
  s64 t0, s0, 88
  l64 t0, s0, 80
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 0
  l64 t1, sp, 0
  addi sp, sp, 8
  bge t1, t0, L7
  addi t0, zero, 0
  j L8
L7:
  addi t0, zero, 1
L8:
  beq t0, zero, L5
  addi t0, zero, 1
  j L6
L5:
  addi t0, zero, 1
  sub t0, zero, t0
L6:
  s64 t0, s0, 96
  l64 t0, s0, 72
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 0
  l64 t1, sp, 0
  addi sp, sp, 8
  blt t1, t0, L11
  addi t0, zero, 0
  j L12
L11:
  addi t0, zero, 1
L12:
  beq t0, zero, L9
  addi t0, s0, 72
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 72
  sub t0, zero, t0
  l64 t1, sp, 0
  addi sp, sp, 8
  s64 t0, t1, 0
  j L10
L9:
L10:
  l64 t0, s0, 80
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 0
  l64 t1, sp, 0
  addi sp, sp, 8
  blt t1, t0, L15
  addi t0, zero, 0
  j L16
L15:
  addi t0, zero, 1
L16:
  beq t0, zero, L13
  addi t0, s0, 80
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 80
  sub t0, zero, t0
  l64 t1, sp, 0
  addi sp, sp, 8
  s64 t0, t1, 0
  j L14
L13:
L14:
  l64 t0, s0, 72
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 80
  l64 t1, sp, 0
  addi sp, sp, 8
  sub t0, t1, t0
  s64 t0, s0, 104
L17:
  addi t0, zero, 1
  beq t0, zero, L18
  addi t0, zero, 255
  addi t6, zero, 14
  sll t0, t0, t6
  addi t0, t0, 16383
  addi t6, zero, 14
  sll t0, t0, t6
  addi t0, t0, 16383
  addi t6, zero, 14
  sll t0, t0, t6
  addi t0, t0, 16004
  addi t6, zero, 14
  sll t0, t0, t6
  addi t0, t0, 5120
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 24
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 1920
  l64 t1, sp, 0
  addi sp, sp, 8
  mul t0, t1, t0
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 16
  l64 t1, sp, 0
  addi sp, sp, 8
  add t0, t1, t0
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 3
  l64 t1, sp, 0
  addi sp, sp, 8
  mul t0, t1, t0
  l64 t1, sp, 0
  addi sp, sp, 8
  add t0, t1, t0
  s64 t0, s0, 112
  l64 t0, s0, 112
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 0
  addi t6, zero, 1
  mul t0, t0, t6
  l64 t1, sp, 0
  addi sp, sp, 8
  add t0, t1, t0
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 48
  l64 t1, sp, 0
  addi sp, sp, 8
  s8 t0, t1, 0
  l64 t0, s0, 112
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 1
  addi t6, zero, 1
  mul t0, t0, t6
  l64 t1, sp, 0
  addi sp, sp, 8
  add t0, t1, t0
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 56
  l64 t1, sp, 0
  addi sp, sp, 8
  s8 t0, t1, 0
  l64 t0, s0, 112
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 2
  addi t6, zero, 1
  mul t0, t0, t6
  l64 t1, sp, 0
  addi sp, sp, 8
  add t0, t1, t0
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 64
  l64 t1, sp, 0
  addi sp, sp, 8
  s8 t0, t1, 0
  l64 t0, s0, 16
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 32
  l64 t1, sp, 0
  addi sp, sp, 8
  beq t1, t0, L23
  addi t0, zero, 0
  j L24
L23:
  addi t0, zero, 1
L24:
  beq t0, zero, L21
  l64 t0, s0, 24
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 40
  l64 t1, sp, 0
  addi sp, sp, 8
  beq t1, t0, L25
  addi t0, zero, 0
  j L26
L25:
  addi t0, zero, 1
L26:
  beq t0, zero, L21
  addi t0, zero, 1
  j L22
L21:
  addi t0, zero, 0
L22:
  beq t0, zero, L19
  j L18
  j L20
L19:
L20:
  addi t0, zero, 2
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 104
  l64 t1, sp, 0
  addi sp, sp, 8
  mul t0, t1, t0
  s64 t0, s0, 120
  l64 t0, s0, 120
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 80
  sub t0, zero, t0
  l64 t1, sp, 0
  addi sp, sp, 8
  bgt t1, t0, L29
  addi t0, zero, 0
  j L30
L29:
  addi t0, zero, 1
L30:
  beq t0, zero, L27
  addi t0, s0, 104
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 80
  l64 t1, sp, 0
  addi sp, sp, 8
  l64 t2, t1, 0
  sub t0, t2, t0
  s64 t0, t1, 0
  addi t0, s0, 16
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 88
  l64 t1, sp, 0
  addi sp, sp, 8
  l64 t2, t1, 0
  add t0, t2, t0
  s64 t0, t1, 0
  j L28
L27:
L28:
  l64 t0, s0, 120
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 72
  l64 t1, sp, 0
  addi sp, sp, 8
  blt t1, t0, L33
  addi t0, zero, 0
  j L34
L33:
  addi t0, zero, 1
L34:
  beq t0, zero, L31
  addi t0, s0, 104
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 72
  l64 t1, sp, 0
  addi sp, sp, 8
  l64 t2, t1, 0
  add t0, t2, t0
  s64 t0, t1, 0
  addi t0, s0, 24
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 t0, s0, 96
  l64 t1, sp, 0
  addi sp, sp, 8
  l64 t2, t1, 0
  add t0, t2, t0
  s64 t0, t1, 0
  j L32
L31:
L32:
  j L17
L18:
L0:
  add sp, s0, zero
  l64 s0, sp, 8
  l64 ra, sp, 0
  addi t6, zero, 128
  add sp, sp, t6
  jalr zero, ra, 0
F1:
  addi t6, zero, 16
  sub sp, sp, t6
  s64 ra, sp, 0
  s64 s0, sp, 8
  add s0, sp, zero
  addi t0, zero, 0
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 120
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 639
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 120
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 255
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 0
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 0
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 a6, sp, 0
  addi sp, sp, 8
  l64 a5, sp, 0
  addi sp, sp, 8
  l64 a4, sp, 0
  addi sp, sp, 8
  l64 a3, sp, 0
  addi sp, sp, 8
  l64 a2, sp, 0
  addi sp, sp, 8
  l64 a1, sp, 0
  addi sp, sp, 8
  l64 a0, sp, 0
  addi sp, sp, 8
  jal ra, F0
  add t0, a0, zero
  addi t0, zero, 240
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 120
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 240
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 479
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 0
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 255
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 0
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 a6, sp, 0
  addi sp, sp, 8
  l64 a5, sp, 0
  addi sp, sp, 8
  l64 a4, sp, 0
  addi sp, sp, 8
  l64 a3, sp, 0
  addi sp, sp, 8
  l64 a2, sp, 0
  addi sp, sp, 8
  l64 a1, sp, 0
  addi sp, sp, 8
  l64 a0, sp, 0
  addi sp, sp, 8
  jal ra, F0
  add t0, a0, zero
  addi t0, zero, 480
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 120
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 839
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 479
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 0
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 0
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  addi t0, zero, 255
  addi t6, zero, 8
  sub sp, sp, t6
  s64 t0, sp, 0
  l64 a6, sp, 0
  addi sp, sp, 8
  l64 a5, sp, 0
  addi sp, sp, 8
  l64 a4, sp, 0
  addi sp, sp, 8
  l64 a3, sp, 0
  addi sp, sp, 8
  l64 a2, sp, 0
  addi sp, sp, 8
  l64 a1, sp, 0
  addi sp, sp, 8
  l64 a0, sp, 0
  addi sp, sp, 8
  jal ra, F0
  add t0, a0, zero
L35:
  add sp, s0, zero
  l64 s0, sp, 8
  l64 ra, sp, 0
  addi t6, zero, 16
  add sp, sp, t6
  jalr zero, ra, 0

No way we would write those 500+ lines just to draw a little on the framebuffer! The point is that having the Zenith C > Zenith Assembly > Zenith Hardware/Emulator pipeline allows us to create significantly more complex and practical programs, including the end goal of a quantized small language model. However, there are a few more components at play here, namely the kernel and the standard library. The kernel implements system call handlers in Zenith C. This allows the user to ask the kernel to execute a program, for example. Currently, all applications have access to the framebuffer MMIO, but in the future I'd like to pass control of that to the kernel too, meaning graphic I/O would be handled at the kernel level as well. The standard library zenith-libc provides basic functions for printing, string comparison, etc., as well as wraps system calls in a friendlier manner for future use.

Finally, the web interface packs the WebAssembly builds of the compiler, assembler, and emulator, and gives an editor to interactively run them on your browser. You can check it out here.

Current Status

At the time of writing (July 22nd, 2026), 41 out of 62 items are complete (~66%). After all of these are done, all that's left will be implementing the quantized small language model inference.

Defined Emulator (wasm) Emulator (native) RTL (simulation) RTL (native) PCB Other
Arithmetic Instruction Set N/A N/A
Memory Instruction Set N/A N/A
Control Instruction Set N/A N/A
Tensor Instruction Set N/A N/A
System Instruction Set N/A N/A
Executable Format N/A N/A N/A N/A N/A
Filesystem Format N/A N/A N/A N/A N/A
System Calls N/A N/A N/A N/A N/A
MMIO - - - - - - -
➔ Framebuffer (VGA) N/A
➔ Keyboard (PS/2) N/A
➔ Mouse (PS/2) N/A
➔ Storage (SD) N/A
Assembly Language N/A N/A N/A N/A N/A
C-like Language N/A N/A N/A N/A N/A
Boot N/A N/A N/A N/A N/A N/A
Standard Library N/A N/A N/A N/A N/A N/A
Kernel N/A N/A N/A N/A N/A N/A

Use of Large Language Models

This is primarily a learning project for myself. I don't have a hard deadline nor a concrete set of features I need before a set date. I'm mainly working on this to get a better understanding of what our computers and ML accelerators do on a day-to-day basis - therefore, I use large language models very modestly here, mainly for research, finding PCBA parts, and not for writing code1. Ask me about how I use language models in my work experience for more information.