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.
Files changed (323) hide show
  1. speja-0.13.0/.claude-plugin/marketplace.json +14 -0
  2. speja-0.13.0/.claude-plugin/plugin.json +12 -0
  3. speja-0.13.0/.github/dependabot.yml +35 -0
  4. speja-0.13.0/.github/workflows/action.yml +62 -0
  5. speja-0.13.0/.github/workflows/ci.yml +341 -0
  6. speja-0.13.0/.github/workflows/compatibility.yml +190 -0
  7. speja-0.13.0/.github/workflows/fuzz.yml +52 -0
  8. speja-0.13.0/.github/workflows/release.yml +408 -0
  9. speja-0.13.0/.gitignore +11 -0
  10. speja-0.13.0/.mcp.json +8 -0
  11. speja-0.13.0/.pre-commit-hooks.yaml +16 -0
  12. speja-0.13.0/.readthedocs.yaml +14 -0
  13. speja-0.13.0/CHANGELOG.md +418 -0
  14. speja-0.13.0/CONTRIBUTING.md +77 -0
  15. speja-0.13.0/Cargo.lock +1129 -0
  16. speja-0.13.0/Cargo.toml +53 -0
  17. speja-0.13.0/LICENSE-APACHE +201 -0
  18. speja-0.13.0/LICENSE-MIT +25 -0
  19. speja-0.13.0/NOTICE +33 -0
  20. speja-0.13.0/PKG-INFO +307 -0
  21. speja-0.13.0/README.md +276 -0
  22. speja-0.13.0/THIRD_PARTY_LICENSES.md +138 -0
  23. speja-0.13.0/_typos.toml +21 -0
  24. speja-0.13.0/action.yml +138 -0
  25. speja-0.13.0/build.rs +52 -0
  26. speja-0.13.0/clippy.toml +1 -0
  27. speja-0.13.0/deny.toml +46 -0
  28. speja-0.13.0/docs/airgapped.md +134 -0
  29. speja-0.13.0/docs/architecture.md +120 -0
  30. speja-0.13.0/docs/assets/favicon.png +0 -0
  31. speja-0.13.0/docs/assets/speja-logo-dark.png +0 -0
  32. speja-0.13.0/docs/assets/speja-logo.png +0 -0
  33. speja-0.13.0/docs/claude-code.md +49 -0
  34. speja-0.13.0/docs/cli.md +91 -0
  35. speja-0.13.0/docs/compatibility.md +198 -0
  36. speja-0.13.0/docs/editors.md +80 -0
  37. speja-0.13.0/docs/formatting.md +197 -0
  38. speja-0.13.0/docs/github-action.md +85 -0
  39. speja-0.13.0/docs/gitlab-ci.md +38 -0
  40. speja-0.13.0/docs/index.md +76 -0
  41. speja-0.13.0/docs/line-folding-coverage.md +98 -0
  42. speja-0.13.0/docs/line-folding.md +122 -0
  43. speja-0.13.0/docs/lint.md +194 -0
  44. speja-0.13.0/docs/lsp.md +117 -0
  45. speja-0.13.0/docs/mcp.md +88 -0
  46. speja-0.13.0/docs/migrating-from-vsg.md +108 -0
  47. speja-0.13.0/docs/native-rules.md +910 -0
  48. speja-0.13.0/docs/performance.md +24 -0
  49. speja-0.13.0/docs/project-setup.md +121 -0
  50. speja-0.13.0/docs/quick-start.md +94 -0
  51. speja-0.13.0/docs/releasing.md +139 -0
  52. speja-0.13.0/docs/reports.md +104 -0
  53. speja-0.13.0/docs/requirements.txt +3 -0
  54. speja-0.13.0/docs/roadmap.md +65 -0
  55. speja-0.13.0/docs/rule-counts.md +14 -0
  56. speja-0.13.0/docs/rule-reference.md +116 -0
  57. speja-0.13.0/docs/rule-status.md +242 -0
  58. speja-0.13.0/docs/upstream-notes.md +28 -0
  59. speja-0.13.0/docs/vhdl-frontend.md +84 -0
  60. speja-0.13.0/docs/vscode-editing.md +210 -0
  61. speja-0.13.0/docs/vsg-config.md +247 -0
  62. speja-0.13.0/docs/waivers.md +58 -0
  63. speja-0.13.0/editors/vscode/.gitignore +7 -0
  64. speja-0.13.0/editors/vscode/.vscode/launch.json +13 -0
  65. speja-0.13.0/editors/vscode/.vscode/tasks.json +11 -0
  66. speja-0.13.0/editors/vscode/.vscodeignore +9 -0
  67. speja-0.13.0/editors/vscode/README.md +121 -0
  68. speja-0.13.0/editors/vscode/docs/development.md +73 -0
  69. speja-0.13.0/editors/vscode/docs/formatting.md +138 -0
  70. speja-0.13.0/editors/vscode/docs/server-selection.md +49 -0
  71. speja-0.13.0/editors/vscode/icon.png +0 -0
  72. speja-0.13.0/editors/vscode/language-configuration.json +15 -0
  73. speja-0.13.0/editors/vscode/package-lock.json +3988 -0
  74. speja-0.13.0/editors/vscode/package.json +452 -0
  75. speja-0.13.0/editors/vscode/scripts/check-grammar.mjs +93 -0
  76. speja-0.13.0/editors/vscode/scripts/check-themes.mjs +142 -0
  77. speja-0.13.0/editors/vscode/scripts/gen-themes.mjs +109 -0
  78. speja-0.13.0/editors/vscode/scripts/package.mjs +98 -0
  79. speja-0.13.0/editors/vscode/scripts/palettes.json +1601 -0
  80. speja-0.13.0/editors/vscode/scripts/probe.mjs +36 -0
  81. speja-0.13.0/editors/vscode/src/editing.ts +1209 -0
  82. speja-0.13.0/editors/vscode/src/extension.ts +219 -0
  83. speja-0.13.0/editors/vscode/src/generate.test.ts +290 -0
  84. speja-0.13.0/editors/vscode/src/generate.ts +533 -0
  85. speja-0.13.0/editors/vscode/syntaxes/vhdl.tmLanguage.json +122 -0
  86. speja-0.13.0/editors/vscode/test/smoke/run.mjs +220 -0
  87. speja-0.13.0/editors/vscode/test/smoke/suite.js +445 -0
  88. speja-0.13.0/editors/vscode/themes/afterglow.json +162 -0
  89. speja-0.13.0/editors/vscode/themes/bamboo-multiplex.json +162 -0
  90. speja-0.13.0/editors/vscode/themes/bamboo-vulgaris.json +162 -0
  91. speja-0.13.0/editors/vscode/themes/blue-moon.json +162 -0
  92. speja-0.13.0/editors/vscode/themes/carbonfox.json +162 -0
  93. speja-0.13.0/editors/vscode/themes/catppuccin-frappe.json +162 -0
  94. speja-0.13.0/editors/vscode/themes/catppuccin-macchiato.json +162 -0
  95. speja-0.13.0/editors/vscode/themes/catppuccin-mocha.json +162 -0
  96. speja-0.13.0/editors/vscode/themes/deus.json +162 -0
  97. speja-0.13.0/editors/vscode/themes/dogrun.json +162 -0
  98. speja-0.13.0/editors/vscode/themes/dracula.json +162 -0
  99. speja-0.13.0/editors/vscode/themes/duskfox.json +162 -0
  100. speja-0.13.0/editors/vscode/themes/everforest-hard.json +162 -0
  101. speja-0.13.0/editors/vscode/themes/everforest-medium.json +162 -0
  102. speja-0.13.0/editors/vscode/themes/everforest-soft.json +162 -0
  103. speja-0.13.0/editors/vscode/themes/gruvbox-material-hard.json +162 -0
  104. speja-0.13.0/editors/vscode/themes/gruvbox-material-medium.json +162 -0
  105. speja-0.13.0/editors/vscode/themes/gruvbox-material-soft.json +162 -0
  106. speja-0.13.0/editors/vscode/themes/gruvbox-vhdl-dark.json +162 -0
  107. speja-0.13.0/editors/vscode/themes/gruvbox-vhdl-light.json +162 -0
  108. speja-0.13.0/editors/vscode/themes/kanagawa-dragon.json +162 -0
  109. speja-0.13.0/editors/vscode/themes/kanagawa-wave.json +162 -0
  110. speja-0.13.0/editors/vscode/themes/koda-moss.json +162 -0
  111. speja-0.13.0/editors/vscode/themes/luna.json +162 -0
  112. speja-0.13.0/editors/vscode/themes/moonfly.json +162 -0
  113. speja-0.13.0/editors/vscode/themes/nightfox.json +162 -0
  114. speja-0.13.0/editors/vscode/themes/nordfox.json +162 -0
  115. speja-0.13.0/editors/vscode/themes/onedark.json +162 -0
  116. speja-0.13.0/editors/vscode/themes/onedarkpro-dark.json +162 -0
  117. speja-0.13.0/editors/vscode/themes/onedarkpro-onedark.json +162 -0
  118. speja-0.13.0/editors/vscode/themes/onedarkpro-vivid.json +162 -0
  119. speja-0.13.0/editors/vscode/themes/oxocarbon.json +162 -0
  120. speja-0.13.0/editors/vscode/themes/papercolor.json +162 -0
  121. speja-0.13.0/editors/vscode/themes/tender.json +162 -0
  122. speja-0.13.0/editors/vscode/themes/terafox.json +162 -0
  123. speja-0.13.0/editors/vscode/themes/tokyonight-moon.json +162 -0
  124. speja-0.13.0/editors/vscode/themes/tokyonight-night.json +162 -0
  125. speja-0.13.0/editors/vscode/themes/tokyonight-storm.json +162 -0
  126. speja-0.13.0/editors/vscode/themes/torchlight-dusk.json +162 -0
  127. speja-0.13.0/editors/vscode/themes/torchlight.json +162 -0
  128. speja-0.13.0/editors/vscode/themes/unokai.json +162 -0
  129. speja-0.13.0/editors/vscode/themes/vague.json +162 -0
  130. speja-0.13.0/editors/vscode/themes/vscode.json +162 -0
  131. speja-0.13.0/editors/vscode/tsconfig.json +22 -0
  132. speja-0.13.0/examples/bench.rs +118 -0
  133. speja-0.13.0/examples/corpus.rs +146 -0
  134. speja-0.13.0/examples/layout_keys.rs +33 -0
  135. speja-0.13.0/mkdocs.yml +74 -0
  136. speja-0.13.0/plans/analysis-and-lsp.md +453 -0
  137. speja-0.13.0/pyproject.toml +43 -0
  138. speja-0.13.0/python/speja/__init__.py +29 -0
  139. speja-0.13.0/python/speja/__main__.py +22 -0
  140. speja-0.13.0/python/tests/smoke.py +67 -0
  141. speja-0.13.0/scripts/compare_bench.py +74 -0
  142. speja-0.13.0/scripts/compare_vsg.py +177 -0
  143. speja-0.13.0/scripts/corpus_findings.py +109 -0
  144. speja-0.13.0/scripts/gen_rule_docs.py +269 -0
  145. speja-0.13.0/scripts/gen_spacing_rules.py +155 -0
  146. speja-0.13.0/scripts/github_action_report.py +356 -0
  147. speja-0.13.0/scripts/learn_layout_rules.py +100 -0
  148. speja-0.13.0/scripts/migrate_vsg_config.py +64 -0
  149. speja-0.13.0/skills/vsg/SKILL.md +106 -0
  150. speja-0.13.0/src/align.rs +442 -0
  151. speja-0.13.0/src/analysis/calls.rs +194 -0
  152. speja-0.13.0/src/analysis/choices.rs +436 -0
  153. speja-0.13.0/src/analysis/clockdomain.rs +417 -0
  154. speja-0.13.0/src/analysis/combinational.rs +315 -0
  155. speja-0.13.0/src/analysis/design.rs +1258 -0
  156. speja-0.13.0/src/analysis/elaborate.rs +1018 -0
  157. speja-0.13.0/src/analysis/evaluated.rs +618 -0
  158. speja-0.13.0/src/analysis/flow.rs +406 -0
  159. speja-0.13.0/src/analysis/fsm.rs +360 -0
  160. speja-0.13.0/src/analysis/lint.rs +854 -0
  161. speja-0.13.0/src/analysis/mod.rs +190 -0
  162. speja-0.13.0/src/analysis/resetdomain.rs +382 -0
  163. speja-0.13.0/src/analysis/suspend.rs +193 -0
  164. speja-0.13.0/src/analysis/testbench.rs +231 -0
  165. speja-0.13.0/src/analysis/width.rs +357 -0
  166. speja-0.13.0/src/blank.rs +649 -0
  167. speja-0.13.0/src/config.rs +1292 -0
  168. speja-0.13.0/src/doc.rs +655 -0
  169. speja-0.13.0/src/fix.rs +307 -0
  170. speja-0.13.0/src/format.rs +1738 -0
  171. speja-0.13.0/src/fuzz.rs +262 -0
  172. speja-0.13.0/src/indent.rs +448 -0
  173. speja-0.13.0/src/keywords.rs +310 -0
  174. speja-0.13.0/src/layout.rs +441 -0
  175. speja-0.13.0/src/layout_rules.json +412 -0
  176. speja-0.13.0/src/lib.rs +723 -0
  177. speja-0.13.0/src/local_rules.rs +164 -0
  178. speja-0.13.0/src/lsp.rs +1065 -0
  179. speja-0.13.0/src/main.rs +13 -0
  180. speja-0.13.0/src/mcp.rs +624 -0
  181. speja-0.13.0/src/organize.rs +314 -0
  182. speja-0.13.0/src/reflow.rs +186 -0
  183. speja-0.13.0/src/rules/case.rs +1008 -0
  184. speja-0.13.0/src/rules/catalog.rs +202 -0
  185. speja-0.13.0/src/rules/length.rs +148 -0
  186. speja-0.13.0/src/rules/mod.rs +413 -0
  187. speja-0.13.0/src/rules/naming.rs +894 -0
  188. speja-0.13.0/src/rules/project.rs +168 -0
  189. speja-0.13.0/src/rules/select.rs +256 -0
  190. speja-0.13.0/src/rules/structure.rs +845 -0
  191. speja-0.13.0/src/rules/transform.rs +1055 -0
  192. speja-0.13.0/src/spacing_rules.json +175 -0
  193. speja-0.13.0/src/verify.rs +83 -0
  194. speja-0.13.0/src/vsg_cli.rs +2497 -0
  195. speja-0.13.0/src/vsg_defaults.json +1 -0
  196. speja-0.13.0/src/vsg_defaults.rs +58 -0
  197. speja-0.13.0/src/waivers.rs +190 -0
  198. speja-0.13.0/tests/analysis.rs +70 -0
  199. speja-0.13.0/tests/cli.rs +1046 -0
  200. speja-0.13.0/tests/corpus-findings.txt +9 -0
  201. speja-0.13.0/tests/corpus-findings.yaml +11 -0
  202. speja-0.13.0/tests/fake_vsg.py +29 -0
  203. speja-0.13.0/tests/formatting/alignment_off.out.vhd +46 -0
  204. speja-0.13.0/tests/formatting/alignment_off.vhd +21 -0
  205. speja-0.13.0/tests/formatting/alignment_off.yaml +8 -0
  206. speja-0.13.0/tests/formatting/assert_report_wait.out.vhd +31 -0
  207. speja-0.13.0/tests/formatting/assert_report_wait.vhd +14 -0
  208. speja-0.13.0/tests/formatting/assignments.out.vhd +54 -0
  209. speja-0.13.0/tests/formatting/assignments.vhd +19 -0
  210. speja-0.13.0/tests/formatting/boundaries.out.vhd +14 -0
  211. speja-0.13.0/tests/formatting/boundaries.vhd +11 -0
  212. speja-0.13.0/tests/formatting/calls_aggregates.out.vhd +59 -0
  213. speja-0.13.0/tests/formatting/calls_aggregates.vhd +15 -0
  214. speja-0.13.0/tests/formatting/comment_spacing.out.vhd +10 -0
  215. speja-0.13.0/tests/formatting/comment_spacing.vhd +6 -0
  216. speja-0.13.0/tests/formatting/comment_spacing.yaml +6 -0
  217. speja-0.13.0/tests/formatting/comments.out.vhd +36 -0
  218. speja-0.13.0/tests/formatting/comments.vhd +28 -0
  219. speja-0.13.0/tests/formatting/conditions.out.vhd +44 -0
  220. speja-0.13.0/tests/formatting/conditions.vhd +21 -0
  221. speja-0.13.0/tests/formatting/configuration_context.out.vhd +26 -0
  222. speja-0.13.0/tests/formatting/configuration_context.vhd +9 -0
  223. speja-0.13.0/tests/formatting/crlf.out.vhd +2 -0
  224. speja-0.13.0/tests/formatting/crlf.vhd +2 -0
  225. speja-0.13.0/tests/formatting/declarations.out.vhd +88 -0
  226. speja-0.13.0/tests/formatting/declarations.vhd +34 -0
  227. speja-0.13.0/tests/formatting/deep_nesting.out.vhd +28 -0
  228. speja-0.13.0/tests/formatting/deep_nesting.vhd +6 -0
  229. speja-0.13.0/tests/formatting/entity_interface.out.vhd +21 -0
  230. speja-0.13.0/tests/formatting/entity_interface.vhd +8 -0
  231. speja-0.13.0/tests/formatting/fmt_off.out.vhd +27 -0
  232. speja-0.13.0/tests/formatting/fmt_off.vhd +22 -0
  233. speja-0.13.0/tests/formatting/generate_case_loop.out.vhd +74 -0
  234. speja-0.13.0/tests/formatting/generate_case_loop.vhd +37 -0
  235. speja-0.13.0/tests/formatting/indent_tokens.out.vhd +29 -0
  236. speja-0.13.0/tests/formatting/indent_tokens.vhd +16 -0
  237. speja-0.13.0/tests/formatting/indent_tokens.yaml +16 -0
  238. speja-0.13.0/tests/formatting/instantiation.out.vhd +56 -0
  239. speja-0.13.0/tests/formatting/instantiation.vhd +14 -0
  240. speja-0.13.0/tests/formatting/keyword_case.out.vhd +14 -0
  241. speja-0.13.0/tests/formatting/keyword_case.vhd +7 -0
  242. speja-0.13.0/tests/formatting/layout_options.out.vhd +43 -0
  243. speja-0.13.0/tests/formatting/layout_options.vhd +17 -0
  244. speja-0.13.0/tests/formatting/layout_options.yaml +12 -0
  245. speja-0.13.0/tests/formatting/protected_types.out.vhd +39 -0
  246. speja-0.13.0/tests/formatting/protected_types.vhd +14 -0
  247. speja-0.13.0/tests/formatting/signatures.out.vhd +18 -0
  248. speja-0.13.0/tests/formatting/signatures.vhd +7 -0
  249. speja-0.13.0/tests/formatting/tool_directives.out.vhd +23 -0
  250. speja-0.13.0/tests/formatting/tool_directives.vhd +16 -0
  251. speja-0.13.0/tests/formatting/unbreakable.out.vhd +15 -0
  252. speja-0.13.0/tests/formatting/unbreakable.vhd +8 -0
  253. speja-0.13.0/tests/golden.rs +84 -0
  254. speja-0.13.0/tests/lsp.rs +1186 -0
  255. speja-0.13.0/tests/regressions/vsg_bug_001.vhd +8 -0
  256. speja-0.13.0/tests/regressions/vsg_bug_002.vhd +7 -0
  257. speja-0.13.0/tests/regressions/vsg_bug_003.vhd +3 -0
  258. speja-0.13.0/tests/regressions/vsg_bug_004.vhd +6 -0
  259. speja-0.13.0/tests/regressions/vsg_bug_005.vhd +13 -0
  260. speja-0.13.0/tests/regressions/vsg_bug_006.vhd +7 -0
  261. speja-0.13.0/tests/regressions/vsg_bug_007.vhd +11 -0
  262. speja-0.13.0/tests/regressions/vsg_bug_008.vhd +21 -0
  263. speja-0.13.0/tests/regressions/vsg_bug_009.vhd +13 -0
  264. speja-0.13.0/tests/regressions/vsg_bug_010.vhd +4 -0
  265. speja-0.13.0/tests/regressions/vsg_bug_011.vhd +4 -0
  266. speja-0.13.0/tests/regressions/vsg_bug_012.vhd +9 -0
  267. speja-0.13.0/tests/regressions/vsg_bug_013.vhd +12 -0
  268. speja-0.13.0/tests/regressions/vsg_bug_014.vhd +10 -0
  269. speja-0.13.0/tests/regressions/vsg_bug_015.vhd +9 -0
  270. speja-0.13.0/tests/regressions/vsg_bug_016.vhd +5 -0
  271. speja-0.13.0/tests/regressions/vsg_bug_017.vhd +8 -0
  272. speja-0.13.0/tests/regressions/vsg_bug_018.vhd +34 -0
  273. speja-0.13.0/tests/regressions/vsg_bug_020.vhd +21 -0
  274. speja-0.13.0/tests/regressions/vsg_bug_021.vhd +30 -0
  275. speja-0.13.0/tests/regressions/vsg_bug_022.vhd +25 -0
  276. speja-0.13.0/tests/regressions/vsg_bug_023.vhd +9 -0
  277. speja-0.13.0/tests/regressions/vsg_bug_024.vhd +8 -0
  278. speja-0.13.0/tests/regressions/vsg_bug_026.vhd +4 -0
  279. speja-0.13.0/tests/regressions/vsg_bug_027.vhd +9 -0
  280. speja-0.13.0/tests/regressions/vsg_bug_028.vhd +8 -0
  281. speja-0.13.0/tests/regressions/vsg_bug_029.vhd +13 -0
  282. speja-0.13.0/tests/regressions/vsg_bug_030.vhd +11 -0
  283. speja-0.13.0/tests/regressions/vsg_bug_034.vhd +15 -0
  284. speja-0.13.0/tests/regressions.rs +146 -0
  285. speja-0.13.0/vendor/vhdl_libraries/ieee2008/README.ieee +30 -0
  286. speja-0.13.0/vendor/vhdl_libraries/ieee2008/fixed_float_types.vhdl +61 -0
  287. speja-0.13.0/vendor/vhdl_libraries/ieee2008/fixed_generic_pkg-body.vhdl +6361 -0
  288. speja-0.13.0/vendor/vhdl_libraries/ieee2008/fixed_generic_pkg.vhdl +1439 -0
  289. speja-0.13.0/vendor/vhdl_libraries/ieee2008/fixed_pkg.vhdl +52 -0
  290. speja-0.13.0/vendor/vhdl_libraries/ieee2008/float_generic_pkg-body.vhdl +5712 -0
  291. speja-0.13.0/vendor/vhdl_libraries/ieee2008/float_generic_pkg.vhdl +1000 -0
  292. speja-0.13.0/vendor/vhdl_libraries/ieee2008/float_pkg.vhdl +55 -0
  293. speja-0.13.0/vendor/vhdl_libraries/ieee2008/ieee_bit_context.vhdl +4 -0
  294. speja-0.13.0/vendor/vhdl_libraries/ieee2008/ieee_std_context.vhdl +5 -0
  295. speja-0.13.0/vendor/vhdl_libraries/ieee2008/math_complex-body.vhdl +1602 -0
  296. speja-0.13.0/vendor/vhdl_libraries/ieee2008/math_complex.vhdl +1083 -0
  297. speja-0.13.0/vendor/vhdl_libraries/ieee2008/math_real-body.vhdl +1927 -0
  298. speja-0.13.0/vendor/vhdl_libraries/ieee2008/math_real.vhdl +625 -0
  299. speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_bit-body.vhdl +3037 -0
  300. speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_bit.vhdl +1592 -0
  301. speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_bit_unsigned-body.vhdl +592 -0
  302. speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_bit_unsigned.vhdl +623 -0
  303. speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_std-body.vhdl +4088 -0
  304. speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_std.vhdl +1685 -0
  305. speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_std_unsigned-body.vhdl +595 -0
  306. speja-0.13.0/vendor/vhdl_libraries/ieee2008/numeric_std_unsigned.vhdl +616 -0
  307. speja-0.13.0/vendor/vhdl_libraries/ieee2008/std_logic_1164-body.vhdl +1572 -0
  308. speja-0.13.0/vendor/vhdl_libraries/ieee2008/std_logic_1164.vhdl +309 -0
  309. speja-0.13.0/vendor/vhdl_libraries/ieee2008/std_logic_textio.vhdl +3 -0
  310. speja-0.13.0/vendor/vhdl_libraries/std/env.vhd +11 -0
  311. speja-0.13.0/vendor/vhdl_libraries/std/standard.vhd +94 -0
  312. speja-0.13.0/vendor/vhdl_libraries/std/textio.vhd +73 -0
  313. speja-0.13.0/vendor/vhdl_libraries/synopsys/std_logic_arith.vhdl +2391 -0
  314. speja-0.13.0/vendor/vhdl_libraries/synopsys/std_logic_misc.vhdl +967 -0
  315. speja-0.13.0/vendor/vhdl_libraries/synopsys/std_logic_signed.vhdl +343 -0
  316. speja-0.13.0/vendor/vhdl_libraries/synopsys/std_logic_unsigned.vhdl +329 -0
  317. speja-0.13.0/vendor/vhdl_libraries/vhdl_ls.toml +7 -0
  318. speja-0.13.0/vendor/vhdl_libraries/vital2000/memory_b.vhdl +7151 -0
  319. speja-0.13.0/vendor/vhdl_libraries/vital2000/memory_p.vhdl +1729 -0
  320. speja-0.13.0/vendor/vhdl_libraries/vital2000/prmtvs_b.vhdl +5622 -0
  321. speja-0.13.0/vendor/vhdl_libraries/vital2000/prmtvs_p.vhdl +1413 -0
  322. speja-0.13.0/vendor/vhdl_libraries/vital2000/timing_b.vhdl +2187 -0
  323. 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