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.
- booley_rtl-0.1.0/LICENSE +201 -0
- booley_rtl-0.1.0/PKG-INFO +251 -0
- booley_rtl-0.1.0/README.md +205 -0
- booley_rtl-0.1.0/VERSION +1 -0
- booley_rtl-0.1.0/pyproject.toml +243 -0
- booley_rtl-0.1.0/setup.cfg +4 -0
- booley_rtl-0.1.0/src/booley/__init__.py +13 -0
- booley_rtl-0.1.0/src/booley/adapterlib/__init__.py +89 -0
- booley_rtl-0.1.0/src/booley/adapterlib/parsers.py +169 -0
- booley_rtl-0.1.0/src/booley/adapterlib/proc.py +181 -0
- booley_rtl-0.1.0/src/booley/adapterlib/request.py +184 -0
- booley_rtl-0.1.0/src/booley/adapterlib/responses.py +265 -0
- booley_rtl-0.1.0/src/booley/adapterlib/runner.py +135 -0
- booley_rtl-0.1.0/src/booley/bootstrap_mode.py +60 -0
- booley_rtl-0.1.0/src/booley/core/__init__.py +9 -0
- booley_rtl-0.1.0/src/booley/core/boundary.py +248 -0
- booley_rtl-0.1.0/src/booley/core/btool_adapter_contract.py +259 -0
- booley_rtl-0.1.0/src/booley/core/btool_adapter_validation.py +411 -0
- booley_rtl-0.1.0/src/booley/core/config_paths.py +36 -0
- booley_rtl-0.1.0/src/booley/core/models.py +114 -0
- booley_rtl-0.1.0/src/booley/core/run_tool.py +168 -0
- booley_rtl-0.1.0/src/booley/core_security.py +401 -0
- booley_rtl-0.1.0/src/booley/data/__init__.py +0 -0
- booley_rtl-0.1.0/src/booley/data/__pycache__/__init__.cpython-314.pyc +0 -0
- booley_rtl-0.1.0/src/booley/data/cheatsheet.md +180 -0
- booley_rtl-0.1.0/src/booley/data/criteria.toml +164 -0
- booley_rtl-0.1.0/src/booley/data/docker/Dockerfile +227 -0
- booley_rtl-0.1.0/src/booley/data/docker/Dockerfile.egress-proxy +7 -0
- booley_rtl-0.1.0/src/booley/data/docker/Dockerfile.reaper +9 -0
- booley_rtl-0.1.0/src/booley/data/docker/Dockerfile.riscv +140 -0
- booley_rtl-0.1.0/src/booley/data/docker/build-riscv.sh +29 -0
- booley_rtl-0.1.0/src/booley/data/docker/build.sh +27 -0
- booley_rtl-0.1.0/src/booley/data/docker/pdk/NangateOpenCellLibrary_typical_ccs.lib +133314 -0
- booley_rtl-0.1.0/src/booley/data/docker/pdk/nangate45/Nangate45.rc +13 -0
- booley_rtl-0.1.0/src/booley/data/docker/pdk/nangate45/Nangate45_stdcell.lef +11552 -0
- booley_rtl-0.1.0/src/booley/data/docker/pdk/nangate45/Nangate45_tech.lef +779 -0
- booley_rtl-0.1.0/src/booley/data/docker/pdk/nangate45/README.md +6 -0
- booley_rtl-0.1.0/src/booley/data/refs/booley_vcd_dump.sv +19 -0
- booley_rtl-0.1.0/src/booley/data/refs/code_review/rtl/functional.md +62 -0
- booley_rtl-0.1.0/src/booley/data/refs/code_review/rtl/ifdef.md +57 -0
- booley_rtl-0.1.0/src/booley/data/refs/code_review/rtl/optimization.md +71 -0
- booley_rtl-0.1.0/src/booley/data/refs/code_review/rtl/protocol-cdc.md +60 -0
- booley_rtl-0.1.0/src/booley/data/refs/code_review/rtl/quality.md +22 -0
- booley_rtl-0.1.0/src/booley/data/refs/code_review/rtl/security.md +56 -0
- booley_rtl-0.1.0/src/booley/data/refs/code_review/testbench/tb-review.md +69 -0
- booley_rtl-0.1.0/src/booley/data/refs/rtl-mutation-testing.md +192 -0
- booley_rtl-0.1.0/src/booley/data/refs/rtl_style_guide.md +48 -0
- booley_rtl-0.1.0/src/booley/data/refs/sim_result_sentinel.sv +23 -0
- booley_rtl-0.1.0/src/booley/data/refs/tb_style_guide.md +312 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-setup/AGENTS_TEMPLATE.md +25 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-setup/BOOLEY_TEMPLATE.toml +35 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-setup/CORE_TEMPLATE.yaml +56 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-setup/SKILL.md +125 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-setup/TESTS_TEMPLATE.toml +12 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-setup/agents/openai.yaml +4 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-setup/steps/2-project-config.md +399 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-setup/steps/3-agents-md.md +95 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-setup/steps/4-simulate.md +79 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-setup/steps/5-lint.md +57 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-setup/steps/6-asic-synthesize.md +111 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-setup/steps/7-doctor.md +58 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-setup/steps/_adapter-common.md +246 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-create/SKILL.md +105 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-create/TICKET_TEMPLATE.md +173 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-create/ticket-creation.md +306 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-triage/SKILL.md +50 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-triage/steps/01-board-orphans.md +16 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-triage/steps/02-blocked.md +76 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-triage/steps/03-review.md +77 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-triage/steps/04-summary.md +22 -0
- booley_rtl-0.1.0/src/booley/data/skills/booley-ticket-triage/tool-reference.md +35 -0
- booley_rtl-0.1.0/src/booley/docker/__init__.py +0 -0
- booley_rtl-0.1.0/src/booley/docker/egress_proxy.py +388 -0
- booley_rtl-0.1.0/src/booley/docker/proxy_entry.py +86 -0
- booley_rtl-0.1.0/src/booley/docker/reaper.py +261 -0
- booley_rtl-0.1.0/src/booley/filelock.py +86 -0
- booley_rtl-0.1.0/src/booley/filesystem_utils.py +74 -0
- booley_rtl-0.1.0/src/booley/find_good_commit.py +650 -0
- booley_rtl-0.1.0/src/booley/fusesoc_registry.py +1587 -0
- booley_rtl-0.1.0/src/booley/fusesoc_trace_overlay.py +450 -0
- booley_rtl-0.1.0/src/booley/guidance_links.py +130 -0
- booley_rtl-0.1.0/src/booley/harness/__init__.py +9 -0
- booley_rtl-0.1.0/src/booley/harness/__main__.py +151 -0
- booley_rtl-0.1.0/src/booley/harness/_backend_config.py +492 -0
- booley_rtl-0.1.0/src/booley/harness/_claude_backend.py +884 -0
- booley_rtl-0.1.0/src/booley/harness/_claude_transcript_md.py +117 -0
- booley_rtl-0.1.0/src/booley/harness/_codex_backend.py +699 -0
- booley_rtl-0.1.0/src/booley/harness/_codex_transcript_md.py +224 -0
- booley_rtl-0.1.0/src/booley/harness/_cost.py +48 -0
- booley_rtl-0.1.0/src/booley/harness/_editor_config.py +38 -0
- booley_rtl-0.1.0/src/booley/harness/_limits.py +22 -0
- booley_rtl-0.1.0/src/booley/harness/_retry.py +81 -0
- booley_rtl-0.1.0/src/booley/harness/_ticket_ops.py +484 -0
- booley_rtl-0.1.0/src/booley/harness/agent.py +102 -0
- booley_rtl-0.1.0/src/booley/harness/agent_backend.py +68 -0
- booley_rtl-0.1.0/src/booley/harness/backends/__init__.py +16 -0
- booley_rtl-0.1.0/src/booley/harness/backends/sim_base.py +47 -0
- booley_rtl-0.1.0/src/booley/harness/blocking.py +159 -0
- booley_rtl-0.1.0/src/booley/harness/booley.py +1089 -0
- booley_rtl-0.1.0/src/booley/harness/booley_status_display.py +222 -0
- booley_rtl-0.1.0/src/booley/harness/colors.py +126 -0
- booley_rtl-0.1.0/src/booley/harness/config.py +175 -0
- booley_rtl-0.1.0/src/booley/harness/console/__init__.py +9 -0
- booley_rtl-0.1.0/src/booley/harness/console/app.py +342 -0
- booley_rtl-0.1.0/src/booley/harness/console/console.tcss +42 -0
- booley_rtl-0.1.0/src/booley/harness/console/criteria_format.py +101 -0
- booley_rtl-0.1.0/src/booley/harness/console/events.py +86 -0
- booley_rtl-0.1.0/src/booley/harness/console/links.py +582 -0
- booley_rtl-0.1.0/src/booley/harness/console/path_backtick.py +66 -0
- booley_rtl-0.1.0/src/booley/harness/console/widgets.py +784 -0
- booley_rtl-0.1.0/src/booley/harness/criteria_acceptance.py +545 -0
- booley_rtl-0.1.0/src/booley/harness/debug_journal.py +100 -0
- booley_rtl-0.1.0/src/booley/harness/devcontainer.py +464 -0
- booley_rtl-0.1.0/src/booley/harness/doctor.py +3745 -0
- booley_rtl-0.1.0/src/booley/harness/git_utils.py +476 -0
- booley_rtl-0.1.0/src/booley/harness/init_cmd.py +1352 -0
- booley_rtl-0.1.0/src/booley/harness/init_common.py +70 -0
- booley_rtl-0.1.0/src/booley/harness/init_docker_image.py +408 -0
- booley_rtl-0.1.0/src/booley/harness/init_git_hooks.py +347 -0
- booley_rtl-0.1.0/src/booley/harness/init_skills.py +164 -0
- booley_rtl-0.1.0/src/booley/harness/interactive_docker.py +346 -0
- booley_rtl-0.1.0/src/booley/harness/logging_utils.py +97 -0
- booley_rtl-0.1.0/src/booley/harness/mcp_config.py +121 -0
- booley_rtl-0.1.0/src/booley/harness/models.py +213 -0
- booley_rtl-0.1.0/src/booley/harness/orchestrator.py +1633 -0
- booley_rtl-0.1.0/src/booley/harness/orchestrator_display.py +406 -0
- booley_rtl-0.1.0/src/booley/harness/orchestrator_guardrails.py +90 -0
- booley_rtl-0.1.0/src/booley/harness/orchestrator_probe.py +142 -0
- booley_rtl-0.1.0/src/booley/harness/orchestrator_prompt.py +571 -0
- booley_rtl-0.1.0/src/booley/harness/orphan_handler.py +177 -0
- booley_rtl-0.1.0/src/booley/harness/preflight.py +438 -0
- booley_rtl-0.1.0/src/booley/harness/project_image.py +340 -0
- booley_rtl-0.1.0/src/booley/harness/prompt_artifacts.py +121 -0
- booley_rtl-0.1.0/src/booley/harness/render_md.py +390 -0
- booley_rtl-0.1.0/src/booley/harness/sandbox.py +327 -0
- booley_rtl-0.1.0/src/booley/harness/sim_utils.py +169 -0
- booley_rtl-0.1.0/src/booley/harness/steps/__init__.py +13 -0
- booley_rtl-0.1.0/src/booley/harness/steps/step_00_parse_validate.py +477 -0
- booley_rtl-0.1.0/src/booley/harness/steps/step_01_setup.py +608 -0
- booley_rtl-0.1.0/src/booley/harness/steps/worktree_lock_gc.py +126 -0
- booley_rtl-0.1.0/src/booley/harness/subscription_limit.py +220 -0
- booley_rtl-0.1.0/src/booley/harness/terminal.py +319 -0
- booley_rtl-0.1.0/src/booley/harness/ticket_cli.py +193 -0
- booley_rtl-0.1.0/src/booley/harness/worktree_health.py +105 -0
- booley_rtl-0.1.0/src/booley/heartbeat.py +121 -0
- booley_rtl-0.1.0/src/booley/host_tools/__init__.py +1 -0
- booley_rtl-0.1.0/src/booley/host_tools/__main__.py +214 -0
- booley_rtl-0.1.0/src/booley/host_tools/exceptions.py +43 -0
- booley_rtl-0.1.0/src/booley/host_tools/fixtures/vivado_impl_pass.log +89 -0
- booley_rtl-0.1.0/src/booley/host_tools/fixtures/vivado_routed_real.rpt +41 -0
- booley_rtl-0.1.0/src/booley/host_tools/fixtures/vivado_routed_real_2025_2.rpt +49 -0
- booley_rtl-0.1.0/src/booley/host_tools/fixtures/vivado_timing.rpt +53 -0
- booley_rtl-0.1.0/src/booley/host_tools/job_manager.py +300 -0
- booley_rtl-0.1.0/src/booley/host_tools/job_state.py +98 -0
- booley_rtl-0.1.0/src/booley/host_tools/mcp_proxy.py +250 -0
- booley_rtl-0.1.0/src/booley/host_tools/path_mapper.py +80 -0
- booley_rtl-0.1.0/src/booley/host_tools/result_extractor.py +92 -0
- booley_rtl-0.1.0/src/booley/host_tools/server.py +331 -0
- booley_rtl-0.1.0/src/booley/host_tools/subprocess_runner.py +247 -0
- booley_rtl-0.1.0/src/booley/host_tools/template_loader.py +92 -0
- booley_rtl-0.1.0/src/booley/host_tools/template_renderer.py +181 -0
- booley_rtl-0.1.0/src/booley/host_tools/template_schema.py +90 -0
- booley_rtl-0.1.0/src/booley/host_tools/templates/run_host_command.sh +11 -0
- booley_rtl-0.1.0/src/booley/host_tools/templates/run_host_command.yaml +52 -0
- booley_rtl-0.1.0/src/booley/host_tools/templates/spyglass_lint.tcl +29 -0
- booley_rtl-0.1.0/src/booley/host_tools/templates/spyglass_lint.yaml +37 -0
- booley_rtl-0.1.0/src/booley/host_tools/templates/vivado_synth.tcl +44 -0
- booley_rtl-0.1.0/src/booley/host_tools/templates/vivado_synth.yaml +52 -0
- booley_rtl-0.1.0/src/booley/host_tools/templates/xcelium_sim.sh +29 -0
- booley_rtl-0.1.0/src/booley/host_tools/templates/xcelium_sim.yaml +42 -0
- booley_rtl-0.1.0/src/booley/incontainer_register.py +325 -0
- booley_rtl-0.1.0/src/booley/job_slots.py +617 -0
- booley_rtl-0.1.0/src/booley/mcp_server.py +2411 -0
- booley_rtl-0.1.0/src/booley/nested_mcp_capabilities.py +67 -0
- booley_rtl-0.1.0/src/booley/paths.py +69 -0
- booley_rtl-0.1.0/src/booley/platform_paths.py +149 -0
- booley_rtl-0.1.0/src/booley/project_config.py +406 -0
- booley_rtl-0.1.0/src/booley/project_dir.py +128 -0
- booley_rtl-0.1.0/src/booley/run_mutmut.py +528 -0
- booley_rtl-0.1.0/src/booley/shared_infra.py +418 -0
- booley_rtl-0.1.0/src/booley/sim/bwave_fifo.py +260 -0
- booley_rtl-0.1.0/src/booley/sim/iverilog_run.py +456 -0
- booley_rtl-0.1.0/src/booley/sim/run_guard.py +149 -0
- booley_rtl-0.1.0/src/booley/sim/sim_result.py +285 -0
- booley_rtl-0.1.0/src/booley/sim/trace_session.py +710 -0
- booley_rtl-0.1.0/src/booley/sim/vcs_run.py +269 -0
- booley_rtl-0.1.0/src/booley/sim/verilator_run.py +513 -0
- booley_rtl-0.1.0/src/booley/sim/xcelium_run.py +261 -0
- booley_rtl-0.1.0/src/booley/sim_links.py +142 -0
- booley_rtl-0.1.0/src/booley/ticket_board/__init__.py +272 -0
- booley_rtl-0.1.0/src/booley/ticket_board/__main__.py +7 -0
- booley_rtl-0.1.0/src/booley/ticket_board/analytics.py +413 -0
- booley_rtl-0.1.0/src/booley/ticket_board/archive.py +136 -0
- booley_rtl-0.1.0/src/booley/ticket_board/cli.py +394 -0
- booley_rtl-0.1.0/src/booley/ticket_board/cli_handlers.py +676 -0
- booley_rtl-0.1.0/src/booley/ticket_board/constants.py +99 -0
- booley_rtl-0.1.0/src/booley/ticket_board/criteria_markdown.py +295 -0
- booley_rtl-0.1.0/src/booley/ticket_board/evidence.py +101 -0
- booley_rtl-0.1.0/src/booley/ticket_board/execution.py +248 -0
- booley_rtl-0.1.0/src/booley/ticket_board/frontmatter.py +533 -0
- booley_rtl-0.1.0/src/booley/ticket_board/git_ops.py +151 -0
- booley_rtl-0.1.0/src/booley/ticket_board/helpers.py +225 -0
- booley_rtl-0.1.0/src/booley/ticket_board/io.py +718 -0
- booley_rtl-0.1.0/src/booley/ticket_board/lifecycle.py +177 -0
- booley_rtl-0.1.0/src/booley/ticket_board/logs.py +209 -0
- booley_rtl-0.1.0/src/booley/ticket_board/notifications.py +139 -0
- booley_rtl-0.1.0/src/booley/ticket_board/operations.py +736 -0
- booley_rtl-0.1.0/src/booley/ticket_board/paths.py +145 -0
- booley_rtl-0.1.0/src/booley/ticket_board/reporting.py +382 -0
- booley_rtl-0.1.0/src/booley/ticket_board/run_metrics.py +177 -0
- booley_rtl-0.1.0/src/booley/ticket_board/scanner.py +188 -0
- booley_rtl-0.1.0/src/booley/ticket_board/validation.py +752 -0
- booley_rtl-0.1.0/src/booley/ticket_board/validation_logs.py +163 -0
- booley_rtl-0.1.0/src/booley/tool_lock.py +140 -0
- booley_rtl-0.1.0/src/booley/tools/__init__.py +104 -0
- booley_rtl-0.1.0/src/booley/tools/_baseline_worktree.py +103 -0
- booley_rtl-0.1.0/src/booley/tools/_diff_classify.py +203 -0
- booley_rtl-0.1.0/src/booley/tools/_job_records.py +243 -0
- booley_rtl-0.1.0/src/booley/tools/_run_lock.py +67 -0
- booley_rtl-0.1.0/src/booley/tools/_tool_events.py +176 -0
- booley_rtl-0.1.0/src/booley/tools/asic_synthesize.py +1595 -0
- booley_rtl-0.1.0/src/booley/tools/base.py +801 -0
- booley_rtl-0.1.0/src/booley/tools/bwave.py +892 -0
- booley_rtl-0.1.0/src/booley/tools/bwave_sessions.py +269 -0
- booley_rtl-0.1.0/src/booley/tools/clock_timing.py +167 -0
- booley_rtl-0.1.0/src/booley/tools/commit_git_io.py +150 -0
- booley_rtl-0.1.0/src/booley/tools/commit_message_format.py +130 -0
- booley_rtl-0.1.0/src/booley/tools/commit_msg_hook.py +107 -0
- booley_rtl-0.1.0/src/booley/tools/commit_msg_utils.py +159 -0
- booley_rtl-0.1.0/src/booley/tools/compare_vcd.py +562 -0
- booley_rtl-0.1.0/src/booley/tools/coverage_analyst.py +2663 -0
- booley_rtl-0.1.0/src/booley/tools/coverage_verilog_utils.py +291 -0
- booley_rtl-0.1.0/src/booley/tools/criteria.py +712 -0
- booley_rtl-0.1.0/src/booley/tools/criteria_reference.py +298 -0
- booley_rtl-0.1.0/src/booley/tools/deploy_skills.py +274 -0
- booley_rtl-0.1.0/src/booley/tools/edam.py +413 -0
- booley_rtl-0.1.0/src/booley/tools/elaborate.py +388 -0
- booley_rtl-0.1.0/src/booley/tools/fpga_edam.py +356 -0
- booley_rtl-0.1.0/src/booley/tools/fpga_impl.py +847 -0
- booley_rtl-0.1.0/src/booley/tools/fpga_metrics.py +154 -0
- booley_rtl-0.1.0/src/booley/tools/interface_spec.py +185 -0
- booley_rtl-0.1.0/src/booley/tools/lint.py +693 -0
- booley_rtl-0.1.0/src/booley/tools/mechanical_tool.py +131 -0
- booley_rtl-0.1.0/src/booley/tools/mut_harness_inject.py +257 -0
- booley_rtl-0.1.0/src/booley/tools/mutation_lock.py +523 -0
- booley_rtl-0.1.0/src/booley/tools/mutation_tester.py +2153 -0
- booley_rtl-0.1.0/src/booley/tools/orchestration_state.py +920 -0
- booley_rtl-0.1.0/src/booley/tools/pre-commit-ruff.sh +26 -0
- booley_rtl-0.1.0/src/booley/tools/project_native_backend.py +374 -0
- booley_rtl-0.1.0/src/booley/tools/registry.py +359 -0
- booley_rtl-0.1.0/src/booley/tools/reviewer.py +1763 -0
- booley_rtl-0.1.0/src/booley/tools/rewrite_commits.py +25 -0
- booley_rtl-0.1.0/src/booley/tools/schema_extractor.py +107 -0
- booley_rtl-0.1.0/src/booley/tools/scope_precommit_hook.py +97 -0
- booley_rtl-0.1.0/src/booley/tools/sim_edam.py +393 -0
- booley_rtl-0.1.0/src/booley/tools/simulate.py +2163 -0
- booley_rtl-0.1.0/src/booley/tools/source_fingerprint.py +147 -0
- booley_rtl-0.1.0/src/booley/tools/specialist.py +646 -0
- booley_rtl-0.1.0/src/booley/tools/submit_run_report.py +317 -0
- booley_rtl-0.1.0/src/booley/tools/tb_coder.py +746 -0
- booley_rtl-0.1.0/src/booley/tools/threshold_eval.py +152 -0
- booley_rtl-0.1.0/src/booley/tools/tools_reference.py +175 -0
- booley_rtl-0.1.0/src/booley/tools/validate_commit_msg.py +198 -0
- booley_rtl-0.1.0/src/booley/tools/workspace_isolation.py +696 -0
- booley_rtl-0.1.0/src/booley/tools/worktree_create.sh +508 -0
- booley_rtl-0.1.0/src/booley/venue.py +71 -0
- booley_rtl-0.1.0/src/booley/vivado/xdc/timing.xdc +7 -0
- booley_rtl-0.1.0/src/booley/yosys/abc_config.json +5 -0
- booley_rtl-0.1.0/src/booley/yosys/abc_scripts/abc_aggressive.script +21 -0
- booley_rtl-0.1.0/src/booley/yosys/abc_scripts/abc_balanced.script +15 -0
- booley_rtl-0.1.0/src/booley/yosys/abc_scripts/abc_fast.script +10 -0
- booley_rtl-0.1.0/src/booley/yosys/openroad_timing.py +351 -0
- booley_rtl-0.1.0/src/booley/yosys/run_yosys_syn.py +494 -0
- booley_rtl-0.1.0/src/booley/yosys/sdc/abc_simple.sdc +5 -0
- booley_rtl-0.1.0/src/booley/yosys/syn_config.py +33 -0
- booley_rtl-0.1.0/src/booley/yosys/syn_core.py +1065 -0
- booley_rtl-0.1.0/src/booley/yosys/syn_discovery.py +52 -0
- booley_rtl-0.1.0/src/booley/yosys/syn_parse.py +60 -0
- booley_rtl-0.1.0/src/booley/yosys/syn_subprocess.py +199 -0
- booley_rtl-0.1.0/src/booley/yosys/synthesis_watchdog.py +565 -0
- booley_rtl-0.1.0/src/booley/zombie_cleanup.py +183 -0
- booley_rtl-0.1.0/src/booley_rtl.egg-info/PKG-INFO +251 -0
- booley_rtl-0.1.0/src/booley_rtl.egg-info/SOURCES.txt +321 -0
- booley_rtl-0.1.0/src/booley_rtl.egg-info/dependency_links.txt +1 -0
- booley_rtl-0.1.0/src/booley_rtl.egg-info/entry_points.txt +5 -0
- booley_rtl-0.1.0/src/booley_rtl.egg-info/requires.txt +32 -0
- booley_rtl-0.1.0/src/booley_rtl.egg-info/top_level.txt +2 -0
- booley_rtl-0.1.0/src/bwave/tests/fixtures/real_cvdp/generate.py +599 -0
- booley_rtl-0.1.0/src/bwave/tests/gen_test_vcds.py +418 -0
- booley_rtl-0.1.0/src/bwave/tests/gen_xcelium_dialect_vcd.py +152 -0
- booley_rtl-0.1.0/src/bwave/tests/simulator_ground_truth_test.py +1723 -0
- booley_rtl-0.1.0/src/bwave/tests/test_real_cvdp_fixtures.py +140 -0
- booley_rtl-0.1.0/src/bwave/tests/test_xcelium_dialect.py +148 -0
- booley_rtl-0.1.0/src/bwave/tools/check_schema.py +147 -0
- booley_rtl-0.1.0/tests/test_bootstrap_mode.py +55 -0
- booley_rtl-0.1.0/tests/test_core_boundary.py +366 -0
- booley_rtl-0.1.0/tests/test_core_security.py +491 -0
- booley_rtl-0.1.0/tests/test_entry_points.py +20 -0
- booley_rtl-0.1.0/tests/test_filesystem_utils.py +133 -0
- booley_rtl-0.1.0/tests/test_find_good_commit.py +50 -0
- booley_rtl-0.1.0/tests/test_fusesoc_registry.py +2052 -0
- booley_rtl-0.1.0/tests/test_guidance_links.py +116 -0
- booley_rtl-0.1.0/tests/test_heartbeat.py +173 -0
- booley_rtl-0.1.0/tests/test_host_mcp_adversarial.py +551 -0
- booley_rtl-0.1.0/tests/test_host_tools.py +1040 -0
- booley_rtl-0.1.0/tests/test_host_tools_cli.py +101 -0
- booley_rtl-0.1.0/tests/test_host_tools_integration.py +115 -0
- booley_rtl-0.1.0/tests/test_incontainer_register.py +301 -0
- booley_rtl-0.1.0/tests/test_interactive_smoke.py +518 -0
- booley_rtl-0.1.0/tests/test_job_slots.py +479 -0
- booley_rtl-0.1.0/tests/test_mcp_server.py +1048 -0
- booley_rtl-0.1.0/tests/test_nested_mcp_capabilities.py +57 -0
- booley_rtl-0.1.0/tests/test_paths.py +73 -0
- booley_rtl-0.1.0/tests/test_platform_paths.py +111 -0
- booley_rtl-0.1.0/tests/test_project_config_human_in_loop.py +197 -0
- booley_rtl-0.1.0/tests/test_project_dir.py +159 -0
- booley_rtl-0.1.0/tests/test_run_mutmut.py +564 -0
- booley_rtl-0.1.0/tests/test_run_tool.py +86 -0
- booley_rtl-0.1.0/tests/test_shared_infra.py +411 -0
- booley_rtl-0.1.0/tests/test_source_map_from_core.py +244 -0
- booley_rtl-0.1.0/tests/test_tool_lock.py +118 -0
- booley_rtl-0.1.0/tests/test_venue.py +102 -0
- booley_rtl-0.1.0/tests/test_zombie_cleanup.py +88 -0
booley_rtl-0.1.0/LICENSE
ADDED
|
@@ -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
|
+
[](https://opensource.org/licenses/Apache-2.0)
|
|
52
|
+
[](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.
|