Reconvergence handling improves metric quality in circuits with fanout branches that rejoin.
Algorithm selection
| Algorithm | Complexity | Use when |
|---|---|---|
dominator (default, auto-selected) |
polynomial, no cap | always |
basic |
O(n^2) |
structural checks only, not auto-selected |
simple |
O(n^2 log n) |
structural checks only, not auto-selected |
advanced |
O(n^2) |
structural checks only, not auto-selected |
dominator is the only detector whose single-stem record schema the COP cofactor (C1)
correction consumes; the Obs-side corrections (SCOAP’s reconvergence-depth adjustment, COP’s
Bayesian/correlated-observability adjustment) are format-agnostic and consume records from all
four detectors. analyze_and_add_tp/cop/scoap auto-select dominator regardless of circuit
size when -a is omitted. The separate FaultFlow _preflight machine interface defaults to
advanced instead; see the FaultFlow integration section below.
CLI usage
Reconvergence-aware metrics:
python3 opentest cop -i <design.json> -r -j
python3 opentest scoap -i <design.json> -r
(omitting -a, or passing -a dominator explicitly, select the same detector)
Reconvergence alongside TPI:
python3 opentest --yosys analyze_and_add_tp -i <design.json> --scoap -r -t 50 -m 10 --tech sky130 -v
Path-materialization budget
Detection (finding every reconvergent (stem, site) pair) is always complete and fast. Correcting a confirmed site needs a max-flow call to materialize two disjoint paths, since COP cofactor correction re-evaluates gate logic along them and needs their genuine disjointness for correctness.
A dense real design can have many confirmed sites. Measured on picorv32a (~14.6k gates): 8,084 fanout stems, 7,488 distinct sites, 673,921 total pairs. Unbounded materialization is many hours (a real run hit 1h49m and was still climbing before being killed).
DominatorReconvergenceDetector takes a path_budget_seconds parameter (default 30 seconds, Python-API only; no CLI flag yet).
- Detection is never capped by this: every genuine reconvergence is still reported.
- Once the budget is spent, remaining sites get
path1/path2asNoneandpaths_materialized: False; COP correction skips these and keeps the independence-based estimate. - Sites are corrected in priority order (tightest/shortest stem→site distance first, via a cheap one-BFS-per-stem pass), not arbitrarily.
- Full
picorv32apass (detection + budget-capped correction): 2+ hours never-finished → ~47 seconds.
To use a different (or unbounded) budget, call the detector directly instead of the CLI.
tpi_manifest.json net-ID enrichment
When a Yosys JSON netlist is available, structural_hints.fanout_points in the manifest is written as list[dict] with yosys_net_id on each entry:
{
"structural_hints": {
"fanout_points": [
{"name": "net_foo", "yosys_net_id": 42},
{"name": "internal_sig", "yosys_net_id": null}
]
}
}
yosys_net_id is netnames[name]["bits"][0], the first integer in Yosys’s bits list, directly usable as a Yosys net index. Signals not in netnames or with only string-constant bits get null.
Practical recommendations
- Use the default (
dominator) for normal runs; it’s auto-selected, so no flag is needed. - On a large or densely-reconvergent design, pass a larger
path_budget_seconds(Python API) if correction quality near the budget cutoff matters more than wall-clock time. - Keep verbose mode enabled while tuning thresholds and test-point count.
Parallel execution
Large circuits can automatically use parallel processing in analysis paths. Keep reconvergence enabled so observability adjustments remain correlation-aware.
Output usage
- feed reconvergence-aware COP/SCOAP results into TPI selection
- compare outputs between algorithms only when behavior needs investigation
- keep algorithm choice consistent inside a single benchmark campaign
FaultFlow integration
OT exposes a machine interface that FaultFlow calls before ATPG to obtain reconvergence structural data without inserting test points. The interface runs SCOAP + reconvergence analysis (defaulting to the advanced algorithm, a different default than the dominator auto-selection used elsewhere), writes an enriched tpi_manifest.json and a separate <design>_reconv_ids.json, and emits a JSON status line on stdout for the calling process to parse. FaultFlow uses the reconvergent stems only to order its ATPG queue: the records are structural (two branches of a stem meet again), so they never show that a fault is redundant, and every verdict still comes from SAT.
See FaultFlow Preflight Protocol for the full contract.