Docs / Reconvergence Integration

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).

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

  1. Use the default (dominator) for normal runs; it’s auto-selected, so no flag is needed.
  2. 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.
  3. 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

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.