XedaHQ/xeda
XedaHQ/xeda has 47 GitHub stars and 5 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-09 22:58 UTC. Last push 2026-11-06.
Cross EDA Abstraction and Automation
Measured star growth
- in 24h
- 0
- in 7 days
- Collecting history
- in 15 days
- Collecting history
- in 1 month
- Collecting history
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
README.md
OriginalXeda automates simulation, synthesis and implementation with commercial and open-source EDA tools. One declarative design file drives all of them: you switch tools by naming another flow.
Read the Xeda documentation for the complete references of the design file, the flows and the run directories.
Installation
Xeda supports every Python release series that has not reached end of life. Currently, that means Python 3.11 through 3.15. Xeda drives EDA tools but does not install them. The tools that a flow needs must be available locally, in Docker, or on the remote host.
For command-line use, install Xeda in an isolated uv tool
environment:
uv tool install --upgrade xeda
pipx does the same:
pipx install --force xeda
To import Xeda as a Python library, install it in the virtual environment of your project:
python3 -m pip install -U xeda
Check the installation with xeda --version.
Supported platforms
- Python 3.11 through 3.15.
- Linux x86_64: CI runs the full test suite. Some open-source flows run against the real tools; the verification table in the flow documentation lists which.
- macOS: CI runs only the tests of operating-system-sensitive code (processes, locks, files, the remote client). It installs no EDA tool.
- Linux arm64: not tested in CI.
- Native Windows: not supported. Use WSL.
The documentation has a table of the flows that CI verifies against the real tool (section "Verification of the built-in flows" of the Flows page).
Usage
Design file
A design file says what to build: the sources in compilation order, the top module, parameters, the clock port and, optionally, a testbench. The settings of one tool go in a section for its flow. Paths are relative to the design file. YAML is the recommended format. TOML and JSON also work.
This is examples/vhdl/sqrt/sqrt.yaml:
name: sqrt
description: Iterative computation of the square root of an integer
language.vhdl.standard: 2008
rtl:
sources:
- "sqrt.vhdl"
top: sqrt
clock.port: clk
parameters.G_IN_WIDTH: 32
tb:
sources:
- "tb_sqrt.py"
flows:
yosys_fpga:
fpga.part: xc7a100tftg256-2L
clock.freq: 100 MHz
vivado_synth:
fpga.part: xc7a100tftg256-2L
clock.period: 5 ns
vivado_alt_synth:
fpga.part: xc7a100tftg256-2L
synth.strategy: ExtraTiming
impl.strategy: ExtraTimingCongestion
clock.period: 5 ns
A dotted key stands for a nested table: clock.period: 5 ns is a clock table with the key
period. The command line uses the same keys, for example -s vivado_synth.clock.period=4.5ns.
A .py testbench source makes the testbench a cocotb one. The clock period is a setting of each
flow, because it constrains one build.
Run xeda design-schema for the JSON Schema of a design file. YAML uses the 1.2 core schema. It
rejects duplicate keys and keys that are not text. Quote values that must stay text, such as
"010", "0x1F" and "1e3". The words yes, no, on and off are text. A boolean setting
accepts only true or false, so debug: yes and debug: 1 are errors.
Running flows
The example files come from a clone of the repository (git clone https://github.com/XedaHQ/xeda);
the wheel has no examples/. The cocotb testbench of this example also needs cocotb and
cocolight in the environment that runs Xeda. The wheel installs neither, and cocolight comes
from Git:
python3 -m pip install "cocotb~=2.1.0" "cocolight @ git+https://github.com/kammoh/cocolight.git"
# or, for a `uv tool` install:
uv tool install --upgrade xeda --with "cocotb~=2.1.0" \
--with "cocolight @ git+https://github.com/kammoh/cocolight.git"
The same design file serves every flow:
xeda run ghdl_sim examples/vhdl/sqrt/sqrt.yaml # simulate with GHDL and run the cocotb tests
xeda run nvc examples/vhdl/sqrt/sqrt.yaml # the same design and testbench with NVC
xeda run vivado_synth examples/vhdl/sqrt/sqrt.yaml # synthesize and implement with Vivado
xeda run vivado_synth examples/vhdl/sqrt/sqrt.yaml -s vivado_synth.clock.period=4.5ns # change one setting
xeda dse vivado_synth examples/vhdl/sqrt/sqrt.yaml --initial-frequency-low "100 MHz" --initial-frequency-high "300 MHz" # search for the highest clock frequency
A flow whose inputs and outputs are declared can follow another flow. A chain joins them with
+, and --dry-run shows the plan without starting a tool. This chain builds the bitstream of
the ULX3S example, in examples/boards/ulx3s/blinky, and programs no hardware:
xeda run yosys_fpga+nextpnr+fpga_pack examples/boards/ulx3s/blinky/blinky.xeda.yaml --dry-run
Flow names and setting names are exact: a second spelling or an unknown name is an error that suggests the right one.
Remote runs
--remote HOST runs the whole request on a Linux machine over SSH. HOST is any destination that
ssh accepts. The host needs no Xeda: the first run installs it, and the results come back to your
run root.
xeda run vivado_synth examples/vhdl/sqrt/sqrt.yaml --remote <host>
See the remote runs page for the setup,
xeda remote check and runs that keep going after you disconnect.
Finding out what is available
xeda list-flows # every flow: category, what it takes and makes, what follows it
xeda list-settings vivado_synth # every setting of a flow, with type, default and meaning
xeda list-results vivado_synth # the metrics that flow writes, with types and units
xeda design-schema # JSON Schema of a design file
Scripting and coding agents
The query commands accept --json. So do run, dse and scrub: they then write tool output
and logs to stderr, and stdout holds one JSON document:
xeda run vivado_synth examples/vhdl/sqrt/sqrt.yaml --json | jq '.nodes[-1].record.metrics.fmax'
Xeda also ships a skill for coding agents. Its flow catalog comes from the installed version:
xeda skill install # writes ./.claude/skills/xeda/
Flows
A flow is a named sequence of steps that one or more tools perform. A flow can need the output
of another flow, its producer, and Xeda runs the producer first. For example, nextpnr needs the
netlist of yosys_fpga, so it runs yosys_fpga before place and route. A flow runs again only
when its sources, settings, tools or outputs changed since its last successful run. Results,
generated scripts, reports and the effective settings are in the run root, xeda_run/.
Supported Tools and Flows
- AMD-Xilinx Vivado Design Suite
vivado_synth: FPGA synthesis and implementation in project mode, run in batchvivado_alt_synth: the same in non-project mode, runningsynth_designthroughroute_designfrom a generated TCL scriptvivado_impl: place and route of an EDIF netlist in non-project mode, with no synthesis: the netlistyosys_fpgawrites for a Xilinx device (yosys_fpga+vivado_impl), or an EDIF sourcevivado_project: creates a Vivado project for the design, to work on in Vivado (gui: trueopens it)vivado_sim: functional simulation of an RTL design with the Vivado simulator (xsim)vivado_postsynth_sim: simulation of the testbench on the netlist thatvivado_synthwrites, optionally with timing from its SDF filevivado_power: post-implementation power estimation from the real switching activity of a timing-annotated netlist simulation, rather than a vectorless estimate
- AMD-Xilinx ISE Design Suite
ise_synth: FPGA synthesis and implementation for older Xilinx device families
- Bluespec compiler (bsc 2026.07.1 or newer), for designs in
Bluespec SystemVerilog (BSV) and Bluespec Classic (BH)
bsc: compiles the design to Verilog, and collects the Verilog files that its top module needs (including the bsc library modules it instantiates) for a later synthesis or simulation flowbsc_sim: compiles a Bluespec testbench and simulates it with Bluesim, or with Verilator, Icarus Verilog or another Verilog simulator through bsc's own Verilog link step
- GHDL VHDL simulator
ghdl_sim: VHDL simulationghdl_synth: VHDL elaboration throughghdl --synth; for general-purpose synthesis preferyosys, which handles VHDL, Verilog and mixed-language designs
- Intel Quartus Prime (Lite/Pro Editions)
quartus: FPGA synthesis and implementation flow
- Lattice Diamond
diamond_synth: synthesis, place & route and bitstream generation for Lattice devices
- Icarus Verilog: open-source Verilog/SystemVerilog
simulator
iverilog: compiles the design and simulates it. It supports cocotb testbenches, and VCD and FST waveforms
- NVC VHDL simulator
nvc: VHDL simulation
- Siemens (Mentor) ModelSim
modelsim: RTL and gate-level netlist simulation of VHDL, Verilog, SystemVerilog and mixed-language designs, with optional SDF timing annotation
- nextpnr portable FPGA place and route tool
nextpnr: places and routes the netlist thatyosys_fpgawrites, and reports achieved frequency, slack and utilization. The tested device families are Lattice ECP5 and iCE40, and Xilinx 7-series through nextpnr-himbaechel of openXC7. Nexus is best-effort. Families other than ECP5 and 7-series report the count of each bel type in a table of cell typesfpga_pack: packs the routed configuration thatnextpnrrecords (or a configuration source of the matching type) into a bitstream, with ecppack, icepack or fpga-as of openXC7. It programs nothing
- openFPGALoader: open-source and multi-platform
universal utility for programming FPGAs, compatible with many boards, cables and FPGAs from
major manufacturers
openfpgaloader: loads a bitstream onto the board: the one thatfpga_packbuilds afteryosys_fpgaandnextpnr, or a bitstream source. It is the only flow that touches hardware
- OpenROAD open-source ASIC place and route
openroad_place: floorplan, power grid, placement and timing repair of the gate-level netlist thatyosyswrites for a standard-cell platform, with the constraints of the design and its clocks. It writes the placed database and its SDC fileopenroad_cts: clock tree synthesis, legalization and timing repair of the placed database. It writes the database and its SDC file, with propagated clocksopenroad_grt: pin access, global route, repair of the design, the timing and the antenna violations. It writes the database, its SDC file and the route guidesopenroad: detailed route, antenna repair and filler cells of the globally routed database, then the final database, SDC file, DEF file, netlist and parasitics, with the timing, power and IR drop report. It checks timing, design rule violations and antenna violations. It can also merge the GDSII layout with KLayout and save images of the design
- SymbiYosys formal property checker, with Verilog and
SystemVerilog through slang and VHDL through the GHDL Yosys plugin
sby: checks one RTL design with a bounded model check, an unbounded proof or a cover search, with the top module that the user names. The user's harness owns the clocks, the reset, the initial state and the assumptions. The flow always runs and never reuses a formal result. It refuses a design that mixes VHDL with Verilog or SystemVerilog
- xezim: open-source Verilog/SystemVerilog simulator in Rust
xezim: compiles and simulates in one command. It supports cocotb testbenches, UVM, SDF timing annotation, code coverage, and VCD and FST waveforms. Upstream ships no binaries: build it from source with Cargo
- Synopsys Design Compiler
dc: ASIC logic synthesis
- Synopsys VCS simulator
vcs: Verilog/SystemVerilog simulation
- Verilator: open-source Verilog/SystemVerilog simulator
verilator: compiles the design to C++ or SystemC and builds a native executable. It supports cocotb testbenches, plain C++ or SystemC harnesses, and VCD, FST and SAIF waveform tracing
- Yosys Open SYnthesis Suite
yosys: ASIC and generic gate/LUT synthesisyosys_fpga: FPGA synthesis; it comes first in the builds ofnextpnr,fpga_packandopenfpgaloader, and it can feedvivado_implyosys_sim: simulation with CXXRTL
Run xeda list-flows for the complete list in the installed version. Run
xeda list-settings <flow> and xeda list-results <flow> for the settings and the results of a
flow.
Stability
From version 1.0.0, the Python modules xeda, xeda.errors and xeda.introspect, the command-line
interface, the JSON documents, and the built-in flows follow stable rules. Read the
Stability page for what is public and how
breaking changes are handled.
Development
git clone https://github.com/XedaHQ/xeda.git
cd xeda
uv sync
uv run pytest tests/ # serial
uv run pytest tests/ -n logical # one worker per logical CPU, several times faster
uv run pytest -n logical -m "python_compat and not real_tool" # faster cross-version check
uv run pytest tests/ -n logical --shard 2/4 # the second of four disjoint parts, as CI runs it
uv sync installs xeda in editable mode, with the dependency group dev of pyproject.toml. This
group includes the group test (pytest and the packages of the tests), the group examples (the
Python packages of the cocotb testbenches of the examples, which the tests run, and pyserial for
the host programs of the uart_echo and uart_link examples) and the quality tools. The
dependency groups are not part of the published package: pip install xeda installs none of them.
The marked command runs the compatibility cases that CI runs on Python 3.11 through 3.14. CI runs
the full tool-backed suite on Python 3.15 as four parallel jobs, one shard each, and one Verilator
cocotb smoke test on Python 3.11. A --shard K/N command runs only one of N disjoint parts of the
suite. The first two commands run every test.
Bare tox runs those compatibility checks, the full Python 3.15 suite and the quality checks. To
run the full test suite on every supported Python version, use
tox -e py311,py312,py313,py314,py315.
An editable pip installation also works if uv is not available. pip 25.1 or newer installs the
dependency groups:
COCOTB_IGNORE_PYTHON_REQUIRES=1 python -m pip install --editable . --group dev
Cocotb 2.1.0 supports Python through 3.14, and it has no wheel for Python 3.15. On Python 3.15, its
upstream setup.py rejects a source build unless COCOTB_IGNORE_PYTHON_REQUIRES=1 is set.
uv sync sets this variable for the build of cocotb, and so does the py315 environment of tox.
It overrides the build-time version check of cocotb. It does not add upstream support for
Python 3.15.
Do not edit CHANGELOG.md to record a change. Add one file to changelog.d/ for each change
that a user can see. At release, the maintainer folds the files into the changelog with
python tools/fold_changelog.py v<version>. Name the file <slug>.<type>.md:
<slug>is a short name for the change, in kebab-case.<type>isfixed,added,changedorremoved.
The file holds one Markdown bullet: one or two short sentences about what changed for a user. For
a breaking change, say what to do instead. Wrap the lines at 100 columns, and indent each line
after the first by two spaces. For example, changelog.d/scrub-keeps-new-runs.fixed.md can hold
this text:
- `xeda scrub` no longer removes a run that finished after it listed the directories.
tests/test_changelog_fragments.py checks every fragment.
Explore related projects
n8n-io/n8n
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
209,942 starslanggenius/dify
Build Agentic workflows, RAG pipelines, with rich AI model and tool support on one collaborative workspace. Deploy on cloud, VPC, or self-hosted, so teams move from prototype to production without rebuilding the stack.
160,773 starsmicrosoft/PowerToys
Microsoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows
140,755 starsstablyai/orca
Orca is the place for working with a fleet of agents (e.g. Grok Bot, Claude Code). Run any coding agent with your own subscription. Available on desktop, mobile and remote runtime.
120,478 stars