RTL design in Verilog, verification against independent reference models, computer architecture, GPU programming, and taking designs through synthesis and physical layout.

int8 GEMM Kernels in CUDA

CUDA C++ · Tensor Cores (WMMA) · cuBLAS · Nsight Compute · Python

The int8 matrix multiply at the heart of quantized neural networks, written seven ways on the GPU. Each version fixes the previous one's bottleneck: memory coalescing, shared-memory and register tiling, packed dp4a instructions, and finally tensor cores.

Every kernel is checked exactly against a CPU reference at every size, and benchmarked on an NVIDIA T4 with a roofline analysis. It pairs with my accelerator: tensor cores are systolic arrays inside the GPU, and both designs come down to keeping the multipliers fed.

TOPS, log scale 0.1 1 10 naive 0.06 coalesced 0.76 smem_tiled 0.8 reg_tiled 2.78 dp4a 8.07 tensor_core 20.36 cuBLAS 44.03
Measured on an NVIDIA T4 at 2048³: each kernel fixes the bottleneck of the one above it. cuBLAS is NVIDIA's library, for reference.
330×faster than the naive kernel
20.4 TOPSmy tensor-core kernel
46%of NVIDIA cuBLAS
294×faster than the CPU
View on GitHub

Pipelined RISC-V Processor

Verilog · RV32I · Python

Single-cycle and five-stage RV32I cores, built to compare how pipeline hazards affect performance. The pipelined core forwards ALU results, stalls on load-use dependencies, and flushes younger instructions on taken branches.

I wrote my own assembler and instruction-set simulator as a golden model. Every program's final registers, memory and instruction count must match it exactly, including thousands of randomly generated instructions.

1 2 3 4 5 6 7 8 cycle → add t1,t0,t0 IF ID EX MEM WB sub t2,t1,t0 IF ID EX MEM WB lw a0,0(s0) IF ID EX MEM WB beq a0,t2,L IF ID EX MEM WB
Instructions overlap across clock cycles; the curve is a forwarded result.
28%lower CPI with forwarding
1.92 → 1.38cycles per instruction
8 / 8planted bugs caught
View on GitHub

Digital Design RTL

Verilog · Icarus Verilog · Verilator · GitHub Actions

A set of synthesizable building blocks: UART, SPI master, synchronous FIFO, button debouncer, and a traffic-light state machine. A UART echo top level connects the receiver, FIFO and transmitter into one serial datapath.

Six self-checking testbenches cover randomized FIFO traffic, UART framing errors, SPI edge timing, and safety properties checked every cycle. CI runs every simulation and Verilator lint on each push.

UART echo simulation: the receiver decodes 0x48, queues it in the FIFO, and the transmitter sends it back.
View on GitHub

Firmware, real-time systems, sensors and signal processing: hardware that interacts with the physical world.

Butter Bot

STM32 · ESP32S3 camera · I2C · UART · PWM · 3D printing · in progress, Fall 2026

An autonomous mini forklift inspired by the Butter Robot from Rick and Morty. It uses a camera to find a stick of butter, slides its forks under a small pallet, lifts it, and delivers it to a red drop-off marker.

An STM32 Nucleo-L4R5ZI-P runs the robot as an interrupt-driven state machine. It receives butter and marker positions from a XIAO ESP32S3 Sense camera over UART, reads heading from an LSM303AGR magnetometer over I2C, and drives two DC gearmotors and an SG92R servo with timer PWM. The 25-part 3D-printed body includes a parallel-link forklift that lifts the forks 30 mm while keeping them level.

RTOS Task Scheduler

STM32 NUCLEO-F446RE · FreeRTOS · C

Multitasking firmware with concurrent tasks for sensor polling, motor control, status LEDs and a UART command shell, coordinated through task priorities, preemption, queue-based messaging and mutex-protected output.

Commands like motor open, led on and status can be issued live over serial. The hardware is an STM32 NUCLEO-F446RE, an SG90 servo, and an external 5 V supply.

View on GitHub
shell motor sensor led
Tasks preempting each other by priority on one CPU core.

More embedded projects

PIRmotor

Automatic Feeder Prototype

An Arduino feeder that uses a PIR interrupt to trigger a motor and logs events over serial.

GitHub

Solar-Powered Charger

A solar-powered USB charger prototype with a LiPo battery and a DC-DC boost converter.

Useless Box

A motorized box that flips its own switch off using a mechanical lever and a limit switch.

Machine learning from scratch, interactive learning tools, and web apps.

Mini LLM

Python · PyTorch

A character-level transformer. Its attention heads use a causal mask, so each position only attends to itself and earlier characters. The command-line interface trains on a text file and samples from a saved checkpoint.

View on GitHub
h h e e l l l l o o _ _ w w causalmask
Each character attends only to itself and earlier ones.

AstroML Journey

React · Vite

An app that teaches machine learning through six space-themed lessons. React state tracks quiz answers and completed missions, and the stage selector unlocks the next world after a correct answer.

View on GitHub
L1 L2 L3 L4 L5 L6
Six lessons as worlds; each correct answer unlocks the next.

Image Classifier

Python · PyTorch

A small CNN trained from scratch on CIFAR-10 with data augmentation, batch normalization and dropout.

View on GitHub
ship plane car bird 32×32 imageconv layers
Pixels → convolution feature maps → class scores (CIFAR-10).

tela

JavaScript

A browser-based wardrobe prototype that saves clothing and outfit posts in local storage and suggests combinations from past outfits.

View on GitHub
suggested
Saved clothes combined into outfit suggestions.

More software projects

Stock Market Simulator

A single-page browser simulator for practicing stock trades.

GitHub

BFS & DFS Algorithms

A Python curses demo that animates breadth-first and depth-first maze traversal.

GitHub

Turtle Graphics

A Python turtle racing game with randomized movement and obstacles.

GitHub