Coffee Space


PCB Design Tools

Preview Image

TL;DR: I use Kicad, skidl and freerouting to aid in my PCB design process.

Disclaimer: I don’t claim to be an expert. I’m just a programmer that found a process that works for me.

The functionality offered is (beyond Kicad’s normal functionality):


In reply to a post on HackerNews titled “The tooling ecosystem that adds joy to KiCad”, I commented regarding my own setup:

The best thing to happen to KiCad was skidl [1] paired with freerouting [2]. You can spin a board in so little time it’s insane. In the future I will be looking to automate even the parts placement too.

P.S. If there is interest I will look to document my workflow.



At the time of writing this, there were 16 upvotes and some requests to discuss in more detail the process I use in this setup. The intention of this article is to address this and previous requests regarding this.


The heart of the process is a Makefile. I’m a Linux user and quite like using a Makefile for basic stuff, if nothing else it provides autocompletion.

Without further delay, here it is:

0001 ROOT = $(shell eval pwd)
0003 .PHONY: all
0005 all: clean
0007 # -- Installing --
0009 setup:
0010     # Build circuit programmatically
0011     python3 -m pip install skidl
0012     # PCB layout
0013     sudo apt install --no-install-recommends kicad kicad-footprints kicad-libraries kicad-symbols kicad-templates
0014     # Auto-route the PCB
0015     curl -fsSL -o bin/
0016     unzip -d bin/ bin/
0018 # -- PCB --
0020 pcb_circuit:
0021     ( \
0022       export KICAD_SYMBOL_DIR="/usr/share/kicad/symbols"; \
0023       export KICAD_TEMPLATE_DIR="/usr/share/kicad/template"; \
0024       export KISYSMOD="/usr/share/kicad/footprints"; \
0025       cd pcb; python3; \
0026     )
0028 pcb_layout:
0029     ( \
0030       export KICAD_SYMBOL_DIR="/usr/share/kicad/symbols"; \
0031       export KICAD_TEMPLATE_DIR="/usr/share/kicad/template"; \
0032       export KISYSMOD="/usr/share/kicad/footprints"; \
0033       cd pcb; pcbnew board.kicad_pcb; \
0034     )
0036 pcb_route:
0037     java -jar bin/freerouting-1.4.4-linux-x64/lib/app/freerouting-executable.jar -de pcb/board.dsn -do pcb/ -mp 1000
0039 pcb_gerber:
0040     # TODO: Should version the ZIP file.
0041     zip -r pcb/ pcb/*.gbr pcb/*.drl
0042     rm pcb/*.gbr pcb/*.drl
0044 # -- Tools --
0046 skidl:
0047     ( \
0048       export KICAD_SYMBOL_DIR="/usr/share/kicad/symbols"; \
0049       export KICAD_TEMPLATE_DIR="/usr/share/kicad/template"; \
0050       export KISYSMOD="/usr/share/kicad/footprints"; \
0051       cd pcb; python3 -i; \
0052     )

The commands do the following:


The following is my internal documentation on how to perform this process:

PCB Description

The PCB is designed in skidl, a programmatically defined schematic tool. Our controller can be located at pcb/ Documentation for skidl can found online1. Additionally there is a great introduction video explaining the benefits of using the library2.

Note that it is useful to have named nets as these can be set to have different trace properties. For example, you could have a thicker trace for a power circuit.

Once you have modified the controller, you can check it and generate a netlist by running make pcb_circuit. Errors produced by the ERC process need to be fixed and warnings should be ideally avoided.

Kicad Basic PCB

We now want to utilize pcbnew to do the basic board layout, which can be run using make pcb_layout.

To import our netlist, go to File > Import > Netlist… (this may take a while depending on your machine). We want to load our netlist, so we open the file pcb/ Then select Update PCB to add the parts. NOTE: It likes to add the parts off the screen sometimes.

Now we can draw a PCB outline (graphic line tool on the “Edge.Cuts” layer) and place the components inside - but don’t bother with the routing process.

We now want to delete all existing traces by doing Edit > Global Deletions… an then select “Tracks & vias”. This then allows the autoroute to fully solve all tracks automatically. Lastly we can export Specctra DSN by going to File > Export > Specctra DSN…. Save this as pcb/control.dsn.

Before performing the DSN, it is good to delete the existing routes, otherwise the auto-router will work around these.


To do the auto-routing, we simply run make pcb_route. A GUI will appear and you can watch it solve all of your problems.


Now we can go back to pcbnew and go to File > Import > Specctra Session… and open pcb/ You should now see the traces applied to the PCB.

To get a rough idea of what the finished PCB will look like, use View > 3D Viewer.

As you can see, I’ve also interspersed a few additional details that are useful to know.


I believe the real power here is circuit re-use. Imagine for example importing the skidl description for a controller and just being able to re-use it in lots of circuits, knowing it is well tested.

Of course, auto-routing is insanely cool too. With the right rules, there is no reason why any design couldn’t be generated.


If there is interest in this process, I can look towards doing a step-by-step example, perhaps even as a video.