Skip to main content

A package manager for FPGA/HDL development: resolve, fetch and assemble IP cores from the LibFPGA registry.

Project description

lfpga

A package manager for FPGA/HDL development. Resolve, fetch and assemble open IP cores from the LibFPGA registry into a source list your simulator or synthesis tool can consume.

The registry is the pypi.org of FPGA IP: curated, ownership-claimed, and toolchain-verified. lfpga is the pip, and its superpower is that every package can carry an earned verification badge (lints clean, synthesizes, testbench passes).

$ lfpga init my-soc
$ lfpga add libfpga
Found libfpga: https://github.com/libfpga/libfpga
  license MIT · verilog · ✓ lint, synth, testbench, formal
$ lfpga add picorv32
$ lfpga install
  libfpga        a4ef4a3fa4ac  1 files  ✓ lint, synth, testbench, formal
  picorv32       e9c4c5b8...   1 files  unverified

Wrote lfpga.lock and build/sources.f (2 source files).

Then point your tool at the generated filelist:

$ verilator --lint-only -f build/sources.f
$ iverilog -o sim.vvp -f build/sources.f
# Vivado: read_verilog -f build/sources.f (via -f)

Why a package manager for FPGA is different

FPGA IP is source, not binaries: there is no ABI and no linking, so lfpga vendors declared HDL files and hands them to the tool of your choice. It does not replace your simulator or synthesizer; it produces the inputs they expect. See the design notes for the full rationale (name collisions, fuzzy versioning, filesets, vendor primitives).

Install

pip install lfpga        # Python 3.11+

Commands

Command What it does
lfpga init [name] Create a libfpga.yaml here
lfpga search <text> Search the registry for cores
lfpga info <name> Show a core's registry metadata
lfpga add <pkg> Add a dependency (name, name@rev, or a git URL)
lfpga install Resolve, pin (lfpga.lock), fetch, and write build/sources.f
lfpga list Show the locked dependencies and their badges
lfpga sources [--format vivado|quartus|verilator] Emit a source list, or a Vivado/Quartus build script
lfpga sim [--tool iverilog|verilator] Run a simulation (deps + your testbench)
lfpga synth [--top M] Synthesize with Yosys and report area
lfpga import <.core|Bender.yml> Import a FuseSoC or Bender project
lfpga publish [repo] List your core in the registry and queue verification

Publish your core

If you maintain an open FPGA core, one command lists it in the LibFPGA registry and queues it for the verification toolchain (Verilator lint, Yosys synth, an Icarus testbench):

$ lfpga publish
Publishing https://github.com/you/your-core to the LibFPGA registry...
✓ Listed as 'your-core'  →  https://libfpga.com/cores/your-core
  Queued for verification: lint, synth, testbench.
  Claim it to prove ownership: https://libfpga.com/cores/your-core/claim

Add the badge to your README:
  [![lfpga](https://libfpga.com/cores/your-core/badge.svg)](https://libfpga.com/cores/your-core)

It reads the libfpga.yaml committed on your default branch, so make sure it is pushed. Badges are always earned by the toolchain, never self-declared.

Keep it fresh in CI

Drop this into .github/workflows/lfpga.yml and every push re-lists your core and refreshes its badge (no secrets needed):

name: LibFPGA
on:
  push:
    branches: [main]
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: libfpga/lfpga@v0.5.0

The manifest (libfpga.yaml)

One file, like Cargo.toml: it both declares your dependencies and (if you publish) describes this repo as a package for the registry.

name: my-soc
dependencies:
  libfpga: "*"                       # latest default branch
  picorv32: { rev: v1.0.3 }          # pin a tag, branch or commit
  libfpga-myhdl: { modules: [lfpga_mac] }   # sub-select from a repo
  private-mac: { git: "https://github.com/acme/mac.git" }

The lockfile (lfpga.lock)

Commit it. Because HDL builds are source-and-elaborate, reproducibility is lockfile-first: it pins the exact commit and the exact build sources, so a build is identical across machines and over time.

Status

Actively developed. Resolution is transitive: each package's own libfpga.yaml dependencies are pulled in, de-duplicated across the graph, and checked for version conflicts (cycle-safe). Plus lfpga search / lfpga info for discovery and lfpga publish to list your own core. It also generates Vivado and Quartus build scripts from the resolved graph (lfpga sources --format vivado|quartus). On the roadmap: invoking the vendor tools directly.

MIT licensed. Part of LibFPGA.

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

lfpga-0.7.0.tar.gz (26.5 kB view details)

Uploaded Source

Built Distribution

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

lfpga-0.7.0-py3-none-any.whl (25.1 kB view details)

Uploaded Python 3

File details

Details for the file lfpga-0.7.0.tar.gz.

File metadata

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

File hashes

Hashes for lfpga-0.7.0.tar.gz
Algorithm Hash digest
SHA256 843f115c07b324ed2b4d5d290ee24c71066934437c8dab8195516c19f097dd38
MD5 26458cce3559fc3dfd15e71c913b5385
BLAKE2b-256 5bec4d71ce433b8f3e2068d9f6c8c5fd650ad00179c4a3dcb96400186e41136e

See more details on using hashes here.

Provenance

The following attestation bundles were made for lfpga-0.7.0.tar.gz:

Publisher: publish.yml on libfpga/lfpga

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

File details

Details for the file lfpga-0.7.0-py3-none-any.whl.

File metadata

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

File hashes

Hashes for lfpga-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f20af682f0842bbed68deb3c61976159b9928d883d25f1b38affdadec5719894
MD5 042ffc7734243d52985eadfd89d782fa
BLAKE2b-256 97e44bc3b092b05b04bd4dcd94c6261608cdf8c6888d02e1f27140ce6f9b8157

See more details on using hashes here.

Provenance

The following attestation bundles were made for lfpga-0.7.0-py3-none-any.whl:

Publisher: publish.yml on libfpga/lfpga

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