Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

ohsh: a humble HDL source handler

CI Integrations Docs PyPI Python License

ohsh is a humble command-line tool that works out which HDL source files (SystemVerilog and VHDL) a design needs and in what order to compile them. Each module gets a manifest.json that lists its sources and the modules it depends on. ohsh reads the manifests and writes plain .src file lists, one per library and language.

ohsh works alongside build flows such as hog, Vivado, Quartus, Questa, cocotb and VUnit. It does not run simulators, manage tool projects or parse your HDL.

Features

  • Auto-discovers HDL module manifests anywhere under a project tree.
  • Resolves module dependencies recursively, across libraries.
  • Detects circular dependencies and exits with an error naming the cycle.
  • Emits ordered, per-library source lists for SystemVerilog and VHDL.
  • Writes the order to compile the libraries in.
  • Checks that every listed source file exists.
  • Creates, fixes and checks manifests by reading the HDL sources (best effort).
  • Pure Python with no runtime dependencies.

Installation

pip install ohsh

Or from a clone, which needs Python 3.9 or newer:

git clone https://github.com/logvik-org/ohsh.git
cd ohsh
pip install .

Usage

The Getting started guide walks through a small project from install to compiled sources.

ohsh [OPTIONS] MODULE

ohsh will:

  1. Search for all manifest*.json files starting from --top-dir.
  2. Resolve dependencies for MODULE (the top-level).
  3. Generate ordered SystemVerilog and VHDL source lists per library.
  4. Write them as <lib>_systemverilog.src / <lib>_vhdl.src in the output directory.
  5. Write the library compile order to libraries.src.

Options

Option Description Default
-t, --top-dir Project top-level directory, the base for manifest discovery. cwd
-w, --work Library for the top module, which work in its manifest refers to. work
-o, --output Directory for the .src lists and libraries.src, created if missing. cwd
--relative-to DIR Write the source paths relative to DIR. absolute
--format FORMAT plain lists, or the list files of a hog project. plain
-v, --verbose Show progress (-v) or debug details (-vv). quiet
--log-file PATH Also write logs to a file (no log file is written by default). none
--version Print version and exit.
-h, --help Show help and exit.

Manifest actions

These options work on the manifests under --top-dir instead of writing source lists. They read the sources to find which design units each file declares and uses. --fix and --check work on all modules, or on MODULE and its dependencies when one is given. See Create, fix and check manifests.

Option Description Default
--create Write a manifest for every source directory that has none.
--fix Add missing dependencies to the manifests and sort their sources.
--check Report manifests that --fix would change, exit 104 if there are any.
--exclude PATTERN With --create, skip directories matching this glob pattern. none
-y, --yes With --create, write every manifest without asking. ask
--no-deps With --fix or --check and MODULE, leave its dependencies alone.

Example

Give each module a manifest.json next to its sources:

project/
├── accumulator/
│   ├── accumulator.vhd
│   └── manifest.json
└── adder/
    ├── adder.vhd
    └── manifest.json
{
  "module": "accumulator",
  "sources": ["accumulator.vhd"],
  "dependencies": {
    "work": ["adder"]
  }
}
{
  "module": "adder",
  "sources": ["adder.vhd"]
}

Then run ohsh in the project directory with the top module's name:

cd project
ohsh accumulator

It writes work_vhdl.src with the sources in compile order:

/path/to/project/adder/adder.vhd
/path/to/project/accumulator/accumulator.vhd

and libraries.src with the libraries to compile (here only work). Modules with SystemVerilog sources go to <lib>_systemverilog.src in the same way. See the manifest file format for dependencies across libraries.

libraries.src lists the library names, one per line, in the order to compile them: each library comes after the libraries it uses. Compile the libraries in this order rather than hard-coding it. If libraries depend on each other in a loop (a module in libA uses libB and a module in libB uses libA), no such order exists. ohsh then logs a warning and writes a best-effort order, which works for tools that sort files themselves (such as Vivado or Quartus projects) but may fail with tools that compile one library at a time.

Documentation

The full documentation is at ohsh.readthedocs.io:

License

Licensed under the Apache License 2.0. See LICENSE and NOTICE.

Author

Ola Groettvik - GitHub

AI assistance

ohsh started as a hand-written script. Most later development was done with AI assistance, with all changes reviewed and tested by the author.

Metadata

Release files for ohsh 0.4.0rc1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ohsh 0.4.0rc1
File Size Uploaded
ohsh-0.4.0rc1.tar.gz 26.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ohsh 0.4.0rc1
File Interpreter ABI Platform
ohsh-0.4.0rc1-py3-none-any.whl Python 3 none any Details

Total release size: 53.7 kB

Release files / ohsh-0.4.0rc1.tar.gz

Download URL ohsh-0.4.0rc1.tar.gz
Size 26.7 kB
Tags Source
SHA-256 checksum
How to use checksums
7002e0ed19466798e00712f4b2cb29e414e33b5c050ff92f5f644a1b4521de31
BLAKE2b-256 checksum
How to use checksums
f288ff0411d73ea8716e46aa6c995c7dc9e3335b84b85b51ab2b4af4e3451db8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release files / ohsh-0.4.0rc1-py3-none-any.whl

Download URL ohsh-0.4.0rc1-py3-none-any.whl
Size 27.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cdc03519d0c1ded8ae2c0f4994efb8f458b907c2428064a7b1314ab789775d9c
BLAKE2b-256 checksum
How to use checksums
dc0fd0a1725d976d1ad5617427609f2d3b3794104db3f93c38fa3971952be455
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release history Release notifications | RSS feed

0.5.0

2 release files

0.4.0

2 release files

This release

0.4.0rc1 This release

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page