Skip to main content

vsg-rs

A fast Rust-native VHDL formatter and style checker with the command line, rules and configuration of VSG.

vsg-rs is an independent Rust implementation of a VHDL formatter and style checker that aims for compatibility with the rules and configuration of the VHDL Style Guide (VSG). It is not affiliated with, endorsed by, or maintained by the VHDL Style Guide project or its maintainers.

vsg-rs was inspired by the VHDL Style Guide (VSG) project by Jeremiah Leary and contributors. vsg-rs contains no VSG code; VSG is used only as a behavioural reference.

Status: beta. vsg-rs is tested against more than 11,000 real-world files. 192 VSG rules are implemented as rules with fixes (structure, identifier case and consistency, naming, comments, length_001). The other 779 rules are layout rules covered by the formatter: whitespace, indentation (including indent.tokens), blank lines, alignment, keyword case and line structure. Expect layout changes before 1.0.

Why

  • Drop-in for VSG. Same arguments, same configuration files, same report formats and exit codes. Existing scripts and CI jobs keep working.
  • One phase. All violations are reported at once, and --fix fixes everything in one run: no repeated --fix runs, no rule-order dependencies.
  • A real formatter. Source is parsed once into a lossless syntax tree and printed in one canonical layout, like rustfmt or Black. Running --fix twice changes nothing.
  • Long lines are folded, not just reported. Calls, maps, aggregates, expressions, conditions, declarations and signatures fold at structural boundaries (line folding).
  • Safe to run on save. Formatted output is re-parsed and must contain exactly the same tokens and comments; fixed output must parse. Files with syntax errors are never changed. Fixes that VSG does not apply by default, or that could break code, need --unsafe_fixes.
  • Fast. A typical file takes a few milliseconds; real-world VHDL is checked at about 3.4 MB/s on one core, and files are processed in parallel worker processes (performance).

Installation

pip install vsg-rs            # Linux, Windows and macOS wheels, Python 3.10+ (or: uv tool install vsg-rs)
cargo install --path .        # from source (Rust 1.95 or newer)

Standalone binaries for Linux (static, x86_64 and aarch64), Windows (x64 and arm64) and macOS (arm64 and x86_64) are attached to each GitHub release, with a SHA256SUMS file.

Usage

vsg-rs takes VSG's arguments:

vsg-rs -f src/fifo.vhd src/fifo_pkg.vhd      # report violations
vsg-rs src/*.vhd                             # file names can also be given without -f
vsg-rs -f src/*.vhd --fix                    # fix and format the files in place
vsg-rs -f src/*.vhd --fix -b                 # ... keeping a .bak copy of each changed file
vsg-rs -f src/*.vhd -c vsg.yaml              # with a VSG configuration file
vsg-rs -f src/*.vhd -of summary -js report.json -j junit.xml --quality_report gl.json
vsg-rs --stdin < src/fifo.vhd                # read from stdin
vsg-rs -rc entity_015                        # the configuration of one rule
vsg-rs -oc effective.json                    # the whole effective configuration
vsg-rs --style indent_only -f src/*.vhd --fix  # only re-indent
vsg-rs --recursive src                       # every .vhd/.vhdl file below src

As in VSG, files can also be listed in the configuration (file_list), and directories are not searched unless --recursive is given. The exit code is 0 when no error-severity violations were found and 1 otherwise.

What is reported

  • Rule violations, with VSG's rule ids and solution texts, in VSG's console layout (-of vsg, the default), as -of syntastic lines or as an -of summary.
  • Layout violations: every place where --fix would change the layout (indentation, spacing, line breaks, blank lines, trailing whitespace, keyword case, comment columns), under the VSG rule that reports it. vsg-rs decides the whole layout at once; the rule for each kind of change was learned by comparing with VSG on real code. Changes without a known VSG rule are reported as format.

When several files are checked together, uses of names declared in another file's package, or of another file's entity ports and generics, are checked for consistent capitalization too.

Fixes

--fix applies the fixes VSG applies by default and then formats the file. Rules that VSG does not fix by default (for example adding a missing port mode, port_023, or removing a signal's default value, signal_007) are left alone unless their configuration sets fixable: true or --unsafe_fixes is given. --fix_only FILE limits fixing to the listed rules and lines, as in VSG.

Additions to VSG's command line

Option Meaning
--unsafe_fixes with --fix, also apply fixes VSG does not apply by default; they may change behaviour or remove information, so review the result
--diff with --fix, print a unified diff instead of changing files
--stdin_filename PATH name of the --stdin input, used to find the configuration and in reports
--range START:END with --stdin --fix, change only these lines (1-based)
--sarif FILE write a SARIF 2.1.0 report (GitHub code scanning)
--list_rules list every VSG rule and how vsg-rs handles it
--recursive check the .vhd / .vhdl files in directories given as inputs, and in their subdirectories

With --stdin --fix, the fixed source is written to stdout and the report to stderr (VSG 3.35 cannot fix stdin). -fp and -ap are accepted and have no effect, --force_fix has no effect (files with syntax errors are never changed), and local rules (-lr, VSG's Python rule plugins) are run by an installed VSG (see below). See compatibility for the details.

Configuration

Configuration files use VSG's format (YAML or JSON) and are passed with -c; later files override earlier ones. Without -c, vsg-rs uses the nearest vsg-rs.yaml / .vsg-rs.yaml (or .json) next to the first input or in a parent directory, which VSG itself ignores.

rule:
  global:
    indent_style: spaces
    indent_size: 2
  group:
    case::name:
      case: lower
  length_001:
    length: 100
  process_016:
    disable: true
  port_023:
    fixable: true          # also add missing port modes with --fix
indent:
  tokens:
    case_statement_alternative:
      when_keyword: {after: current, token: current}
file_rules:
  legacy/**/*.vhd:
    rule:
      length_001:
        disable: true

Local rules (-lr DIR or local_rules: DIR) are VSG Python plugins, so vsg-rs runs them with an installed VSG (vsg on the path, or the command in VSG_RS_VSG, for example uvx --from vsg==3.35.0 vsg) with all built-in rules disabled, and merges their findings; with --fix, their fixes are applied first.

Blank-line, alignment, keyword-case and indentation rules configure the formatter (formatting). Formatting can be switched off for a region with -- vsg-rs: fmt off / -- vsg-rs: fmt on; VSG's -- vsg_off [rule ...] / -- vsg_on comments suppress rules (and, without rule names, formatting).

Editor integration

Configure your editor to pipe the buffer through vsg-rs --stdin --fix --stdin_filename <path> (add --range START:END to format selected lines). With exit code 0 the buffer is replaced with stdout; otherwise stdout is empty, stderr explains why, and the buffer should be left unchanged. See editor integration for VS Code, Neovim, Helix and Emacs.

GitHub Action

vsg-rs is also a GitHub Action. Add a workflow such as .github/workflows/vhdl-style.yml:

name: VHDL style
on:
  push:
    branches: [main]
  pull_request:

jobs:
  vsg:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write     # suggestions and the summary comment
    steps:
      - uses: actions/checkout@v5
      - uses: ru551n/vsg-rs@v0.9.5
        with:
          args: -c vsg.yaml --recursive src   # any vsg-rs arguments

The action downloads the vsg-rs release of its own tag (checked against SHA256SUMS) and runs vsg-rs with args. On a pull request:

  • Suggested changes: what --fix would change on the pull request's lines is posted as suggestions in one review, applied with one click. Suggestions that no longer apply are resolved on the next run.
  • One summary comment: findings per rule and the command that fixes them, updated in place on every push.
  • Annotations on the lines the pull request adds or changes.
  • Code scanning (optional, sarif-upload: true with security-events: write): rule violations also become tracked alerts under Security → Code scanning, and GitHub's code scanning bot comments on the ones a pull request introduces.
  • Result: the step fails when vsg-rs reports error-severity violations (fail-on-violations: false only reports them).

Other inputs: version (a release tag or latest), working-directory, annotations (changed, true or false), layout (suggestions, or alerts for one code scanning alert per block to reformat), pr-comment, and token. Outputs: exit-code, sarif-file and version. Linux, Windows and macOS runners are supported. To fix the reported violations locally, run the same arguments with --fix. See GitHub Action for details, and ru551n/vhdl-ai-test#9 for an example pull request.

Python

The wheels install the vsg-rs executable. python -m vsg_rs ... runs it too, and vsg_rs.find_vsg_rs_bin() returns its path.

Documentation

Development

cargo fmt --check
cargo clippy --all-targets --all-features -- -D warnings
cargo test
cargo run --release --example corpus -- --width 80 path/to/vhdl   # stability and overflow report
FIX=1 cargo run --release --example corpus -- path/to/vhdl         # the same for --fix (FIX=unsafe: --unsafe_fixes; CONFIG=file)
cargo run --release --example bench                                # timing on generated inputs
python scripts/compare_vsg.py FILE...                              # findings per rule, vsg-rs vs VSG 3.35
python scripts/learn_layout_rules.py FILE...                       # relearn src/layout_rules.json
python scripts/gen_spacing_rules.py VSG_CHECKOUT/docs              # regenerate src/spacing_rules.json
UPDATE_EXPECT=1 cargo test --test golden                           # re-bless golden files (review the diff)

The library (vsg_rs) can also be used directly: Parsed::new, format_parsed, fix_with, rules::check_with and the range variants format_range / fix_range.

License

vsg-rs is licensed under either of Apache License, Version 2.0 or MIT license, at your option. Third-party dependencies are listed in THIRD_PARTY_LICENSES.md. The VHDL parser, vhdl_syntax from the rust_hdl project, is MPL-2.0 and is used as an unmodified dependency.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in vsg-rs, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Download files

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

Source Distribution

vsg_rs-0.9.5.tar.gz (269.4 kB view details)

Uploaded Source

Built Distributions

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

vsg_rs-0.9.5-py3-none-win_arm64.whl (1.8 MB view details)

Uploaded Python 3Windows ARM64

vsg_rs-0.9.5-py3-none-win_amd64.whl (2.0 MB view details)

Uploaded Python 3Windows x86-64

vsg_rs-0.9.5-py3-none-musllinux_1_2_x86_64.whl (2.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

vsg_rs-0.9.5-py3-none-musllinux_1_2_aarch64.whl (1.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

vsg_rs-0.9.5-py3-none-manylinux_2_28_x86_64.whl (2.0 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

vsg_rs-0.9.5-py3-none-manylinux_2_28_aarch64.whl (1.9 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

vsg_rs-0.9.5-py3-none-macosx_11_0_arm64.whl (1.8 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

vsg_rs-0.9.5-py3-none-macosx_10_12_x86_64.whl (1.9 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file vsg_rs-0.9.5.tar.gz.

File metadata

  • Download URL: vsg_rs-0.9.5.tar.gz
  • Upload date:
  • Size: 269.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for vsg_rs-0.9.5.tar.gz
Algorithm Hash digest
SHA256 5db954bbf2b7b63f4b9549bde8d546e070ffe0d1f45cd72e012cf7fd1aad8636
MD5 a253db4806354b0cd23a1e04d9b868d7
BLAKE2b-256 b6ed3154fbf9bebf09d3cd19f7024cb9efd60d8df9749ddcbd35cec73fefa993

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.9.5.tar.gz:

Publisher: release.yml on ru551n/vsg-rs

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

File details

Details for the file vsg_rs-0.9.5-py3-none-win_arm64.whl.

File metadata

  • Download URL: vsg_rs-0.9.5-py3-none-win_arm64.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for vsg_rs-0.9.5-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 a8e615001beeb6558b154864139e5568e6a5fad431bdb631f56720cd7bd92f31
MD5 ccff76ce3fa0d881d122b39d5f4c17be
BLAKE2b-256 f028df21bb3c59b8d65f6c1f68a6d2cb5d05e5cd33d5c2f2e488da9d26c97834

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.9.5-py3-none-win_arm64.whl:

Publisher: release.yml on ru551n/vsg-rs

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

File details

Details for the file vsg_rs-0.9.5-py3-none-win_amd64.whl.

File metadata

  • Download URL: vsg_rs-0.9.5-py3-none-win_amd64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for vsg_rs-0.9.5-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 121d93ddd778103165b7bf758a83d39eabb947b55125dcea841c7aa1b10c66c3
MD5 3a91270b7aa7ca447ad87d4b4fd9be69
BLAKE2b-256 2f04def348c61643b94b5dfe24b6ceb54450dfbf84b69c94e129685c9d1d28b3

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.9.5-py3-none-win_amd64.whl:

Publisher: release.yml on ru551n/vsg-rs

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

File details

Details for the file vsg_rs-0.9.5-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for vsg_rs-0.9.5-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c397099da2f78ff43617d3894433edcd3baea9bd211f80a6aed2ecf442fee8e1
MD5 efe4680eb6b3415274f19da6d50bc325
BLAKE2b-256 4770472f447ffbf9bfa7c19f146232cf4e68cc47536a56840a7f3b1b2e7ecd1f

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.9.5-py3-none-musllinux_1_2_x86_64.whl:

Publisher: release.yml on ru551n/vsg-rs

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

File details

Details for the file vsg_rs-0.9.5-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for vsg_rs-0.9.5-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 096719d18f84188e39205564da9793a99536f6399d76b22a7bd01bbf3cfe0c1f
MD5 620144dc95b2713fbcc296b69ba828b7
BLAKE2b-256 73e15e44c9393c6ca868b0f5d1e6d9439c2ad4c7d123db66b74aded187202ee3

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.9.5-py3-none-musllinux_1_2_aarch64.whl:

Publisher: release.yml on ru551n/vsg-rs

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

File details

Details for the file vsg_rs-0.9.5-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for vsg_rs-0.9.5-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c3f334014d5198c95e2e2c15920a9ef7fc444291bfe61e0ea6276cd12b30bd6d
MD5 d7e2204948edaf22dcb27bd85ea31677
BLAKE2b-256 e3e3fd22d5a70739a1418ee20d6a35ed43a6ab2dcb8991a57fe2d31121cbae3a

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.9.5-py3-none-manylinux_2_28_x86_64.whl:

Publisher: release.yml on ru551n/vsg-rs

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

File details

Details for the file vsg_rs-0.9.5-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for vsg_rs-0.9.5-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f234ef96d8fcfa4bac51c8a2f8902b1483eb8c0d86a4cc419be729811617ac1d
MD5 b1facb9399e62dc2fd2917929b8e792f
BLAKE2b-256 69f6a14585b1c078d34686e54dc7fac080057ec25c8274bec1b64c037be4a828

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.9.5-py3-none-manylinux_2_28_aarch64.whl:

Publisher: release.yml on ru551n/vsg-rs

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

File details

Details for the file vsg_rs-0.9.5-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vsg_rs-0.9.5-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9e438f181e3140ac34bbf2e9a6c5989c04a42464a28b6081fe07c284b49e8174
MD5 a0dde55dac82a95c71cc4a8471e711e9
BLAKE2b-256 e37f1043e8ac05badd5a0a7c7c3e302eaf46d5ddc34c83fcbbeb50949c308c31

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.9.5-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on ru551n/vsg-rs

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

File details

Details for the file vsg_rs-0.9.5-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for vsg_rs-0.9.5-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 27cda40ee7f807ea6a075952ad15ddd52639a5ce88784dcd0672dc33072c5e57
MD5 e88b88b29551a7d2c930e842514303a5
BLAKE2b-256 626935e474c93387db9e92dbe68d9126c0bec402b00271d714cefda0973e6e6d

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.9.5-py3-none-macosx_10_12_x86_64.whl:

Publisher: release.yml on ru551n/vsg-rs

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

Release history Release notifications | RSS feed

0.9.6

9 files

This release

0.9.5 This release

9 files

0.9.4

9 files

0.9.3

9 files

0.9.2

9 files

0.9.1

9 files

0.9.0

9 files

0.8.0

9 files

0.7.0

9 files

0.6.0

7 files

0.5.0

7 files

0.4.0

7 files

0.3.0

7 files

0.2.0

7 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