speja 0.13.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- speja-0.13.0/.claude-plugin/marketplace.json +14 -0
- speja-0.13.0/.claude-plugin/plugin.json +12 -0
- speja-0.13.0/.github/dependabot.yml +35 -0
- speja-0.13.0/.github/workflows/action.yml +62 -0
- speja-0.13.0/.github/workflows/ci.yml +341 -0
- speja-0.13.0/.github/workflows/compatibility.yml +190 -0
- speja-0.13.0/.github/workflows/fuzz.yml +52 -0
- speja-0.13.0/.github/workflows/release.yml +408 -0
- speja-0.13.0/.gitignore +11 -0
- speja-0.13.0/.mcp.json +8 -0
- speja-0.13.0/.pre-commit-hooks.yaml +16 -0
- speja-0.13.0/.readthedocs.yaml +14 -0
- speja-0.13.0/CHANGELOG.md +418 -0
- speja-0.13.0/CONTRIBUTING.md +77 -0
- speja-0.13.0/Cargo.lock +1129 -0
- speja-0.13.0/Cargo.toml +53 -0
- speja-0.13.0/LICENSE-APACHE +201 -0
- speja-0.13.0/LICENSE-MIT +25 -0
- speja-0.13.0/NOTICE +33 -0
- speja-0.13.0/PKG-INFO +307 -0
- speja-0.13.0/README.md +276 -0
- speja-0.13.0/THIRD_PARTY_LICENSES.md +138 -0
- speja-0.13.0/_typos.toml +21 -0
- speja-0.13.0/action.yml +138 -0
- speja-0.13.0/build.rs +52 -0
- speja-0.13.0/clippy.toml +1 -0
- speja-0.13.0/deny.toml +46 -0
- speja-0.13.0/docs/airgapped.md +134 -0
- speja-0.13.0/docs/architecture.md +120 -0
- speja-0.13.0/docs/assets/favicon.png +0 -0
- speja-0.13.0/docs/assets/speja-logo-dark.png +0 -0
- speja-0.13.0/docs/assets/speja-logo.png +0 -0
- speja-0.13.0/docs/claude-code.md +49 -0
- speja-0.13.0/docs/cli.md +91 -0
- speja-0.13.0/docs/compatibility.md +198 -0
- speja-0.13.0/docs/editors.md +80 -0
- speja-0.13.0/docs/formatting.md +197 -0
- speja-0.13.0/docs/github-action.md +85 -0
- speja-0.13.0/docs/gitlab-ci.md +38 -0
- speja-0.13.0/docs/index.md +76 -0
- speja-0.13.0/docs/line-folding-coverage.md +98 -0
- speja-0.13.0/docs/line-folding.md +122 -0
- speja-0.13.0/docs/lint.md +194 -0
- speja-0.13.0/docs/lsp.md +117 -0
- speja-0.13.0/docs/mcp.md +88 -0
- speja-0.13.0/docs/migrating-from-vsg.md +108 -0
- speja-0.13.0/docs/native-rules.md +910 -0
- speja-0.13.0/docs/performance.md +24 -0
- speja-0.13.0/docs/project-setup.md +121 -0
- speja-0.13.0/docs/quick-start.md +94 -0
- speja-0.13.0/docs/releasing.md +139 -0
- speja-0.13.0/docs/reports.md +104 -0
- speja-0.13.0/docs/requirements.txt +3 -0
- speja-0.13.0/docs/roadmap.md +65 -0
- speja-0.13.0/docs/rule-counts.md +14 -0
- speja-0.13.0/docs/rule-reference.md +116 -0
- speja-0.13.0/docs/rule-status.md +242 -0
- speja-0.13.0/docs/upstream-notes.md +28 -0
- speja-0.13.0/docs/vhdl-frontend.md +84 -0
- speja-0.13.0/docs/vscode-editing.md +210 -0
- speja-0.13.0/docs/vsg-config.md +247 -0
- speja-0.13.0/docs/waivers.md +58 -0
- speja-0.13.0/editors/vscode/.gitignore +7 -0
- speja-0.13.0/editors/vscode/.vscode/launch.json +13 -0
- speja-0.13.0/editors/vscode/.vscode/tasks.json +11 -0
- speja-0.13.0/editors/vscode/.vscodeignore +9 -0
- speja-0.13.0/editors/vscode/README.md +121 -0
- speja-0.13.0/editors/vscode/docs/development.md +73 -0
- speja-0.13.0/editors/vscode/docs/formatting.md +138 -0
- speja-0.13.0/editors/vscode/docs/server-selection.md +49 -0
- speja-0.13.0/editors/vscode/icon.png +0 -0
- speja-0.13.0/editors/vscode/language-configuration.json +15 -0
- speja-0.13.0/editors/vscode/package-lock.json +3988 -0
- speja-0.13.0/editors/vscode/package.json +452 -0
- speja-0.13.0/editors/vscode/scripts/check-grammar.mjs +93 -0
- speja-0.13.0/editors/vscode/scripts/check-themes.mjs +142 -0
- speja-0.13.0/editors/vscode/scripts/gen-themes.mjs +109 -0
- speja-0.13.0/editors/vscode/scripts/package.mjs +98 -0
- speja-0.13.0/editors/vscode/scripts/palettes.json +1601 -0
- speja-0.13.0/editors/vscode/scripts/probe.mjs +36 -0
- speja-0.13.0/editors/vscode/src/editing.ts +1209 -0
- speja-0.13.0/editors/vscode/src/extension.ts +219 -0
- speja-0.13.0/editors/vscode/src/generate.test.ts +290 -0
- speja-0.13.0/editors/vscode/src/generate.ts +533 -0
- speja-0.13.0/editors/vscode/syntaxes/vhdl.tmLanguage.json +122 -0
- speja-0.13.0/editors/vscode/test/smoke/run.mjs +220 -0
- speja-0.13.0/editors/vscode/test/smoke/suite.js +445 -0
- speja-0.13.0/editors/vscode/themes/afterglow.json +162 -0
- speja-0.13.0/editors/vscode/themes/bamboo-multiplex.json +162 -0
- speja-0.13.0/editors/vscode/themes/bamboo-vulgaris.json +162 -0
- speja-0.13.0/editors/vscode/themes/blue-moon.json +162 -0
- speja-0.13.0/editors/vscode/themes/carbonfox.json +162 -0
- speja-0.13.0/editors/vscode/themes/catppuccin-frappe.json +162 -0
- speja-0.13.0/editors/vscode/themes/catppuccin-macchiato.json +162 -0
- speja-0.13.0/editors/vscode/themes/catppuccin-mocha.json +162 -0
- speja-0.13.0/editors/vscode/themes/deus.json +162 -0
- speja-0.13.0/editors/vscode/themes/dogrun.json +162 -0
- speja-0.13.0/editors/vscode/themes/dracula.json +162 -0
- speja-0.13.0/editors/vscode/themes/duskfox.json +162 -0
- speja-0.13.0/editors/vscode/themes/everforest-hard.json +162 -0
- speja-0.13.0/editors/vscode/themes/everforest-medium.json +162 -0
- speja-0.13.0/editors/vscode/themes/everforest-soft.json +162 -0
- speja-0.13.0/editors/vscode/themes/gruvbox-material-hard.json +162 -0
- speja-0.13.0/editors/vscode/themes/gruvbox-material-medium.json +162 -0
- speja-0.13.0/editors/vscode/themes/gruvbox-material-soft.json +162 -0
- speja-0.13.0/editors/vscode/themes/gruvbox-vhdl-dark.json +162 -0
- speja-0.13.0/editors/vscode/themes/gruvbox-vhdl-light.json +162 -0
- speja-0.13.0/editors/vscode/themes/kanagawa-dragon.json +162 -0
- speja-0.13.0/editors/vscode/themes/kanagawa-wave.json +162 -0
- speja-0.13.0/editors/vscode/themes/koda-moss.json +162 -0
- speja-0.13.0/editors/vscode/themes/luna.json +162 -0
- speja-0.13.0/editors/vscode/themes/moonfly.json +162 -0
- speja-0.13.0/editors/vscode/themes/nightfox.json +162 -0
- speja-0.13.0/editors/vscode/themes/nordfox.json +162 -0
- speja-0.13.0/editors/vscode/themes/onedark.json +162 -0
- speja-0.13.0/editors/vscode/themes/onedarkpro-dark.json +162 -0
- speja-0.13.0/editors/vscode/themes/onedarkpro-onedark.json +162 -0
- speja-0.13.0/editors/vscode/themes/onedarkpro-vivid.json +162 -0
- speja-0.13.0/editors/vscode/themes/oxocarbon.json +162 -0
- speja-0.13.0/editors/vscode/themes/papercolor.json +162 -0
- speja-0.13.0/editors/vscode/themes/tender.json +162 -0
- speja-0.13.0/editors/vscode/themes/terafox.json +162 -0
- speja-0.13.0/editors/vscode/themes/tokyonight-moon.json +162 -0
- speja-0.13.0/editors/vscode/themes/tokyonight-night.json +162 -0
- speja-0.13.0/editors/vscode/themes/tokyonight-storm.json +162 -0
- speja-0.13.0/editors/vscode/themes/torchlight-dusk.json +162 -0
- speja-0.13.0/editors/vscode/themes/torchlight.json +162 -0
- speja-0.13.0/editors/vscode/themes/unokai.json +162 -0
- speja-0.13.0/editors/vscode/themes/vague.json +162 -0
- speja-0.13.0/editors/vscode/themes/vscode.json +162 -0
- speja-0.13.0/editors/vscode/tsconfig.json +22 -0
- speja-0.13.0/examples/bench.rs +118 -0
- speja-0.13.0/examples/corpus.rs +146 -0
- speja-0.13.0/examples/layout_keys.rs +33 -0
- speja-0.13.0/mkdocs.yml +74 -0
- speja-0.13.0/plans/analysis-and-lsp.md +453 -0
- speja-0.13.0/pyproject.toml +43 -0
- speja-0.13.0/python/speja/__init__.py +29 -0
- speja-0.13.0/python/speja/__main__.py +22 -0
- speja-0.13.0/python/tests/smoke.py +67 -0
- speja-0.13.0/scripts/compare_bench.py +74 -0
- speja-0.13.0/scripts/compare_vsg.py +177 -0
- speja-0.13.0/scripts/corpus_findings.py +109 -0
- speja-0.13.0/scripts/gen_rule_docs.py +269 -0
- speja-0.13.0/scripts/gen_spacing_rules.py +155 -0
- speja-0.13.0/scripts/github_action_report.py +356 -0
- speja-0.13.0/scripts/learn_layout_rules.py +100 -0
- speja-0.13.0/scripts/migrate_vsg_config.py +64 -0
- speja-0.13.0/skills/vsg/SKILL.md +106 -0
- speja-0.13.0/src/align.rs +442 -0
- speja-0.13.0/src/analysis/calls.rs +194 -0
- speja-0.13.0/src/analysis/choices.rs +436 -0
- speja-0.13.0/src/analysis/clockdomain.rs +417 -0
- speja-0.13.0/src/analysis/combinational.rs +315 -0
- speja-0.13.0/src/analysis/design.rs +1258 -0
- speja-0.13.0/src/analysis/elaborate.rs +1018 -0
- speja-0.13.0/src/analysis/evaluated.rs +618 -0
- speja-0.13.0/src/analysis/flow.rs +406 -0
- speja-0.13.0/src/analysis/fsm.rs +360 -0
- speja-0.13.0/src/analysis/lint.rs +854 -0
- speja-0.13.0/src/analysis/mod.rs +190 -0
- speja-0.13.0/src/analysis/resetdomain.rs +382 -0
- speja-0.13.0/src/analysis/suspend.rs +193 -0
- speja-0.13.0/src/analysis/testbench.rs +231 -0
- speja-0.13.0/src/analysis/width.rs +357 -0
- speja-0.13.0/src/blank.rs +649 -0
- speja-0.13.0/src/config.rs +1292 -0
- speja-0.13.0/src/doc.rs +655 -0
- speja-0.13.0/src/fix.rs +307 -0
- speja-0.13.0/src/format.rs +1738 -0
- speja-0.13.0/src/fuzz.rs +262 -0
- speja-0.13.0/src/indent.rs +448 -0
- speja-0.13.0/src/keywords.rs +310 -0
- speja-0.13.0/src/layout.rs +441 -0
- speja-0.13.0/src/layout_rules.json +412 -0
- speja-0.13.0/src/lib.rs +723 -0
- speja-0.13.0/src/local_rules.rs +164 -0
- speja-0.13.0/src/lsp.rs +1065 -0
- speja-0.13.0/src/main.rs +13 -0
- speja-0.13.0/src/mcp.rs +624 -0
- speja-0.13.0/src/organize.rs +314 -0
- speja-0.13.0/src/reflow.rs +186 -0
- speja-0.13.0/src/rules/case.rs +1008 -0
- speja-0.13.0/src/rules/catalog.rs +202 -0
- speja-0.13.0/src/rules/length.rs +148 -0
- speja-0.13.0/src/rules/mod.rs +413 -0
- speja-0.13.0/src/rules/naming.rs +894 -0
- speja-0.13.0/src/rules/project.rs +168 -0
- speja-0.13.0/src/rules/select.rs +256 -0
- speja-0.13.0/src/rules/structure.rs +845 -0
- speja-0.13.0/src/rules/transform.rs +1055 -0
- speja-0.13.0/src/spacing_rules.json +175 -0
- speja-0.13.0/src/verify.rs +83 -0
- speja-0.13.0/src/vsg_cli.rs +2497 -0
- speja-0.13.0/src/vsg_defaults.json +1 -0
- speja-0.13.0/src/vsg_defaults.rs +58 -0
- speja-0.13.0/src/waivers.rs +190 -0
- speja-0.13.0/tests/analysis.rs +70 -0
- speja-0.13.0/tests/cli.rs +1046 -0
- speja-0.13.0/tests/corpus-findings.txt +9 -0
- speja-0.13.0/tests/corpus-findings.yaml +11 -0
- speja-0.13.0/tests/fake_vsg.py +29 -0
- speja-0.13.0/tests/formatting/alignment_off.out.vhd +46 -0
- speja-0.13.0/tests/formatting/alignment_off.vhd +21 -0
- speja-0.13.0/tests/formatting/alignment_off.yaml +8 -0
- speja-0.13.0/tests/formatting/assert_report_wait.out.vhd +31 -0
- speja-0.13.0/tests/formatting/assert_report_wait.vhd +14 -0
- speja-0.13.0/tests/formatting/assignments.out.vhd +54 -0
- speja-0.13.0/tests/formatting/assignments.vhd +19 -0
- speja-0.13.0/tests/formatting/boundaries.out.vhd +14 -0
- speja-0.13.0/tests/formatting/boundaries.vhd +11 -0
- speja-0.13.0/tests/formatting/calls_aggregates.out.vhd +59 -0
- speja-0.13.0/tests/formatting/calls_aggregates.vhd +15 -0
- speja-0.13.0/tests/formatting/comment_spacing.out.vhd +10 -0
- speja-0.13.0/tests/formatting/comment_spacing.vhd +6 -0
- speja-0.13.0/tests/formatting/comment_spacing.yaml +6 -0
- speja-0.13.0/tests/formatting/comments.out.vhd +36 -0
- speja-0.13.0/tests/formatting/comments.vhd +28 -0
- speja-0.13.0/tests/formatting/conditions.out.vhd +44 -0
- speja-0.13.0/tests/formatting/conditions.vhd +21 -0
- speja-0.13.0/tests/formatting/configuration_context.out.vhd +26 -0
- speja-0.13.0/tests/formatting/configuration_context.vhd +9 -0
- speja-0.13.0/tests/formatting/crlf.out.vhd +2 -0
- speja-0.13.0/tests/formatting/crlf.vhd +2 -0
- speja-0.13.0/tests/formatting/declarations.out.vhd +88 -0
- speja-0.13.0/tests/formatting/declarations.vhd +34 -0
- speja-0.13.0/tests/formatting/deep_nesting.out.vhd +28 -0
- speja-0.13.0/tests/formatting/deep_nesting.vhd +6 -0
- speja-0.13.0/tests/formatting/entity_interface.out.vhd +21 -0
- speja-0.13.0/tests/formatting/entity_interface.vhd +8 -0
- speja-0.13.0/tests/formatting/fmt_off.out.vhd +27 -0
- speja-0.13.0/tests/formatting/fmt_off.vhd +22 -0
- speja-0.13.0/tests/formatting/generate_case_loop.out.vhd +74 -0
- speja-0.13.0/tests/formatting/generate_case_loop.vhd +37 -0
- speja-0.13.0/tests/formatting/indent_tokens.out.vhd +29 -0
- speja-0.13.0/tests/formatting/indent_tokens.vhd +16 -0
- speja-0.13.0/tests/formatting/indent_tokens.yaml +16 -0
- speja-0.13.0/tests/formatting/instantiation.out.vhd +56 -0
- speja-0.13.0/tests/formatting/instantiation.vhd +14 -0
- speja-0.13.0/tests/formatting/keyword_case.out.vhd +14 -0
- speja-0.13.0/tests/formatting/keyword_case.vhd +7 -0
- speja-0.13.0/tests/formatting/layout_options.out.vhd +43 -0
- speja-0.13.0/tests/formatting/layout_options.vhd +17 -0
- speja-0.13.0/tests/formatting/layout_options.yaml +12 -0
- speja-0.13.0/tests/formatting/protected_types.out.vhd +39 -0
- speja-0.13.0/tests/formatting/protected_types.vhd +14 -0
- speja-0.13.0/tests/formatting/signatures.out.vhd +18 -0
- speja-0.13.0/tests/formatting/signatures.vhd +7 -0
- speja-0.13.0/tests/formatting/tool_directives.out.vhd +23 -0
- speja-0.13.0/tests/formatting/tool_directives.vhd +16 -0
- speja-0.13.0/tests/formatting/unbreakable.out.vhd +15 -0
- speja-0.13.0/tests/formatting/unbreakable.vhd +8 -0
- speja-0.13.0/tests/golden.rs +84 -0
- speja-0.13.0/tests/lsp.rs +1186 -0
- speja-0.13.0/tests/regressions/vsg_bug_001.vhd +8 -0
- speja-0.13.0/tests/regressions/vsg_bug_002.vhd +7 -0
- speja-0.13.0/tests/regressions/vsg_bug_003.vhd +3 -0
- speja-0.13.0/tests/regressions/vsg_bug_004.vhd +6 -0
- speja-0.13.0/tests/regressions/vsg_bug_005.vhd +13 -0
- speja-0.13.0/tests/regressions/vsg_bug_006.vhd +7 -0
- speja-0.13.0/tests/regressions/vsg_bug_007.vhd +11 -0
- speja-0.13.0/tests/regressions/vsg_bug_008.vhd +21 -0
- speja-0.13.0/tests/regressions/vsg_bug_009.vhd +13 -0
- speja-0.13.0/tests/regressions/vsg_bug_010.vhd +4 -0
- speja-0.13.0/tests/regressions/vsg_bug_011.vhd +4 -0
- speja-0.13.0/tests/regressions/vsg_bug_012.vhd +9 -0
- speja-0.13.0/tests/regressions/vsg_bug_013.vhd +12 -0
- speja-0.13.0/tests/regressions/vsg_bug_014.vhd +10 -0
- speja-0.13.0/tests/regressions/vsg_bug_015.vhd +9 -0
- speja-0.13.0/tests/regressions/vsg_bug_016.vhd +5 -0
- speja-0.13.0/tests/regressions/vsg_bug_017.vhd +8 -0
- speja-0.13.0/tests/regressions/vsg_bug_018.vhd +34 -0
- speja-0.13.0/tests/regressions/vsg_bug_020.vhd +21 -0
- speja-0.13.0/tests/regressions/vsg_bug_021.vhd +30 -0
- speja-0.13.0/tests/regressions/vsg_bug_022.vhd +25 -0
- speja-0.13.0/tests/regressions/vsg_bug_023.vhd +9 -0
- speja-0.13.0/tests/regressions/vsg_bug_024.vhd +8 -0
- speja-0.13.0/tests/regressions/vsg_bug_026.vhd +4 -0
- speja-0.13.0/tests/regressions/vsg_bug_027.vhd +9 -0
- speja-0.13.0/tests/regressions/vsg_bug_028.vhd +8 -0
- speja-0.13.0/tests/regressions/vsg_bug_029.vhd +13 -0
- speja-0.13.0/tests/regressions/vsg_bug_030.vhd +11 -0
- speja-0.13.0/tests/regressions/vsg_bug_034.vhd +15 -0
- speja-0.13.0/tests/regressions.rs +146 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/README.ieee +30 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/fixed_float_types.vhdl +61 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/fixed_generic_pkg-body.vhdl +6361 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/fixed_generic_pkg.vhdl +1439 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/fixed_pkg.vhdl +52 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/float_generic_pkg-body.vhdl +5712 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/float_generic_pkg.vhdl +1000 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/float_pkg.vhdl +55 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/ieee_bit_context.vhdl +4 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/ieee_std_context.vhdl +5 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/math_complex-body.vhdl +1602 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/math_complex.vhdl +1083 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/math_real-body.vhdl +1927 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/math_real.vhdl +625 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_bit-body.vhdl +3037 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_bit.vhdl +1592 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_bit_unsigned-body.vhdl +592 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_bit_unsigned.vhdl +623 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_std-body.vhdl +4088 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_std.vhdl +1685 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_std_unsigned-body.vhdl +595 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_std_unsigned.vhdl +616 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/std_logic_1164-body.vhdl +1572 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/std_logic_1164.vhdl +309 -0
- speja-0.13.0/vendor/vhdl_libraries/ieee2008/std_logic_textio.vhdl +3 -0
- speja-0.13.0/vendor/vhdl_libraries/std/env.vhd +11 -0
- speja-0.13.0/vendor/vhdl_libraries/std/standard.vhd +94 -0
- speja-0.13.0/vendor/vhdl_libraries/std/textio.vhd +73 -0
- speja-0.13.0/vendor/vhdl_libraries/synopsys/std_logic_arith.vhdl +2391 -0
- speja-0.13.0/vendor/vhdl_libraries/synopsys/std_logic_misc.vhdl +967 -0
- speja-0.13.0/vendor/vhdl_libraries/synopsys/std_logic_signed.vhdl +343 -0
- speja-0.13.0/vendor/vhdl_libraries/synopsys/std_logic_unsigned.vhdl +329 -0
- speja-0.13.0/vendor/vhdl_libraries/vhdl_ls.toml +7 -0
- speja-0.13.0/vendor/vhdl_libraries/vital2000/memory_b.vhdl +7151 -0
- speja-0.13.0/vendor/vhdl_libraries/vital2000/memory_p.vhdl +1729 -0
- speja-0.13.0/vendor/vhdl_libraries/vital2000/prmtvs_b.vhdl +5622 -0
- speja-0.13.0/vendor/vhdl_libraries/vital2000/prmtvs_p.vhdl +1413 -0
- speja-0.13.0/vendor/vhdl_libraries/vital2000/timing_b.vhdl +2187 -0
- speja-0.13.0/vendor/vhdl_libraries/vital2000/timing_p.vhdl +1202 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "speja",
|
|
3
|
+
"description": "VHDL formatting and static analysis for Claude Code.",
|
|
4
|
+
"owner": {
|
|
5
|
+
"name": "Sebastian Hellgren"
|
|
6
|
+
},
|
|
7
|
+
"plugins": [
|
|
8
|
+
{
|
|
9
|
+
"name": "speja",
|
|
10
|
+
"source": "./",
|
|
11
|
+
"description": "Format VHDL, fix what is fixable, and check it is clean before committing."
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "speja",
|
|
3
|
+
"version": "0.13.0",
|
|
4
|
+
"description": "VHDL formatting and static analysis: format a file the project's way, fix what is fixable, and check it is clean before committing, with the speja MCP server preconfigured.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Sebastian Hellgren"
|
|
7
|
+
},
|
|
8
|
+
"homepage": "https://speja.readthedocs.io/",
|
|
9
|
+
"repository": "https://github.com/ru551n/speja",
|
|
10
|
+
"license": "MIT OR Apache-2.0",
|
|
11
|
+
"keywords": ["vhdl", "fpga", "rtl", "formatter", "linter", "vsg", "style"]
|
|
12
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Dependency updates, once a week, grouped so that each ecosystem opens at most one pull
|
|
2
|
+
# request. CI (and, for workflow changes, the release and action
|
|
3
|
+
# test workflows) must pass before merging.
|
|
4
|
+
version: 2
|
|
5
|
+
updates:
|
|
6
|
+
# Rust crates (Cargo.toml / Cargo.lock). vhdl_syntax is pinned to a git revision on purpose
|
|
7
|
+
# (see docs/vhdl-frontend.md) and is updated by hand.
|
|
8
|
+
- package-ecosystem: cargo
|
|
9
|
+
directory: /
|
|
10
|
+
schedule:
|
|
11
|
+
interval: weekly
|
|
12
|
+
ignore:
|
|
13
|
+
- dependency-name: vhdl_syntax
|
|
14
|
+
groups:
|
|
15
|
+
cargo:
|
|
16
|
+
patterns: ["*"]
|
|
17
|
+
|
|
18
|
+
# GitHub Actions used by the workflows and by the composite action (action.yml). They are
|
|
19
|
+
# pinned to commit hashes, with the version in a comment; Dependabot updates both.
|
|
20
|
+
- package-ecosystem: github-actions
|
|
21
|
+
directory: / # includes .github/workflows
|
|
22
|
+
schedule:
|
|
23
|
+
interval: weekly
|
|
24
|
+
groups:
|
|
25
|
+
github-actions:
|
|
26
|
+
patterns: ["*"]
|
|
27
|
+
|
|
28
|
+
# Python packaging (pyproject.toml: the maturin build requirement).
|
|
29
|
+
- package-ecosystem: pip
|
|
30
|
+
directory: /
|
|
31
|
+
schedule:
|
|
32
|
+
interval: weekly
|
|
33
|
+
groups:
|
|
34
|
+
python:
|
|
35
|
+
patterns: ["*"]
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Tests the GitHub Action in action.yml on Linux, Windows and macOS.
|
|
2
|
+
name: Action
|
|
3
|
+
|
|
4
|
+
on:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
paths:
|
|
8
|
+
- "action.yml"
|
|
9
|
+
- "scripts/github_action_report.py"
|
|
10
|
+
- ".github/workflows/action.yml"
|
|
11
|
+
pull_request:
|
|
12
|
+
paths:
|
|
13
|
+
- "action.yml"
|
|
14
|
+
- "scripts/github_action_report.py"
|
|
15
|
+
- ".github/workflows/action.yml"
|
|
16
|
+
workflow_dispatch:
|
|
17
|
+
inputs:
|
|
18
|
+
upload:
|
|
19
|
+
description: Also upload to code scanning (use a scratch branch; this creates alerts)
|
|
20
|
+
type: boolean
|
|
21
|
+
default: false
|
|
22
|
+
|
|
23
|
+
permissions:
|
|
24
|
+
contents: read
|
|
25
|
+
|
|
26
|
+
jobs:
|
|
27
|
+
test:
|
|
28
|
+
strategy:
|
|
29
|
+
fail-fast: false
|
|
30
|
+
matrix:
|
|
31
|
+
os: [ubuntu-latest, windows-latest, macos-latest]
|
|
32
|
+
runs-on: ${{ matrix.os }}
|
|
33
|
+
permissions:
|
|
34
|
+
contents: read
|
|
35
|
+
security-events: write
|
|
36
|
+
steps:
|
|
37
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
38
|
+
- name: Create an input with violations
|
|
39
|
+
shell: bash
|
|
40
|
+
run: |
|
|
41
|
+
mkdir -p action-test/src
|
|
42
|
+
printf 'entity E is\nend;\n' > action-test/src/bad.vhd
|
|
43
|
+
- name: Run the action
|
|
44
|
+
id: vsg
|
|
45
|
+
uses: ./
|
|
46
|
+
with:
|
|
47
|
+
version: latest
|
|
48
|
+
args: --recursive src
|
|
49
|
+
working-directory: action-test
|
|
50
|
+
fail-on-violations: "false"
|
|
51
|
+
sarif-upload: ${{ inputs.upload && matrix.os == 'ubuntu-latest' }}
|
|
52
|
+
- name: Check the outputs
|
|
53
|
+
shell: bash
|
|
54
|
+
env:
|
|
55
|
+
CODE: ${{ steps.vsg.outputs.exit-code }}
|
|
56
|
+
SARIF: ${{ steps.vsg.outputs.sarif-file }}
|
|
57
|
+
VERSION: ${{ steps.vsg.outputs.version }}
|
|
58
|
+
run: |
|
|
59
|
+
echo "speja $VERSION exited with $CODE"
|
|
60
|
+
test "$CODE" = 1
|
|
61
|
+
grep -q '"ruleId": "entity_008"' "$SARIF"
|
|
62
|
+
grep -q '"uri": "action-test/src/bad.vhd"' "$SARIF"
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
env:
|
|
9
|
+
CARGO_TERM_COLOR: always
|
|
10
|
+
RUSTFLAGS: -D warnings
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
# Which parts of the repository a change touches, so the rest of the workflow can stay out of
|
|
14
|
+
# the way. A documentation change should not build the compiler on three operating systems.
|
|
15
|
+
# When the answer cannot be worked out -- a first push, a force push, a shallow history -- every
|
|
16
|
+
# job runs, because a missed check is worse than a wasted minute.
|
|
17
|
+
changes:
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
outputs:
|
|
20
|
+
rust: ${{ steps.what.outputs.rust }}
|
|
21
|
+
docs: ${{ steps.what.outputs.docs }}
|
|
22
|
+
vscode: ${{ steps.what.outputs.vscode }}
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
25
|
+
with:
|
|
26
|
+
fetch-depth: 0
|
|
27
|
+
- id: what
|
|
28
|
+
env:
|
|
29
|
+
BASE: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }}
|
|
30
|
+
shell: bash
|
|
31
|
+
run: |
|
|
32
|
+
everything() {
|
|
33
|
+
{
|
|
34
|
+
echo "rust=true"
|
|
35
|
+
echo "docs=true"
|
|
36
|
+
echo "vscode=true"
|
|
37
|
+
} >> "$GITHUB_OUTPUT"
|
|
38
|
+
exit 0
|
|
39
|
+
}
|
|
40
|
+
[ -n "$BASE" ] || everything
|
|
41
|
+
git cat-file -e "$BASE^{commit}" 2>/dev/null || everything
|
|
42
|
+
files=$(git diff --name-only "$BASE" HEAD)
|
|
43
|
+
echo "changed:"; echo "$files" | sed 's/^/ /'
|
|
44
|
+
|
|
45
|
+
# The workflow itself, or anything that decides how the build behaves: run everything.
|
|
46
|
+
if echo "$files" | grep -qE '^\.github/workflows/ci\.yml$|^rust-toolchain'; then
|
|
47
|
+
everything
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
has() { echo "$files" | grep -qE "$1"; }
|
|
51
|
+
rust=false
|
|
52
|
+
docs=false
|
|
53
|
+
vscode=false
|
|
54
|
+
# The crate, its inputs, and the things that gate it.
|
|
55
|
+
has '^(src|tests|examples|fuzz|vendor|scripts)/|^(build\.rs|Cargo\.toml|Cargo\.lock|clippy\.toml|deny\.toml|_typos\.toml)$' && rust=true
|
|
56
|
+
# The published site. A Rust change can make the generated rule tables stale, so the
|
|
57
|
+
# documentation job also runs whenever the crate changes.
|
|
58
|
+
has '^docs/|^mkdocs\.yml$|^[^/]*\.md$' && docs=true
|
|
59
|
+
has '^editors/vscode/' && vscode=true
|
|
60
|
+
{
|
|
61
|
+
echo "rust=$rust"
|
|
62
|
+
echo "docs=$docs"
|
|
63
|
+
echo "vscode=$vscode"
|
|
64
|
+
} >> "$GITHUB_OUTPUT"
|
|
65
|
+
lint:
|
|
66
|
+
needs: changes
|
|
67
|
+
if: needs.changes.outputs.rust == 'true'
|
|
68
|
+
runs-on: ubuntu-latest
|
|
69
|
+
steps:
|
|
70
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
71
|
+
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # master
|
|
72
|
+
with:
|
|
73
|
+
toolchain: stable
|
|
74
|
+
components: rustfmt, clippy
|
|
75
|
+
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
|
|
76
|
+
- run: cargo fmt --check
|
|
77
|
+
- run: cargo clippy --locked --workspace --all-targets --all-features -- -D warnings
|
|
78
|
+
|
|
79
|
+
test:
|
|
80
|
+
needs: changes
|
|
81
|
+
if: needs.changes.outputs.rust == 'true'
|
|
82
|
+
strategy:
|
|
83
|
+
matrix:
|
|
84
|
+
os: [ubuntu-latest, windows-latest, macos-latest]
|
|
85
|
+
runs-on: ${{ matrix.os }}
|
|
86
|
+
steps:
|
|
87
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
88
|
+
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # master
|
|
89
|
+
with:
|
|
90
|
+
toolchain: stable
|
|
91
|
+
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
|
|
92
|
+
- run: cargo test --locked --workspace
|
|
93
|
+
|
|
94
|
+
msrv:
|
|
95
|
+
needs: changes
|
|
96
|
+
if: needs.changes.outputs.rust == 'true'
|
|
97
|
+
runs-on: ubuntu-latest
|
|
98
|
+
steps:
|
|
99
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
100
|
+
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # master
|
|
101
|
+
with:
|
|
102
|
+
toolchain: 1.95
|
|
103
|
+
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
|
|
104
|
+
- run: cargo check --locked --workspace --all-targets
|
|
105
|
+
|
|
106
|
+
# Licences, duplicate crates, unknown sources and RUSTSEC advisories (deny.toml).
|
|
107
|
+
deny:
|
|
108
|
+
needs: changes
|
|
109
|
+
if: needs.changes.outputs.rust == 'true'
|
|
110
|
+
runs-on: ubuntu-latest
|
|
111
|
+
steps:
|
|
112
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
113
|
+
- uses: EmbarkStudios/cargo-deny-action@3c6349835b2b7b196a839186cb8b78e02f7b5f25 # v2
|
|
114
|
+
with:
|
|
115
|
+
command: check
|
|
116
|
+
|
|
117
|
+
# Documentation examples, spelling of user-visible text, and unused dependencies.
|
|
118
|
+
extras:
|
|
119
|
+
needs: changes
|
|
120
|
+
if: needs.changes.outputs.rust == 'true'
|
|
121
|
+
runs-on: ubuntu-latest
|
|
122
|
+
steps:
|
|
123
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
124
|
+
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # master
|
|
125
|
+
with:
|
|
126
|
+
toolchain: stable
|
|
127
|
+
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # master
|
|
128
|
+
with:
|
|
129
|
+
toolchain: nightly
|
|
130
|
+
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
|
|
131
|
+
- uses: taiki-e/install-action@4076c08d76dba979c11a7285295b0716c1d67908 # v2
|
|
132
|
+
with:
|
|
133
|
+
tool: cargo-machete@0.9.2
|
|
134
|
+
- run: cargo test --locked --workspace --doc
|
|
135
|
+
- uses: crate-ci/typos@512fc24f32f44ab01972217aaaf3dc86ec234d53 # v1.50.2
|
|
136
|
+
- run: cargo machete
|
|
137
|
+
# The fuzz targets are a separate crate on nightly, so nothing else compiles them; without
|
|
138
|
+
# this a broken target is only found by the nightly fuzz run, seven minutes in.
|
|
139
|
+
- run: cargo +nightly check --manifest-path fuzz/Cargo.toml --bins
|
|
140
|
+
|
|
141
|
+
# The published documentation, built the way Read the Docs builds it. `--strict` fails on a link
|
|
142
|
+
# to a page that does not exist, which is the way documentation usually rots.
|
|
143
|
+
docs:
|
|
144
|
+
needs: changes
|
|
145
|
+
if: needs.changes.outputs.docs == 'true' || needs.changes.outputs.rust == 'true'
|
|
146
|
+
runs-on: ubuntu-latest
|
|
147
|
+
steps:
|
|
148
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
149
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
|
|
150
|
+
with:
|
|
151
|
+
python-version: "3.13"
|
|
152
|
+
- run: pip install --retries 10 --timeout 60 -r docs/requirements.txt
|
|
153
|
+
- run: mkdocs build --strict --site-dir /tmp/site
|
|
154
|
+
# Rule tables and counts are generated from the binary, because hand-written ones drifted:
|
|
155
|
+
# the site once said 58 lint rules while the binary had 66. Only a change to the crate can
|
|
156
|
+
# make them stale, so the build that checks them is skipped for prose.
|
|
157
|
+
- if: needs.changes.outputs.rust == 'true'
|
|
158
|
+
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # master
|
|
159
|
+
with:
|
|
160
|
+
toolchain: stable
|
|
161
|
+
- if: needs.changes.outputs.rust == 'true'
|
|
162
|
+
uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
|
|
163
|
+
- if: needs.changes.outputs.rust == 'true'
|
|
164
|
+
run: cargo build --release
|
|
165
|
+
- if: needs.changes.outputs.rust == 'true'
|
|
166
|
+
run: python scripts/gen_rule_docs.py --check
|
|
167
|
+
|
|
168
|
+
# The VS Code client is a launcher, not logic, but it still has to compile: a type error here
|
|
169
|
+
# would only be found when someone tried to package a release.
|
|
170
|
+
vscode:
|
|
171
|
+
needs: changes
|
|
172
|
+
if: needs.changes.outputs.vscode == 'true'
|
|
173
|
+
runs-on: ubuntu-latest
|
|
174
|
+
steps:
|
|
175
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
176
|
+
- uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v5
|
|
177
|
+
with:
|
|
178
|
+
# 22.18 or newer: the generator self-check runs as TypeScript under
|
|
179
|
+
# `node --experimental-strip-types`, with no build step of its own.
|
|
180
|
+
node-version: "22.18"
|
|
181
|
+
cache: npm
|
|
182
|
+
cache-dependency-path: editors/vscode/package-lock.json
|
|
183
|
+
- run: npm ci
|
|
184
|
+
working-directory: editors/vscode
|
|
185
|
+
- run: npm run compile
|
|
186
|
+
working-directory: editors/vscode
|
|
187
|
+
# The generators, and the grammar against a tokenized sample.
|
|
188
|
+
- run: npm test
|
|
189
|
+
working-directory: editors/vscode
|
|
190
|
+
|
|
191
|
+
# How much of the code the tests reach; a number per pull request, not a gate.
|
|
192
|
+
coverage:
|
|
193
|
+
needs: changes
|
|
194
|
+
if: needs.changes.outputs.rust == 'true'
|
|
195
|
+
runs-on: ubuntu-latest
|
|
196
|
+
steps:
|
|
197
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
198
|
+
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # master
|
|
199
|
+
with:
|
|
200
|
+
toolchain: stable
|
|
201
|
+
components: llvm-tools-preview
|
|
202
|
+
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
|
|
203
|
+
- uses: taiki-e/install-action@4076c08d76dba979c11a7285295b0716c1d67908 # v2
|
|
204
|
+
with:
|
|
205
|
+
tool: cargo-llvm-cov@0.9.1
|
|
206
|
+
- name: Measure
|
|
207
|
+
run: |
|
|
208
|
+
cargo llvm-cov --locked --workspace --lcov --output-path lcov.info
|
|
209
|
+
{
|
|
210
|
+
echo "## Coverage"
|
|
211
|
+
echo
|
|
212
|
+
echo '```'
|
|
213
|
+
cargo llvm-cov report --summary-only
|
|
214
|
+
echo '```'
|
|
215
|
+
} >> "$GITHUB_STEP_SUMMARY"
|
|
216
|
+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
|
217
|
+
with:
|
|
218
|
+
name: coverage
|
|
219
|
+
path: lcov.info
|
|
220
|
+
|
|
221
|
+
# Changes to the public library API against the base branch. Reported, not enforced: speja
|
|
222
|
+
# is still 0.x, and the API may change with a minor version.
|
|
223
|
+
semver:
|
|
224
|
+
needs: changes
|
|
225
|
+
if: github.event_name == 'pull_request' && needs.changes.outputs.rust == 'true'
|
|
226
|
+
runs-on: ubuntu-latest
|
|
227
|
+
continue-on-error: true
|
|
228
|
+
steps:
|
|
229
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
230
|
+
with:
|
|
231
|
+
fetch-depth: 0
|
|
232
|
+
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # master
|
|
233
|
+
with:
|
|
234
|
+
toolchain: stable
|
|
235
|
+
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
|
|
236
|
+
- uses: taiki-e/install-action@4076c08d76dba979c11a7285295b0716c1d67908 # v2
|
|
237
|
+
with:
|
|
238
|
+
tool: cargo-semver-checks@0.50.0
|
|
239
|
+
- env:
|
|
240
|
+
BASE: ${{ github.base_ref }}
|
|
241
|
+
run: cargo semver-checks --baseline-rev "origin/$BASE"
|
|
242
|
+
|
|
243
|
+
# Timings of this pull request against its base (warns, never fails: shared runners).
|
|
244
|
+
bench:
|
|
245
|
+
needs: changes
|
|
246
|
+
if: github.event_name == 'pull_request' && needs.changes.outputs.rust == 'true'
|
|
247
|
+
runs-on: ubuntu-latest
|
|
248
|
+
steps:
|
|
249
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
250
|
+
with:
|
|
251
|
+
fetch-depth: 0
|
|
252
|
+
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # master
|
|
253
|
+
with:
|
|
254
|
+
toolchain: stable
|
|
255
|
+
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
|
|
256
|
+
- name: This pull request
|
|
257
|
+
run: cargo run --locked --release --example bench > head.txt
|
|
258
|
+
- name: Its base
|
|
259
|
+
env:
|
|
260
|
+
BASE: ${{ github.base_ref }}
|
|
261
|
+
run: |
|
|
262
|
+
git checkout --detach "origin/$BASE"
|
|
263
|
+
cargo run --locked --release --example bench > base.txt
|
|
264
|
+
git checkout -
|
|
265
|
+
- run: python3 scripts/compare_bench.py base.txt head.txt
|
|
266
|
+
|
|
267
|
+
# Whether speja can run inside an airgap is a question with an answer, not a promise: the
|
|
268
|
+
# binary is exercised with no network at all, and traced to show it does not even try to open
|
|
269
|
+
# a socket. See docs/airgapped.md.
|
|
270
|
+
airgap:
|
|
271
|
+
needs: changes
|
|
272
|
+
if: needs.changes.outputs.rust == 'true'
|
|
273
|
+
runs-on: ubuntu-latest
|
|
274
|
+
steps:
|
|
275
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
276
|
+
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # master
|
|
277
|
+
with:
|
|
278
|
+
toolchain: stable
|
|
279
|
+
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
|
|
280
|
+
- run: cargo build --locked --release
|
|
281
|
+
- run: sudo apt-get update && sudo apt-get install -y strace
|
|
282
|
+
|
|
283
|
+
# A dependency that cannot speak a network protocol cannot phone home whatever the code
|
|
284
|
+
# around it does. `tokio` is here for the language server's stdio transport and is built
|
|
285
|
+
# without its `net` feature, so it has no sockets to offer.
|
|
286
|
+
- name: No dependency is a network client
|
|
287
|
+
run: |
|
|
288
|
+
cargo tree --locked --edges normal --prefix none \
|
|
289
|
+
| awk '{ print $1 }' | sort -u > crates.txt
|
|
290
|
+
if grep -qxE 'reqwest|hyper|h2|curl|ureq|isahc|attohttpc|surf|native-tls|rustls|openssl|openssl-sys|tokio-tungstenite|async-std' crates.txt; then
|
|
291
|
+
echo "A network client is in the dependency tree:"
|
|
292
|
+
grep -xE 'reqwest|hyper|h2|curl|ureq|isahc|attohttpc|surf|native-tls|rustls|openssl|openssl-sys|tokio-tungstenite|async-std' crates.txt
|
|
293
|
+
exit 1
|
|
294
|
+
fi
|
|
295
|
+
echo "$(wc -l < crates.txt) crates, none of them a network client."
|
|
296
|
+
|
|
297
|
+
# `socketpair` is allowed: it connects two processes on this machine and cannot name a
|
|
298
|
+
# remote host. Anything that can address one fails the job.
|
|
299
|
+
- name: The binary imports no symbol that can reach a host
|
|
300
|
+
run: |
|
|
301
|
+
if nm -D target/release/speja \
|
|
302
|
+
| grep -E ' U (socket|connect|bind|listen|accept|sendto|recvfrom|getaddrinfo|gethostbyname)@'; then
|
|
303
|
+
echo "The binary imports a symbol that can reach a network."
|
|
304
|
+
exit 1
|
|
305
|
+
fi
|
|
306
|
+
echo "No networking symbols imported."
|
|
307
|
+
|
|
308
|
+
- name: Everything works with no network at all
|
|
309
|
+
run: |
|
|
310
|
+
printf 'entity dut is\nend entity dut;\n' > dut.vhd
|
|
311
|
+
sudo unshare -n bash -eu -c '
|
|
312
|
+
# Prove the isolation before trusting anything that runs inside it: a namespace
|
|
313
|
+
# with a route to the outside would make the rest of this step meaningless.
|
|
314
|
+
if [ "$(ip -brief address | grep -cv "^lo ")" -ne 0 ]; then
|
|
315
|
+
ip -brief address; echo "the namespace has an external interface"; exit 1
|
|
316
|
+
fi
|
|
317
|
+
if timeout 5 bash -c "exec 3<>/dev/tcp/1.1.1.1/53" 2>/dev/null; then
|
|
318
|
+
echo "the network is still reachable"; exit 1
|
|
319
|
+
fi
|
|
320
|
+
bin=target/release/speja
|
|
321
|
+
"$bin" --version
|
|
322
|
+
"$bin" --check style,lint dut.vhd
|
|
323
|
+
"$bin" --fix --diff dut.vhd > /dev/null
|
|
324
|
+
"$bin" --explain lint_771 > /dev/null
|
|
325
|
+
"$bin" --list_rules > /dev/null
|
|
326
|
+
echo "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"server/discover\"}" \
|
|
327
|
+
| "$bin" mcp | grep -q supportedVersions
|
|
328
|
+
'
|
|
329
|
+
echo "The command line, the rule set and the MCP server all work with no network."
|
|
330
|
+
|
|
331
|
+
# Stronger than "no network was available": it never asks for one.
|
|
332
|
+
- name: It does not even try to open a socket
|
|
333
|
+
run: |
|
|
334
|
+
strace -f -qq -e trace=%network -o net.log \
|
|
335
|
+
target/release/speja --check style,lint dut.vhd || true
|
|
336
|
+
if grep -vE 'socketpair|^\+\+\+|^---|unfinished|resumed' net.log | grep -q .; then
|
|
337
|
+
echo "The run made a network syscall:"
|
|
338
|
+
cat net.log
|
|
339
|
+
exit 1
|
|
340
|
+
fi
|
|
341
|
+
echo "Zero network syscalls."
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# How close speja is to VSG, measured rather than asserted: both tools run over the same corpus
|
|
2
|
+
# and the findings are compared per rule (scripts/compare_vsg.py). Weekly, because it installs
|
|
3
|
+
# VSG and takes minutes; the numbers land in the job summary.
|
|
4
|
+
#
|
|
5
|
+
# `compare` and `configured` pin the version speja targets, so their numbers are comparable from
|
|
6
|
+
# week to week. `latest` installs whatever VSG released most recently, which is how a new release
|
|
7
|
+
# is noticed here rather than in someone's pipeline.
|
|
8
|
+
name: Compatibility
|
|
9
|
+
|
|
10
|
+
on:
|
|
11
|
+
schedule:
|
|
12
|
+
# 04:17 UTC on Mondays.
|
|
13
|
+
- cron: "17 4 * * 1"
|
|
14
|
+
workflow_dispatch:
|
|
15
|
+
inputs:
|
|
16
|
+
files:
|
|
17
|
+
description: How many corpus files to compare
|
|
18
|
+
default: "200"
|
|
19
|
+
|
|
20
|
+
permissions:
|
|
21
|
+
contents: read
|
|
22
|
+
|
|
23
|
+
jobs:
|
|
24
|
+
compare:
|
|
25
|
+
runs-on: ubuntu-latest
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
28
|
+
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # master
|
|
29
|
+
with:
|
|
30
|
+
toolchain: stable
|
|
31
|
+
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
|
|
32
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
|
|
33
|
+
with:
|
|
34
|
+
python-version: "3.13"
|
|
35
|
+
|
|
36
|
+
# VUnit's own VHDL is the corpus: real code, a fixed revision, and it exercises packages,
|
|
37
|
+
# testbenches and verification components.
|
|
38
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
39
|
+
with:
|
|
40
|
+
repository: VUnit/vunit
|
|
41
|
+
ref: bbbe9caba5278dd8057020edc3aeb5f223c0e037
|
|
42
|
+
path: corpus
|
|
43
|
+
persist-credentials: false
|
|
44
|
+
|
|
45
|
+
- run: pip install --retries 10 --timeout 60 vsg==3.35.0
|
|
46
|
+
- run: cargo build --locked --release
|
|
47
|
+
|
|
48
|
+
- name: Compare
|
|
49
|
+
env:
|
|
50
|
+
HOW_MANY: ${{ inputs.files || '200' }}
|
|
51
|
+
run: |
|
|
52
|
+
# The third-party OSVVM copy under examples/ is not VUnit's own style.
|
|
53
|
+
find corpus/vunit/vhdl corpus/examples/vhdl -name '*.vhd' \
|
|
54
|
+
| grep -v osvvm | sort | head -n "$HOW_MANY" > files.txt
|
|
55
|
+
python3 scripts/compare_vsg.py --vsg vsg --speja target/release/speja \
|
|
56
|
+
--markdown "$GITHUB_STEP_SUMMARY" $(cat files.txt)
|
|
57
|
+
|
|
58
|
+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
|
59
|
+
if: always()
|
|
60
|
+
with:
|
|
61
|
+
name: compatibility
|
|
62
|
+
path: .compare
|
|
63
|
+
|
|
64
|
+
# open-logic configures 825 rules, far more of VSG's option surface than VUnit does, so it
|
|
65
|
+
# measures how well the configuration is honoured rather than how well the rules are written.
|
|
66
|
+
configured:
|
|
67
|
+
runs-on: ubuntu-latest
|
|
68
|
+
steps:
|
|
69
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
70
|
+
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # master
|
|
71
|
+
with:
|
|
72
|
+
toolchain: stable
|
|
73
|
+
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
|
|
74
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
|
|
75
|
+
with:
|
|
76
|
+
python-version: "3.13"
|
|
77
|
+
|
|
78
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
79
|
+
with:
|
|
80
|
+
repository: open-logic/open-logic
|
|
81
|
+
ref: ecca8af95295e798b8a3bc6610cb52be9688ae01
|
|
82
|
+
path: configured
|
|
83
|
+
persist-credentials: false
|
|
84
|
+
|
|
85
|
+
- run: pip install --retries 10 --timeout 60 vsg==3.35.0
|
|
86
|
+
- run: cargo build --locked --release
|
|
87
|
+
|
|
88
|
+
- name: Compare
|
|
89
|
+
env:
|
|
90
|
+
HOW_MANY: ${{ inputs.files || '200' }}
|
|
91
|
+
run: |
|
|
92
|
+
# Their configuration names rules that VSG 3.35 has renamed, and refuses to load
|
|
93
|
+
# without this; see scripts/migrate_vsg_config.py.
|
|
94
|
+
python3 scripts/migrate_vsg_config.py \
|
|
95
|
+
configured/lint/config/vsg_config.yml > configured_config.yml
|
|
96
|
+
# Their own exclusions: third-party sources and one incomplete documentation example.
|
|
97
|
+
find configured/src configured/test -name '*.vhd' \
|
|
98
|
+
| grep -v RbExample | sort | head -n "$HOW_MANY" > configured_files.txt
|
|
99
|
+
python3 scripts/compare_vsg.py --vsg vsg --speja target/release/speja \
|
|
100
|
+
-c configured_config.yml --out .compare-configured \
|
|
101
|
+
--markdown "$GITHUB_STEP_SUMMARY" $(cat configured_files.txt)
|
|
102
|
+
|
|
103
|
+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
|
104
|
+
if: always()
|
|
105
|
+
with:
|
|
106
|
+
name: compatibility-configured
|
|
107
|
+
path: .compare-configured
|
|
108
|
+
|
|
109
|
+
# Whatever VSG released most recently. This job exists to notice a new VSG release and what it
|
|
110
|
+
# changes; it is expected to differ more than the pinned jobs, and it never gates anything.
|
|
111
|
+
latest:
|
|
112
|
+
runs-on: ubuntu-latest
|
|
113
|
+
steps:
|
|
114
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
115
|
+
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # master
|
|
116
|
+
with:
|
|
117
|
+
toolchain: stable
|
|
118
|
+
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
|
|
119
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
|
|
120
|
+
with:
|
|
121
|
+
python-version: "3.13"
|
|
122
|
+
|
|
123
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
124
|
+
with:
|
|
125
|
+
repository: VUnit/vunit
|
|
126
|
+
ref: bbbe9caba5278dd8057020edc3aeb5f223c0e037
|
|
127
|
+
path: corpus
|
|
128
|
+
persist-credentials: false
|
|
129
|
+
|
|
130
|
+
- run: pip install --retries 10 --timeout 60 --upgrade vsg
|
|
131
|
+
- run: cargo build --locked --release
|
|
132
|
+
|
|
133
|
+
- name: Which VSG, and which one speja targets
|
|
134
|
+
run: |
|
|
135
|
+
{
|
|
136
|
+
echo "## Latest VSG"
|
|
137
|
+
echo
|
|
138
|
+
echo "| | |"
|
|
139
|
+
echo "|---|---|"
|
|
140
|
+
echo "| Released | $(vsg --version | head -n1) |"
|
|
141
|
+
echo "| speja targets | $(target/release/speja --version) |"
|
|
142
|
+
} >> "$GITHUB_STEP_SUMMARY"
|
|
143
|
+
|
|
144
|
+
- name: Compare
|
|
145
|
+
env:
|
|
146
|
+
HOW_MANY: ${{ inputs.files || '200' }}
|
|
147
|
+
run: |
|
|
148
|
+
find corpus/vunit/vhdl corpus/examples/vhdl -name '*.vhd' \
|
|
149
|
+
| grep -v osvvm | sort | head -n "$HOW_MANY" > files.txt
|
|
150
|
+
python3 scripts/compare_vsg.py --vsg vsg --speja target/release/speja \
|
|
151
|
+
--out .compare-latest --markdown "$GITHUB_STEP_SUMMARY" $(cat files.txt)
|
|
152
|
+
|
|
153
|
+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
|
154
|
+
if: always()
|
|
155
|
+
with:
|
|
156
|
+
name: compatibility-latest
|
|
157
|
+
path: .compare-latest
|
|
158
|
+
|
|
159
|
+
# What speja's own rules report over the whole of both corpora, against what they reported
|
|
160
|
+
# last time. The layer's claim is that a finding is proven, and three rules were once found
|
|
161
|
+
# reporting false positives on code they had never been run over: each had been validated
|
|
162
|
+
# against a subset of a corpus rather than all of it. A count that moves has to be explained.
|
|
163
|
+
precision:
|
|
164
|
+
name: Native rule findings
|
|
165
|
+
runs-on: ubuntu-latest
|
|
166
|
+
steps:
|
|
167
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
168
|
+
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # master
|
|
169
|
+
with:
|
|
170
|
+
toolchain: stable
|
|
171
|
+
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
|
|
172
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
173
|
+
with:
|
|
174
|
+
repository: VUnit/vunit
|
|
175
|
+
ref: bbbe9caba5278dd8057020edc3aeb5f223c0e037
|
|
176
|
+
path: corpora/vunit
|
|
177
|
+
persist-credentials: false
|
|
178
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
179
|
+
with:
|
|
180
|
+
repository: open-logic/open-logic
|
|
181
|
+
ref: ecca8af95295e798b8a3bc6610cb52be9688ae01
|
|
182
|
+
path: corpora/open-logic
|
|
183
|
+
persist-credentials: false
|
|
184
|
+
- run: cargo build --locked --release
|
|
185
|
+
- name: Compare with what these rules reported last time
|
|
186
|
+
run: |
|
|
187
|
+
python3 scripts/corpus_findings.py --check \
|
|
188
|
+
--binary target/release/speja \
|
|
189
|
+
--summary "$GITHUB_STEP_SUMMARY" \
|
|
190
|
+
corpora/vunit corpora/open-logic
|