Software engineer fascinated by computer hardware and the systems built upon it.
UC Davis graduate passionate about graphics pipelines, simulators, and CS education tools. Experience leading development on RISC-V simulator deployed as a teaching aid and independent projects surrounding graphics pipelines and physics visualizations.
Also a creative working on thinky puzzle games and nostalgic websites. Trying to claw back a small piece of that old internet individuality.
RISC-V system emulator, primarily meant for teaching assembly programming and computer organization concepts.
VRV implements the instruction set RV32IMF_Zicsr (32-bit base integer + integer multiplication/division support, single-precision floating point support, and control and status registers support) and offers two privilege levels: machine and user modes.
web clientseminar presentation slidesSIGCSETS 2025 Postergitlab
Annual programming contest hosted at UC Davis with a focus on introducing both undergrads and highschool students to the creative thinking and problem solving skills that competitive programming promotes.
I was lead problem setter for the 2023 and 2024 contests and a problem writer/tester for the upcoming 2025 contest. As lead problem setter, I was responsible for statement editting, testing/verification, and maintaining format consistency. I also led onboarding efforts to instruct and advise other members of the contest organization team in terms of problem writing and configuring the judge.
Written from the perpsective of an in-universe conspiracy theorist, this website has a retro geocities style and contains many secrets that inform the world surrounding the game as well as this character.
Cycle-level event-driven simulator designed for computer architecture research. Used globally by university labs and industry computer hardware designers.
Over the Summer of 2024, was a hired as a research software engineer in the UC Davis DArchR lab that maintains and develops gem5. During that time, I made the following contributions:
This site allows users to go on a quick eploration of the regionally-distinct ekiben, bento found at Japanese train stations intended to be eaten while riding the train. You can select a variety of cities and investigate the ingredients and history of a selected ekiben specific to that region.
One interesting engineering problem was how to allow selection and highlighting of specific areas of the images. This was done by manually rotoscoping these sections in photoshop while also generating a mask of that specific area. While the rotoscoped image is used for the highlighitng, the masks are composited these into a single image while, ensuring each area has a distinct shade of red representing the area's ID. There are actually two rendered canvases on the site, one of which is invisible and displays this ID mask. I can then use the user's mouse position to query this mask and highlight the associated area of the image.
A simple ray-tracing engine designed to test the performance improvement of CUDA for this particular workload. The scene consists of a variable number of randomly placed reflective spheres. The engine performs scattering and accumulation to create a high quality image in real-time by improving fidelity across frames.
CUDA parallelization is done at the level of areas of pixels in the rendered frame. We test the assumption that each pixel within these small areas will processs a similar number of ray bounces and access similar memory from the scene. These factors will promote speedup. This approach is tested against a serial implementation for increasingly many spheres to show improvements from CUDA as the scene grows more complex.
This game puts you in the seat of a 1984-style beauracrat who is having their thoughts constantly analyzed by their government to ensure complacency. However, you are given the ability to continue thinking freely, as long as you can rearrange your thoughts back into obediency before they are checked. Use this freedom to sabotage infrastructure and remain innocuous.
Made over 48 hours in Unity for a UC Davis game jam.
A collection of small computer vision projects.
Image stitching presents a procedure to stitch together images to form a cohesive panoramic photo, compensating for differences in camera angle and position. Harris corner detection is used to find a set of useful descriptors in the images and then find good pairs of descriptors that may act as anchor points to match up the images. Finally, RANSAC is used to randomly sample a set of pairs and attempts a homographic projection built upon those points. This leads to an almost exact reprojection of the contents of one image into the space of the other.
Filters and edge detection contains a variety of experiments with different kernel filters such as Gaussian blur, Sobel edge detection, and bilateral filter. This culminates in an algorithm using the Hough transform to create a set of lines that can characterize the most significant edges of the image.
A lineage-based transactional database written in Rust with a python interface. This kind of database stores the changes in records after each transaction, retaining the history of the record within the managed structure of the database. Indirection is limited by maintaining a chain of references from a base record -- the record attached to the query structures -- and the tail record -- the most recent version of the record. Then the chain continues backwards in time all the way back to the base record. Supports multithreaded query scheduling with concurrency control, durable buffer pool, and variable-sized data elements.
Developed by a five-person team, my responsibilites and contributions include:
alARM is a simple ARM-like ISA used an assignment for the UC Davis computer architecture course.
The assignment specified a digital logic simulation of an alARM CPU to be made in the program Logisim. The design and implementation of this CPU is documented in the whitepaper linked below.
The original assignment required hand-assembling programs into the bytecode so that it could be loaded into Logisim. As a student in the class, I volunteered to write an assembler for the rest of the class to use to speed up this tedious process. The assembler includes a choice of strict or relaxed syntaxes, highly informative error messages, and pseudo-instructions. You can see a full specification of the assembly syntax in the assembler's README.
The assembler was written to gracefully handle the addition of new instructions and pseudo-instructions -- this proved useful when students in future iterations of the class forked and easily updated the assembler for new project specifications.
A webapp that helps students visualize how RISC-V instructions are encoded and decoded. Can either encode or decode the input and presents a visualization of the fields of the assembly instruction and how they map to the bits in the encoded instruction word.
Aa a contributor to this project, I made the following contributions:
A cloth simulation built with OpenGL and SFML for the UI. Supports a variety of options to customize the aesthetics of the mesh and the quality of the simulation.
Supports mouse interaction with the mesh via direct manipulation of mesh nodes via dragging, pinning, or deletion.
Simulation is implemented with Verlet integration to propogate the forces while preventing erroneous increases in system energy and the mesh is constructed with constraints on edge that are iteratively resolved to stabilize the results. The rendered mesh is itself interpolated at a higher resolution than the simulation mesh, efficiently improving the apperance of the simulation.
An interactive Mandelbrot fractal explorer with frame contents entirely generated from hand-written MASM assembly code using AVX SIMD instructions for performance. Uses SFML as a window manager and input controller, but all commands are sent to the assembly rendering library which generates the pixel data to be rendered.
Supports zooming, panning, adjusting fractal precision, and multiple coloring modes.
Look familiar? This website was made for an art collective I created with a few of my friends. I really enjoyed the design -- and I spent a lot of time on it back then -- so I decided to reuse it for this personal website.
The goal was to have one website from which we could all share our creations, which could implicitly diffuse one member's marketing to the others. The design of the website was supposed to reflect a minimal, dark, and modern aesthetic with a technical bend to it. I wanted a website that felt hand-made and detail oriented, so a bulk of the time was spent on making all of the interactions smooth and substantial. Besides some jquery for easy element lookups and filtering, there are no libraries or frameworks used; just good old-fashioned vanilla javascript.
The collective was multimedia, so I contributed a game and had planned to develop more along with the website. There is also an art gallery with pieces made by another member but was thoughtfully arranged on the website with the browser as a viewing medium in mind. There were even plans to make a 3D gallery, which is where the WebGL deferred renderer comes in, but those plans fell through.
Intended as a renderer for a 3D puzzle game engine, this renderer supports advanced exponential variance shadow-mapping (EVSM) for dynamic lightsources, screen-space anti-aliasing (FXAA), screen-space ambient occlusion (SSAO), physically-based rendered lighting (PBR), and Source-inpsired room-isolated rendering logic with a graph of room connections to support efficient culling of both rendered meshes and light interactions.
The goal was to make a 3D engine with some high-quality rendering features that can be tuned to support a wide variety of devices. Since this is running on the web, it needed to remain efficient and performant even at its base level, while also remaining flexible enoguh to support low-end hardware, such as computers with only integrated graphics, if necessary.
A sokoban-style block-pushing puzzle game with mechanics inspired by Portal. Made using Stephen Lavelle's puzzlescript engine. Contains 5 levels that each explore different consequences of the portal mechanic in from this top-down perspective.
A problem-solving game inspired by Zachtronics and digital logic. Abanoned as a prototype due to my own inability to explain the mechanics, I left it as "purposefully" inpenetrable in order to inspire the rare few to discover its functionality (inspired by games like Gestalt-OS).
Each tile can contain a logic module and can be linked with wires between the modules. Each tile can also be customized to interact with different signals or to react in different ways (toggling, rotating, etc) when a signal is emitted. Signals can be emitted by having power sent to themvia the wires, and recievers can react to the emission of a signal by transmitting power themselves. The goal is to emit a certain combination of signals in series in a reproducible manner.
Made with the cross-platform haxe language and the haxegon game framework which was primarily used for the rendering API. The bulk of the game's architecture and logic was handmade. The game simulation is highly performant and could run tens of hundreds of thousands of iterations per second from a dense and complicated circuit (though neither that complexity nor that speed is at all necessary for the game).
Promotional website for a documentary film about the music and relationship -- along with the struggles surrounding both -- of a married couple collaborating as a singer-songwriter duo. Made from scratch with some design brainstorming with the film publisher.