booley-rtl 0.1.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. booley_rtl-0.1.0/LICENSE +201 -0
  2. booley_rtl-0.1.0/PKG-INFO +251 -0
  3. booley_rtl-0.1.0/README.md +205 -0
  4. booley_rtl-0.1.0/VERSION +1 -0
  5. booley_rtl-0.1.0/pyproject.toml +243 -0
  6. booley_rtl-0.1.0/setup.cfg +4 -0
  7. booley_rtl-0.1.0/src/booley/__init__.py +13 -0
  8. booley_rtl-0.1.0/src/booley/adapterlib/__init__.py +89 -0
  9. booley_rtl-0.1.0/src/booley/adapterlib/parsers.py +169 -0
  10. booley_rtl-0.1.0/src/booley/adapterlib/proc.py +181 -0
  11. booley_rtl-0.1.0/src/booley/adapterlib/request.py +184 -0
  12. booley_rtl-0.1.0/src/booley/adapterlib/responses.py +265 -0
  13. booley_rtl-0.1.0/src/booley/adapterlib/runner.py +135 -0
  14. booley_rtl-0.1.0/src/booley/bootstrap_mode.py +60 -0
  15. booley_rtl-0.1.0/src/booley/core/__init__.py +9 -0
  16. booley_rtl-0.1.0/src/booley/core/boundary.py +248 -0
  17. booley_rtl-0.1.0/src/booley/core/btool_adapter_contract.py +259 -0
  18. booley_rtl-0.1.0/src/booley/core/btool_adapter_validation.py +411 -0
  19. booley_rtl-0.1.0/src/booley/core/config_paths.py +36 -0
  20. booley_rtl-0.1.0/src/booley/core/models.py +114 -0
  21. booley_rtl-0.1.0/src/booley/core/run_tool.py +168 -0
  22. booley_rtl-0.1.0/src/booley/core_security.py +401 -0
  23. booley_rtl-0.1.0/src/booley/data/__init__.py +0 -0
  24. booley_rtl-0.1.0/src/booley/data/__pycache__/__init__.cpython-314.pyc +0 -0
  25. booley_rtl-0.1.0/src/booley/data/cheatsheet.md +180 -0
  26. booley_rtl-0.1.0/src/booley/data/criteria.toml +164 -0
  27. booley_rtl-0.1.0/src/booley/data/docker/Dockerfile +227 -0
  28. booley_rtl-0.1.0/src/booley/data/docker/Dockerfile.egress-proxy +7 -0
  29. booley_rtl-0.1.0/src/booley/data/docker/Dockerfile.reaper +9 -0
  30. booley_rtl-0.1.0/src/booley/data/docker/Dockerfile.riscv +140 -0
  31. booley_rtl-0.1.0/src/booley/data/docker/build-riscv.sh +29 -0
  32. booley_rtl-0.1.0/src/booley/data/docker/build.sh +27 -0
  33. booley_rtl-0.1.0/src/booley/data/docker/pdk/NangateOpenCellLibrary_typical_ccs.lib +133314 -0
  34. booley_rtl-0.1.0/src/booley/data/docker/pdk/nangate45/Nangate45.rc +13 -0
  35. booley_rtl-0.1.0/src/booley/data/docker/pdk/nangate45/Nangate45_stdcell.lef +11552 -0
  36. booley_rtl-0.1.0/src/booley/data/docker/pdk/nangate45/Nangate45_tech.lef +779 -0
  37. booley_rtl-0.1.0/src/booley/data/docker/pdk/nangate45/README.md +6 -0
  38. booley_rtl-0.1.0/src/booley/data/refs/booley_vcd_dump.sv +19 -0
  39. booley_rtl-0.1.0/src/booley/data/refs/code_review/rtl/functional.md +62 -0
  40. booley_rtl-0.1.0/src/booley/data/refs/code_review/rtl/ifdef.md +57 -0
  41. booley_rtl-0.1.0/src/booley/data/refs/code_review/rtl/optimization.md +71 -0
  42. booley_rtl-0.1.0/src/booley/data/refs/code_review/rtl/protocol-cdc.md +60 -0
  43. booley_rtl-0.1.0/src/booley/data/refs/code_review/rtl/quality.md +22 -0
  44. booley_rtl-0.1.0/src/booley/data/refs/code_review/rtl/security.md +56 -0
  45. booley_rtl-0.1.0/src/booley/data/refs/code_review/testbench/tb-review.md +69 -0
  46. booley_rtl-0.1.0/src/booley/data/refs/rtl-mutation-testing.md +192 -0
  47. booley_rtl-0.1.0/src/booley/data/refs/rtl_style_guide.md +48 -0
  48. booley_rtl-0.1.0/src/booley/data/refs/sim_result_sentinel.sv +23 -0
  49. booley_rtl-0.1.0/src/booley/data/refs/tb_style_guide.md +312 -0
  50. booley_rtl-0.1.0/src/booley/data/skills/booley-setup/AGENTS_TEMPLATE.md +25 -0
  51. booley_rtl-0.1.0/src/booley/data/skills/booley-setup/BOOLEY_TEMPLATE.toml +35 -0
  52. booley_rtl-0.1.0/src/booley/data/skills/booley-setup/CORE_TEMPLATE.yaml +56 -0
  53. booley_rtl-0.1.0/src/booley/data/skills/booley-setup/SKILL.md +125 -0
  54. booley_rtl-0.1.0/src/booley/data/skills/booley-setup/TESTS_TEMPLATE.toml +12 -0
  55. booley_rtl-0.1.0/src/booley/data/skills/booley-setup/agents/openai.yaml +4 -0
  56. booley_rtl-0.1.0/src/booley/data/skills/booley-setup/steps/2-project-config.md +399 -0
  57. booley_rtl-0.1.0/src/booley/data/skills/booley-setup/steps/3-agents-md.md +95 -0
  58. booley_rtl-0.1.0/src/booley/data/skills/booley-setup/steps/4-simulate.md +79 -0
  59. booley_rtl-0.1.0/src/booley/data/skills/booley-setup/steps/5-lint.md +57 -0
  60. booley_rtl-0.1.0/src/booley/data/skills/booley-setup/steps/6-asic-synthesize.md +111 -0
  61. booley_rtl-0.1.0/src/booley/data/skills/booley-setup/steps/7-doctor.md +58 -0
  62. booley_rtl-0.1.0/src/booley/data/skills/booley-setup/steps/_adapter-common.md +246 -0
  63. booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-create/SKILL.md +105 -0
  64. booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-create/TICKET_TEMPLATE.md +173 -0
  65. booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-create/ticket-creation.md +306 -0
  66. booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-triage/SKILL.md +50 -0
  67. booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-triage/steps/01-board-orphans.md +16 -0
  68. booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-triage/steps/02-blocked.md +76 -0
  69. booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-triage/steps/03-review.md +77 -0
  70. booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-triage/steps/04-summary.md +22 -0
  71. booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-triage/tool-reference.md +35 -0
  72. booley_rtl-0.1.0/src/booley/docker/__init__.py +0 -0
  73. booley_rtl-0.1.0/src/booley/docker/egress_proxy.py +388 -0
  74. booley_rtl-0.1.0/src/booley/docker/proxy_entry.py +86 -0
  75. booley_rtl-0.1.0/src/booley/docker/reaper.py +261 -0
  76. booley_rtl-0.1.0/src/booley/filelock.py +86 -0
  77. booley_rtl-0.1.0/src/booley/filesystem_utils.py +74 -0
  78. booley_rtl-0.1.0/src/booley/find_good_commit.py +650 -0
  79. booley_rtl-0.1.0/src/booley/fusesoc_registry.py +1587 -0
  80. booley_rtl-0.1.0/src/booley/fusesoc_trace_overlay.py +450 -0
  81. booley_rtl-0.1.0/src/booley/guidance_links.py +130 -0
  82. booley_rtl-0.1.0/src/booley/harness/__init__.py +9 -0
  83. booley_rtl-0.1.0/src/booley/harness/__main__.py +151 -0
  84. booley_rtl-0.1.0/src/booley/harness/_backend_config.py +492 -0
  85. booley_rtl-0.1.0/src/booley/harness/_claude_backend.py +884 -0
  86. booley_rtl-0.1.0/src/booley/harness/_claude_transcript_md.py +117 -0
  87. booley_rtl-0.1.0/src/booley/harness/_codex_backend.py +699 -0
  88. booley_rtl-0.1.0/src/booley/harness/_codex_transcript_md.py +224 -0
  89. booley_rtl-0.1.0/src/booley/harness/_cost.py +48 -0
  90. booley_rtl-0.1.0/src/booley/harness/_editor_config.py +38 -0
  91. booley_rtl-0.1.0/src/booley/harness/_limits.py +22 -0
  92. booley_rtl-0.1.0/src/booley/harness/_retry.py +81 -0
  93. booley_rtl-0.1.0/src/booley/harness/_ticket_ops.py +484 -0
  94. booley_rtl-0.1.0/src/booley/harness/agent.py +102 -0
  95. booley_rtl-0.1.0/src/booley/harness/agent_backend.py +68 -0
  96. booley_rtl-0.1.0/src/booley/harness/backends/__init__.py +16 -0
  97. booley_rtl-0.1.0/src/booley/harness/backends/sim_base.py +47 -0
  98. booley_rtl-0.1.0/src/booley/harness/blocking.py +159 -0
  99. booley_rtl-0.1.0/src/booley/harness/booley.py +1089 -0
  100. booley_rtl-0.1.0/src/booley/harness/booley_status_display.py +222 -0
  101. booley_rtl-0.1.0/src/booley/harness/colors.py +126 -0
  102. booley_rtl-0.1.0/src/booley/harness/config.py +175 -0
  103. booley_rtl-0.1.0/src/booley/harness/console/__init__.py +9 -0
  104. booley_rtl-0.1.0/src/booley/harness/console/app.py +342 -0
  105. booley_rtl-0.1.0/src/booley/harness/console/console.tcss +42 -0
  106. booley_rtl-0.1.0/src/booley/harness/console/criteria_format.py +101 -0
  107. booley_rtl-0.1.0/src/booley/harness/console/events.py +86 -0
  108. booley_rtl-0.1.0/src/booley/harness/console/links.py +582 -0
  109. booley_rtl-0.1.0/src/booley/harness/console/path_backtick.py +66 -0
  110. booley_rtl-0.1.0/src/booley/harness/console/widgets.py +784 -0
  111. booley_rtl-0.1.0/src/booley/harness/criteria_acceptance.py +545 -0
  112. booley_rtl-0.1.0/src/booley/harness/debug_journal.py +100 -0
  113. booley_rtl-0.1.0/src/booley/harness/devcontainer.py +464 -0
  114. booley_rtl-0.1.0/src/booley/harness/doctor.py +3745 -0
  115. booley_rtl-0.1.0/src/booley/harness/git_utils.py +476 -0
  116. booley_rtl-0.1.0/src/booley/harness/init_cmd.py +1352 -0
  117. booley_rtl-0.1.0/src/booley/harness/init_common.py +70 -0
  118. booley_rtl-0.1.0/src/booley/harness/init_docker_image.py +408 -0
  119. booley_rtl-0.1.0/src/booley/harness/init_git_hooks.py +347 -0
  120. booley_rtl-0.1.0/src/booley/harness/init_skills.py +164 -0
  121. booley_rtl-0.1.0/src/booley/harness/interactive_docker.py +346 -0
  122. booley_rtl-0.1.0/src/booley/harness/logging_utils.py +97 -0
  123. booley_rtl-0.1.0/src/booley/harness/mcp_config.py +121 -0
  124. booley_rtl-0.1.0/src/booley/harness/models.py +213 -0
  125. booley_rtl-0.1.0/src/booley/harness/orchestrator.py +1633 -0
  126. booley_rtl-0.1.0/src/booley/harness/orchestrator_display.py +406 -0
  127. booley_rtl-0.1.0/src/booley/harness/orchestrator_guardrails.py +90 -0
  128. booley_rtl-0.1.0/src/booley/harness/orchestrator_probe.py +142 -0
  129. booley_rtl-0.1.0/src/booley/harness/orchestrator_prompt.py +571 -0
  130. booley_rtl-0.1.0/src/booley/harness/orphan_handler.py +177 -0
  131. booley_rtl-0.1.0/src/booley/harness/preflight.py +438 -0
  132. booley_rtl-0.1.0/src/booley/harness/project_image.py +340 -0
  133. booley_rtl-0.1.0/src/booley/harness/prompt_artifacts.py +121 -0
  134. booley_rtl-0.1.0/src/booley/harness/render_md.py +390 -0
  135. booley_rtl-0.1.0/src/booley/harness/sandbox.py +327 -0
  136. booley_rtl-0.1.0/src/booley/harness/sim_utils.py +169 -0
  137. booley_rtl-0.1.0/src/booley/harness/steps/__init__.py +13 -0
  138. booley_rtl-0.1.0/src/booley/harness/steps/step_00_parse_validate.py +477 -0
  139. booley_rtl-0.1.0/src/booley/harness/steps/step_01_setup.py +608 -0
  140. booley_rtl-0.1.0/src/booley/harness/steps/worktree_lock_gc.py +126 -0
  141. booley_rtl-0.1.0/src/booley/harness/subscription_limit.py +220 -0
  142. booley_rtl-0.1.0/src/booley/harness/terminal.py +319 -0
  143. booley_rtl-0.1.0/src/booley/harness/ticket_cli.py +193 -0
  144. booley_rtl-0.1.0/src/booley/harness/worktree_health.py +105 -0
  145. booley_rtl-0.1.0/src/booley/heartbeat.py +121 -0
  146. booley_rtl-0.1.0/src/booley/host_tools/__init__.py +1 -0
  147. booley_rtl-0.1.0/src/booley/host_tools/__main__.py +214 -0
  148. booley_rtl-0.1.0/src/booley/host_tools/exceptions.py +43 -0
  149. booley_rtl-0.1.0/src/booley/host_tools/fixtures/vivado_impl_pass.log +89 -0
  150. booley_rtl-0.1.0/src/booley/host_tools/fixtures/vivado_routed_real.rpt +41 -0
  151. booley_rtl-0.1.0/src/booley/host_tools/fixtures/vivado_routed_real_2025_2.rpt +49 -0
  152. booley_rtl-0.1.0/src/booley/host_tools/fixtures/vivado_timing.rpt +53 -0
  153. booley_rtl-0.1.0/src/booley/host_tools/job_manager.py +300 -0
  154. booley_rtl-0.1.0/src/booley/host_tools/job_state.py +98 -0
  155. booley_rtl-0.1.0/src/booley/host_tools/mcp_proxy.py +250 -0
  156. booley_rtl-0.1.0/src/booley/host_tools/path_mapper.py +80 -0
  157. booley_rtl-0.1.0/src/booley/host_tools/result_extractor.py +92 -0
  158. booley_rtl-0.1.0/src/booley/host_tools/server.py +331 -0
  159. booley_rtl-0.1.0/src/booley/host_tools/subprocess_runner.py +247 -0
  160. booley_rtl-0.1.0/src/booley/host_tools/template_loader.py +92 -0
  161. booley_rtl-0.1.0/src/booley/host_tools/template_renderer.py +181 -0
  162. booley_rtl-0.1.0/src/booley/host_tools/template_schema.py +90 -0
  163. booley_rtl-0.1.0/src/booley/host_tools/templates/run_host_command.sh +11 -0
  164. booley_rtl-0.1.0/src/booley/host_tools/templates/run_host_command.yaml +52 -0
  165. booley_rtl-0.1.0/src/booley/host_tools/templates/spyglass_lint.tcl +29 -0
  166. booley_rtl-0.1.0/src/booley/host_tools/templates/spyglass_lint.yaml +37 -0
  167. booley_rtl-0.1.0/src/booley/host_tools/templates/vivado_synth.tcl +44 -0
  168. booley_rtl-0.1.0/src/booley/host_tools/templates/vivado_synth.yaml +52 -0
  169. booley_rtl-0.1.0/src/booley/host_tools/templates/xcelium_sim.sh +29 -0
  170. booley_rtl-0.1.0/src/booley/host_tools/templates/xcelium_sim.yaml +42 -0
  171. booley_rtl-0.1.0/src/booley/incontainer_register.py +325 -0
  172. booley_rtl-0.1.0/src/booley/job_slots.py +617 -0
  173. booley_rtl-0.1.0/src/booley/mcp_server.py +2411 -0
  174. booley_rtl-0.1.0/src/booley/nested_mcp_capabilities.py +67 -0
  175. booley_rtl-0.1.0/src/booley/paths.py +69 -0
  176. booley_rtl-0.1.0/src/booley/platform_paths.py +149 -0
  177. booley_rtl-0.1.0/src/booley/project_config.py +406 -0
  178. booley_rtl-0.1.0/src/booley/project_dir.py +128 -0
  179. booley_rtl-0.1.0/src/booley/run_mutmut.py +528 -0
  180. booley_rtl-0.1.0/src/booley/shared_infra.py +418 -0
  181. booley_rtl-0.1.0/src/booley/sim/bwave_fifo.py +260 -0
  182. booley_rtl-0.1.0/src/booley/sim/iverilog_run.py +456 -0
  183. booley_rtl-0.1.0/src/booley/sim/run_guard.py +149 -0
  184. booley_rtl-0.1.0/src/booley/sim/sim_result.py +285 -0
  185. booley_rtl-0.1.0/src/booley/sim/trace_session.py +710 -0
  186. booley_rtl-0.1.0/src/booley/sim/vcs_run.py +269 -0
  187. booley_rtl-0.1.0/src/booley/sim/verilator_run.py +513 -0
  188. booley_rtl-0.1.0/src/booley/sim/xcelium_run.py +261 -0
  189. booley_rtl-0.1.0/src/booley/sim_links.py +142 -0
  190. booley_rtl-0.1.0/src/booley/ticket_board/__init__.py +272 -0
  191. booley_rtl-0.1.0/src/booley/ticket_board/__main__.py +7 -0
  192. booley_rtl-0.1.0/src/booley/ticket_board/analytics.py +413 -0
  193. booley_rtl-0.1.0/src/booley/ticket_board/archive.py +136 -0
  194. booley_rtl-0.1.0/src/booley/ticket_board/cli.py +394 -0
  195. booley_rtl-0.1.0/src/booley/ticket_board/cli_handlers.py +676 -0
  196. booley_rtl-0.1.0/src/booley/ticket_board/constants.py +99 -0
  197. booley_rtl-0.1.0/src/booley/ticket_board/criteria_markdown.py +295 -0
  198. booley_rtl-0.1.0/src/booley/ticket_board/evidence.py +101 -0
  199. booley_rtl-0.1.0/src/booley/ticket_board/execution.py +248 -0
  200. booley_rtl-0.1.0/src/booley/ticket_board/frontmatter.py +533 -0
  201. booley_rtl-0.1.0/src/booley/ticket_board/git_ops.py +151 -0
  202. booley_rtl-0.1.0/src/booley/ticket_board/helpers.py +225 -0
  203. booley_rtl-0.1.0/src/booley/ticket_board/io.py +718 -0
  204. booley_rtl-0.1.0/src/booley/ticket_board/lifecycle.py +177 -0
  205. booley_rtl-0.1.0/src/booley/ticket_board/logs.py +209 -0
  206. booley_rtl-0.1.0/src/booley/ticket_board/notifications.py +139 -0
  207. booley_rtl-0.1.0/src/booley/ticket_board/operations.py +736 -0
  208. booley_rtl-0.1.0/src/booley/ticket_board/paths.py +145 -0
  209. booley_rtl-0.1.0/src/booley/ticket_board/reporting.py +382 -0
  210. booley_rtl-0.1.0/src/booley/ticket_board/run_metrics.py +177 -0
  211. booley_rtl-0.1.0/src/booley/ticket_board/scanner.py +188 -0
  212. booley_rtl-0.1.0/src/booley/ticket_board/validation.py +752 -0
  213. booley_rtl-0.1.0/src/booley/ticket_board/validation_logs.py +163 -0
  214. booley_rtl-0.1.0/src/booley/tool_lock.py +140 -0
  215. booley_rtl-0.1.0/src/booley/tools/__init__.py +104 -0
  216. booley_rtl-0.1.0/src/booley/tools/_baseline_worktree.py +103 -0
  217. booley_rtl-0.1.0/src/booley/tools/_diff_classify.py +203 -0
  218. booley_rtl-0.1.0/src/booley/tools/_job_records.py +243 -0
  219. booley_rtl-0.1.0/src/booley/tools/_run_lock.py +67 -0
  220. booley_rtl-0.1.0/src/booley/tools/_tool_events.py +176 -0
  221. booley_rtl-0.1.0/src/booley/tools/asic_synthesize.py +1595 -0
  222. booley_rtl-0.1.0/src/booley/tools/base.py +801 -0
  223. booley_rtl-0.1.0/src/booley/tools/bwave.py +892 -0
  224. booley_rtl-0.1.0/src/booley/tools/bwave_sessions.py +269 -0
  225. booley_rtl-0.1.0/src/booley/tools/clock_timing.py +167 -0
  226. booley_rtl-0.1.0/src/booley/tools/commit_git_io.py +150 -0
  227. booley_rtl-0.1.0/src/booley/tools/commit_message_format.py +130 -0
  228. booley_rtl-0.1.0/src/booley/tools/commit_msg_hook.py +107 -0
  229. booley_rtl-0.1.0/src/booley/tools/commit_msg_utils.py +159 -0
  230. booley_rtl-0.1.0/src/booley/tools/compare_vcd.py +562 -0
  231. booley_rtl-0.1.0/src/booley/tools/coverage_analyst.py +2663 -0
  232. booley_rtl-0.1.0/src/booley/tools/coverage_verilog_utils.py +291 -0
  233. booley_rtl-0.1.0/src/booley/tools/criteria.py +712 -0
  234. booley_rtl-0.1.0/src/booley/tools/criteria_reference.py +298 -0
  235. booley_rtl-0.1.0/src/booley/tools/deploy_skills.py +274 -0
  236. booley_rtl-0.1.0/src/booley/tools/edam.py +413 -0
  237. booley_rtl-0.1.0/src/booley/tools/elaborate.py +388 -0
  238. booley_rtl-0.1.0/src/booley/tools/fpga_edam.py +356 -0
  239. booley_rtl-0.1.0/src/booley/tools/fpga_impl.py +847 -0
  240. booley_rtl-0.1.0/src/booley/tools/fpga_metrics.py +154 -0
  241. booley_rtl-0.1.0/src/booley/tools/interface_spec.py +185 -0
  242. booley_rtl-0.1.0/src/booley/tools/lint.py +693 -0
  243. booley_rtl-0.1.0/src/booley/tools/mechanical_tool.py +131 -0
  244. booley_rtl-0.1.0/src/booley/tools/mut_harness_inject.py +257 -0
  245. booley_rtl-0.1.0/src/booley/tools/mutation_lock.py +523 -0
  246. booley_rtl-0.1.0/src/booley/tools/mutation_tester.py +2153 -0
  247. booley_rtl-0.1.0/src/booley/tools/orchestration_state.py +920 -0
  248. booley_rtl-0.1.0/src/booley/tools/pre-commit-ruff.sh +26 -0
  249. booley_rtl-0.1.0/src/booley/tools/project_native_backend.py +374 -0
  250. booley_rtl-0.1.0/src/booley/tools/registry.py +359 -0
  251. booley_rtl-0.1.0/src/booley/tools/reviewer.py +1763 -0
  252. booley_rtl-0.1.0/src/booley/tools/rewrite_commits.py +25 -0
  253. booley_rtl-0.1.0/src/booley/tools/schema_extractor.py +107 -0
  254. booley_rtl-0.1.0/src/booley/tools/scope_precommit_hook.py +97 -0
  255. booley_rtl-0.1.0/src/booley/tools/sim_edam.py +393 -0
  256. booley_rtl-0.1.0/src/booley/tools/simulate.py +2163 -0
  257. booley_rtl-0.1.0/src/booley/tools/source_fingerprint.py +147 -0
  258. booley_rtl-0.1.0/src/booley/tools/specialist.py +646 -0
  259. booley_rtl-0.1.0/src/booley/tools/submit_run_report.py +317 -0
  260. booley_rtl-0.1.0/src/booley/tools/tb_coder.py +746 -0
  261. booley_rtl-0.1.0/src/booley/tools/threshold_eval.py +152 -0
  262. booley_rtl-0.1.0/src/booley/tools/tools_reference.py +175 -0
  263. booley_rtl-0.1.0/src/booley/tools/validate_commit_msg.py +198 -0
  264. booley_rtl-0.1.0/src/booley/tools/workspace_isolation.py +696 -0
  265. booley_rtl-0.1.0/src/booley/tools/worktree_create.sh +508 -0
  266. booley_rtl-0.1.0/src/booley/venue.py +71 -0
  267. booley_rtl-0.1.0/src/booley/vivado/xdc/timing.xdc +7 -0
  268. booley_rtl-0.1.0/src/booley/yosys/abc_config.json +5 -0
  269. booley_rtl-0.1.0/src/booley/yosys/abc_scripts/abc_aggressive.script +21 -0
  270. booley_rtl-0.1.0/src/booley/yosys/abc_scripts/abc_balanced.script +15 -0
  271. booley_rtl-0.1.0/src/booley/yosys/abc_scripts/abc_fast.script +10 -0
  272. booley_rtl-0.1.0/src/booley/yosys/openroad_timing.py +351 -0
  273. booley_rtl-0.1.0/src/booley/yosys/run_yosys_syn.py +494 -0
  274. booley_rtl-0.1.0/src/booley/yosys/sdc/abc_simple.sdc +5 -0
  275. booley_rtl-0.1.0/src/booley/yosys/syn_config.py +33 -0
  276. booley_rtl-0.1.0/src/booley/yosys/syn_core.py +1065 -0
  277. booley_rtl-0.1.0/src/booley/yosys/syn_discovery.py +52 -0
  278. booley_rtl-0.1.0/src/booley/yosys/syn_parse.py +60 -0
  279. booley_rtl-0.1.0/src/booley/yosys/syn_subprocess.py +199 -0
  280. booley_rtl-0.1.0/src/booley/yosys/synthesis_watchdog.py +565 -0
  281. booley_rtl-0.1.0/src/booley/zombie_cleanup.py +183 -0
  282. booley_rtl-0.1.0/src/booley_rtl.egg-info/PKG-INFO +251 -0
  283. booley_rtl-0.1.0/src/booley_rtl.egg-info/SOURCES.txt +321 -0
  284. booley_rtl-0.1.0/src/booley_rtl.egg-info/dependency_links.txt +1 -0
  285. booley_rtl-0.1.0/src/booley_rtl.egg-info/entry_points.txt +5 -0
  286. booley_rtl-0.1.0/src/booley_rtl.egg-info/requires.txt +32 -0
  287. booley_rtl-0.1.0/src/booley_rtl.egg-info/top_level.txt +2 -0
  288. booley_rtl-0.1.0/src/bwave/tests/fixtures/real_cvdp/generate.py +599 -0
  289. booley_rtl-0.1.0/src/bwave/tests/gen_test_vcds.py +418 -0
  290. booley_rtl-0.1.0/src/bwave/tests/gen_xcelium_dialect_vcd.py +152 -0
  291. booley_rtl-0.1.0/src/bwave/tests/simulator_ground_truth_test.py +1723 -0
  292. booley_rtl-0.1.0/src/bwave/tests/test_real_cvdp_fixtures.py +140 -0
  293. booley_rtl-0.1.0/src/bwave/tests/test_xcelium_dialect.py +148 -0
  294. booley_rtl-0.1.0/src/bwave/tools/check_schema.py +147 -0
  295. booley_rtl-0.1.0/tests/test_bootstrap_mode.py +55 -0
  296. booley_rtl-0.1.0/tests/test_core_boundary.py +366 -0
  297. booley_rtl-0.1.0/tests/test_core_security.py +491 -0
  298. booley_rtl-0.1.0/tests/test_entry_points.py +20 -0
  299. booley_rtl-0.1.0/tests/test_filesystem_utils.py +133 -0
  300. booley_rtl-0.1.0/tests/test_find_good_commit.py +50 -0
  301. booley_rtl-0.1.0/tests/test_fusesoc_registry.py +2052 -0
  302. booley_rtl-0.1.0/tests/test_guidance_links.py +116 -0
  303. booley_rtl-0.1.0/tests/test_heartbeat.py +173 -0
  304. booley_rtl-0.1.0/tests/test_host_mcp_adversarial.py +551 -0
  305. booley_rtl-0.1.0/tests/test_host_tools.py +1040 -0
  306. booley_rtl-0.1.0/tests/test_host_tools_cli.py +101 -0
  307. booley_rtl-0.1.0/tests/test_host_tools_integration.py +115 -0
  308. booley_rtl-0.1.0/tests/test_incontainer_register.py +301 -0
  309. booley_rtl-0.1.0/tests/test_interactive_smoke.py +518 -0
  310. booley_rtl-0.1.0/tests/test_job_slots.py +479 -0
  311. booley_rtl-0.1.0/tests/test_mcp_server.py +1048 -0
  312. booley_rtl-0.1.0/tests/test_nested_mcp_capabilities.py +57 -0
  313. booley_rtl-0.1.0/tests/test_paths.py +73 -0
  314. booley_rtl-0.1.0/tests/test_platform_paths.py +111 -0
  315. booley_rtl-0.1.0/tests/test_project_config_human_in_loop.py +197 -0
  316. booley_rtl-0.1.0/tests/test_project_dir.py +159 -0
  317. booley_rtl-0.1.0/tests/test_run_mutmut.py +564 -0
  318. booley_rtl-0.1.0/tests/test_run_tool.py +86 -0
  319. booley_rtl-0.1.0/tests/test_shared_infra.py +411 -0
  320. booley_rtl-0.1.0/tests/test_source_map_from_core.py +244 -0
  321. booley_rtl-0.1.0/tests/test_tool_lock.py +118 -0
  322. booley_rtl-0.1.0/tests/test_venue.py +102 -0
  323. booley_rtl-0.1.0/tests/test_zombie_cleanup.py +88 -0
@@ -0,0 +1,201 @@
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to the Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by the Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding any notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
178
+
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. Please also get an in-touch with
186
+ your own legal counsel to ensure the license is appropriate for your
187
+ jurisdiction and use case.
188
+
189
+ Copyright 2025-2026 The Booley Authors
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
@@ -0,0 +1,251 @@
1
+ Metadata-Version: 2.4
2
+ Name: booley-rtl
3
+ Version: 0.1.0
4
+ Summary: Orchestrated RTL development harness with ticket-based workflow automation
5
+ Author-email: "A.R." <boldaxolotl@proton.me>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/boldaxolotl/Booley
8
+ Project-URL: Issues, https://github.com/boldaxolotl/Booley/issues
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)
13
+ Requires-Python: >=3.11
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE
16
+ Requires-Dist: claude-agent-sdk>=0.1.55
17
+ Requires-Dist: click>=8.0
18
+ Requires-Dist: colorama>=0.4
19
+ Requires-Dist: edalize==0.6.8
20
+ Requires-Dist: fusesoc==2.4.6
21
+ Requires-Dist: httpx>=0.28
22
+ Requires-Dist: httpx-sse>=0.4
23
+ Requires-Dist: Jinja2>=3.1
24
+ Requires-Dist: jsonschema>=4.0
25
+ Requires-Dist: libcst>=1.0
26
+ Requires-Dist: markdown-it-py>=4.0
27
+ Requires-Dist: mcp>=1.8
28
+ Requires-Dist: mdit-py-plugins>=0.5
29
+ Requires-Dist: mutmut>=3.0
30
+ Requires-Dist: pydantic>=2.0
31
+ Requires-Dist: pydantic-settings>=2.0
32
+ Requires-Dist: python-dotenv>=1.0
33
+ Requires-Dist: PyYAML>=6.0
34
+ Requires-Dist: rich>=13.0
35
+ Requires-Dist: setproctitle>=1.3
36
+ Requires-Dist: textual>=8.0
37
+ Requires-Dist: pywin32>=300; sys_platform == "win32"
38
+ Provides-Extra: dev
39
+ Requires-Dist: build>=1.0; extra == "dev"
40
+ Requires-Dist: pytest>=8.0; extra == "dev"
41
+ Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
42
+ Requires-Dist: pytest-timeout>=2.3; extra == "dev"
43
+ Requires-Dist: coverage>=7.0; extra == "dev"
44
+ Requires-Dist: ruff>=0.4; extra == "dev"
45
+ Dynamic: license-file
46
+
47
+ # Booley
48
+
49
+ **Agentic RTL development framework — sandboxed EDA flows driven by AI agents**
50
+
51
+ [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
52
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
53
+
54
+ It's 2026, and LLMs are finally good enough to do real work. Software already accepts this: agents write more and more of the code while humans move up to architecture, specification, review, and integration. Hardware moves slower, but it moves: every major EDA vendor and a wave of startups are shipping AI tools for chip design. Those tools are closed, expensive, and out of reach if you don't work at a big company. I hit that wall myself, and raw agents like Claude Code and Codex kept failing on RTL work in the same predictable ways. So I built the tool I was missing: free and open source.
55
+
56
+ The idea:
57
+
58
+ 1. Take the most capable coding agents available (Claude Code, Codex).
59
+ 2. Put them in a sandbox with the repo under development, blocking access to the host, so they can run without asking for permissions.
60
+ 3. Give them quick, one-command access to an open-source sim/lint/synth/waveform stack inside the sandbox, so they can check their own work and iterate fast.
61
+ 4. Wrap it all in one IDE: VS Code.
62
+
63
+ A harness checks the agent's claims against real tool results (see below for the protection measures), and you choose how to drive it: hands-on in a chat, or hand it a self-contained ticket and let it run.
64
+
65
+
66
+ ## What Booley Solves
67
+
68
+ Dropping a capable model into an RTL repo is not enough. I tried it. The toolchain is fragmented (every EDA tool speaks its own CLI, every coding agent its own protocol), and even once that's unified, a handful of failure modes make naive agentic hardware work unreliable. Booley puts one interface over every tool and every agent, then hardens it against the failure modes below.
69
+
70
+ ### A fragmented toolchain, one interface
71
+
72
+ An RTL flow is a pile of tools that share nothing: Verilator, Icarus, Yosys, plus licensed heavyweights like Vivado or Xcelium, each with its own CLI, flags, and output format. The agent driving them is a moving part too: today Claude Code, tomorrow Codex. Wire an agent straight into that mess and you get N tools × M agents of brittle glue. Booley collapses it to one:
73
+
74
+ - **One typed surface over every tool**: every EDA tool is a B-Tool: the same structured call in, the same normalized verdict out, whether it runs in the sandbox (Verilator, Icarus, Yosys, sv2v, `bwave`) or crosses the adapter boundary to a licensed tool on the host (Vivado, Xcelium, VCS). The agent learns one interface, not one per tool ([details](docs/FEATURES.md#structured-b-tool-contracts)).
75
+ - **Agent-agnostic**: the same B-Tools are exposed over MCP, which Claude Code and Codex both drive natively. Pick the model you want; the toolchain stays identical ([details](docs/WHY.md#why-vs-code)).
76
+ - **One environment**: editor, tools, and agent share a single VS Code window. No context switch between where you write RTL and where you run it: that's what makes VS Code the *agentic RTL IDE* the toolchain never had.
77
+
78
+ ### Hallucination and unreliability
79
+
80
+ Left to its own judgment, an agent will declare a task done that it never finished, "pass" a test by misreading a log, or quietly run the wrong configuration. I've watched all three happen. Booley replaces the agent's judgment with machine-checked facts:
81
+
82
+ - **Config and test registry**: `config` and `test` arguments resolve to named entries in Booley's shared configuration, not ad-hoc command lines. A request to run one test resolves to exactly that test, and the report carries the resolved identity, so the agent can't fool itself about what ran ([details](docs/FEATURES.md#named-build-configurations-and-tests)).
83
+ - **Acceptance criteria**: Ticket Mode drives toward explicit criteria (`sim_pass`, `lint_clean`, `synthesis_pass`), and the ticket cannot complete until the harness, not the agent, confirms every mandatory one ([details](docs/USAGE.md#acceptance-criteria)).
84
+ - **Structured tool contracts (B-Tools)**: a tool call returns a normalized verdict (`pass` / `fail` / `inconclusive` / `timeout`) instead of raw terminal output for the agent to (mis)interpret. A criterion is satisfied only when the tool itself returns a valid `pass` ([details](docs/FEATURES.md#structured-b-tool-contracts)).
85
+
86
+ ### You can't let an agent loose on your machine
87
+
88
+ Autonomous work only pays off when the agent doesn't stop to ask permission at every step. But I'm not giving a capable, fallible model that's steerable by whatever text it reads free rein on my machine. The sandbox turns each failure mode into a contained non-event:
89
+
90
+ - **Prompt injection**: text in a datasheet or web page hijacks the agent. Trapped in a container with no host access or general internet, the payload has nowhere to reach.
91
+ - **Off-script pushes**: the agent drifts and "helpfully" commits half-finished work. It only touches an isolated worktree behind a human review-and-merge gate, never your remotes or real branches.
92
+ - **Accidental damage**: a misfired `rm` or a script in the wrong directory. With only the worktree mounted, the blast radius stops at the sandbox.
93
+
94
+ That's what makes "let it run autonomously" a sane default instead of a gamble:
95
+
96
+ - **Sandboxed by default**: agents run in a container with only the worktree mounted: full autonomy inside, zero host access, network restricted to LLM API endpoints ([details](docs/FEATURES.md#docker-sandboxing)).
97
+ - **Tools run inside too**: the sandbox image ships the EDA stack (Verilator, Icarus Verilog, Yosys, sv2v, bwave), so the common flows execute fully contained.
98
+ - **A safe boundary for heavyweights**: when a tool is too heavy or too licensed to containerize (Vivado, vendor simulators), it runs on the host behind a narrow adapter interface, and Booley still sees the same tool contract ([details](docs/BTOOL-ADAPTER-CONTRACTS.md)).
99
+
100
+ ### Context rot
101
+
102
+ Long single-context agent sessions degrade: the model loses the thread, gets distracted by stale logs, and quality falls off over a multi-hour task.
103
+
104
+ - **Specialists with isolated context**: each Specialist (testbench authoring, code review, mutation testing) runs in a fresh LLM context, so none of them drags along stale logs or drafts from earlier iterations. The orchestrator carries continuity through structured state, not an ever-growing conversation ([details](docs/ARCHITECTURE.md#the-sandbox)).
105
+
106
+ ### Debugging blind
107
+
108
+ A waveform is how a hardware engineer actually debugs. But an LLM can't read a multi-gigabyte VCD, so without one the agent is reduced to guessing about the code. So I wrote it a waveform tool:
109
+
110
+ - **Waveform-aware debug (`bwave`)**: a Rust tool that lets the agent query signal values over time ranges, trigger sampling of one signal on another, and trace data through the design, debugging from observed behavior, not speculation. The simulator streams its VCD through an in-RAM FIFO that `bwave` compacts into a `.bwave` cache on the fly, so the multi-gigabyte VCD never touches disk; even 10 GB+ traces stay tractable and the tracing overhead stays small ([details](docs/FEATURES.md#waveform-based-debug)).
111
+
112
+ ### Weak testbenches
113
+
114
+ Agents work best against a concrete criterion. For RTL that criterion is the testbench: the agent writes and fixes the design until the testbench passes. But nothing judges the *testbench*: a weak one passes no matter what, and a green run tells you nothing about whether the design was actually exercised.
115
+
116
+ - **Mutation testing**: Booley injects targeted bugs into the RTL and checks whether the testbench catches them, scoring the detection rate against a threshold. "Tests pass" becomes "tests pass *and* are proven to catch real bugs." The testbench is the RTL's criterion; mutation testing is the testbench's ([details](docs/FEATURES.md#mutation-testing)).
117
+
118
+ Booley does much more than this: coverage measurement, multi-phase code review, automated SVA generation, lint triage, scope enforcement, and more. See [FEATURES.md](docs/FEATURES.md) for the full list.
119
+
120
+ ## Modes of Operation
121
+
122
+ Two modes, same project configuration, same tool stack, same per-folder sandbox container (the Session Runtime), just two ways to drive it.
123
+
124
+ ### Interactive Mode
125
+
126
+ The hands-on path. Open your RTL repo in VS Code, accept **"Reopen in Container"**, and the window reloads inside a Booley runtime container with everything it needs: simulators, lint, synthesis, waveform tools, and the specialist agents. The container comes from an untracked `.devcontainer/devcontainer.json` that `booley init` writes into the repo (hidden from git via `.git/info/exclude`, never committed). Egress is restricted to a Booley proxy, the agent runs as a non-root user, and an idle reaper stops orphaned sessions.
127
+
128
+ From there you just chat: what to inspect, which simulation to run, what failure to debug, what code to review, which waveform to query. You guide the work closely and make decisions as they come up. (`booley_status` at the start of a session shows the sandbox container id and available tools.)
129
+
130
+ ### Ticket Mode
131
+
132
+ The autonomous path. You write a ticket (the ticket-creation skill helps) specifying what needs doing, which files are in scope, which tests must pass, and any other completion criteria. Then `booley run` from a terminal inside the devcontainer, one terminal per concurrent ticket alongside your interactive session, and Booley does the rest: isolated worktree, orchestrator, specialists, EDA tools, criteria tracking, all the way to completion.
133
+
134
+ When the ticket reaches review, you inspect the result, adjust if needed, then approve and merge into your working branch.
135
+
136
+ ## Limitations
137
+
138
+ - **Booley will not design hardware for you.** You design the architecture and write the specs; Booley handles the grunt work. Force multiplier, not replacement.
139
+ - **Testbenches are simple and direct.** Plain SystemVerilog, no UVM.
140
+ - **Only tested at the IP level.** Complex IPs, like a RISC-V core or crypto accelerators, but never chip- or SoC-level integration.
141
+ - **Setup can take effort.** The setup skills make integration as smooth as I could get it, but every build system is different; complex flows or heavy licensed EDA tools may still need project-specific work.
142
+ - **The code quality is "hardware engineer writing software."** The architecture is sound, but the Python could use polish. Contributions from actual software developers are very welcome.
143
+ - **Work in progress.** Expect occasional bugs and rough edges in the UI. I'm actively on it, and things keep getting better.
144
+
145
+ ## Quick Start
146
+
147
+ Three ways in, ordered by how much you want to invest:
148
+
149
+ 1. **[Level 1: Watch](#level-1--watch-2-min).** See an engineer drive Booley on a demo project, start to finish. Zero setup.
150
+ 2. **[Level 2: Try the demo yourself](#level-2--try-the-demo-yourself).** Clone a pre-configured demo repo and run its tickets out of the box.
151
+ 3. **[Level 3: Use it on your own project](#level-3--use-it-on-your-own-project).** Full integration on your own RTL.
152
+
153
+ ### Level 1 — Watch (2 min)
154
+
155
+ > **Coming soon.** A short screencast of me driving Booley on a demo project end to end (feasibility triage, ticket run, results) so you can see the workflow before touching anything.
156
+
157
+ ### Level 2 — Try the demo yourself
158
+
159
+ > **Demo repo coming soon.** A well-known open-source IP with pre-configured Booley tickets, ready to run out of the box: no `/booley-setup` needed, since the design description, tests, and config already ship in the repo. The steps below are the flow you'll follow once the link is live.
160
+
161
+ The prerequisites and platform notes below apply to Levels 2 and 3 alike.
162
+
163
+ **Supported platforms:** Windows (yes, you can now design hardware on Windows), Linux (Ubuntu 24.04 tested). macOS is not supported.
164
+
165
+ > **Windows.** Booley runs **natively on Windows**: install the CLI with Windows Python, keep your repo on a normal `C:\...` path, and let **Docker Desktop** (WSL2 backend) host the containers: no WSL shell needed, no repo on the WSL filesystem. Three Windows-specific gotchas:
166
+ > - **Python:** a fresh Windows has only the Microsoft Store *aliases* (`python`/`python3` open the Store instead of running). Install a real one first, e.g. `winget install Python.Python.3.13`.
167
+ > - **Docker Desktop must be running**: its CLI only joins `PATH` once the app has started; open a new terminal after first launch.
168
+ > - **Line endings:** Git for Windows defaults to `core.autocrlf=true`, which checks files out with CRLF; the Linux container then sees every file as modified. In your RTL repo set `git config core.autocrlf false`, commit a `.gitattributes` with `* text eol=lf`, and re-checkout (`git checkout -- .`). `booley init` detects and warns about this.
169
+
170
+ > **EDA tool support.** First-class today: the open-source stack (Verilator, Icarus Verilog, Yosys, sv2v) plus **Vivado** for FPGA implementation: built-in flows, no extra work. **Cadence Xcelium** runs through a built-in host-boundary simulate backend (`builtin-host`) that loads your tool module and license on the host, validated end-to-end. Full picture in the [supported-tools matrix](docs/SUPPORTED-TOOLS.md); wire your own commercial flow via a [project-native host adapter](docs/CONFIG.md#project-native-backends), or track remaining Big-3 coverage (Design Compiler, Siemens) on the [roadmap](docs/ROADMAP.md#commercial-eda-backends).
171
+
172
+ > **Synthesis is a PPA estimate, not tape-out.** The `asic_synthesize` B-Tool gives you **power/performance/area metrics fast enough to iterate the RTL against**, not a sign-off, whatever engine backs it (Yosys + OpenROAD today; Genus / Design Compiler may follow). Real tape-out synthesis (physical implementation, CTS, routing, DRC/LVS, multi-corner STA on a foundry PDK) is **out of scope for Booley**. See [SUPPORTED-TOOLS.md](docs/SUPPORTED-TOOLS.md#built-in-flows).
173
+
174
+ **Prerequisites:**
175
+ - **Python 3.11+**
176
+ - **Docker**: hosts the sandbox and tool stack
177
+ - **VS Code** with the **Dev Containers** extension: Booley runs inside a devcontainer via **Reopen in Container**
178
+ - Credentials for at least one supported agent backend:
179
+ - **OpenAI / Codex** (default): a ChatGPT Plus subscription ($20/mo minimum) or an OpenAI API key
180
+ - **Anthropic / Claude**: a Claude Pro/Max subscription or an Anthropic API key
181
+
182
+ Booley runs on a single provider; select it via `booley.toml [agent] provider` (`codex` or `claude`). Both the orchestrator and all specialists run on the chosen provider.
183
+
184
+ > **Note:** Booley's agents authenticate the same way Claude Code or Codex do. A **subscription** (Claude Pro/Max or ChatGPT/Codex) covers **both** modes, including the nested Specialist agents. An **API key** is the pay-per-token alternative; if `ANTHROPIC_API_KEY` is set it takes precedence over a Claude subscription. Auth and billing details in [USAGE.md](docs/USAGE.md#ticket-mode--cli-reference).
185
+
186
+ ```bash
187
+ # Install Booley
188
+ pip install booley-rtl
189
+
190
+ # Clone the pre-configured demo repo (link coming soon) and enter it
191
+ git clone <demo-repo-url>
192
+ cd <demo-repo>
193
+
194
+ # Initialize Booley project state and seed the Interactive Mode devcontainer
195
+ booley init
196
+ ```
197
+
198
+ Then open the repo folder in VS Code and accept **Reopen in Container**. When the
199
+ window reloads, the agent extension (Claude Code or Codex, whichever you picked
200
+ during `booley init`) is already installed, chat panel in the sidebar. The demo
201
+ ships its design description, tests, and tickets, so there's nothing to
202
+ configure: run a shipped ticket straight from a terminal inside the container:
203
+
204
+ ```bash
205
+ # Run an autonomous ticket end to end
206
+ booley run --ticket <slug>
207
+ ```
208
+
209
+ ### Level 3 — Use it on your own project
210
+
211
+ Same shape: `pip install booley-rtl`, `booley init`, **Reopen in Container**, but
212
+ instead of shipped tickets you run the **`/booley-setup`** skill in the agent
213
+ chat to onboard your own RTL: feasibility triage, `AGENTS.md`, FuseSoC `.core`
214
+ design discovery, tests, config, and a final `booley doctor` audit. Then
215
+ `booley run` your own tickets.
216
+
217
+ > **Do you have to adopt FuseSoC?** The built-in flows build from a FuseSoC
218
+ > `.core` target: the default, simplest path that fits most projects. If you'd
219
+ > rather keep your existing build system (Makefile, vendor-simulator flow, custom scripts),
220
+ > use a [project-native adapter](docs/CONFIG.md#project-native-backends): no `.core`
221
+ > is required and you do not convert your build to FuseSoC.
222
+
223
+ **Full walkthrough, including project-native adapters for commercial EDA flows,
224
+ is in [SETUP.md](docs/SETUP.md).**
225
+
226
+ ## Documentation
227
+
228
+ - [Features](docs/FEATURES.md): expanded descriptions of all capabilities
229
+ - [Setup](docs/SETUP.md): installation, configuration, advanced backends
230
+ - [Usage](docs/USAGE.md): CLI reference, ticket-driven workflow, acceptance criteria
231
+ - [Architecture](docs/ARCHITECTURE.md): orchestrator, agentic tools, mechanical tools, context isolation
232
+ - [Why](docs/WHY.md): the rationale behind the load-bearing decisions (Docker, VS Code, two modes, MCP)
233
+ - [Benchmarks](docs/BENCHMARKS.md): results and comparison with related work
234
+ - [Roadmap](docs/ROADMAP.md): planned features and future directions
235
+
236
+ ## Contributing
237
+
238
+ Contributions welcome. See [CONTRIBUTING.md](docs/CONTRIBUTING.md) for guidelines.
239
+
240
+ ## Acknowledgments
241
+
242
+ Booley stands on a lot of other people's work. Thank you to:
243
+
244
+ - **The authors of [Edalize](https://github.com/olofk/edalize) and [FuseSoC](https://github.com/olofk/fusesoc)**, and especially their lead maintainer, Olof Kindgren, for the framework that makes Booley's whole idea of a simple, unified CLI-over-EDA interface possible.
245
+ - **The author of [vcdvcd](https://github.com/cirosantilli/vcdvcd), Ciro Santilli**, for the VCD-parsing work that seeded the `bwave` idea.
246
+ - **The author of [wavepeek](https://github.com/kleverhq/wavepeek)**, another neat waveform-to-CLI tool, for the clean top-level CLI interface that inspired `bwave`'s (the internals started well before wavepeek and are quite different).
247
+ - **The authors of [Yosys](https://github.com/YosysHQ/yosys), [Verilator](https://github.com/verilator/verilator), [Icarus Verilog](https://github.com/steveicarus/iverilog), and [sv2v](https://github.com/zachjs/sv2v)**, for the excellent open-source EDA tools that make Booley possible at all.
248
+
249
+ ## License
250
+
251
+ Apache 2.0. See [LICENSE](LICENSE) for details.