Skip to main content

SHDL hardware-description toolchain: the PySHDL user-facing driver, the SHDL→Base SHDL flattener, the Base SHDL→C compiler (shdlc), the shdl project/package CLI, and the conformance suite.

Project description

SHDL

SHDL (Simple Hardware Description Language) is an educational, gate-level hardware description language and simulation toolchain. Its founding principle is fidelity: circuits simulate gate by gate, one propagation level per cycle (the unit-delay model), and no tool in the chain is allowed to collapse or shortcut that structure. You describe hardware out of AND/OR/NOT/XOR; you watch signals ripple through it.

The two languages

SHDL is the authoring language: reusable hierarchical components, multi-bit ports, compile-time parameters, generators and conditionals for repetitive structure, bit slices and concatenation, named constants, optional initial state, and imports. Specified in docs/shdl.md.

Base SHDL is the intermediate representation every tool consumes: a flat netlist of single-bit wires over exactly six primitives — AND, OR, NOT, XOR, __VCC__, __GND__ — plus a JSON metadata section (multi-bit port groups, hierarchy, source maps, timing, constants, init seeds). Specified in docs/base_shdl.md.

Pipeline

 .shdl source
      │
      ▼
  Flattener        six phases: strip, monomorphize, expand generators,
      │            expand slices, materialize constants, flatten hierarchy
      ▼
  Base SHDL        single-bit primitive netlist + JSON metadata
      │
      ▼
  SHDLC            generates C (two-buffer compute/commit cycle),
      │            builds a shared library with a stable ABI
      ▼
  libcircuit       reset() / poke() / peek() / step()
                   (+ step_settle() / run_batch() throughput paths)

Quickstart

Requires Python ≥ 3.14 and a C compiler (clang or gcc).

Install the released package from PyPI to get the SHDL Python package and the shdl / shdlc / shdl-flatten / shdl-conformance CLIs:

pip install PySHDL          # or: uv add PySHDL

Or work from a clone with uv:

uv sync

# Flatten SHDL to Base SHDL (inspect the IR)
uv run shdl-flatten examples/fullAdder.shdl

# Compile straight from SHDL source to a shared library
uv run shdlc examples/fullAdder.shdl -o fullAdder.dylib

Drive a circuit from Python with PySHDL — one class, Circuit, runs the whole pipeline (flatten → compile → build → load) in-process and exposes poke/peek/step plus dict access and a context manager:

from SHDL import Circuit

with Circuit("examples/adder8.shdl") as c:
    c["A"] = 100            # dict-style poke; bit 0 is the LSB
    c["B"] = 55
    c.settle()             # advance every gate level (combinational depth)
    print(c["Sum"])         # 155

See docs/pyshdl.md for the full guide, and examples/interacting.py for a runnable walkthrough (uv run python examples/interacting.py). The underlying ABI is callable from any language; see docs/shdlc_goals.md §3 for the full contract (masking, lazy evaluation, init-seeded power-on state).

Projects & packages: the shdl CLI

The shdl command (installed with the package) manages whole projects and installs circuit libraries from Circuit Circus, the SHDL package index:

shdl new counter && cd counter   # scaffold shdl.toml, src/, tests/ — it compiles
shdl add arith                   # vendor a package (+ its deps) into shdl_modules/
shdl build && shdl test          # flatten + compile, then run the test vectors
shdl run                         # poke/peek/step REPL over the live circuit
use arith::{RippleAdder};        # vendored packages are directly importable

Dependencies are pinned in a committed shdl.lock (builds never touch the network), and shdl publish walks you through contributing a package back. See docs/shdl_cli.md.

Repository layout

Path What it is
flattener/ SHDL → Base SHDL (lexer, parser, six lowering phases, metadata, HighEval reference interpreter)
shdlc/ Base SHDL → C → shared library (model, codegen, cc driver, BaseEval reference interpreter, ctypes harness)
SHDL/ The user-facing Python driver: Circuit runs the pipeline in-process and exposes poke/peek/step (from SHDL import Circuit)
conformance/ Frozen corpus of cases with golden Base SHDL + cycle-by-cycle traces, and its runner
tests/ flattener/, compiler/, and cpu/ suites (~1640 tests)
examples/ Small circuits (adders, latches, mux, ALU) and a complete, verified 16-bit CPU (examples/CPU/)
docs/ The normative specs and the verification map
scripts/ Maintenance tooling (conformance corpus builder)

The flattener and shdlc are deliberately decoupled: Base SHDL text is the only contract between them, and each side carries its own independent reference interpreter so the two can cross-check each other.

Testing

uv run pytest                    # full suite
uv run shdl-conformance run      # golden corpus: flatten + compile + trace lockstep

The suite covers per-phase units, per-raise-site diagnostics (every error's exact position is pinned), differential fuzzing against two independent oracles, byte-determinism, ABI contracts under ASAN/UBSAN, and instruction- level lockstep of the example CPU against a golden model.

Documentation

Status

The flattener, the SHDLC compiler (release ABI), the conformance suite, PySHDL — the user-facing Python driver (from SHDL import Circuit) — and the shdl CLI (projects + the Circuit Circus package registry) are complete and green. Next up are the debug build and the SHDB debugger — see the build sequence in the charter.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyshdl-1.1.0.tar.gz (838.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyshdl-1.1.0-py3-none-any.whl (311.3 kB view details)

Uploaded Python 3

File details

Details for the file pyshdl-1.1.0.tar.gz.

File metadata

  • Download URL: pyshdl-1.1.0.tar.gz
  • Upload date:
  • Size: 838.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pyshdl-1.1.0.tar.gz
Algorithm Hash digest
SHA256 f2089e158990a5f53ccc2e43d71e4ed3d3e83c2d7ccff8b9f12596a275dde713
MD5 5d24954adba8da5504db8e6b4446cb84
BLAKE2b-256 4f71705cc670785c829713b15c1ca3abf33fd00b4e00a019e0ea836ec004c00d

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyshdl-1.1.0.tar.gz:

Publisher: publish.yml on rafa-rrayes/SHDL

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyshdl-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: pyshdl-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 311.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pyshdl-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6a66517616e8426d9ce9bcbea469df24ee0b714c91b08b6bdb7d836e93e44cd4
MD5 e8ea029bba45a26fbb74d18dd02add5b
BLAKE2b-256 15125a3e29536e37b1590e3b04c2e560b82adf04bcc6af28b764296c7c8e930c

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyshdl-1.1.0-py3-none-any.whl:

Publisher: publish.yml on rafa-rrayes/SHDL

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page