Skip to content

update plugin/RTL2Spec to main branch - #142

Open
wutianze wants to merge 16 commits into
plugin/RTL2Specfrom
main
Open

wutianze wants to merge 16 commits into
plugin/RTL2Specfrom
main

Conversation

@wutianze

Copy link
Copy Markdown
Contributor

No description provided.

…hrough

Add design_with_ppa.rtl.python_dut.options.verilator_args: a list of
single-token verilator arguments the managed Python-DUT build forwards
through picker's --vflag.  The absent-key default injects
--output-split 2000 so verilator's statement-count splitter keeps each
generated C++ file small enough for parallel compilation; a configured
list replaces the default wholesale and is validated against
whitespace, quotes, and shell/Makefile metacharacters.  Multi-token
values are single-quoted for picker's shell-based console launcher so
they arrive as one --vflag argument.  The normalized options join the
RTL config identity, so changing them invalidates cached builds.
…ault

Add design_with_ppa.rtl.python_dut.options.ccache_enabled (default
true).  When the ccache command is installed, the managed Python-DUT
build routes generated C++ compilation through it via a compiler-name
PATH masquerade, without touching picker's fixed generated cmake
invocation; CCACHE_BASEDIR, CCACHE_NOHASHDIR, and CCACHE_IGNOREOPTIONS
are set so rebuilds from fresh temporary directories still hit the
cache and picker's hardcoded -march=native probe cannot disable it.
When ccache is missing, the build warns with install guidance and
proceeds uncached; false disables the cache entirely.  The option
joins the RTL config identity, so toggling it invalidates cached
builds.
A stage_args timeout previously tripped the reserved-field guard and
failed the whole call, even though it names the same call-time budget
as the tool-level timeout parameter.  Consume it exactly like the
existing full_output control: validate it as a non-negative integer
number of seconds, pop it before Checker dispatch, and run Check/
Complete with the larger of the tool-level and stage_args values so a
caller-granted budget is never truncated.  is_complete stays reserved
and is now rejected with a message naming the field and why.
Document the control field in the Check/Complete tool schemas and the
checker development guide.
… builds

prepare_unit now takes the resolved workflow configuration and
forwards design_with_ppa.rtl.python_dut.options - the verilator -V
passthrough and the ccache wrapper - into the managed unit build, so
repo-module-tdd users configure them like unit-design-tdd users via
config.yaml or --override.  The RTL language, source glob, and
template stay pinned to the module's normalized unit sources, and the
forwarded options join the build identity so changing them rebuilds.
validate_unit and the delivery replay pass their RepoPaths cfg, and
repo-module-tdd.yaml declares the option defaults so they remain
discoverable in the workflow config file.
… references

Scoring every candidate scope by rescanning the whole VCD header is
quadratic in declared references, and rebuilding the expected-bit port
index inside _reference_bit_positions on every call multiplied that
cost by the input-port width. On wide generated-RTL waveforms the
discovery alone cost about 100 seconds per performance TC.

Group all declared references under their direct parent scope once,
hoist the port index to the callers, and score each candidate from its
own children only. Scope selection semantics (deepest deterministic
candidate, custom-scope preservation) are unchanged; a deep-hierarchy
regression test guards the linear bound.
…T waveforms

The temporary VCD produced before activity parsing dumped every facet
of the DUT (about 119 MB per performance TC on wide designs) even
though only top-level input ports are ever bound.

Pass the synthesized input-port names to _convert_fst_to_vcd and set
per-facet process masks through pylibfst so only matching facets are
decoded; FST hierarchy vector names carry a spaced suffix that is
stripped before matching. The emitted hierarchy section still lists
every declared signal, so scope discovery and coverage checks observe
the same contract, and a wanted set matching no facet falls back to
full decoding. Focused tests cover filtered/full activity equivalence,
vector-suffixed names, and the fallback path.
Add master_api.max_task_count (default 100) as the maximum number of
managed tasks the master executes in parallel. A validated launch
request that exceeds the limit, or arrives while earlier submissions
are still waiting, is stored as a waiting task record and started
automatically in submission order once a slot frees up. New submissions
never jump the queue.

Waiting tasks carry a monotonic queue_seq that survives restarts and
backs POST /api/tasks/waiting/order for reordering the queue. They can
be stopped out of the queue while keeping their workspace, or deleted
to cancel the submission together with its workspace directory. List
and detail responses expose queue_position, and /api/tasks and
/api/agents expose max_task_count and waiting_task_count for clients.
Dispatch failures keep a failed task record instead of silently
dropping the queued submission.
Add a Waiting stat card beside Total/Online/Offline on the master
dashboard and a Launch Queue panel on the task page. The panel is the
single place waiting tasks are listed, showing queue position, task id,
DUT, and created/queued timestamps; rows reorder the queue by
drag-and-drop or move buttons and cancel queued submissions. The task
list no longer repeats waiting rows, keeps CMD/Terminal disabled until
a task starts, and shows a permanent max-parallel chip. The launch page
reports queued submissions explicitly for single and batch launches.
Switch the default launch backend to opencode, require the reference
model for DUT tests (NEED_REF_MODEL), stop ignoring mock components,
and drop the OPENAI_CONTEXT_SIZE, OPENAI_OUTPUT_SIZE, and
CLAUDE_CODE_MAX_CONTEXT_TOKENS environment entries.
Show a full docker run --env-file example alongside the -e flags, and
keep env-file comments on their own lines: docker does not strip inline
comments, so a trailing '# ...' would become part of the value. Sync the
same section into README.en.md.
Tasks launched through the master now default to --mcp-server-port -1 so
each child picks a free port instead of every task competing for the
shared mcp_server.port (5000), which breaks parallel launches. An
explicit port in a launch request still wins over the default.

Cover the default and the explicit-override path with focused tests on
the launch request merge and child command construction.
@wutianze
wutianze added this pull request to stack #143 October 10, 2026 02:47
un_write_dirs and write_dirs entries now accept glob patterns: *, ?, and
[...] match within one path segment, a ** segment matches zero or more
whole segments, and a matched path protects or allows everything below
it. Literal entries keep exact component comparison.

The shared matcher in tools/fileops.py now gates the file write tools,
ApplyWaveInfoEvidence target resolution, the template-target read-only
conflict check, --no-write targets, PDB add_write_path/add_un_write_path
at runtime, and the RTL2Spec plugin's protected-children precheck. Tool
init warns via glob expansion instead of a literal existence check, and
denial diagnostics name the matched no-write entry.
… write_dirs entries

When a path matches both lists, the deepest matching entry now decides:
a write entry strictly below a no-write entry makes that subtree writable
again (e.g. un_write_dirs ["{DUT}"] with write_dirs ["{DUT}/*.md",
"{DUT}/{DUT}.db/"]), while an equal-depth conflict keeps the path
protected, preserving the single-file self-protection contract.

The startup read-only chmod skips paths the write policy re-allows and
keeps protected directories writable when they hold declared write
entries, so carve-out directories that only appear at runtime can be
created and filled. ApplyWaveInfoEvidence resolves targets with the same
precedence, and allowed/denied diagnostics name the deciding entry.
…ted DUT

Add {DUT}/**/*.vdb, {DUT}/**/*.fsdb, and {DUT}/**/*.vpd to the default
write_dirs. VCS creates *.vdb data directories and dumps *.fsdb/*.vpd
waveform files wherever the simulator runs, including inside the DUT
tree, and needs to create them at runtime. The carve-out keeps matched
paths and their subtrees writable while the rest of {DUT} stays
protected; the contract is locked by a config loader test that renders
the defaults and checks both the allowed artifacts and still-protected
siblings.
…ctory

The "formal_test copy" template tree was committed by mistake and is not
referenced by any workflow, config, or test. Remove it entirely.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants