Factory Floor Notes
Public notes, made in hope they are useful to someone. Mostly with programmable hardware bend. See list of topics.
Questions? Comments? Article ideas? Let me know. Want to chat? Find a time here.
-
Volume I of my Fuchsia Internals report series is the graphics and display pipeline, and it is a deliberate choice for the first deep-dive: graphics is a complete worked application that exercises nearly every kernel …
-
This is a description of how I build programmable hardware. Everything that goes into Cocoapuffs, my RISC-V system-on-chip on an Artix-7 FPGA: the RTL, the firmware, the simulations, the synthesis, the bitstream, and the …
-
rules_vivado drives the AMD/Xilinx Vivado FPGA toolchain from Bazel: VHDL and Verilog compile, elaborate, simulate, synthesize, place-and-route, generate a bitstream, and program the device, all as hermetic Bazel build …
-
I have been writing a set of technical reports on the internals of Fuchsia, Google’s capability-based microkernel operating system, aimed squarely at electrical, RTL, and FPGA engineers rather than at kernel hackers. …
-
Interviews for FPGA and digital-design roles draw from a stable, well-defined body of knowledge, yet candidates routinely stumble on it because the questions are asked crisply and must be answered under pressure. I am …
-
Fuchsia’s Zircon kernel now boots on Cocoapuffs, my homebrew RISC-V system-on-chip an AMD Artix-7 FPGA: as far as I know, the first Fuchsia boot on programmable hardware. The boot video and the full chain, from a SERV …
-
I’m excited to announce the release of bazel_local_nix 0.1.0! bazel_local_nix provides Bazel rules that make Nix packages available inside a Bazel workspace without a host-level Nix installation and without nix-portable. …
-
tl;dr: I revived the upspin project source code. See it at https://github.com/filmil/upspin, and https://github.com/filmil/upspin-gdrive. Read on to learn what that actually means. History Upspin was a project intended …
-
Synod is a distributed Paxos coordination agent implemented in Go. It manages a highly available, synchronized Key-Value store across a network of peers using the Paxos consensus algorithm. It allows multiple dynamically …
-
mkill is a Go program that continuously monitors memory usage of the programs owned by the current user. It kills the program with the sharpest rise in memory utilization when the overall system memory occupancy goes …
-
A link page of interesting libraries and utilities I found. Libraries, utilities, etc. https://registry.bazel.build/modules/rules_verilator https://github.com/lromor/fpga-assembler …
-
fshlib fshlib is a simple shell library for logging. It provides a set of functions to log messages with different severity levels. Github repo: https://github.com/filmil/fshlib Usage To use the library, source the …
-
note to self: do not remove .bazelversion from projects The other day, I was pondering whether to keep setting particular bazel version in projects. I even removed some, to see what would become of it. Since I use the …
-
This repository provides Bazel rules for creating self-extracting archives (“shar"s) out of shell binaries. See section “what is this” below for details. Details at: https://github.com/filmil/rules_shar Usage To use …
-
Bazel rules to support a debian rootfs The idea of this repository is to provide a hermetic, ephemeral and reproducible repository of prebuilt binaries, which can then be brought into bazel builds to remove the …
-
This is another piece of news in my quest for hermetic, ephemeral, and reproducible builds (“HER”). If you read my articles in the past months or so, you may have noticed that I am looking for good ways of creating …
-
This is a collection of links to interesting articles and knowledge sources about the Bazel build system that I found. I’m motivated to do this after spending considerable time developing a thing that already existed. …
-
This is another piece of news in my quest for hermetic, ephemeral, and reproducible builds (“HER”). If you read my articles in the past months or so, you may have noticed that I am looking for good ways of creating …
-
Update 2025-10-19: I made a searchable index of modules available from my registry at https://www.hdlfactory.com/bazel-registry. As Bazel 9.0 promises to disable the old dependency management approaches based on …
-
lit2md: a literate program converter from code to Markdown lit2md is a simplistic literate programming (LP) converter. See at: https://github.com/filmil/lit2md It takes a source code file annotated with special …
-
Writing XDC Clock Constraints for Vivado This guide explains how to properly constrain a digital design with multiple clocks in an XDC (Xilinx Design Constraints) file, specifically for use in Vivado batch mode. We’ll …
-
Decentralized Downloads for Bazel: Introducing bazel_rules_bt In the world of reproducible builds and efficient dependency management, Bazel stands out as a powerful tool. However, fetching large or uncommon dependencies …
-
I asked Gemini to teach me about the VHDL resolved signals. What you read below is the result. Mastering Resolved Signals in VHDL: A Comprehensive Guide for Digital Design 1. Introduction to Signals in VHDL The …
-
How to shoot yourself in the foot with inout signals They say that no good deed goes unpunished. Here’s an example of a footgun in VHDL which stems from in my view an eminently reasonable desire to keep the entity …
-
I asked Gemini to teach me the VHDL type conversions. What you read below is the result. An annoying generated podcast will be available for a while. VHDL IEEE Libraries and Numeric Type Conversions: A Definitive …
-
I updated the repository https://github.com/filmil/vivado-docker/ with the changes required to package Vivado 2025.1. As of this writing, version 2025.1 is the last published version. I hope that the updated version will …
-
rules_nixpkgs use This is a run-down of tips and tricks for the use of rules_nixpkgs, a rule set for bringing in nix packages for use in bazel. I got involved with the use of rules_nixpkgs as a result of my work on …
-
Bid allows you to create a build rule that runs a single bazel build action inside a Docker container. And if you can run a single action, you can run more if you so choose. This helps you if you must use software which …
-
Other formats: Original content is at: https://github.com/filmil/bazel-ebook The rendered HTML edition at: https://hdlfactory.com/bazel_ebook_html/ Introduction This repository is a set of bazel build rules that allow …
-
A quick note about correct use of glbl.v in a Verilog simulation in Vivado. This note is way less confusing than any notes you may find elsewhere on the Internet. glbl.v is a small collection of “global” signals that are …
-
From: https://github.com/filmil/go-vcd-parser Value Change Dump (VCD) File parser This is a parser for the Value Change Dump files, a.k.a VCD file format. The file format is defined in the IEEE Standard 1800-2003. …
-
Reusing the general approach from this post gives a way for setting Shift_L+Shift_R as layout change: $ gsettings set org.gnome.desktop.wm.keybindings switch-input-source "['<Shift>Shift_L']" $ gsettings set …
-
What? $readmemh is a Verilog directive that allows you to initialize an array. It works differently in simulation compared to synthesis. In simulation, this directive behaves as a “read file into array”. In synthesis, …
-
From zero to RISC-V in hardware, in 6 minutes Program your FPGA with a one-liner command. It’s a kind of magic. This is a project in sustainable FPGA development that I have been working on. It ties together several …
-
Be forewarned: HER builds with nix require a functional ranlib This is something seldom known, and a very sharp corner to cut yourself on. But you really want to know if you are using nix. I lost an entire day trying to …
-
bazel rules for GHDL I present to you https://github.com/filmil/bazel_rules_ghdl: a set of bazel rules for converting VHDL into Verilog. This for example allows running VHDL code in a Verilator simulation. Commercial …
-
bazel rules for a riscv64 bare metal rust compiler This article assumes that you have bazel installed via the bazelisk method. This is the latest example in my repository at: https://github.com/filmil/bazel-experiments …
-
bazel installation via the bazelisk method Here is how I install bazel. I use this installation method on all of my machines. I do not think it is practical to go about this any other way. It is implied in all of my …
-
bazel rules for a riscv64 bare metal GCC compiler The repository https://github.com/filmil/bazel_rules_gcc_riscv64_baremetal contains bazel rules that can be used for a hermetic bare metal GCC cross-compiler for a 64-bit …
-
lazygit tips and tricks These are some tips and tricks for lazygit that I keep forgetting how to do. Split a commit into multiple commits Based on the discussion here. Open lazygit 4 to move to the commits panel Enter …
-
Summary Here is how you can set up a hardware server (hw_server) in AMD Vivado 2023.2. Once you do this, that you can move your workbench to a virtual machine in your cloud of choice - mine is GCP - but program a device …
-
Google Nest Router (2nd Generation) can serve as an access point I accidentally bought the Google Nest 2nd Generation Router when I needed an Access Point. It turns out that the Router can act as an Access Point and join …
-
Summary This short note defines the notions of hermetic, ephemeral and reproducible software build, as used in my writing. I call this “her” for short. Hermetic A build is said to be hermetic, if each build step only has …
-
Summary I bother with bazel. Here is why. Background Bazel is a build system. Originally created at Google for internal purposes, then eventually open sourced. Since then, it has not been universally accepted. You can …
-
You, too, can have a fully hermetic, reproducible, and ephemeral bazel build. If you are in a hurry, fast forward to https://github.com/filmil/bazel_local_nix Intro While looking for non-invasive and reproducible ways to …
-
Docker tips and tricks Save an image to an archive docker save imagename | gzip > myimage.tar.gz Load image to an archive docker load < myimage.tar.gz
-
Bazel does not like FIFOs Perhaps obvious in retrospect, but it is not possible for a bazel build artifact to generate a named pipe in the filesystem. The after-step checks will object if an output directory contains at …
-
After a lengthy search I found the below article that explains the use of Unix domain sockets in go: https://johnrefior.com/gobits/read/go-introduction-to-unix-socket-communication
-
If this advice helped you, let me know. How to run docker containers under Synology NAS, easily and with custom settings Prompted by a recent need to run a local Jupyter instance using the Jupyter Docker Stacks. The …
-
TIM-011 video playlist TIM-011 was an 8-bit teaching computer that was ostensibly developed by IMP in what is now Serbia. Here is a public collection of videos related to the TIM-011 computer. Most of the videos, and …
-
TIM-011 was an 8-bit teaching computer that was ostensibly developed by IMP in what is now Serbia. It is hard to develop for any machine without a way to test quickly whether your work results in something usable. Since …
-
Update 2026-04-17: Bazoekt has been modernized and revived. Sourcegraph has taken over maintenance of zoekt, but what they actually did was disable the old repo and dismantle the zoekt infrastructure, so it couldn’t be …
-
Excavating an unknown file from a foreign_cc rule I discovered this trick recently, while trying (and mostly failing) to build a library. I discovered that it is possible to excavate an arbitrary file from the resulting …
-
TIM-011 gets a C runtime library TIM-011 was an 8-bit teaching computer that was ostensibly developed by IMP in what is now Serbia. Now that https://github.com/filmil/tim011-tools/issues/3 has been fixed, the TIM-011 …
-
I was a bit hard pressed to find all the proper work attribution. Please let me know if you have data to contribute. TIM-011 TIM-011 was an 8-bit teaching computer that was ostensibly developed by IMP in what is now …
-
A while back I wanted to make a hermetic environment for repeatably running Docker tooling. The results are here: https://github.com/filmil/vivado-docker/ At this time, it’s only able to run the GUI version of the tool. …
-
From VimScript into Lua This is my cheat sheet for migrating VimScript into Lua. Things I often forget. There are places to learn about Lua use in Neovim . But, for some reason, I could not find side-by-side examples of …
-
Often needed little bits of git knowledge that I tend to forget. Check out the contents of a GitHub PR From: https://devopscube.com/checkout-git-pull-request/ git fetch origin pull/15/head:test-branch This will fetch the …
-
Often needed little bits of bazel knowledge that I tend to forget. Module extensions Reminder about module extensions. # Also instead of `http.bzl`, `git.bzl` etc. http_file = …
-
Here is an example python Flask app built with Bazel. See README.md for instructions. Running the app will start a local dev server for Flask and you should be able to direct your browser at it and see the result. Based …
-
We recently became Tesla owners, as our old car unexpectedly gave out. We were expecting to get at least 1 more year out of it. But it was not meant to be. Now that we’re obnoxious Tesla owners, it is only fair that I …
-
Update 2023-08-17: This is now a feature in bazel, see https://github.com/bazelbuild/bazel/issues/18766 for details. It is available starting bazel version 6.3.0. Use additional_compiler_input parameter to cc_library and …
-
Summary The bazel build system has rules available to build C or C++ code from external repositories that use other more “conventional” build tools. By this I mean the usual suspects: GNU autotools, GNU make and cmake. …