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 (performance).

Installation

pip install vsg-rs            # Linux and Windows 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

As in VSG, directories are not searched; pass files (for example vsg-rs -f $(find src -name '*.vhd')). 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.
  • format violations: lines whose layout differs from what --fix produces. VSG reports these under its individual whitespace, indentation, blank-line and alignment rules; vsg-rs decides the whole layout at once and reports the line ranges instead.

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

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 -lr (VSG's Python rule plugins) is not supported. 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

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.

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)
cargo run --release --example bench                                # timing on generated inputs
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.3.0.tar.gz (223.2 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.3.0-py3-none-win_arm64.whl (1.7 MB view details)

Uploaded Python 3Windows ARM64

vsg_rs-0.3.0-py3-none-win_amd64.whl (1.8 MB view details)

Uploaded Python 3Windows x86-64

vsg_rs-0.3.0-py3-none-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

vsg_rs-0.3.0-py3-none-musllinux_1_2_aarch64.whl (1.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

vsg_rs-0.3.0-py3-none-manylinux_2_28_x86_64.whl (1.8 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

vsg_rs-0.3.0-py3-none-manylinux_2_28_aarch64.whl (1.7 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

File details

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

File metadata

  • Download URL: vsg_rs-0.3.0.tar.gz
  • Upload date:
  • Size: 223.2 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.3.0.tar.gz
Algorithm Hash digest
SHA256 e15d829f8be935e0bbe7ef1058be3b857b1a07756784b4144df1faaf4a3ba108
MD5 3afcb651a7d2de07eb6a0b401c6868aa
BLAKE2b-256 befbc6116e87d695bcf556eed3932a03d183efb5714752e296724954d7193bf8

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.3.0.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.3.0-py3-none-win_arm64.whl.

File metadata

  • Download URL: vsg_rs-0.3.0-py3-none-win_arm64.whl
  • Upload date:
  • Size: 1.7 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.3.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 bac35439f676b3537d6907d51380060d2b4e52a3cfb7cab41abcc311574476aa
MD5 978a1b4352e6ecbb31427bb8c2994b6c
BLAKE2b-256 461118da156d0e8e49eada08f7397db2a68571073c7c8d3962f0c8b5df7b2725

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.3.0-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.3.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: vsg_rs-0.3.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 1.8 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.3.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 306db9d4f0979642e5e4bd0cb375f519eab65c61396f759f4235b6a65037850d
MD5 b730a456d33e8a91e31c387aa34d5cb1
BLAKE2b-256 ef144cbb6ebf99e02b7455b8587359e9f42122b57ac2e4c6b1c8880fd2cbb5cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.3.0-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.3.0-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for vsg_rs-0.3.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5ee6d50b8ea3343f1db079e5ed8f5988fd050ebc91077e630fbcde8d805e9f2a
MD5 614991e005d741410e439e1949eb0f4b
BLAKE2b-256 7c65ac93f6b0eb9e79ccd20e6e76f8f2bb949bc1794b5af95e35490ca46a5843

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.3.0-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.3.0-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for vsg_rs-0.3.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7eeabd7b3300ab1f184b81e6aecbddec75d63f2077397daee01bff9233fbfc8d
MD5 894051de9702846c958a33fb3a28ab6f
BLAKE2b-256 fa79a5f9efa068435c4e5f6b37c7fb67658fee13d11923e8ab575da874416cdf

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.3.0-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.3.0-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for vsg_rs-0.3.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c2ac81e213759107fb217af6eca71c3462cc1c140ab21780fd06c6fe06d0d46d
MD5 4c27448ec44107c11ca268a546189e2a
BLAKE2b-256 f04f6e12ae4943c67e468d4e73443c9f22402bca8a3272a3d444642f878ebab2

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.3.0-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.3.0-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for vsg_rs-0.3.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6e7a083758dfdcc23f05419fef64d78ee8d55745df63bb972e06885dae759236
MD5 fff5a263a44250e2dc4273256641156e
BLAKE2b-256 4b30152766e408f65c85fdd9e88ff1417c78c7017e96761c7c54fe1cc6b7c160

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsg_rs-0.3.0-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.

Release history Release notifications | RSS feed

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

This release

0.3.0 This release

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