io.github.gokeshenzhen/traceweave
TraceWeave is an MCP server that assists AI-driven RTL/SoC debugging by connecting simulation logs, waveforms, source code, and compile records into evidence-backed investigation tools.
Locate simulation artifacts — discover compile logs, simulation logs, VCD/FSDB waveforms, and formal (JasperGold) artifacts under a project directory (get_sim_paths, get_formal_paths).
Parse and compare simulation failures — group runtime errors by signature, extract timestamps/context, diff failures between runs, and recommend next debugging steps (parse_sim_log, get_error_context, diff_sim_failure_results, analyze_failures, analyze_failure_event, recommend_failure_debug_next_steps).
Build and browse design hierarchy — construct testbench/RTL hierarchy from compile logs, browse subtrees, find instances, inspect source files, and explore UVM/class inheritance (build_tb_hierarchy, get_tb_subtree, find_tb_instance, lookup_tb_files, get_tb_file_detail, get_tb_class_hierarchy, dump_tb_section).
Scan for structural risks — statically detect suspicious ties, open inputs, constant comparisons, multi-drive, incomplete case, and magic conditions without running simulation (scan_structural_risks).
Query waveforms — inspect format/duration, search signal paths, read signal values at a time, list transitions, sample around a timestamp or on clock edges (get_waveform_summary, search_signals, get_signal_at_time, get_signal_transitions, get_signals_around_time, get_signals_by_cycle).
Trace signal drivers and loads — explain RTL drivers, find consumers, trace connectivity paths, and follow X/Z propagation using NPI, Source Graph, or static analysis backends (explain_signal_driver, find_signal_loads, trace_signal_path, trace_x_source).
Analyze handshakes and protocols — discover valid/ready and AHB/APB bundles, sweep interfaces for stalls/backpressure/payload-hold violations, and reconstruct id-correlated transactions with latency and ordering facts (suggest_handshakes, suggest_protocol_bundles, sweep_handshakes, inspect_handshake, reconstruct_transactions).
Verify timing and differences — find first divergence between signals/waveforms, check signal periodicity, and evaluate temporal predicates over clock windows with concrete witnesses (diff_first_divergence, period, verify_window).
Manage time cursors — name, list, and delete reusable timestamps for later queries (cursor_set, cursor_list, cursor_delete).
Build EDA backends — construct a Verdi KDB from compile logs for NPI-based signal tracing (build_kdb).
Get a debugging snapshot — review collected evidence and missing steps at the start of a session (get_diagnostic_snapshot).
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@io.github.gokeshenzhen/traceweaveFind the first signal divergence in the latest VCD waveform."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
🐙 TraceWeave
TraceWeave is an MCP server for RTL / SoC debugging. It connects compile records, simulation logs, VCD/FSDB waveforms, and RTL source to your AI assistant, helping you work from a failed simulation to the relevant time, signals, and driving logic.
Use it with Claude Code, Codex, Copilot, or another MCP client. Describe the problem in natural language; the assistant uses tools to investigate, trace, and verify, with evidence you can review.
Use Cases · Installation · Client Setup · Start Debugging · Tool Quick Reference · FAQ · Documentation and Feedback
Use Cases
Problem | How TraceWeave helps |
A simulation times out or hangs, with no clear starting point | Summarize failures and scan interface handshakes to narrow down the affected interfaces and time window |
A scoreboard mismatch or different results between runs | Compare failure records and waveforms, locate observed differences, and trace data and control sources on both sides |
A signal becomes X/Z | Inspect the surrounding waveform and follow upstream drivers to trace unknown-value propagation |
Suspected ties, unconnected inputs, or magic-word conditions | Statically scan source code for constant connections, open inputs, and constant comparisons as investigation leads; no simulation run or waveform required |
A deep SoC hierarchy with many modules and interfaces | Browse hierarchy on demand, locate instances and source files, and follow drivers, consumers, and connectivity paths |
A debugging hypothesis needs evidence | Sample by cycle and check timing conditions, handshake stability, and transaction completion |
Supports VCS / Xcelium simulation logs and VCD / FSDB waveforms. Exported formal waveforms can also be queried; automatic artifact discovery currently supports JasperGold.
Signal tracing (driver, load, and connectivity path queries) follows Verdi NPI → Source Graph → basic static analysis (Legacy Static) by default. It first queries the elaborated KDB; when NPI is unavailable or cannot provide a trustworthy result, it tries Source Graph without a commercial license, then falls back to basic static analysis where supported.
Capabilities for large designs, with selected examples of validated scale:
Hierarchy and source browsing on demand: the server builds and retains hierarchy and file indexes, then returns local results by instance, subtree, or file to keep large SoC queries manageable in the assistant's context. Hierarchy construction and local queries have been verified on a synthetic design with 50,500 logical instances; the initial build still scans compilation records and sources.
Bulk handshake checks:
sweep_handshakesdiscovers AHB / valid-ready interfaces and checks stalls, payload stability, and premature valid/HTRANS deassertion. A recorded design with 78,817 total signals and a 2.59 ms waveform yielded 49 candidate interfaces involving 262 clock/protocol signals; 35 interfaces were checked in about 4.65 minutes, with 14 skipped and partial coverage. Runtime and coverage depend on the waveform, interface types, and resource limits.GiB-scale log parsing:
parse_sim_loghas been verified on a 1 GiB synthetic log with 2,097,152 lines, finding all four errors at the beginning, middle, and end.
Related MCP server: Xcelium MCP Server
Installation
Requires Python 3.11+. Choose the installation that fits your environment:
Installation | Intended use |
Repository | Simulation hosts with an existing Verdi installation, for FSDB, Source Graph, and optional NPI / LSF |
PyPI | Log and VCD analysis, or Source Graph without a commercial license |
Repository Installation
git clone https://github.com/gokeshenzhen/TraceWeave.git
cd TraceWeave
export VERDI_HOME=/path/to/verdi
bash scripts/install.shThe installer prepares the Python environment, Source Graph, and FSDB reader, then checks the runtime. It leaves shell startup files and MCP client configuration untouched. NPI still requires the appropriate EDA runtime and license from your site.
For an existing installation, start with a read-only check:
bash scripts/install.sh --checkPyPI Installation
python3.11 -m pip install "traceweave-mcp[source-graph]"
traceweave-mcp --doctorFor logs, VCD, and basic static analysis only, install traceweave-mcp without [source-graph]. The PyPI package does not include the FSDB reader; use the repository installation for FSDB.
Client Setup
After a repository installation, generate a client configuration template with absolute paths:
Client | Generate configuration template |
Claude Code |
|
Codex |
|
Copilot |
|
These commands only print templates. Add the output to your client's MCP configuration, supply any required site EDA environment variables, and reconnect the server. See the client configuration reference for complete examples.
Other MCP clients supporting stdio can use these connection settings:
Installation |
|
|
Repository |
|
|
PyPI |
|
|
LSF-only NPI licenses
If Verdi/NPI licenses are available only on LSF compute nodes, provide these settings to the MCP server process. Replace digital with your queue:
export TRACEWEAVE_NPI_EXECUTION=lsf
export TRACEWEAVE_NPI_LSF_QUEUE="digital"The client must inherit or explicitly pass these variables. Project files, the TraceWeave installation, and cache directories must be visible at the same absolute paths on submission and compute nodes. See the LSF configuration reference for bash / tcsh examples, client environment forwarding, and verification steps.
Start Debugging
Once connected, try a request like this, replacing the path with your project directory:
Use TraceWeave to investigate the simulation failure in
my_caseunder/path/to/verif. Start with the logs, design structure, and interface handshakes, then trace suspicious signals. Include timestamps, signals, and source references in your findings.
You can also start with a specific question:
Compare
tb.dut.resultin these two waveforms and trace the logic producing the difference on each side.
Use deep mode to scan the design described by this compile log for suspicious ties, unconnected inputs, and constant comparisons.
The assistant's default investigation follows these steps:
Find the run's artifacts: locate compile logs, simulation logs, and waveforms.
Establish design context: build the hierarchy and scan structural risks in parallel using the same compile log.
Narrow the investigation: parse failures and scan handshakes for failed runs with a waveform.
Trace and verify: inspect signals, drivers, and consumers, then test hypotheses with window or cycle checks.
Compare after a fix: check how failure records and waveforms change in the next run.
For a first connection check, ask the assistant to call get_sim_paths and confirm that actual MCP tool calls run. See the debug workflow for the full procedure.
Custom Runtime Error Formats
parse_sim_log already recognizes standard UVM_ERROR / UVM_FATAL messages and VCS / Xcelium assertion failures, with a generic ERROR fallback. For project-specific checker, scoreboard, or $display output, add Python regular expressions to custom_patterns.yaml. Custom messages do not need to contain UVM_ERROR or even ERROR; no Python changes are required.
If your messages share a label but the text after it varies, matching that label is enough:
MY_CHECK_FAIL @ 12.5 ns expected=0x12 actual=0x34
MY_CHECK_FAIL @ 20 ns timeout waiting for responseReplace the default patterns: [] with the following, or append the rule to your existing patterns list:
patterns:
- name: my_checker
severity: ERROR
regex: '^MY_CHECK_FAIL'^ means the start of the line; everything after the label may vary, with no extra regex needed. If a timestamp or other text precedes the label, use regex: 'MY_CHECK_FAIL' to match it anywhere in the line.
nameidentifies the failure group.severitydefaults toERROR;FATALandWARNINGare also supported. Matched custom warnings are included in runtime failure counts.descriptionis for maintainers.regexmatches one log line at a time. Use YAML single quotes to preserve backslashes. Built-in assertion and UVM parsing runs first, followed by custom rules in list order (first match wins), then the genericERRORfallback. Recognized compile / elaboration diagnostics remain excluded.
The expected=0x12 actual=0x34 format above is already recognized automatically, so the simple label rule is enough and no named captures are needed. Suppose your log uses its own field names instead:
MY_CHECK_FAIL @ 12.5 ns want=0x12 have=0x34regex: '^MY_CHECK_FAIL' still recognizes the error and preserves the full message. To also extract want and have as the expected and actual values, replace the regex in the rule above with:
regex: '^MY_CHECK_FAIL.*want=(?P<expected>\S+)\s+have=(?P<actual>\S+)'Repository installations use the root custom_patterns.yaml by default. To keep project rules elsewhere, or when using the PyPI installation, save the YAML above in your own file and pass its absolute path to the MCP server process:
export TRACEWEAVE_CUSTOM_PATTERNS_FILE="/absolute/path/to/custom_patterns.yaml"This selects that file instead of the default custom rules; built-in formats remain active. The MCP client must inherit or explicitly forward the variable. Restart or reconnect the server after changing it, then parse the log again. Edits to the selected YAML are loaded on the next parse_sim_log call.
Tool Quick Reference
Usually, you describe the debugging goal and let the assistant select the tools. This table lists every tool by purpose; MCP tool definitions provide the parameters.
FAQ
Can I use TraceWeave without a commercial license?
Log analysis, VCD queries, static structural scanning, and Source Graph do not need a commercial license. Direct value and transition queries on existing waveforms do not need an NPI license: VCD uses the built-in parser, while FSDB uses local Verdi FSDB Reader libraries and the wrapper. Verdi NPI signal tracing and KDB builds require the corresponding EDA environment and license.
How should I judge signal-tracing accuracy?
NPI uses an elaborated KDB matching the current design; Source Graph builds a semantic connectivity graph from source. With complete compilation context, supported target semantics, and complete query coverage, exact resolution, and no truncation, the results can be treated as exact structural connectivity facts within the current query scope for driver, load, and connectivity path analysis.
Can I run static structural scans without simulation results?
Yes. scan_structural_risks performs static source analysis without running a simulation or reading simulation run logs or VCD / FSDB waveforms. The current interface requires a compile/elaboration log (compile_log) and access to the corresponding sources and include files, so it can be used after compilation/elaboration, before running the simulation.
How do I choose auto or deep for static structural scanning?
The default auto mode runs source-text checks and reuses compatible semantic results already available. Ask the assistant to use deep when you need a new semantic scan for constant connections, open inputs, and similar facts. The analysis_mode parameter applies to each call; no client configuration change is needed. Findings are leads to investigate: legitimate tie-offs and protocol constants may also appear.
Does a scan with no findings mean the design is correct?
Conclusions depend on actual coverage. Missing signals, resource limits, or unsupported structures can limit analysis. Zero findings with zero or partial coverage do not establish that a design is free of problems. Tools report coverage and truncation so the assistant can decide whether to narrow the scope and investigate further.
Can I inspect formal waveforms?
You can query exported VCD / FSDB files and automatically discover JasperGold artifacts. Property results, trace classification, and reachability semantics must come from the formal tool or the user.
Where is design data processed?
File parsing and EDA queries run locally or on the configured LSF compute nodes. Returned debugging evidence enters your AI client's context. TraceWeave usage telemetry is off by default and writes only to local files when enabled.
Documentation and Feedback
Learn more about | Resource |
Debugging steps and tool cooperation | |
Verifying a root cause with evidence | |
Architecture, backend capabilities, and resource limits | |
Complete environment configuration and advanced settings | |
Reporting a problem or suggesting a feature |
Before contributing, read AGENTS.md. With test dependencies installed, run python3.11 -m pytest from the repository root.
TraceWeave is available under the MIT License.
Follow the WeChat public account for project updates and debugging examples:
Available Tools
38 toolsanalyze_failure_eventB
Start from a single normalized failure_event and combine waveform, hierarchy, and source information to return recommended instances, signals, and source files.
| Name | Required | Description | Default |
|---|---|---|---|
| log_path | Yes | ||
| top_hint | No | ||
| simulator | Yes | vcs / xcelium | |
| wave_path | Yes | ||
| compile_log | No | ||
| failure_event | Yes | Normalized failure_event from parse_sim_log for the same log |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden; it does disclose the main transformation and output categories: combine waveform, hierarchy, and source information, and return recommended instances, signals, and source files. It does not elaborate on side effects, failure behavior, or dependencies beyond the implicit 'normalized failure_event' prerequisite, but the core behavior is not hidden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or repetition. It efficiently states the starting input, the data sources combined, and the output types, which is good for conciseness even if the tool's complexity might warrant more detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters, nested objects, no output schema, and no annotations, the description is too thin to fully guide correct invocation. It omits the explicit relationship to parse_sim_log, the role of optional parameters, and any guidance on what the recommended output looks like structurally.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, and the description compensates only loosely: 'waveform, hierarchy, and source information' hints at wave_path, top_hint, and compile_log but never maps these terms to actual parameters. It does not clarify log_path, top_hint, or compile_log semantics, and the only meaningful parameter explanation comes from the schema's failure_event description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's action: start from a single normalized failure_event, combine waveform/hierarchy/source information, and return recommended instances, signals, and source files. It distinguishes itself from plural/multi-event siblings like analyze_failures by emphasizing 'single normalized failure_event', though it does not explicitly name an alternative tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Start from a single normalized failure_event' implies the tool is meant to be used after parse_sim_log and per single failure event, giving some usage context. However, it does not explicitly say when to prefer this tool over siblings such as analyze_failures, recommend_failure_debug_next_steps, or get_diagnostic_snapshot, nor does it state exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_failuresA
Core failure-analysis tool. Focuses on the first occurrence of a single failure group and returns the log summary, raw error context, and waveform snapshot. FSDB support depends on fsdb_runtime.enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| log_path | Yes | Simulation log path, for example irun.log | |
| simulator | Yes | vcs / xcelium | |
| wave_path | Yes | Waveform file path, for example top_tb.fsdb | |
| window_ps | No | Waveform window around each failure time in ps. Default: 2000 | |
| group_index | No | Failure group index to analyze. Default: 0 | |
| signal_paths | Yes | Signal paths to inspect. Clients should confirm full paths with search_signals after inferring candidates from RTL or log output. | |
| extra_transitions | No | Extra transitions to include before the window for each signal. Default: 5 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It usefully discloses that only the first occurrence of a single failure group is examined, that it returns specific artifacts, and that FSDB support depends on fsdb_runtime.enabled. This gives an agent meaningful context beyond the tool name and schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler and front-loads the core purpose. The key scoping detail (first occurrence, single failure group) appears early, and the FSDB dependency is included as a necessary operational caveat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description states what outputs to expect, which is important because there is no output schema. It also covers a critical runtime dependency. It could be stronger by explaining how this tool relates to sibling analysis tools, but for a single-tool invocation it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% parameter coverage, so the schema already documents each parameter. The description does not add extra semantic detail about parameters, but it is not required to compensate for missing schema descriptions. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific failure-analysis tool and states its scope: the first occurrence of a single failure group. It also lists concrete outputs (log summary, raw error context, waveform snapshot), making the tool's purpose easy to grasp. It does not explicitly name or distinguish sibling tools, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The text says this is the "core failure-analysis tool," which suggests general use, but it gives no explicit when-to-use or when-not-to-use guidance. It does not mention alternatives such as analyze_failure_event or recommend_failure_debug_next_steps, nor does it explain how to choose among the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_kdbA
Auto-build a Verdi KDB from a parsed compile log using vericom + elabcom. Use this when the simulator is Xcelium (xrun) and the NPI backend reports no KDB, or to force-refresh a stale cached KDB. Output is cached under TRACEWEAVE_CACHE_DIR (default ~/.cache/traceweave/kdb//); cache hits reuse the previous KDB without re-invoking Verdi. When TRACEWEAVE_NPI_EXECUTION=lsf, every cache-miss/rebuild runs on the configured LSF queue and never falls back to a local licensed build. A runnable build.sh is written next to the KDB for inspection or reproduction. Requires VERDI_HOME with bin/vericom and bin/elabcom.
| Name | Required | Description | Default |
|---|---|---|---|
| top_hint | No | Override the top module. Defaults to the first non-recorder top in compile_result. | |
| simulator | No | vcs / xcelium / auto. Optional — auto-detected from the log when omitted. | |
| compile_log | Yes | Absolute path to the compile/elaborate log to drive the build from. | |
| force_rebuild | No | Rebuild even if the cache key matches an existing KDB. Default: false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it covers a lot: cache location, cache-hit reuse, LSF queue behavior with no fallback, generation of build.sh, and the VERDI_HOME requirement. It does not mention error behavior or the exact return value, but for a build/caching tool the key side effects and preconditions are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, when to use, caching behavior, LSF execution semantics, reproducibility script, and environment prerequisite. The most important information is front-loaded in the first two sentences, making it easy for an agent to quickly decide whether to invoke the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation/build tool with no annotations and no output schema, the description does strong work by covering environment requirements, caching, LSF behavior, and side effects. It stops short of stating what the tool returns on success or failure, which would make it fully self-contained for an agent. Overall, the missing return/error contract is a minor but real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces the meaning of force_rebuild ('force-refresh') and compile_log ('parsed compile log'), but it does not add substantial parameter-level detail beyond what the schema already provides. It adds context around environment variables and execution mode rather than parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific action and resource: 'Auto-build a Verdi KDB from a parsed compile log using vericom + elabcom.' It immediately differentiates this tool from the analysis/query siblings by focusing on construction of a KDB cache artifact. The use cases (Xcelium, missing KDB, stale cache) further disambiguate its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool: when the simulator is Xcelium (xrun), the NPI backend reports no KDB, or a stale cached KDB needs refreshing. It also gives behavior-specific guidance for TRACEWEAVE_NPI_EXECUTION=lsf. It does not explicitly name a non-use case or contrast with a sibling alternative, but the 'use this when' phrasing is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_tb_hierarchyA
Stream one compile/elaborate log plus optional complementary phase logs, scan source files, and cache the full testbench hierarchy server-side without retaining raw source bodies. For split VCS flows, prefer the source-compile log as compile_log and pass VHDL/source/elaboration companions in build order; later connectivity tools continue using that primary path. Returns a SLIM payload: project, stats, tree_skeleton (depth 2), interfaces, ambiguous_basenames, build_metrics, and hierarchy_handle. A configured timeout/source-byte guard returns build_status='blocked' plus a fixed blocker and no handle. Use a completed handle with get_tb_subtree / lookup_tb_files / find_tb_instance / get_tb_file_detail / get_tb_class_hierarchy / dump_tb_section to access the full data on demand.
| Name | Required | Description | Default |
|---|---|---|---|
| simulator | No | vcs / xcelium / auto (default: auto) | auto |
| compile_log | Yes | Absolute path to the primary compile or elaborate log | |
| supplementary_compile_logs | No | Optional ordered complementary compile/elaboration logs from the same simulator build; their order participates in the hierarchy and Source Graph identity |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations to supply safety or behavior hints, the description carries the full burden and does so well. It discloses caching, non-retention of raw source bodies, SLIM payload behavior, timeout/source-byte guard blocking, and the need to use the handle with getter tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and key behavior, then expands into usage guidance, return payload summary, and blocker behavior. Each sentence earns its place without redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since there is no output schema, the description compensates by summarizing the SLIM payload fields and the blocked response. It also covers input guidance, server-side caching, privacy-relevant behavior, and subsequent tool usage, making it complete for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining which log should be compile_log in split VCS flows and that supplementary logs participate in hierarchy identity via their order.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: stream logs, scan source files, and cache the testbench hierarchy server-side. It clearly distinguishes this tool from the sibling getter tools by framing it as the builder that returns a hierarchy_handle for later access.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for use, including how to choose compile_log in split VCS flows and how to order supplementary logs. It also names the follow-up tools that consume the handle, but it does not explicitly state when not to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cursor_deleteA
Delete a named cursor. Returns whether the cursor existed.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Cursor name to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It explicitly states that the tool returns whether the cursor existed, which indicates that deleting a non-existent cursor is handled gracefully rather than raising an error. The destructive nature of the operation is clear from the verb 'Delete', and no contradictory or hidden behavior is suggested.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the core action and includes the key return behavior. There is no filler, redundancy, or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a one-parameter tool with no output schema. The description, combined with the schema, covers the action, the target parameter, and the return behavior. An agent has all the information needed to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the single 'name' parameter already described as 'Cursor name to delete.' The description adds no additional parameter-level semantics beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Delete') and identifies the resource ('named cursor'), making the tool's purpose unambiguous. It is clearly distinct from sibling tools like cursor_set and cursor_list, which handle creation and listing respectively.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives. There are no mentions of prerequisites, context, or exclusions, and it does not reference related sibling tools. The intended usage is only implied by the action verb itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cursor_listA
List all cursors registered in the current session, ordered by time.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the ordering behavior and session scope, which is useful. However, it does not mention whether any state is modified, what happens when no cursors exist, or what the return format is. For a simple list tool this is acceptable but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is a single, front-loaded sentence with no filler. Every word adds meaning: scope ('current session'), operation ('list'), and ordering ('by time'). It is a model of concise documentation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description provides the essential information: what it lists, the scope, and the ordering. It could mention the expected return shape (e.g., array of cursor IDs), but that is largely inferred from the tool name and description. Overall, an agent can invoke this correctly without further details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool accepts zero parameters, so there is nothing to explain. Per the rubric, a zero-parameter tool gets a baseline of 4, and the description correctly implies no inputs are required. There is no parameter ambiguity to resolve.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') with a clear resource ('all cursors registered in the current session') and adds ordering ('by time'). This clearly differentiates it from the sibling tools cursor_set and cursor_delete, which are about modifying cursors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates that this tool is for inspecting cursors within the current session, which implies when to use it. It does not explicitly exclude alternates, but the sibling names (cursor_set, cursor_delete) make the intended context obvious. A small gap is the lack of explicit 'use this when you need to review active cursors' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cursor_setA
Register a named time anchor (in ps) for the current session. Other tools that take a time may reference '@' instead of copying ps integers across calls. Cursors are process-scoped and dropped on server restart. Names must match [A-Za-z_][A-Za-z0-9_-]*.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Cursor name. | |
| note | No | Optional human-readable note. | |
| time_ps | Yes | Anchor time in ps. Must be >= 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the behavioral disclosure burden. It usefully states that cursors are process-scoped and dropped on server restart, and it provides the name regex. However, it does not mention what happens when re-registering an existing name (overwrite vs error), which is a meaningful behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long with no filler. The core purpose is front-loaded, followed by usage context and validation rules. Every sentence earns its place and provides necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple registration tool with only two required parameters, the description covers purpose, usage, lifetime, and naming constraints. Missing details like overwrite behavior and return payload are not critical to invoking the tool. No output schema is present, so those details would be a nice-to-have rather than a blocker.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes all parameters with 100% coverage, so the baseline is 3. The description adds value by specifying the name pattern regex and explaining that time anchors can be referenced as '@<name>', which goes beyond the schema. This additional guidance helps an agent use the parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('register') and the resource ('named time anchor'), making it easy to understand what the tool does. It also indicates how the anchor is used by other tools ('@<name>'), which distinguishes it from cursor_list and cursor_delete. No ambiguity remains about the tool's core purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: to create reusable named time anchors and avoid copying ps integers. It also gives practical constraints such as process-scoped lifetime and naming rules. It does not explicitly discuss exclusions relative to cursor_list/cursor_delete, but the purpose is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_first_divergenceA
Find the first time two signals hold unequal values. Works across two waveforms (passing run vs failing run) or within one waveform between two signals (expected vs actual). Auto-registers a cursor at the divergence time so downstream calls can reference it by name. Reads existing waveforms only — does NOT rerun simulation.
| Name | Required | Description | Default |
|---|---|---|---|
| signal_a | Yes | Full hierarchical signal path in wave_path_a. | |
| signal_b | Yes | Full hierarchical signal path in wave_path_b. | |
| cursor_name | No | Optional explicit cursor name. If omitted, a deterministic name (div_<sha8>) is generated. | |
| cursor_note | No | Optional note attached to the registered cursor. | |
| end_time_ps | No | End of comparison window. -1 means end of simulation. Accepts an integer (ps), a cursor reference like '@div_3a7c', or a unit literal like '12.34ns'. | |
| wave_path_a | Yes | First waveform (FSDB or VCD). | |
| wave_path_b | Yes | Second waveform. May equal wave_path_a for within-run diff. | |
| start_time_ps | No | Start of comparison window. Default 0. Accepts an integer (ps), a cursor reference like '@div_3a7c', or a unit literal like '12.34ns'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly discloses the side effect (auto-registering a cursor for downstream reference) and the read-only nature ('Reads existing waveforms only — does NOT rerun simulation'). It doesn't mention edge-case behavior like 'no divergence found,' but the key behavioral traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no wasted words. The first sentence states the core function, the second gives use-case context, and the third addresses side effects and safety. All information is front-loaded and earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main behavior, use cases, and side effects, but since there is no output schema, the return value is not explicitly described. The agent can infer it likely returns a divergence time and/or cursor name, but the ambiguity around what happens when no divergence is found and what exact data is returned leaves a meaningful gap for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter semantics baseline is 3 even without additional explanation in the description. The description itself does not add parameter-level meaning, but the schema already documents all eight parameters, including formats for time values and cursor references.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific, unambiguous action: 'Find the first time two signals hold unequal values.' It then distinguishes two concrete use cases (across two waveforms, or within one waveform), which clearly separates it from sibling tools like get_signal_at_time or get_signal_transitions that inspect signals without diffing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool, identifying both the cross-run and within-run comparison scenarios. It does not explicitly name alternatives or state when not to use it, but the two use-case patterns give the agent enough situational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_sim_failure_resultsA
Compare normalized failure events from two simulation logs. Returns resolved, persistent, and newly introduced failures, plus changes in failure type, X/Z presence, first-failure timing, and a convergence summary. If a simulator overwrites the same log path between runs, pass new_log_path only after parse_sim_log has captured the baseline snapshot, or pass snapshot IDs returned by parse_sim_log.
| Name | Required | Description | Default |
|---|---|---|---|
| simulator | No | vcs / xcelium / auto. Defaults to simulator discovered by get_sim_paths when omitted. | |
| new_log_path | No | New simulation log. For same-path reruns, this may be the overwritten log path. | |
| base_log_path | No | Baseline simulation log. Optional when base_snapshot_id is supplied, or when new_log_path has a previous parsed snapshot. | |
| new_snapshot_id | No | New log snapshot ID returned by parse_sim_log. | |
| base_snapshot_id | No | Baseline log snapshot ID returned by parse_sim_log. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It discloses the comparison's output dimensions and the important dependency on parse_sim_log snapshot timing. It does not explicitly state read-only/no side effects, but the described behavior is otherwise transparent for a comparison utility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose and return categories, followed by a compact caveat. There is no filler, no repetition of schema field names, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description covers the returned information, parameter selection, and a critical workflow edge case. The only notable gap is not telling an agent when to choose this over diff_first_divergence, and not describing the exact output format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining the workflow relationship between new_log_path and parse_sim_log snapshots, and clarifying when snapshot IDs can substitute for paths. This is meaningful parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Compare normalized failure events from two simulation logs.' It then enumerates what is returned (resolved, persistent, newly introduced failures, changes in failure type, X/Z presence, first-failure timing, convergence summary), which clearly differentiates it from siblings like parse_sim_log and diff_first_divergence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete procedural guidance for the tricky same-path overwrite case: pass new_log_path only after parse_sim_log has captured the baseline snapshot, or pass snapshot IDs. It does not explicitly name alternatives or state when not to use this tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dump_tb_sectionA
Escape hatch: return a named raw section of the full hierarchy result. Prefer targeted handle tools — this is intentionally heavy.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| section | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It honestly reveals that this is an escape hatch returning 'raw' data and is 'intentionally heavy,' which warns about performance and lack of refinement. It does not fully describe output shape or potential errors, but for a read-oriented dump tool it provides the key behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. The key warning and purpose are front-loaded, and the usage guidance is tightly integrated without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of parameter descriptions and no output schema, the description is only partially complete. The enum helps explain the 'section' parameter, and the sibling tool list provides context, but 'handle' is undefined and the return value shape is not described. Still, as a deliberately heavy escape hatch, the description conveys the essential role.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only vaguely connects 'section' to a 'named raw section' of the hierarchy, and it does not explain what 'handle' refers to or what each enum value means. The enum values are listed in the schema, but without descriptions the agent is left to guess their semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'return a named raw section of the full hierarchy result.' It also distinguishes itself from siblings by calling itself an 'escape hatch' and contrasting with 'targeted handle tools,' so an agent can understand this is the less-refined, broader alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The instruction 'Prefer targeted handle tools — this is intentionally heavy' explicitly tells the agent to favor alternatives when possible and warns that this tool is expensive. It does not name specific sibling tools or enumerate exact conditions for when the escape hatch is necessary, but it gives clear directional guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_signal_driverA
Trace a waveform signal path back to the most likely RTL driver. Supports direct assigns, simple always blocks, and module output ports. Set recursive=true to walk multiple hops upstream across instance boundaries. When a Verdi KDB is detected, an NPI backend transparently engages and walks the elaborated netlist with fan_in_reg_list, crossing instance port boundaries the static source-regex backend cannot reach. Recursive NPI fan-in is admitted inside the native traversal (4,096 states, 32 returned facts); Source Graph and NPI both publish traversal counts, limits, truncation, exhaustive-search, and fixed incomplete reasons. A partial positive prefix is usable evidence but not a complete or exclusive driver-set claim. If NPI is unavailable or cannot return a trustworthy result, TraceWeave next attempts a bounded, on-demand Source Graph projection; Legacy Static remains the normal final fallback. The explicit allow_bounded_bootstrap path is the resource-bounded exception: without a full hierarchy it returns only proved positive Source Graph facts, and an inconclusive/blocker result does not start a whole-source Static scan. Source Graph preserves per-bit port-binding provenance, so mixed bindings such as concatenations, constants, truncation, and width extension are reported as segments instead of forcing an all-or-nothing exact-width match. When a dynamic segment reaches a projection boundary, bounded sibling-scope expansion re-runs the original query from a fresh artifact; constant segments are terminal and never trigger expansion. Signal-not-declared and bit-selection-out-of-range are distinct Source Graph blockers. Legacy Static normalizes trailing numeric selects to the bare RTL symbol, but stops honestly at composite port expressions that need per-bit provenance. Parameter specializations and named generate scopes remain instance-specific; dotted packed struct/union members are mapped from their field-local indices onto exact root-aggregate bits. backend_status records the selected/attempted/actual backends, fixed fallback reason, Source Graph coverage and cache/build receipt. The legacy confidence field remains coverage-combined and conservative. For Source Graph results, claim_semantics separates positive_fact_confidence and target_bit_coverage from global_coverage_status; require exclusive_driver_proved before calling a returned driver unique, and negative_claim_allowed before claiming no driver. Warm Source Graph traversal is work-bounded; query_truncated and the query_*_limit coverage gap mean returned positive facts are usable but the driver set is not exhaustive. Each driver_chain hop carries source_info_origin ('compile_log', 'npi', or 'source_graph') so consumers can tell which provenance produced its file:line. driver_status='testbench_driven' (with cross_check.conflict=true) means NPI found NO RTL driver: the only 'driver' it reported is also a LOAD of the same net (an interface-slice alias or a register that reads the net), so the real driver is testbench/behavioral — a UVM driver writing through a virtual interface + clocking block, invisible to RTL fan-in. Treat that as 'start in the TB driver/BFM', NOT as a mis-wire or a DUT-register driver; for an AHB master's HTRANS/HADDR this is the expected, correct answer.
| Name | Required | Description | Default |
|---|---|---|---|
| top_hint | No | ||
| max_depth | No | Maximum recursive depth when recursive=true | |
| recursive | No | Whether to trace the upstream driver chain recursively | |
| simulator | No | vcs / xcelium / auto. Optional — if omitted, server auto-injects the value discovered by get_sim_paths. | |
| wave_path | Yes | ||
| compile_log | Yes | ||
| signal_path | Yes | ||
| allow_bounded_bootstrap | No | If true and full hierarchy is unavailable, prove a hard-bounded single-endpoint Source Graph context. Only positive facts may be returned; no-match remains inconclusive and never triggers a whole-source Static rescan. | |
| supplementary_compile_logs | No | Optional complementary compile/elaboration logs used by bounded bootstrap when no hierarchy handle exists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden—and it meets it. It discloses backend selection and fallback order (NPI, Source Graph, Legacy Static), traversal limits (4,096 states, 32 returned facts), truncation semantics, bounded bootstrap behavior, provenance fields, and the special testbench_driven interpretation. There is no annotation contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads the purpose effectively, and each clause is technically meaningful. However, the entire description is one dense, unbroken paragraph with no bullet points or sections, making it harder for an agent to parse quickly. It is informative but not concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and significant conditional behavior, the description is exceptionally complete. It specifies result semantics (claim_semantics fields, backend_status), fallback order, truncation limits, per-hop provenance, and the testbench_driven special case, giving an agent enough to call the tool and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 56%, so the description must add some value. It does for key parameters: 'recursive=true' is explained as walking multiple hops upstream across instance boundaries, and allow_bounded_bootstrap is described as a resource-bounded exception that only returns proved positive facts. Other parameters like top_hint are not elaborated, but the schema already covers several.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence, 'Trace a waveform signal path back to the most likely RTL driver,' gives a specific verb, resource, and goal. It additionally scopes supported constructs (direct assigns, simple always blocks, module output ports), which helps distinguish it from siblings like trace_signal_path and find_signal_loads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for what the tool does and extensive guidance on interpreting its results, such as treating driver_status='testbench_driven' as 'start in the TB driver/BFM'. However, it never mentions sibling tools or conditions that would route an agent to an alternative, so usage vs. alternatives is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_signal_loadsA
List places that consume (load) a signal: child instance input ports, RHS of assigns/procedural assignments, and always-block sensitivity lists. When a Verdi KDB is detected, an NPI backend transparently engages and resolves the cross-hierarchy / interface-positional / generate-block cases that the static source-regex backend cannot reach. If NPI is unavailable or cannot return a trustworthy result, TraceWeave next attempts the bounded, on-demand Source Graph; Legacy Static remains the normal final fallback (shallow_only). When allow_bounded_bootstrap=true and no full hierarchy exists, only proved positive Source Graph facts are returned; an inconclusive/blocker does not trigger a whole-source Static rescan. backend_status preserves the complete attempt chain and Source Graph coverage/build receipt. claim_semantics separates confidence in returned positive load facts from whole-artifact coverage; exhaustive_search is required before treating the list as all loads, and negative_claim_allowed is required before claiming there are none. A complete Source Graph not_connected is distinct from an inconclusive no-match, which falls through to Static only on the normal full-hierarchy route. Every backend publishes enumeration.{returned_count, output_limit, output_truncated, search_exhaustive, incomplete_reasons, continuation_supported}. High-fanout output is capped at 256; capped positive loads remain usable but are not a complete list, and no backend currently promises a continuation token. Each load query normalizes trailing numeric selects for Legacy Static matching, while Source Graph validates the selected bits against the declaration. Each load carries source_info_origin ('compile_log', 'npi', or 'source_graph') so consumers can tell which provenance produced its file:line.
| Name | Required | Description | Default |
|---|---|---|---|
| top_hint | No | ||
| max_depth | No | Reserved for future transitive walks. Static backend always behaves as 1; NPI backend's fan-out walk is depth-bounded internally regardless of this argument. | |
| simulator | No | vcs / xcelium / auto. Optional — if omitted, server auto-injects the value discovered by get_sim_paths. | |
| compile_log | Yes | ||
| kind_filter | No | Restrict result to a subset of load kinds. | |
| signal_path | Yes | ||
| include_expr | No | Include the surrounding expression for each load. | |
| allow_bounded_bootstrap | No | If true and full hierarchy is unavailable, prove a hard-bounded single-endpoint Source Graph context. Only positive facts may be returned; no-match remains inconclusive and never triggers a whole-source Static rescan. | |
| supplementary_compile_logs | No | Optional complementary compile/elaboration logs used by bounded bootstrap when no hierarchy handle exists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden, and it delivers exceptionally: it documents the full backend attempt chain, the 256-entry high-fanout cap with the warning that capped results are usable but not complete, absence of continuation tokens, normalization of trailing numeric selects per backend, and the source_info_origin provenance field. This is far more transparent than typical MCP descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, which is good, but the rest is a dense single paragraph of backend-negotiation, result-semantics, and enumeration-contract detail. Every sentence carries information, yet the wall-of-text structure hurts navigability; details like the enumeration metadata contract and the 256 cap would sit more naturally with an output schema or in structured sections. It is verbose enough that a 3 is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 9-parameter, 3-backend tool with no output schema, this is remarkably complete: purpose, load kinds, backend routing, fallback behavior, truncation semantics, provenance, and result-interpretation rules are all covered. The main gap is that it never specifies the concrete response shape of a load entry beyond carrying file:line and source_info_origin — the enumeration contract is described, but the load object's fields are not, which matters because no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% (mid-range), so the schema already documents most parameters. The description adds genuine value beyond it: it maps the kind_filter enum values to concrete load kinds, explains that NPI's fan-out walk is internally depth-bounded regardless of max_depth, and clarifies allow_bounded_bootstrap's consequence that no-match is inconclusive and never triggers a rescan. Parameters like top_hint and simulator receive no extra elaboration, but the added semantics push this above the schema-only baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence is a model of purpose clarity: 'List places that consume (load) a signal' with three concrete load kinds enumerated (child instance input ports, RHS of assigns/procedural assignments, always-block sensitivity lists). This specific verb+resource+scope immediately differentiates it from sibling tools like trace_signal_path or explain_signal_driver, which concern tracing/drivers rather than consumers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong conditional context for when the tool's modes engage: NPI when a Verdi KDB is detected, Source Graph when NPI is unavailable, Legacy Static as fallback, and the allow_bounded_bootstrap special behavior. It also gives clear interpretative guidance (exhaustive_search required before treating the list as all loads, negative_claim_allowed required before claiming there are none). However, it never explicitly names sibling alternatives or states when to prefer this tool over them, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_tb_instanceB
Locate instance(s) in the component_tree by exact path OR by module name. path and module are mutually exclusive.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | exact dotted instance path | |
| limit | No | ||
| handle | Yes | ||
| module | No | module name; returns all instances |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It does disclose one meaningful constraint — that `path` and `module` are mutually exclusive — which is a genuine gotcha. But it omits the role of the required `handle` parameter, behavior when both path and module are supplied, no-match behavior, return shape, and the effect of `limit`. This is too thin for an annotation-free tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single 18-word sentence, front-loaded with the core action and resource, followed by the two modes and the key constraint. Every word earns its place; there is zero redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite the tool's moderate complexity (4 parameters, 1 required, no annotations, no output schema), the description leaves material gaps: the meaning of `handle`, return format, error/edge-case behavior, and how this tool relates to the large testbench tree tool family. An agent could call it correctly only by guessing at `handle` semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: only `path` and `module` are described. The description adds real semantic value by stating these two are mutually exclusive, which is not present in the schema. However, it does not compensate for the two undocumented parameters, most critically `handle`, which is required and completely unexplained, and `limit`, whose interaction with path vs module mode is unclear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Locate'), a specific resource ('instance(s) in the component_tree'), and two distinct search modes (exact path or module name). This is clear and functionally distinct from sibling tools like get_tb_subtree or lookup_tb_files, though it doesn't name them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the usage context: call this when you have an exact instance path or a module name to locate instances. However, it gives no exclusions and names no alternatives among the 38 siblings, so an agent gets no explicit guidance on when to prefer find_tb_instance over get_tb_subtree or lookup_tb_files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_diagnostic_snapshotA
Cold-start accelerator that aggregates cached tool results into a single summary view. It never triggers sub-steps and only reads cache. Returns availability status, compact summaries, and suggested calls for missing steps. The result cache is process-global and survives across cases, so at the start of a new session pass your target case (verif_root and/or case_dir): the snapshot validates the cache against it and reports a clean cold start if the cache belongs to a different case. If you pass no target, a cached sim_paths is returned with summary.carried_over=true to signal it may belong to a previous case — confirm it or re-run get_sim_paths.
| Name | Required | Description | Default |
|---|---|---|---|
| case_dir | No | Absolute path to the specific case directory you are debugging. When given, the snapshot confirms the cached get_sim_paths is for this case; if it is for a different case, the snapshot degrades to a cold start instead of leaking the previous case's paths/hierarchy/log. | |
| verif_root | No | Absolute path to the project's verif/ directory. Builds a suggested_call when get_sim_paths has not run, and validates that a cached get_sim_paths result belongs to this project (mismatch ⇒ honest cold start). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden and does it thoroughly. It explicitly discloses read-only behavior ('only reads cache'), process-global cache persistence ('survives across cases'), and the carried_over edge case. This goes well beyond what the tool name alone reveals.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The five sentences are dense and purposeful: what it is, its non-executing behavior, what it returns, how to use it at session start, and the fallback when no target is given. The critical constraints are front-loaded, and no sentence feels redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description meaningfully describes return content ('availability status, compact summaries, and suggested calls for missing steps') and even names the carried_over signal. It also covers both usage paths — passing a target case and passing no target — so an agent has enough context to call and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides rich, detailed descriptions for both optional parameters, covering case validation and cold-start degradation, so the 100% coverage baseline applies. The description adds only a small 'verif_root and/or case_dir' combination hint and the no-target fallback, but largely restates schema semantics rather than offering materially new parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete role ('Cold-start accelerator') and a concrete action ('aggregates cached tool results into a single summary view'). It further distinguishes itself from the sibling debugging tools by stating 'It never triggers sub-steps and only reads cache.' This is a clear, specific definition rather than a tautology.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit usage context: 'at the start of a new session pass your target case (verif_root and/or case_dir)'. It also names a relevant alternative when no target is passed: 'confirm it or re-run get_sim_paths.' It does not enumerate broader when-not-to-use scenarios, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_error_contextA
Extract raw log text around a given error line. Typically used with first_line returned by parse_sim_log.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Center error line number | |
| after | No | Number of lines after the target line. Default: 100 | |
| before | No | Number of lines before the target line. Default: 100 | |
| log_path | Yes | Absolute path to the simulation log, for example irun.log |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description is the only source of behavioral info. It discloses the core read-only behavior ('Extract raw log text') and its relationship to parse_sim_log output. However, it doesn't state return format details (e.g., whether line numbers are included) or error-handling behavior, leaving some ambiguity for a no-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence with the action upfront, followed by a usage pointer. No filler or redundant restatement of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple extraction tool, the description captures purpose, input source, and output nature ('raw log text'). It lacks explicit return formatting details but the workflow reference to parse_sim_log provides sufficient context for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning by indicating the 'line' parameter should come from parse_sim_log's first_line field, bridging tool outputs. This is helpful beyond the schema's 'Center error line number.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Extract raw log text around a given error line.' This clearly distinguishes it from parse_sim_log (parsing) and diff/analyze tools. The phrase 'Typically used with parse_sim_log' further places it in the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage context: 'Typically used with first_line returned by parse_sim_log.' This situates the tool in the debug workflow but doesn't explicitly state when not to use alternatives like analyze_failures or diff_sim_failure_results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_signal_at_timeB
Query a signal value in a waveform file at a specific time in ps. FSDB support depends on fsdb_runtime.enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| time_ps | Yes | Query time. Accepts an integer (ps), a cursor reference like '@div_3a7c', or a unit literal like '12.34ns'. | |
| wave_path | Yes | ||
| signal_path | Yes | Full hierarchical path, for example top_tb.dut.s_bits. A bare bus name (no [msb:lsb]) is auto-completed when it resolves uniquely (resolved_from echoes the input); an unresolved name raises with a did_you_mean list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full behavioral burden. It does communicate a read-only query and an FSDB runtime dependency, but it omits the return format, exact-match-versus-nearest-time behavior, error behavior for unsupported FSDB files, and what happens when the signal cannot be resolved. This is too thin for a no-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first states the core operation and scope, and the second adds a necessary runtime caveat. The information is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has three required parameters, no output schema, and no annotations, so the description must cover both selection and invocation context. The schema covers time_ps and signal_path well, but wave_path is left undefined, and the return value/behavior is not described. An agent would likely be uncertain about what this tool returns and how to supply wave_path correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents time_ps and signal_path in detail, and the description adds only the general notion of 'signal value' and the default unit 'ps'. The wave_path parameter has no schema description and the tool description does not compensate for it, so parameter semantics are adequate but not enhanced meaningfully beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the verb ('Query'), the resource ('a signal value in a waveform file'), and the key qualifier ('at a specific time in ps'). It distinguishes itself from siblings like get_signal_transitions and get_signals_around_time through the singular value/point-in-time framing, though it does not explicitly name or contrast those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use case—fetching a single signal's value at one point in time—is implied by the description, but there is no explicit guidance on when to prefer this tool over closely related siblings such as get_signals_around_time or get_signal_transitions. The FSDB dependency note is a config caveat, not usage routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_signals_around_timeA
Return values and transitions for multiple signals in a NARROW window around a target timestamp (typically the failure time). Designed for local causal-chain inspection; NOT for bulk trace extraction. For round-by-round or multi-cycle sampling use get_signals_by_cycle.
Unit reminder: all times are picoseconds. If the sim log reports Time: X ns, set center_time_ps = X*1000 (example: 75,100 ns -> 75,100,000 ps).
Typical window_ps:
Glitch inspection: 1,000 - 5,000 ps
One clock cycle: = clock_period_ps (NOT exposed by get_waveform_summary; use get_signals_by_cycle after you identify a clock_path, or read it from your sim environment / compile log)
N cycles around fail: N * clock_period_ps
The server enforces a cap of MAX_WAVE_WINDOW_CYCLES (default 256) clock cycles per call, computed at runtime from an auto-detected clock_period_ps. It also rejects center_time_ps past the recorded simulation end. For multi-cycle sampling, get_signals_by_cycle still requires an explicit clock_path. FSDB support depends on fsdb_runtime.enabled.
If a value_at_center is a SUB-CYCLE TRANSIENT — a combinational glitch at the clock edge that settles back within the same cycle (e.g. an interconnect mux re-settling to idle for ~1ns at each edge) — the result sets transient_note and the signal carries center_transient/center_settles_to/center_settle_ps. Treat the SETTLED value as the protocol value; do not attribute a root cause to an edge-sampled value that is flagged transient.
return_mode="values_only" keeps the atomic multi-signal sample but strips the transition lists from every signal: each entry carries value_at_center + window_transition_count (+ any transient annotation, computed before stripping). Use it when you only need the values at one instant — e.g. comparing the same time point across several traces — instead of paying for transition history or falling back to one get_signal_at_time call per signal.
| Name | Required | Description | Default |
|---|---|---|---|
| wave_path | Yes | ||
| window_ps | No | Half-window in ps (center +/- window_ps). Default: 2000. Hard cap: MAX_WAVE_WINDOW_CYCLES clock cycles. For N-cycle sweeps prefer get_signals_by_cycle. | |
| return_mode | No | values_only drops transitions_in_window/pre_window_transitions from every signal, returning value_at_center + window_transition_count (+ transient annotation). Compact point-sample mode for multi-trace value comparison. | full |
| signal_paths | Yes | List of full hierarchical signal paths. A bare bus name (no [msb:lsb]) is auto-completed when unique (see resolved_aliases); unresolved names get did_you_mean entries in signal_suggestions. | |
| center_time_ps | Yes | Center time in PICOSECONDS (not ns). Convert sim-log ns via *1000. Must be within the waveform duration reported by get_waveform_summary. Accepts an integer (ps), a cursor reference like '@div_3a7c', or a unit literal like '12.34ns'. | |
| extra_transitions | No | Extra transitions to include before the time window. Default: 5. 0 means none. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it excels: it discloses the server-enforced MAX_WAVE_WINDOW_CYCLES cap, runtime clock-period detection, rejection of center_time_ps past simulation end, FSDB dependency, and transient-flag semantics. This goes well beyond the schema and helps the agent anticipate non-obvious runtime behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every paragraph carries unique, operationally relevant information: purpose, usage boundaries, window sizing, server limits, transient handling, and return-mode semantics. It is front-loaded with the core purpose and the most important exclusion, and the structure allows an agent to extract what it needs quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema and rich sibling context, the description covers the tool's behavior, constraints, units, edge cases, and mode variations. It explains how to convert units, what limits apply, what the transient fields mean, and when to prefer values_only, making it effectively self-contained for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 83%, the description adds substantial meaning beyond the schema: unit conversion from ns to ps with a concrete example, typical window_ps values for different inspection scenarios, the hard cap on window size, and the effect of return_mode='values_only' on returned fields. These details are not inferable from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Return values and transitions for multiple signals in a NARROW window around a target timestamp'. Explicitly contrasts with bulk extraction and names the alternative get_signals_by_cycle, so an agent can distinguish it from siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: local causal-chain inspection around a failure time, not bulk trace extraction. Offers alternatives for round-by-round or multi-cycle sampling, gives typical window_ps values for glitch inspection and clock cycles, and clarifies when get_signals_by_cycle requires a clock_path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_signals_by_cycleA
Return cycle-by-cycle sampled values for multiple signals aligned to a clock edge. Useful for state machines, pipelines, and round-by-round algorithm checks.
| Name | Required | Description | Default |
|---|---|---|---|
| edge | No | Sampling edge. Default: posedge | posedge |
| wave_path | Yes | Absolute path to the waveform file | |
| clock_path | Yes | Full hierarchical clock path, for example top_tb.des_clk | |
| num_cycles | No | Number of cycles to sample. Default: 16. The server caps a single query at 256 cycles. Mutually exclusive with end_time_ps. | |
| end_time_ps | No | Alternative count axis: window end; num_cycles is derived as the count of clock edges in [start, end_time_ps] (inclusive). Mutually exclusive with num_cycles. Accepts an integer (ps), a cursor reference like '@div_3a7c', or a unit literal like '12.34ns'. | |
| start_cycle | No | Starting cycle index (0-based). Default: 0. Mutually exclusive with start_time_ps. | |
| signal_paths | Yes | List of full hierarchical signal paths to sample. A bare bus name (no [msb:lsb]) is auto-completed when unique (see resolved_aliases); unresolved names get did_you_mean entries in signal_suggestions. | |
| start_time_ps | No | Alternative start axis: window start; snapped to the first clock edge at/after this time. Mutually exclusive with start_cycle. Accepts an integer (ps), a cursor reference like '@div_3a7c', or a unit literal like '12.34ns'. | |
| sample_offset_ps | No | Sampling offset relative to the clock edge in ps. Default: 1, to capture post-delta register values. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, but it only states the sampling alignment and use cases. It doesn't mention the non-obvious 1 ps post-delta offset, the 256-cycle cap, or the resolved_aliases/signal_suggestions behavior, though these appear in parameter descriptions. It is not misleading but is minimal for a tool with this many behavioral nuances.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first states the core function with a specific verb and object, the second gives use cases. The 'aligned to a clock edge' qualifier is front-loaded in the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is effective for a moderately complex tool because the schema covers parameter semantics and the first sentence establishes the sampling model. However, with no output schema, the description doesn't specify the result structure or mention the alias-resolution output, leaving some ambiguity for an agent. The use-case sentence helps compensate, but a note on return shape would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the description adds little beyond naming 'multiple signals' and 'clock edge.' The input schema already documents each parameter, including mutual exclusions and defaults, so the description doesn't need to compensate. Score reflects that the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete action: 'Return cycle-by-cycle sampled values for multiple signals aligned to a clock edge.' The 'cycle-by-cycle' qualifier clearly distinguishes it from sibling time-domain tools like get_signal_at_time and get_signals_around_time. Also provides domain context with state machines, pipelines, and round-by-round algorithm checks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly ties use to cycle-aligned analysis: 'Useful for state machines, pipelines, and round-by-round algorithm checks.' This gives an agent a clear heuristic for when to select this tool, though it doesn't name alternatives or exclusion criteria. The sibling list reinforces the distinction from time-based sampling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_signal_transitionsA
Return transitions for a signal over the strict closed time range [start_time_ps, end_time_ps] (capped at 1000 by default; truncated=true + hint mark a clipped result, transition_count is always the total found). FSDB support depends on fsdb_runtime.enabled. The last value-change strictly before the window is returned separately as predecessor and is never mixed into transitions.
| Name | Required | Description | Default |
|---|---|---|---|
| wave_path | Yes | ||
| end_time_ps | No | -1 means through the end of simulation. Accepts an integer (ps), a cursor reference like '@div_3a7c', or a unit literal like '12.34ns'. | |
| signal_path | Yes | ||
| start_time_ps | No | Window start. Accepts an integer (ps), a cursor reference like '@div_3a7c', or a unit literal like '12.34ns'. | |
| max_transitions | No | Cap on returned transitions (earliest in range kept). Raise explicitly only for deliberate bulk extraction; prefer narrowing the time range. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does well: it discloses the strict closed range, the default 1000 cap, the truncated=true/hint convention, that transition_count is always the total, that predecessor is kept separate, and that FSDB support depends on a runtime flag. This is substantial transparency, though FSDB failure behavior remains slightly underspecified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences pack a lot of relevant behavioral information without filler. The parenthetical-heavy middle sentence is dense, but every clause adds value. The core operation is stated first, followed by edge-case semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description covers the key return-related behaviors: truncation, hint marking, transition_count semantics, and predecessor handling. It is slightly vague about what happens when FSDB support is disabled, but overall an agent has enough context to invoke the tool and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents start_time_ps, end_time_ps, and max_transitions with type and unit details, and the description adds meaningful semantics beyond that: the strict closed window, the default cap behavior, the truncated hint, and the separate predecessor rule. It does not add much on wave_path/signal_path, but those are self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and resource ('transitions for a signal') with a precise time range and cap behavior, making the tool's core purpose clear. It is distinguishable from sibling tools like get_signal_at_time or get_signals_around_time, though it does not explicitly name or contrast them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when the tool is appropriate—any time a signal's transitions over a range are needed—and provides guidance like 'prefer narrowing the time range' and 'Raise explicitly only for deliberate bulk extraction.' However, it does not explicitly state when to choose this over sibling tools such as get_signal_at_time or get_waveform_summary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sim_pathsA
Discover compile logs, simulation logs, and waveform files under a verif directory. If case_name is omitted, the tool returns available cases. For non-standard layouts you may pass explicit sim_log / wave_file / compile_log paths; any provided field is used as-is and the omitted ones are still auto-discovered (a sim_log path also anchors discovery of the matching waveform and compile/elab logs).
| Name | Required | Description | Default |
|---|---|---|---|
| sim_log | No | Optional explicit simulation log path (absolute, or relative to verif_root). Used verbatim, and its directory anchors discovery of the waveform and compile/elab logs for the same case. | |
| case_name | No | Optional case name, for example case0 (matching make SV_CASE=case0) | |
| wave_file | No | Optional explicit waveform path (FSDB/VCD), absolute or relative to verif_root. Used verbatim when given; otherwise discovered. | |
| verif_root | Yes | Absolute path to the project's verif/ directory, for example /path/to/project/verif | |
| compile_log | No | Optional explicit compile/elaborate log path, absolute or relative to verif_root. Used verbatim when given; otherwise discovered from the case dir, the parent top, or a sibling build/elab dir. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden and does well: it discloses that explicit fields are used verbatim, omitted fields are auto-discovered, and a sim_log path also anchors discovery of related files. It does not explicitly state read-only/no-side-effect status, but 'discover' implies a non-mutating operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: the core purpose is front-loaded, followed by concise conditional behavior for omitted case_name and explicit path overrides. Every sentence contributes useful guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main parameter interactions and conditional return behavior, which is important given there is no output schema or annotations. It does not spell out the exact return JSON shape, but the implied result (paths and/or case list) is sufficient for an agent to invoke the tool successfully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents every parameter with 100% coverage, so the baseline is 3. The description adds meaning beyond the schema by explaining cross-parameter behavior: provided paths are used as-is, omitted ones are auto-discovered, and sim_log anchors the discovery of matching waveform/compile logs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Discover') and names the exact resource types: compile logs, simulation logs, and waveform files under a verif directory. This clearly distinguishes it from analysis/parsing siblings such as parse_sim_log or get_waveform_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides actionable when-to guidance: omitting case_name returns available cases, and explicit paths are intended for non-standard layouts. It does not explicitly name alternative tools, but the main conditional usage is clearly conveyed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tb_class_hierarchyC
Return UVM/class inheritance tree built from compiled-source scan results. Use root_class to start from a specific class; empty = all roots.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| handle | Yes | ||
| root_class | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It discloses the data source (compiled-source scan) but omits effects, return format, traversal order, depth semantics, and error behavior. The word 'Return' suggests a read operation, but safety and performance characteristics are not stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both essential, with the primary operation first and the parameter behavior second. It earns conciseness but could use the saved space to explain remaining parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without an output schema or annotations, the description must describe return values, parameter semantics, and usage context. It covers only root_class and leaves handle, depth, and return structure unaddressed, making it insufficient for confident invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains root_class meaning and empty behavior, but handle (required) and depth are left completely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb 'Return' and a specific resource 'UVM/class inheritance tree' from 'compiled-source scan results'. It clearly identifies the tool's purpose but does not explicitly distinguish it from sibling tools like get_tb_subtree or build_tb_hierarchy.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to choose this tool over get_tb_subtree, build_tb_hierarchy, or other hierarchy-related tools. The only usage hint is how to use root_class, which is parameter-level instruction, not tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tb_file_detailB
Return symbols (modules/classes/interfaces) defined in a single compiled file. If the path is not in the compile set, error includes basename-similar suggestions.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosure. It does usefully mention the error-suggestion behavior when the path is not in the compile set, which is a real behavioral trait. However, it does not address whether the operation has side effects, preconditions like a prior build, or any caveats about the compiled set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. The main action is front-loaded, and the conditional error behavior is added compactly. Every sentence contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and two wholly undocumented required parameters, the description is not complete enough. It explains what is returned and one error scenario, but omits the role of 'handle', the output shape, and any preconditions, leaving an agent to guess before invoking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must clarify both parameters. It gives only indirect meaning for 'path' via the compile-set/error-suggestion note, but 'handle' is entirely unexplained. This is insufficient for an agent to know what values to provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description begins with a specific verb ('Return') and identifies a precise resource: symbols (modules/classes/interfaces) defined in a single compiled file. This is clear and actionable, but it does not explicitly differentiate from siblings like get_tb_subtree or lookup_tb_files beyond the implicit 'single compiled file' scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to choose this tool over alternatives, nor any when-not-to-use conditions. The only behavioral note is about error suggestions for wrong paths, which is not usage routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tb_subtreeA
Return a slice of the component_tree starting at root (dotted instance path) with up to depth levels. Use after build_tb_hierarchy to drill into a branch without pulling the whole tree into context.
| Name | Required | Description | Default |
|---|---|---|---|
| root | No | dotted instance path (e.g. 'top.u_cpu'); empty = top module | |
| depth | No | -1 = unbounded; otherwise number of levels to include | |
| handle | Yes | hierarchy_handle from build_tb_hierarchy | |
| max_nodes | No | hard cap on emitted nodes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the behavioral disclosure burden. It does: "Return a slice" signals a non-mutating read operation, and "without pulling the whole tree into context" reveals a deliberate context-size-limiting behavior. It also exposes the prerequisite relationship with build_tb_hierarchy. It does not explicitly mention error behavior or output structure, but the core behavioral profile is clear enough for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences. The first sentence states the operation and key parameters; the second adds usage context. No filler or redundant phrasing exists, and the most important action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter tool with no output schema and no annotations, the description conveys what it returns, how to invoke it (after build_tb_hierarchy), and why to use it (context minimization). It does not describe the exact shape of the returned slice or edge-case behavior, but the parameters and sibling context fill most gaps, leaving only minor ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter already has a description (root, depth, handle, max_nodes). The tool description only re-states root and depth in prose and does not add meaning beyond the schema. Therefore the baseline of 3 is appropriate; the schema already does the explanatory work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: "Return a slice of the component_tree" and clarifies the input key "root (dotted instance path)" with "up to `depth` levels." It clearly differentiates from full-tree-building tools by stating it "drill[s] into a branch" rather than pulling the whole tree.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence explicitly gives the intended usage context: "Use after build_tb_hierarchy" and explains the benefit: "without pulling the whole tree into context." This provides clear when-to-use guidance, but it does not name alternative tools or explicitly state when not to use it, so it stops short of a fully exclusive routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_waveform_summaryA
Return basic waveform metadata such as format, duration, and top modules. FSDB support depends on fsdb_runtime.enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| wave_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior itself. It communicates that the operation is read-only ('Return') and exposes the condition 'FSDB support depends on fsdb_runtime.enabled.' However, it does not explain what happens when fsdb_runtime.enabled is false, whether errors occur, or how limitations manifest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. The primary purpose is front-loaded, and the non-obvious FSDB runtime requirement is placed second without clutter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool, the description gives useful return-value examples and a key dependency warning. But because there is no output schema and no annotations, the description leaves ambiguity around exact return structure, error behavior, and what 'depends on fsdb_runtime.enabled' means operationally.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides only 'wave_path' as a required string with 0% description coverage. The tool description does not explain the expected path format, supported waveform file types, or how wave_path interacts with the FSDB dependency, so it fails to compensate for the missing schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and resource ('basic waveform metadata') with concrete examples ('format, duration, and top modules'). This clearly distinguishes it from sibling tools that operate on signals, traces, or structural hierarchy.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied: call this when you need summary-level waveform metadata rather than signal-level analysis. The FSDB dependency hints at when the tool may not work, but there is no explicit comparison to alternatives or guidance on which sibling tools to choose instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_handshakeA
Classify a clocked valid/ready handshake cycle-by-cycle and report protocol facts that leave no value pattern in scoreboard logs: stalls (valid high, ready low), the longest/over-threshold stall windows, backpressure imbalance (ready high, valid low), and — when payload signals are given — payload-hold violations (a payload that changes while the transfer is still stalled), and premature valid deassertion (a stalled beat whose valid/htrans drops before ready/HREADY arrives — the AHB master-not-waiting-for-HREADY bug, which needs no payload to detect). For AHB (valid_htrans) it ALSO runs x_while_valid (a control field is x/z while valid is asserted) and, when hwrite+write_data are given, a write data-phase HWDATA-hold check (HWDATA must stay stable through a write data-phase wait state). Protocol-agnostic: AXI *valid/*ready, an AHB pair (ready=hready, valid=a 1-bit 'htrans!=IDLE' signal, payload=[haddr,hwrite,hsize] address-phase control which must hold while hready is low; HWDATA goes in write_data, not payload), a generic valid-ready stream, or a credit interface. Returns coverage facts for the checks it actually ran (stall, backpressure, payload-hold, valid-hold, x-while-valid, write-data-hold) without assigning protocol side. Auto-registers a cursor at the first problem (x-while-valid > payload-hold > write-data hold > premature deassertion > long stall > longest stall). On AHB it also returns a protocol_semantics receipt naming which metrics are faithful vs suppressed. For the one-sided violations (x-while-valid, payload-hold, write-data hold, premature deassertion) it also returns a structured attribution block (violating_side=valid_driver, exonerated_side=ready_driver) so the caller does NOT start in the slave driver/monitor — the responder cannot cause either; a plain two-sided stall leaves attribution empty. Reads existing waveforms only — does NOT rerun simulation.
| Name | Required | Description | Default |
|---|---|---|---|
| edge | No | Clock edge to sample on. Default posedge. | posedge |
| clock | Yes | 1-bit clock signal full path. | |
| ready | Yes | Receiver ready/grant signal (1-bit). For AHB, hready. | |
| valid | No | Initiator valid/request signal (1-bit). Provide this OR valid_htrans. | |
| hwrite | No | AHB only: path to HWRITE. With write_data, enables the write data-phase HWDATA-hold check. | |
| payload | No | Optional signals that MUST stay stable while stalled (e.g. AHB htrans/haddr/hwrite/hsize, AXI awaddr/awlen). A mid-stall change is a payload_hold_violation. For AHB do NOT include hwdata here — pass it as write_data (it is a data-phase signal, a different window). | |
| wave_path | Yes | Waveform (FSDB or VCD). | |
| write_data | No | AHB only: path to HWDATA. With hwrite, checks that write data is held stable through a data-phase wait state (HREADY low) — a write_data_hold_violation otherwise. This is the data-phase window, distinct from the address-phase payload-hold. Pass it ONLY for the producer (initiator/master) interface: on a responder/slave interface HWDATA is an interconnect-mux output that glitches at the clock edge and would false-positive. | |
| active_high | No | valid/ready are active-high. Set false for active-low handshakes. Default true. | |
| cursor_name | No | Optional explicit cursor name. Defaults to hs_<sha8>. | |
| cursor_note | No | Optional note attached to the registered cursor. | |
| end_time_ps | No | Window end. -1 means end of simulation. Accepts an integer (ps), a cursor reference like '@div_3a7c', or a unit literal like '12.34ns'. | |
| htrans_rule | No | How valid_htrans derives valid. 'active' (default) = NONSEQ/SEQ (htrans[1]==1); 'non_idle' = htrans != IDLE (counts BUSY too). | active |
| valid_htrans | No | AHB only: path to the htrans signal. A derived valid is computed from it (AHB has no literal valid). Provide this OR valid, not both. | |
| start_time_ps | No | Window start. Default 0. Accepts an integer (ps), a cursor reference like '@div_3a7c', or a unit literal like '12.34ns'. | |
| max_wait_cycles | No | A stall longer than this many cycles becomes a long_stall finding. Default 16. | |
| check_valid_hold | No | Flag premature valid/transfer deassertion: a stalled beat (valid high, ready low) whose valid goes low the next edge before ready arrives = the master dropped the transfer instead of waiting (e.g. AHB htrans->IDLE without waiting for HREADY). Needs no payload. Default true. | |
| check_payload_hold | No | Flag payload changes during a stall. Default true (only meaningful when payload is given). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it delivers: it discloses that this tool only reads waveforms and does NOT rerun simulation, that it auto-registers a cursor at the first problem, that one-sided violations are attributed to the valid driver, and that AHB returns a protocol_semantics receipt. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but earns most of its length by covering six checks, four protocol shapes, cursor behavior, and attribution semantics. It is front-loaded with the core classification purpose. A few clauses are dense or redundant, such as the HWDATA-hold being explained twice and the awkward phrase 'leave no value pattern in scoreboard logs', which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though there is no output schema, the description tells the agent what to expect from the tool: coverage facts for the checks actually run, a registered cursor at the first problem, a structured attribution block for one-sided violations, and an AHB protocol_semantics receipt. It also distinguishes the empty attribution for plain two-sided stalls. For an 18-parameter, analysis-heavy tool, this is remarkably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema: it explains why HWDATA must be passed as write_data rather than payload, which side may safely pass write_data, how valid_htrans derives valid, and what max_wait_cycles defines as a long stall. It does not restate every parameter, but it adds genuine interpretive value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the exact operation ('Classify a clocked valid/ready handshake cycle-by-cycle') and enumerates concrete outputs such as stall windows, backpressure imbalance, and payload-hold violations. It is clear and specific, but it does not explicitly contrast with nearby siblings like sweep_handshakes or reconstruct_transactions, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong protocol context (AXI, AHB, generic, credit) and practical constraints such as 'For AHB do NOT include hwdata here' and 'Pass it ONLY for the producer/initiator interface'. However, it never states when to prefer this tool over a sibling or when not to use it, so the selection guidance is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_tb_filesA
Query the compiled file set by objective scan facts. At least one filter is required. Use this to disambiguate multi-version files (basename collisions are also reported via build_tb_hierarchy.ambiguous_basenames).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| handle | Yes | ||
| basename | No | exact basename match | |
| file_type | No | module | interface | package | class | program (from SV scan) | |
| has_module | No | file defines this module | |
| contains_uvm | No | scan saw `import uvm_pkg::` or `extends uvm_*` | |
| name_contains | No | ||
| path_contains | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It conveys that this is a read-style query over the compiled file set, that a filter is mandatory, and that basename-collision information overlaps with build_tb_hierarchy. It does not discuss pagination, error behavior, or return shape, but these are secondary for a query tool and the core behavior is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences that front-load the action and resource, then state the constraint, then give the primary use case. There is no filler, repetition, or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is an 8-parameter tool with no output schema and no annotations, so the description needs to carry more weight. It omits return behavior, filter-combination semantics, and the meaning of the required handle parameter. The stated use case is helpful, but an agent would still be guessing about important invocation details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, and the description does not compensate for the undocumented parameters. In particular, the required 'handle' parameter is never explained, and 'limit', 'name_contains', and 'path_contains' also lack meaning beyond their names. The 'at least one filter' constraint is useful but does not clarify whether handle counts as a filter or what formats are expected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Query') and resource ('compiled file set'), then gives a concrete purpose: disambiguating multi-version files. It also references a related reporting channel, build_tb_hierarchy.ambiguous_basenames, which helps distinguish it from sibling lookup tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states that at least one filter is required and recommends this tool for disambiguating multi-version files, mentioning that basename collisions are also surfaced by another tool. It does not enumerate exclusions or explicitly say when to prefer other siblings, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_sim_logA
Parse a VCS or Xcelium simulation log and return grouped runtime failures by signature. The simulator argument is required and is not auto-detected here. candidate_previous_logs uses bounded evidence sampling and excludes compile/elaboration logs. The first error group automatically includes about 100 lines of surrounding log context in first_group_context; use get_error_context for other groups.
| Name | Required | Description | Default |
|---|---|---|---|
| log_path | Yes | Absolute path to the simulation log, for example irun.log | |
| simulator | Yes | vcs / xcelium | |
| max_groups | No | Maximum number of error groups to return. Default: 20 | |
| detail_level | No | Detail level to return. Default: summary | summary |
| max_events_per_group | No | Maximum failure_events returned per group in compact/full modes. Default: 3 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it does so well: it calls out non-auto-detection, bounded evidence sampling, exclusion of compile/elaboration logs, and the automatic inclusion of about 100 lines of context for the first group. It does not discuss output shape or error behavior in depth, but the disclosed behaviors are meaningful and specific.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences deliver the core purpose first, then key caveats, then routing advice. Every sentence contributes new information, and none of the schema's parameter descriptions are redundantly restated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description helpfully names and explains two output-related concepts (candidate_previous_logs and first_group_context) and points to get_error_context for richer context on other groups. It is complete enough for an agent to understand what the tool returns and how to use it, though a bit more about the overall result structure would make it fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all five parameters with 100% coverage, so the baseline is 3. The description adds context beyond the schema by explaining that simulator is not auto-detected and that first_group_context is automatically populated, which is helpful, but it does not need to repeat parameter definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Parse'), the exact resource (VCS or Xcelium simulation log), and the specific output (grouped runtime failures by signature). It also differentiates itself from sibling tools by noting that get_error_context should be used for other error groups, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates that the simulator argument is required and not auto-detected, which prevents a common misconfiguration. It also says candidate_previous_logs excludes compile/elaboration logs and directs users to get_error_context for non-first groups, giving practical routing guidance, though it could more explicitly state when to prefer this tool over analyze_failures or diff_sim_failure_results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
periodA
Estimate a signal's dominant period inside a window and flag the first beat that deviates from it. Use for rhythm/throughput questions an LLM cannot eyeball from a transition dump: stalled clocks, dropped burst beats, backpressure bubbles, irregular strobes. The dominant period is the median edge-to-edge interval; the first off-beat is auto-registered as a cursor. Reads existing waveforms only — does NOT rerun simulation.
| Name | Required | Description | Default |
|---|---|---|---|
| edge | No | Edge to count. 'any' for multi-bit/strobe signals. Default posedge. | posedge |
| signal | Yes | Full hierarchical signal path. | |
| wave_path | Yes | Waveform (FSDB or VCD). | |
| cursor_name | No | Optional explicit cursor name for the first off-beat. Defaults to beat_<sha8>. | |
| cursor_note | No | Optional note attached to the registered cursor. | |
| end_time_ps | No | Window end. -1 means end of simulation. Accepts an integer (ps), a cursor reference like '@div_3a7c', or a unit literal like '12.34ns'. | |
| start_time_ps | No | Window start. Default 0. Accepts an integer (ps), a cursor reference like '@div_3a7c', or a unit literal like '12.34ns'. | |
| tolerance_frac | No | Fraction of the period a beat may deviate before counting as an off-beat. Default 0.05 (5%). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does so well. It discloses that the tool only reads existing waveforms and does NOT rerun simulation, and it reveals the important side effect that the first off-beat is auto-registered as a cursor. It also defines the dominant period as the median edge-to-edge interval, clarifying the internal behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no wasted words: the first states the core action, the second gives concrete use cases, and the third explains the algorithm, side effect, and read-only safety. The key differentiators are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given eight parameters and no output schema, the description covers the important behavioral context: when to use it, how the period is computed, the cursor side effect, and the read-only guarantee. The only gap is that the return value is not explicitly described, which matters because no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents every parameter in detail. The description adds some context through the 'window' and 'beat' language, but it does not add meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Estimate', 'flag') and names the resource ('a signal's dominant period inside a window'), then adds the exact calculation method (median edge-to-edge interval). It distinguishes itself from rhythm/throughput alternatives by explicitly scoping to cases an LLM cannot eyeball from a transition dump.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use the tool: for rhythm/throughput questions such as stalled clocks, dropped burst beats, backpressure bubbles, and irregular strobes. It also conveys that this is for cases an LLM cannot eyeball, which implies a rough when-not boundary, though it does not name specific alternative sibling tools or explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_failure_debug_next_stepsA
Choose the highest-priority failure to investigate from the current log, waveform, and optional hierarchy, then recommend signals, instances, and suspected failure class. Also suggests a diff_sim_failure_results call to use on the next run.
| Name | Required | Description | Default |
|---|---|---|---|
| log_path | Yes | ||
| top_hint | No | ||
| simulator | Yes | vcs / xcelium | |
| wave_path | Yes | ||
| compile_log | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden, and it does so fairly well: it frames the tool as advisory ('recommend', 'suggests') rather than executing diff_sim_failure_results itself, and it discloses the output categories. It is silent on session state effects and no-failure edge cases, but these are less critical for an apparent read-only recommendation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the primary action and inputs are front-loaded, the output categories follow, and the diff_sim_failure_results suggestion is a single extra clause. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an analysis/recommendation tool with no output schema or annotations, the description gives enough high-level shape to make a reasonable call: required inputs are implied, and outputs are named. It leaves the exact response structure, the meaning of compile_log, and the form of the suggested diff_sim_failure_results call undefined, so an agent would still need to infer some integration details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning beyond the schema by relating log_path, wave_path, and top_hint to 'current log, waveform, and optional hierarchy', and the schema itself documents simulator as 'vcs / xcelium'. However, compile_log is never explained, so the 20% schema coverage is only partially compensated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is specific: it chooses the highest-priority failure and recommends signals, instances, and suspected failure class, which goes well beyond the tool name. It also names the data sources (log, waveform, optional hierarchy) and the downstream diff_sim_failure_results suggestion. It does not explicitly contrast itself with overlapping siblings like analyze_failures or get_diagnostic_snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use context is implied rather than stated: 'current log, waveform' and 'on the next run' signal a post-simulation debugging stage. There is no explicit guidance about when to choose this tool over alternative analysis/debug tools, nor any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reconstruct_transactionsA
Reconstruct id-correlated request/response transactions from two handshake channels: walk every clock edge, match accepted request beats to completion beats by id, and return per-transaction latency plus aggregate facts (outstanding curve incl. per-id peak, ordering, unmatched=hang signature). One generic core, not a tool per protocol. AXI READ: req=AR (req_valid=arvalid, req_ready=arready, req_id=arid), cmp=R (cmp_valid=rvalid, cmp_ready=rready, cmp_id=rid, cmp_last=rlast); AXI WRITE: req=AW (awvalid/awready/awid), cmp=B (bvalid/bready/bid, no cmp_last). Pass req_fields/cmp_fields (e.g. araddr,arlen / rresp) to capture payload per txn; pass req_len (arlen/awlen) to also check each txn's beat_count against AxLEN+1 (beat_count_mismatch). Out-of-order completion across ids is supported (per-id FIFO); reorder_count is an informational FACT (legal in AXI), latency is a distribution not an 'outlier' verdict. Reads waveforms only.
| Name | Required | Description | Default |
|---|---|---|---|
| edge | No | Clock edge to sample on. Default posedge. | posedge |
| clock | Yes | Shared 1-bit clock full path (e.g. AXI aclk). | |
| reset | No | Optional reset signal; while asserted, in-flight transactions are cleared so a txn straddling reset is not reported as a phantom hang. | |
| cmp_id | No | Completion id bus (e.g. rid/bid). Optional; see req_id (omit both for in-order FIFO pairing). | |
| req_id | No | Request id bus (e.g. arid/awid). Optional: omit both req_id and cmp_id for an unindexed in-order stream (AXI-Lite, APB) — txns pair in FIFO order and report id=null. | |
| req_len | No | Optional AxLEN bus (arlen/awlen). Each txn's observed beat_count is compared to req_len+1; a mismatch (early/late LAST, dropped/extra beat) is a real burst-length violation, surfaced per-txn (beat_count vs expected_beats) and as beat_count_mismatch_count. x/z len → no check. | |
| cmp_last | No | Optional last-beat signal (e.g. rlast). With it, a multi-beat burst completes one txn on last; without it every completion beat is a txn (e.g. AXI B channel). | |
| cmp_ready | Yes | Completion channel ready (e.g. rready/bready). | |
| cmp_valid | Yes | Completion channel valid (e.g. rvalid/bvalid). | |
| data_last | No | AXI WRITE only: W-channel last (wlast); marks the end of a write burst's data. | |
| req_ready | Yes | Request channel ready (e.g. arready/awready). | |
| req_valid | Yes | Request channel valid (e.g. arvalid/awvalid). | |
| wave_path | Yes | Waveform (FSDB or VCD). | |
| cmp_fields | No | Optional completion payload signals to capture per txn (e.g. rresp, bresp). | |
| data_ready | No | AXI WRITE only: W-channel ready (wready). | |
| data_valid | No | AXI WRITE only: W-channel valid (wvalid). The W channel carries no id; beats attach in order to the oldest data-incomplete request. Needs data_ready too. | |
| req_fields | No | Optional request payload signals to capture per txn (e.g. araddr, arlen, arsize, arburst). | |
| active_high | No | valid/ready/last polarity. Default true. | |
| cursor_name | No | Optional explicit cursor name. | |
| cursor_note | No | Optional cursor note. | |
| data_fields | No | AXI WRITE only: W-channel payload to capture per beat (e.g. wdata, wstrb). | |
| end_time_ps | No | Window end. -1 = end of trace. | |
| capture_beats | No | Include per-beat data (data_beats[]) on each txn. Default false (only beat_count). Enable for data-integrity debugging; can be large. | |
| start_time_ps | No | Window start (ps int, '@cursor', or unit literal). Default 0. | |
| timeout_cycles | No | Optional: count completed txns with latency above this many cycles (slow_count fact). | |
| max_transactions | No | Max txn records returned (default 256); counts/stats are over ALL. Sets transactions_truncated when exceeded. | |
| reset_active_low | No | reset is active-low (rst_n). Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden and does so well: it discloses read-only operation, algorithmic behavior (per-id FIFO, out-of-order support), interpretive caveats (reorder_count is informational, latency is a distribution not verdict), and hang semantics (unmatched=hang signature). This goes well beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense yet tightly constructed. The first sentence encapsulates purpose, method, and outputs; subsequent sentences add protocol mappings and key caveats. There is no filler, and every clause contributes to effective tool selection and invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 27 parameters, no output schema, and no annotations, the description is remarkably complete. It explains the core algorithm, protocol-specific parameter meanings, optional payload capture, burst-length checking, reset handling implications, and result semantics. An agent has enough context to invoke the tool correctly across AXI read/write and simple in-order scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds valuable cross-references and protocol mappings, such as explaining that req_len triggers beat_count_mismatch checks and how cmp_last affects transaction completion. It enriches the schema without repeating it verbatim.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's function with a specific verb ('reconstruct'), resource ('id-correlated request/response transactions from two handshake channels'), and method ('walk every clock edge, match accepted request beats to completion beats by id'). It distinguishes itself from sibling waveform/signal tools by focusing on transaction-level reconstruction and latency/fact output rather than signal inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong contextual guidance, including exact AXI READ/WRITE signal mappings and when to use optional parameters (req_fields/cmp_fields, req_len, cmp_last). However, it does not explicitly name alternatives or exclusion conditions among sibling tools, though none appear to be direct alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_structural_risksA
Run a Scope 1 regex-based structural risk scan on RTL/TB source files from the compile file list. This is a heuristic detector: it reports suspicious patterns, not confirmed root causes. Always read coverage_status: only complete with total_risks=0 supports a clean-scan observation; zero_coverage scanned no supported sources, and degraded covers only part of the source set.
| Name | Required | Description | Default |
|---|---|---|---|
| simulator | No | vcs / xcelium / auto (default: auto) | auto |
| categories | No | Optional list of risk categories to scan. If omitted, all categories are scanned. | |
| scan_scope | No | Scan scope version. Currently only scope1 is supported. | scope1 |
| compile_log | Yes | Absolute path to a compile or elaborate log |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it largely succeeds: it explicitly warns that results are 'suspicious patterns, not confirmed root causes' and explains what 'complete', 'zero_coverage', and 'degraded' mean for drawing a clean-scan conclusion. This is meaningful behavioral context beyond the schema. It does not discuss side effects or permissions, but for a read-style scan tool the key caveats are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler: it front-loads the action, then gives the heuristic caveat, then the output-interpretation rule. Every sentence earns its place, and the dense coverage_status guidance is necessary rather than redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one required parameter and complete schema descriptions, the description provides the key result-handling context via coverage_status and total_risks, even though no output schema exists. It does not describe the full risk report structure, but an agent can correctly invoke the tool and understand the critical status field. Minor output-shape detail is the only real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the structured data already documents all four parameters. The description adds mild context by tying compile_log to the 'compile file list', but it does not add semantics for simulator, categories, or scan_scope beyond the schema. Given full schema coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete imperative: 'Run a Scope 1 regex-based structural risk scan on RTL/TB source files from the compile file list.' This states a specific verb and resource and clearly distinguishes 'structural risk scan' from the many log-parsing, waveform, and TB-navigation siblings. The heuristic qualifier further sharpens what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No sentence states when to choose this tool over a sibling or when not to use it. The coverage_status advice explains how to interpret results after running the scan, not how to select among alternatives. Usage context is only implied by the tool's name and 'risk scan' language.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_signalsA
Search for signals in a waveform file (FSDB/VCD) and return full hierarchical paths. Use this when the client knows a leaf signal name but not the full path. keyword accepts a single string OR a list of strings: pass a list to batch several lookups in one call (one result entry per keyword, in input order) instead of issuing consecutive single-keyword searches. Each result also carries direction (input/output/inout/implicit/...) and var_type (wire/reg/integer/real/parameter/memory/...), so callers can filter by port direction or language type within a scope by combining a hierarchical keyword with these fields — no separate listing tool is needed. Note: VCD format does not encode port direction; direction is always null for VCD waves, while var_type is populated. FSDB populates both. FSDB search uses a scope-tree index and does not read value changes, so it scales well to large files. FSDB support depends on fsdb_runtime.enabled returned by get_sim_paths.
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | Yes | Signal keyword (for example s_bits, clk, or data), or a list of keywords (max 16) to batch several lookups in one call — prefer the list form over consecutive single-keyword calls | |
| wave_path | Yes | Absolute path to the waveform file | |
| max_results | No | Maximum number of matches to return. Default: 50 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility and does this well: it discloses VCD's null direction behavior, FSDB populating both fields, scope-tree indexing, the fact that no value changes are read, scaling characteristics, and the fsdb_runtime.enabled dependency. This is substantial behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense and well-structured: purpose first, then usage context, batch semantics, result fields, format limitations, and backend notes. Every sentence contributes information an agent needs; there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema and no annotations, yet the description explains what results contain, their order, backend-specific caveats, and a runtime prerequisite. An agent has enough detail to decide when to call it and how to interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics for keyword: batch behavior, input-order result entries, the preference for lists, and using hierarchical keywords with direction/var_type for filtering. It does not add extra semantics for wave_path or max_results, which the schema already covers adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: search for signals in an FSDB/VCD waveform file and return full hierarchical paths. It also clarifies the tool is for name-based lookup, distinguishing it from sibling tools that work with signal values or transitions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool: when the client knows a leaf signal name but not the full path. However, it never names sibling alternatives or gives explicit when-not-to-use conditions, so it falls just short of full usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_handshakesA
Scan a waveform and propose ready-to-use inspect_handshake bundles: it pairs *valid/*ready signals by scope and stem, finds the clock, and groups the channel payload buses (the signals that must hold steady during a stall). Use this BEFORE inspect_handshake so you don't have to hand-assemble {clock, valid, ready, payload} signal paths. Covers AXI *valid/*ready, generic valid/ready, and req/ack. It does NOT synthesise an AHB 'valid' (there is no literal valid signal — it is htrans != IDLE); use suggest_protocol_bundles for AHB/APB. Reads existing waveforms only.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Optional hierarchy prefix to restrict candidates (e.g. 'tb_top.u_dut'). | |
| wave_path | Yes | Waveform (FSDB or VCD). | |
| max_candidates | No | Max bundles to return. Default 8. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states that the tool reads existing waveforms only, pairs valid/ready signals by scope and stem, finds the clock, and groups payload buses. It also explicitly discloses a non-obvious limitation for AHB. This is rich, honest behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, each earning its place: the core function, the recommended workflow, supported protocols, and an explicit exclusion with a pointer to the alternative. It is front-loaded with the primary purpose and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description tells the agent what to expect (bundles containing clock, valid, ready, payload), how to use the results (feed into inspect_handshake), and what limitations exist. Combined with full schema coverage, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter already has a clear description, so the baseline is 3. The tool description adds a slight hint about scope ('by scope and stem') but does not materially expand on the schema's parameter documentation. It neither improves nor degrades parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Scan a waveform and propose'), a specific resource (waveform), and a concrete output (inspect_handshake bundles). It clearly distinguishes itself from the sibling suggest_protocol_bundles by name and scope, so there is no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use it ('Use this BEFORE inspect_handshake') and when not to ('does NOT synthesise an AHB valid ... use suggest_protocol_bundles for AHB/APB'). It also enumerates supported protocols (AXI, generic valid/ready, req/ack), giving clear selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_protocol_bundlesA
Scan a waveform for protocol-specific AHB/APB bundles. AHB candidates return ready-to-use inspect_handshake args with valid_htrans + ready + payload (address-phase control), plus hwrite/write_data (HWDATA, for the write data-phase hold check) ONLY on initiator-side interfaces (a responder's HWDATA is an interconnect-mux output that glitches at the clock edge, so the check is withheld there to stay zero-FP), because AHB has no literal valid signal. APB candidates return psel/penable/pready facts and loudly report that inspect_handshake still needs a derived valid signal for psel && penable. Direction tags are mechanical discovery facts only; unknown/conflicting markers degrade to direction_tag='unknown' rather than guessing a side. Reads existing waveforms only.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Optional hierarchy prefix to restrict candidates (e.g. 'tb_top.u_dut'). | |
| protocol | Yes | Protocol bundle family to discover. | |
| wave_path | Yes | Waveform (FSDB or VCD). | |
| max_candidates | No | Max bundles to return. Default 8. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it delivers: read-only behavior is stated, the initiator-only HWDATA withholding is explained with rationale ('interconnect-mux output that glitches at the clock edge... to stay zero-FP'), and the direction_tag degradation rule ('unknown/conflicting markers degrade to direction_tag=\'unknown\' rather than guessing') is disclosed. This is exemplary behavioral disclosure beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, and every subsequent clause adds distinct behavioral or domain value. It is long, but the length is warranted by the tool's protocol-specific complexity; a modest trim of parentheticals would be possible without losing substance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with no annotations and no output schema, and the description compensates well by specifying candidate contents per protocol, the directional caveats, and the read-only safety property. The main gap is that the exact return structure/shape is not spelled out, leaving some inference about how candidates are packaged.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaning beyond the terses enum: it explains exactly what AHB candidates contain (valid_htrans + ready + payload, plus hwrite/write_data only on initiator interfaces) and what APB candidates contain (psel/penable/pready + derived-valid requirement), substantially enriching the protocol parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence, 'Scan a waveform for protocol-specific AHB/APB bundles,' states a specific verb, resource, and scoped protocol family. The detailed AHB-vs-APB candidate descriptions (inspect_handshake args, valid_htrans, psel/penable) clearly separate this from siblings like suggest_handshakes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong context for when the tool is appropriate: AHB/APB protocol discovery, initiator-side versus responder-side handling, and the APB derived-valid caveat. It also adds the constraint 'Reads existing waveforms only.' However, it never explicitly names alternatives (e.g., suggest_handshakes) or states when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sweep_handshakesA
Whole-design handshake anomaly sweep: discover EVERY valid/ready interface and every AHB interface, then inspect each over the window in one call, returning a comparative fact table (per-interface stalls, deadlock signature ended_in_stall, x-while-valid, payload-hold, write-data-hold, premature valid deassertion, backpressure) ordered by a transparent mechanical key. Use on opaque global symptoms (timeout/hang) when you don't know which of many interfaces misbehaves — it collapses N suggest+inspect round-trips into one. Always interpret flagged_count together with coverage_status: zero_coverage means no protocol interfaces were checked and is NOT a pass; truncated/degraded means partial coverage. Workflow follow-ups relay only parameter-changing retries: an unscoped zero-coverage result is not blindly replayed, but remains inconclusive. FSDB native transition-buffer truncation is propagated per row and forces degraded coverage; zero findings then cover only returned prefixes. Returns FACTS, not a root-cause verdict; re-rank as the symptom warrants. Reads existing waveforms only.
| Name | Required | Description | Default |
|---|---|---|---|
| edge | No | Clock edge to sample on. Default posedge. | posedge |
| scope | No | Optional hierarchy prefix to limit the sweep (e.g. 'tb_top.u_dut'). If the scope contains no discovered interfaces the result reports coverage_status=zero_coverage; retry unscoped or with a parent/interface scope. | |
| wave_path | Yes | Waveform (FSDB or VCD). | |
| end_time_ps | No | Window end. -1 = end of trace. Accepts ps int, '@cursor', or unit literal. | |
| start_time_ps | No | Window start (ps int, '@cursor', or unit literal like '12.3ns'). Default 0. | |
| max_interfaces | No | Max interfaces to sweep (default 64). If discovery exceeds this the result is flagged truncated=true — raise it for full coverage. | |
| max_wait_cycles | No | Stall length (cycles) above which a stall becomes a long_stall finding. Default 16. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the tool reads existing waveforms only (read-only behavior), returns facts not root-cause verdicts, propagates FSDB truncation as degraded coverage, and defines zero_coverage as a non-pass condition. It also discloses the ordering by a mechanical key and partial-coverage semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but each sentence contributes a distinct operational fact: purpose, when-to-use, coverage semantics, retry policy, truncation handling, return type, and read-only nature. It is slightly long, but the complexity and lack of annotations/output schema justify the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the absence of both annotations and an output schema, the description covers everything needed: the fact-table fields, coverage_status interpretation, truncated/degraded meanings, FSDB truncation caveats, read-only nature, and the distinction between facts and verdicts. An agent can correctly select, invoke, and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds general context about sweeping over a window and interpreting coverage, but it does not materially add parameter-level meaning beyond what the schema already provides. The scope retry advice is already present in the schema's scope field description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (whole-design handshake anomaly sweep) and resource (valid/ready and AHB interfaces), and lists the concrete checks performed. It also differentiates from siblings like suggest_handshakes and inspect_handshake by explicitly noting that it collapses N suggest+inspect round-trips into one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use the tool on opaque global symptoms (timeout/hang) when the offending interface is unknown, and contrasts it with the alternative suggest_handshakes + inspect_handshake flow. It also provides workflow follow-up guidance, such as not blindly replaying unscoped zero-coverage results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trace_signal_pathA
Find a structural connectivity path between two signals. A trusted Verdi NPI result wins; otherwise TraceWeave tries a bounded, dual-endpoint Source Graph before Legacy Static. Source Graph follows only projected IR facts across bindings and supported combinational dependencies. claim_semantics reports confidence in a proved positive path independently from global coverage; a found path is not an exhaustive enumeration. A no-path result is exact only when negative_claim_allowed=true; an inconclusive result falls through to unsupported_reason='static_backend_no_path_api'. This is connectivity, NOT temporal driver direction — use explain_signal_driver for driver semantics.
| Name | Required | Description | Default |
|---|---|---|---|
| top_hint | No | ||
| simulator | No | vcs / xcelium / auto. Optional — auto-injected from get_sim_paths. | |
| to_signal | Yes | ||
| compile_log | Yes | ||
| from_signal | Yes | ||
| expand_assigns | No | Expose supported assignment transitions. NPI may show assign cells; Source Graph shows only real IR/source evidence and never invents an NPI cell identity. This changes presentation, not the connectivity verdict. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does so thoroughly. It discloses the trusted Verdi NPI priority, the bounded TraceWeave Source Graph fallback, the non-exhaustive nature of a found path, the exactness condition for no-path results, and the unsupported_reason fallback. This prevents an agent from over-trusting or misinterpreting results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place, covering purpose, algorithm priority, exactness caveats, and an important sibling distinction. It lacks any structural formatting such as bullets, making it somewhat hard to scan, but there is no wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description gives substantial behavioral and result-caveat context, including claim_semantics, negative_claim_allowed, and unsupported_reason. However, with no output schema and incomplete parameter explanations, some important call details are left to inference. It is adequate for a knowledgeable agent but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, and the description does not compensate for the missing parameter guidance. The required parameters compile_log, from_signal, and to_signal are never explained beyond general phrasing, and top_hint is not mentioned at all. The schema's expand_assigns description is useful, but the core required parameters remain underdocumented for an agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: 'Find a structural connectivity path between two signals.' The last sentence explicitly distinguishes this from temporal driver semantics and names the appropriate sibling tool, explain_signal_driver, so an agent can reliably separate the two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool: when structural connectivity between two signals is needed. It explicitly tells agents not to use it for driver semantics and points to explain_signal_driver as the alternative. It doesn't compare against other siblings like trace_x_source or search_signals, but the main exclusion is well handled.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trace_x_sourceA
When a signal shows X/Z at a target time, trace its propagation chain through upstream driver logic. Uses the selected connectivity route (trusted local/LSF NPI, bounded Source Graph, then Static). A Source Graph trace may expand to bounded direct-child frontiers when an unresolved parent net can be driven by a child output. Any backend or artifact change discards the partial chain and restarts from the original signal, so one returned chain never mixes provenance. Connectivity queries run outside waveform locks. backend_status reports selected versus actual backend; trace_restarted reports a whole-trace retry. Source Graph chain nodes preserve claim_semantics, so an exact positive edge can be used without implying global coverage or exclusive drive. NPI testbench-driven/cross-check evidence is preserved on the node.
| Name | Required | Description | Default |
|---|---|---|---|
| time_ps | Yes | Trace start time. Accepts an integer (ps), a cursor reference like '@div_3a7c', or a unit literal like '12.34ns'. | |
| top_hint | No | ||
| max_depth | No | Maximum trace depth. Default: 20 | |
| simulator | No | vcs / xcelium / auto. Optional — if omitted, server auto-injects the value discovered by get_sim_paths. | |
| wave_path | Yes | ||
| compile_log | Yes | ||
| signal_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden and succeeds: it discloses chain restarts on backend/artifact changes, never mixing provenance, backend_status vs trace_restarted fields, lock-free connectivity queries, and preserved claim_semantics/NPI evidence. This is unusually thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main use case is front-loaded in the first sentence, and subsequent sentences each add a distinct behavioral fact rather than filler. It is dense but could be easier to scan with structured bullets.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with no annotations and no output schema, the description covers route selection, restart semantics, output status fields, and node-level semantics well. The main remaining gap is the lack of a clearer result-shape explanation, though the description provides substantial context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 43%, and required parameters like wave_path, signal_path, and compile_log lack descriptions in both the schema and the tool description. The description references 'target time' and 'original signal' but does not explain how the required inputs should be provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a precise trigger (signal shows X/Z at a target time) and a concrete action (trace propagation chain through upstream driver logic). This clearly scopes the tool and distinguishes it from generic siblings like trace_signal_path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly scopes invocation to X/Z-at-time cases and describes the connectivity route fallback order. It does not name an alternative tool or provide when-not-to-use guidance, but the context is clear enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_windowA
Evaluate a temporal predicate over a clock window and return a precise verdict (holds) plus a concrete witness/counterexample (cycle + sampled values). You state the predicate; the tool checks it against the waveform over thousands of cycles you cannot read yourself. Templates, not a DSL: a term is {signal, op, value} (op: eq/ne/gt/ge/lt/le/is_x/is_known); a predicate is a list of terms (implicit AND — run two calls for OR). Modes: always(P), never(P), eventually(P), implication (A |-> B within N cycles, the protocol-response template; set overlap=false for |=> = a stability/hold property where B must STILL hold the NEXT cycle, e.g. HTRANS/valid held through a wait state), and sequence (the per-accepted-beat increment of a signal — address-stride checks like AHB haddr +stride; supports modulo for WRAP bursts and restart_when for burst boundaries). x/z cycles are reported as unknown (never silently passed); an implication whose response window runs past end-of-trace is reported inconclusive (never silently failed). On a finding it sets violating_signal + a next_action to explain_signal_driver (bus facts do not self-attribute master/slave). Use to prove/disprove an RTL inference in one call. Reads existing waveforms only.
| Name | Required | Description | Default |
|---|---|---|---|
| edge | No | Clock edge to sample on. Default posedge. | posedge |
| mode | Yes | Temporal template to evaluate. | |
| clock | Yes | 1-bit clock signal full path. | |
| delta | No | sequence only: check the per-accepted-beat increment of one signal. predicate is the accepted-beat gate (e.g. hready==1 && htrans active). E.g. AHB byte INCR: {signal:'top.haddr', value:1}. For WRAP bursts pass modulo = burst region bytes (size*len) so the wrap-around beat is accepted via (cur-prev) mod modulo. Pass restart_when (a predicate, e.g. htrans==NONSEQ) to re-seed at each new burst so burst boundaries are not flagged. | |
| overlap | No | implication only. true (default, |->): the response window includes A's own cycle. false (|=>): the window starts the NEXT cycle [i+1, i+within] — use this for a stability/hold property ('B must STILL hold next cycle', e.g. HTRANS/valid held through a wait state) where A already implies B on its own cycle. With overlap=true such a property is a VACUOUS pass (flagged in result.vacuous + warnings); overlap=false requires within_cycles>=1. | |
| predicate | No | always/never/eventually: list of {signal, op, value} terms, AND-combined. | |
| wave_path | Yes | Waveform (FSDB or VCD). | |
| antecedent | No | implication only: the A predicate (list of terms). | |
| consequent | No | implication only: the B predicate that must follow A. | |
| cursor_name | No | Optional explicit cursor name for the witness/counterexample. | |
| cursor_note | No | Optional note for the registered cursor. | |
| end_time_ps | No | Window end. -1 = end of trace. | |
| start_time_ps | No | Window start (ps int, '@cursor', or unit literal). Default 0. | |
| within_cycles | No | implication only: B must hold within this many cycles of A. The response window is [i, i+within] when overlap=true (includes A's cycle) or [i+1, i+within] when overlap=false. Default 1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses edge-case handling: x/z cycles are reported as unknown and never silently passed; an implication running past end-of-trace is inconclusive and never silently failed. It also reveals side effects/outcomes: on a finding it sets violating_signal plus next_action to explain_signal_driver, and notes that two calls are needed for OR semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense and every clause earns its place. It front-loads the core purpose, then efficiently covers templates, modes, edge cases, output behavior, and intended use. Semicolon-separated lists and mode names keep complex information scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description appropriately explains return behavior: verdict, witness/counterexample with cycle and sampled values, vacuous pass/warnings, inconclusive results, and the violating_signal/next_action mechanism. For a tool with 14 parameters, nested objects, and multiple mode-dependent parameter sets, the description is complete enough for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantic guidance beyond the schema: term format, implicit AND, mode-specific intent, overlap behavior for |=> stability properties, and concrete examples like AHB haddr + stride and restart_when for burst boundaries. It does not exhaustively walk through all 14 parameters, but it covers the semantically tricky ones such as delta, overlap, and restart_when.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Evaluate a temporal predicate over a clock window and return a precise verdict (holds) plus a concrete witness/counterexample." It enumerates the five modes and the term/predicate structure, making the tool's unique role unmistakable among siblings like get_signal_at_time and search_signals. It also clarifies read-only scope with "Reads existing waveforms only."
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear use case: "Use to prove/disprove an RTL inference in one call." It also provides mode-level guidance, e.g., implication as the protocol-response template, overlap=false for stability/hold properties, and sequence for address-stride checks. It does not explicitly name sibling alternatives or state when not to use this tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
38 tool updates
v2.0.2- First observed
analyze_failure_event - First observed
analyze_failures - First observed
build_kdb - First observed
build_tb_hierarchy - First observed
cursor_delete - First observed
cursor_list - First observed
cursor_set - First observed
diff_first_divergence - First observed
diff_sim_failure_results - First observed
dump_tb_section - First observed
explain_signal_driver - First observed
find_signal_loads - First observed
find_tb_instance - First observed
get_diagnostic_snapshot - First observed
get_error_context - First observed
get_signal_at_time - First observed
get_signal_transitions - First observed
get_signals_around_time - First observed
get_signals_by_cycle - First observed
get_sim_paths - First observed
get_tb_class_hierarchy - First observed
get_tb_file_detail - First observed
get_tb_subtree - First observed
get_waveform_summary - First observed
inspect_handshake - First observed
lookup_tb_files - First observed
parse_sim_log - First observed
period - First observed
recommend_failure_debug_next_steps - First observed
reconstruct_transactions - First observed
scan_structural_risks - First observed
search_signals - First observed
suggest_handshakes - First observed
suggest_protocol_bundles - First observed
sweep_handshakes - First observed
trace_signal_path - First observed
trace_x_source - First observed
verify_window
TDQS
Scored across 38 tools
Several near-synonymous clusters exist: analyze_failures/analyze_failure_event/recommend_failure_debug_next_steps, get_signal_at_time/get_signal_transitions/get_signals_around_time/get_signals_by_cycle, and trace_signal_path/trace_x_source/explain_signal_driver/find_signal_loads. Long descriptions differentiate them, but the tool set itself does not make the boundaries obvious, so misselection is likely.
Most tools follow a readable snake_case verb_noun pattern (get_tb_subtree, parse_sim_log, inspect_handshake). Minor inconsistencies: period is a bare noun, cursor_set/list/delete invert the noun-verb order, and singular/plural varies (get_signal_at_time vs get_signals_by_cycle).
38 tools is far above the 25+ threshold for a coherent surface. Several families (signal getters, handshake suggestors, failure analyzers) could be consolidated into parameterized tools, making the surface heavier than necessary for an agent to navigate.
The core hardware-debug lifecycle is well covered: hierarchy build/query, log discovery/parsing/failure comparison, waveform search/sampling, driver/load/path tracing, and handshake/protocol checks. Minor gaps include no source-file content access, no full waveform diff beyond first divergence, and no functional coverage analysis, but these are not blocking for the stated purpose.
Maintenance
Related MCP Connectors
Physics-based validation of simulation results: receipts with per-check verdicts, via MCP.
Remote MCP for A2A failure replay MCP, structured receipts, audit logs, and reviewer-ready evidence.
Voice-powered bug reporting with 13 MCP tools. Record bugs by talking; let AI find and fix them.
Katalon True Platform MCP: design tests, run with AI, upload reports, assess release readiness.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables analysis of RTL waveform files (VCD, FST) through WAL (Waveform Analysis Language). Supports signal inspection, transition extraction, and advanced waveform queries for hardware design verification.16BSD 3-Clause
- AlicenseBqualityBmaintenanceEnables AI assistants to control Cadence Xcelium and SimVision simulators in real time for automated RTL and gate-level debugging. It provides 25 tools for signal inspection, watchpoints, binary search, and simulation state management.251MIT
- FlicenseNot gradedqualityBmaintenanceAn MCP server that provides AI assistants with a persistent, sandboxed Python environment for waveform analysis, enabling loading and manipulation of VCD/FST/FSDB files and temporal pattern matching.9-
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to analyze RTL simulation and synthesis logs through deterministic tools for compile-log summaries, signal tie-off safety checks, and regression result statistics.-