Skip to the content
PCBKitNew board
2 layers47.1 × 30.9 mmIndicator module, the printed circuit board in 3D

Indicator module

DDecoene/kransputer

A working computer from a few thousand discrete CMOS transistors — SUBLEQ core, Transputer-style message-passing ring. This repo: the gate-level breadboard PCB modules.

Size
47.1 × 30.9 mm
Copper layers
2
Thickness
1.6 mm
Parts
31
Nets
40
Pads
126
Tracks, vias
0, 0
Pours
1
Routed
Not yet
KiCad
KiCad 10.0 (file 20260206)
Created
6 Sep 2026
Updated
7 Sep 2026

Overview

Indicator module is an open-source printed circuit board by DDecoene, from the DDecoene/kransputer repository on GitHub. It is a 2-layer board of 47.1 × 30.9 mm with 31 parts on 40 nets.

It is built around the AO3400A and D12. Its parts include 12 diodes, 12 transistors, 2 connectors and 1 capacitor.

Main components

2

README

README.md

kransputer

What Kransputer is

Kransputer is a working computer built from a few thousand discrete CMOS transistors — a machine on the scale of an Intel 4004, but made of parts you can hold — designed to grow into a multiprocessor: one core, then a ring of up to eight, passing messages the way INMOS's Transputer did. It exists to be understood and rebuilt, by a person, a class or a hackerspace. Not to be sold.

Why it looks the way it does

One decision forces everything else: CMOS. Almost every discrete-transistor computer ever built is NMOS and burns about a watt standing still. CMOS costs twice the transistors but makes power scale with clock rate instead — turn the clock down and the machine sips. Staying inside a small transistor budget is why the design is stripped to the bone:

  • One instruction — subleq only, so there is no decoder. The instruction set lives in the assembler as macros.
  • A few bits at a time — a serial datapath, so the arithmetic unit is a handful of adders. You pay in clock cycles, which are cheap.
  • No bus — memory, display and input all speak SPI over four wires. No address bus, no data bus.

On this machine, talking to the core next door is cheaper than reading your own memory. That is why the ring is the point, not an afterthought.

How it gets built — from the ground up

The architecture is settled on paper: a SUBLEQ core with a serial datapath and SPI links, meant to grow into a message-passing ring. What is deliberate is the direction of the work. Instead of proving the whole machine on an FPGA before touching a soldering iron, Kransputer is built upward from real gates, one module at a time.

  1. Gates — small PCBs, each a fistful of MOSFETs forming one logic function (NAND, NOR, NOT …), that plug into a breadboard and share a common bus. This is the layer built so far.
  2. Blocks — those gates wired into the units the design calls for: the serial adder that is the whole ALU, the registers, the subleq sequencer and bit counter, the SPI interface to memory, the four-wire link to the next core. Each block is first modelled in structural Verilog — gate for gate, built from the same NAND/NOR/NOT cells as the boards — and checked in simulation, then built physically on breadboards.
  3. A core — one complete processor, assembled from the blocks.
  4. A ring — the core replicated and connected: two, then four, then eight, blocking on the links for synchronisation.

The structural model is the reference: the same stimulus into the simulation and into the breadboard must give the same result, or the block is wrong.

Status

The gate boards are drawn but not yet routed — schematics and rough placement are done, copper is not. Work right now is on the first blocks in structural Verilog, which land here soon. Once those hold up in simulation the boards get routed and finished for a first self-ordered run, with build notes and other material alongside.

This repository

Discrete-logic building blocks for the kransputer — the Gates layer above. Each module is a small PCB that plugs into a breadboard on two opposite edge headers carrying an identical 16-pin pass-through bus, so modules can sit side by side across one or more breadboards and be wired together into larger logic.

Boards

TARGETBoard
nand4x discrete static-CMOS 2-input NAND
nor4x discrete static-CMOS 2-input NOR
not6x discrete static-CMOS inverter
indicator12-channel buffered bus LED indicator

Logic FETs are AO3400A (N-channel) / AO3401A (P-channel) in SOT-23.

The logic boards carry no indicator parts. Every node is on the bus; the indicator board buffers each signal with a single AO3400A in common source (its gate is high-impedance, so the logic net is not loaded) that sinks an LED fed from the indicator board's own VDD rail. LED lit = logic 1. Watching the machine therefore does not sag the logic levels.

Bus pinout

Both edge headers (J1, J2) carry the same 16 pins, wired 1:1, so any signal is reachable from either edge. Framing is fixed: pin 1 = VDD, pin 2 = GND, pins 3–14 carry the 12 signal nets the board drives, pins 15/16 are the edge-to-edge spares (BUS_X, BUS_Y).

J1/J2 are stacking headers: male tails point down into the breadboard, female sockets face up so the indicator shield can plug onto the same 16 pins.

Signal nets per board (bus pins 3–14)

Pinnandnornotindicator
3NAND_1_ANOR_1_ANOT_1_INSIG1
4NAND_1_BNOR_1_BNOT_1_OUTSIG2
5NAND_1_YNOR_1_YNOT_2_INSIG3
6NAND_2_ANOR_2_ANOT_2_OUTSIG4
7NAND_2_BNOR_2_BNOT_3_INSIG5
8NAND_2_YNOR_2_YNOT_3_OUTSIG6
9NAND_3_ANOR_3_ANOT_4_INSIG7
10NAND_3_BNOR_3_BNOT_4_OUTSIG8
11NAND_3_YNOR_3_YNOT_5_INSIG9
12NAND_4_ANOR_4_ANOT_5_OUTSIG10
13NAND_4_BNOR_4_BNOT_6_INSIG11
14NAND_4_YNOR_4_YNOT_6_OUTSIG12

The bus is positional: J1 pin k ≡ J2 pin k on every board. The indicator shield taps pins 3–14 as SIG1..SIG12 and shows whatever a neighbouring board drives there.

Supply: 5 V on the bus. The two header rows are 0.9" apart (row a to row j of one breadboard); columns b–e and f–i stay free for patch wires.

Build

bash
python3 -m venv venv
./venv/bin/pip install -r requirements.txt

./venv/bin/python circuit.py             # writes every <target>_module.net
./venv/bin/python circuit.py nand        # or just one

kicad_env.py finds the KiCad symbol libraries at the macOS bundle path (/Applications/KiCad/KiCad.app/...). On Linux or Windows, set the KICAD*_SYMBOL_DIR / KICAD*_FOOTPRINT_DIR environment variables to your install's library paths before running, or adjust kicad_env.py.

  1. Turn the netlist into a board. Either open a new PCB project nand_module/ in KiCad and "Update PCB from Netlist", or run kinet2pcb headless (needs skidl, kinparse and pcbnew on the same Python — i.e. installed into KiCad's bundled Python, since pcbnew is not in the venv):
    bash
    kinet2pcb -i nand_module.net -o nand_module/nand_module.kicad_pcb -w --overwrite
  2. Rough auto-placement — run from the folder that contains nand_module/, using KiCad's bundled Python:
    bash
    /Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/bin/python3 \
        place.py nand
    place.py positions J1/J2 on opposite 0.9" edges, clusters each gate between them, draws a tight Edge.Cuts rectangle and pours a B.Cu GND zone. Pass an explicit .kicad_pcb path as a second argument to place a board elsewhere.
  3. Reopen in KiCad, nudge, route. Re-fill the GND zone. Run DRC.
  4. Plot Gerbers.

Repeat with nor, not, and indicator (each is its own KiCad project in its own <target>_module/ folder). nand_module/, nor_module/, not_module/ and indicator_module/ are checked in.

Fan-out

A discrete gate output driving other gate inputs is limited by speed, not current (CMOS inputs are capacitive) — fine at this machine's speeds. One indicator-board channel adds roughly the AO3400A gate capacitance to the net it watches; one indicator board on the bus is negligible.

Tests

bash
./venv/bin/pytest

The placement integration test is skipped unless kinet2pcb can import pcbnew (it cannot from the venv). place.py uses fixed, hand-computed coordinates per board type, so its output is deterministic and easy to eyeball in KiCad.

Layout

  • circuit.py — SKiDL netlist generator (all boards, no arg = build every one)
  • place.py — pcbnew layout: exact positions per board type, Edge.Cuts, GND pour
  • kicad_env.py— points SKiDL at the bundled KiCad libraries on macOS
  • SYMBOLS.md — resolved KiCad symbols (AO3400A/AO3401A, LED, R array, header)
  • tests/ — SKiDL-netlist topology checks per board + CLI + place integration

Licence

PolyForm Noncommercial License 1.0.0. Build it, study it, modify it, teach with it, and contribute — freely, for any noncommercial purpose. Selling kits, boards, or hardware based on this work is reserved to the maintainer; see COMMERCIAL.md. Contribution terms are in CONTRIBUTING.md.

Parts

31
QtyValueFootprintReferences
12AO3400APackage_TO_SOT_SMD:SOT-23Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10, Q11, Q12
41kResistor_SMD:R_Array_Convex_4x0603RN1, RN2, RN3, RN4
2BUS_STACK_1x16Connector_PinHeader_2.54mm:PinHeader_1x16_P2.54mm_VerticalJ1, J2
11uCapacitor_SMD:C_0805_2012MetricC1
1D1LED_SMD:LED_0805_2012MetricD1
1D10LED_SMD:LED_0805_2012MetricD10
1D11LED_SMD:LED_0805_2012MetricD11
1D12LED_SMD:LED_0805_2012MetricD12
1D2LED_SMD:LED_0805_2012MetricD2
1D3LED_SMD:LED_0805_2012MetricD3
1D4LED_SMD:LED_0805_2012MetricD4
1D5LED_SMD:LED_0805_2012MetricD5
1D6LED_SMD:LED_0805_2012MetricD6
1D7LED_SMD:LED_0805_2012MetricD7
1D8LED_SMD:LED_0805_2012MetricD8
1D9LED_SMD:LED_0805_2012MetricD9

Questions

How big is the Indicator module PCB?

It measures 47.1 × 30.9 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Indicator module use?

31 parts, built around the AO3400A and D12. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Indicator module KiCad files?

From the DDecoene/kransputer repository on GitHub, at the commit this page was made from: the board is indicator_module/indicator_module.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the Indicator module design in my own project?

Its repository states no licence, so its author keeps all rights: ask DDecoene before reusing the design.

More from DDecoene/kransputer

2
  • 2 layers47.1 × 30.9 mmNor module, the printed circuit board in 3D

    Nor module

    DDecoene/kransputer

    A working computer from a few thousand discrete CMOS transistors — SUBLEQ core, Transputer-style message-passing ring. This repo: the gate-level breadboard PCB modules.

    19 parts
  • 2 layers47.1 × 30.9 mmNot module, the printed circuit board in 3D

    Not module

    DDecoene/kransputer

    A working computer from a few thousand discrete CMOS transistors — SUBLEQ core, Transputer-style message-passing ring. This repo: the gate-level breadboard PCB modules.

    15 parts

Similar boards

  • 2 layers72 × 90 mmWind breakout, the printed circuit board in 3D

    Wind breakout

    idlehandsdev/wind_breakout

    Breakout board for all Adafruit Feather series boards.

    58 parts14
  • 2 layers285.1 × 94.3 mmDK60, the printed circuit board in 3D

    DK60

    Dbroqua/DK60

    [MOVED] Mechanical keyboard based on HHKB layout

    171 parts3GPL-3.0
  • 2 layers140.4 × 111.9 mmSOR Hydrogen, the printed circuit board in 3D

    SOR Hydrogen

    samienr/SOR-Hydrogen

    Wireless Split Ergonomic Keyboard

    66 parts3MIT
  • 2 layers99.8 × 100.8 mmLed board, the printed circuit board in 3D

    Led board

    svpetry/Mini8086

    A small 8086 computer system.

    121 parts3
  • 4 layers100 × 43.3 mmPdp-11-colour, the printed circuit board in 3D

    Pdp-11-colour

    ashlin4010/pdp-11.40-mini-panel

    Included in this repository are the PCB files to make a miniature PDP-11/40 front panel. The board uses a XIAO nrf52840 dev board. No software has been written yet.

    96 parts2MIT
  • 2 layers242.6 × 154.9 mmPlaca, the printed circuit board in 3D

    Placa

    devfabiosilva/embeddedIoT

    My old project for IoT and automation 8 bit system

    194 parts2MIT
  • 2 layersPCBKeys, the printed circuit board in 3D

    PCBKeys

    0x544D/PCBKeys

    Bare essential PCB keyboard

    187 parts