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.
  • 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

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
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
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.5.0.tar.gz (235.8 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.5.0-py3-none-win_arm64.whl (1.7 MB view details)

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

vsg_rs-0.5.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.5.0-py3-none-musllinux_1_2_aarch64.whl (1.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

vsg_rs-0.5.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.5.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.5.0.tar.gz.

File metadata

  • Download URL: vsg_rs-0.5.0.tar.gz
  • Upload date:
  • Size: 235.8 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.5.0.tar.gz
Algorithm Hash digest
SHA256 b6dd105229da722d3bb0baa127526f67afaf4067281e7cccff7b3c8ba87f7183
MD5 708194b913c7dc15052e4b1aa2ade069
BLAKE2b-256 74f6938f90838dea712fe8de49b5d83fb259949971a959e937411c3c40f0b9c0

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: vsg_rs-0.5.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.5.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 0384bc32ecdf818892ec5d68997e80bb7758fde9fbfd1cc515b774ee93025f0f
MD5 ff077156080d7745a689ebf53625263b
BLAKE2b-256 9fb12892b16f34c8dce474c1eaa514549b140dc569e3ac58604d116755cadc68

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: vsg_rs-0.5.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.5.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 f5d34f1b077c99194316e46d8c3ec78a7e1d3207b9eebb0fbb9bf0e98037eba4
MD5 6a69512d96cf48e28a5d5317953178fc
BLAKE2b-256 318687bea14e23d8252222d31bb87a180f81e81d1db569a89d067798072a5707

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vsg_rs-0.5.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9d46f8cf97a567d0f05dfebae592bc923dc36ffaaae43fb978cbcef4aeb28744
MD5 5d8d42109f1717a3e4a9a3bfc1a986b1
BLAKE2b-256 53c5c4d87c9442664ba709bbe2f977a6ac06f674d41198db4ffef846d021173d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vsg_rs-0.5.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 1e619ef63db956c8d332faac73e8054db80fe7d73f395b7996acdd68fcec262c
MD5 726368c64ecfd0d5f3bf386c7039422c
BLAKE2b-256 693c3651682230e5a7adfa56af442500ce65f63a1666253b38ce1d4c045ca29b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vsg_rs-0.5.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8cf49d1c0a545701af54dea8ceb39222c4890695774e3a57fae4b691249e6ee6
MD5 a5bdb86fec20fbb6ea8b4211b7f2df83
BLAKE2b-256 763ee5c1535f239ce62c19ef8183a1de1ae0da0d9d3ff4d1977943afa3c5489e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vsg_rs-0.5.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 81b2911b51a9eafb455eaf33363ee4d3b390f007f6d339399b0125e9404272a9
MD5 ef3718c8eb24f5fbae74ed40930e25c9
BLAKE2b-256 e2cef21ecf5b3f32a8c1951dd580e35fd4854059ec914a799367ec810b7c2c17

See more details on using hashes here.

Provenance

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

This release

0.5.0 This release

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