pub fn analyze<'d>(
netlist: &mut Netlist<'d>,
slang_analysis: &Analysis<'d>,
eval: &EvalSession<'d>,
opts: AnalysisOptions,
) -> Result<StaticAnalysisResult, AnalysisError>Expand description
Task 8 (NL-007, NL-063, NL-076, NL-082): the real static-analysis pass —
backfills SignalDecl.driver_set onto netlist (graph:: populate_driver_kinds, NL-063’s classification clause — the one
mutation this whole pipeline performs on an already-elaborated
Netlist, since sv_lang::Analysis does not exist until after
elaborate() returns), builds the {net,process} driver graph
(graph::build_driver_graph), partitions it (graph::partition),
classifies every un-unioned cross-domain read edge as a CdcEdge
(clock::classify_cdc_edges), and (Task 9, NL-103) fail-closed-
classifies every DPI/VPI call site (dpi::collect_call_tags).
eval is accepted per the plan’s binding signature (and the call-order
this whole pipeline documents: elaborate()’s EvalSession borrow
outlives this call); Task 9 is its first reader —
dpi::collect_call_tags’s own EvalSession::run_dataflow calls
recurse into a DPI/VPI call’s callee body. opts.dpi_default is not
itself consulted here: this task’s classifier computes the real answer
directly rather than short-circuiting to the configured default, which
stays reserved for a future consumer that wants to skip classification
entirely.