net.ac_coupled

a SERIES capacitor carries the net (a decoupling cap to ground/rail does not count)

What it is

net.ac_coupled(net) yields one row per net carried by a series capacitor. A net whose only capacitors return to ground or a rail produces no row.

For hardware engineers

AC coupling puts a capacitor in the signal path so the alternating signal passes while any steady DC level does not. It is standard on high-speed serial links (PCIe, SGMII, USB SuperSpeed) because the two ends deliberately sit at different common-mode voltages: the transmitter idles at one level, the receiver expects another, and the capacitor lets each keep its own.

Leave it out and the two ends are tied together at DC. The receiver sits wherever the transmitter holds it rather than at its own bias point, which shows up as a link that will not train, or trains and then errors under load.

The distinction that is the whole predicate

Both uses of a capacitor are “a capacitor on the net”. The difference is the far side.

far side signal passes through it?
Decoupling ground or a rail no — it shunts noise
Coupling another signal net yes — it carries the signal

So this relation looks for a capacitor whose other net is neither ground nor a power rail. A predicate that skipped that test would mark nearly every net on the board as AC-coupled, since most carry a bypass cap.

For software engineers

A filtered projection over Nets(), 1:1 with coupled nets. Empty on a board with no series caps, the common case for a low-speed design, and a genuine answer rather than a gap.

Go projector

netACCoupledFacts in stdlib/relations/facts.go calls check.ACCoupled in core/check/guards.go. The intent rule intent/property-ac-coupled reads the same function, so a declared-versus-actual comparison and an ad-hoc query cannot disagree about what counts as coupling.

Datalog

Every AC-coupled net:

net.ac_coupled(?n) => ?n

The parts on them, for a quick read of what a link actually connects:

net.ac_coupled(?n), component-on-net(?r, ?n) => ?n, ?r

High-speed pairs that are NOT coupled, the shape a link-integrity review asks about:

component-on-net(?r, ?n), suffix(?n, "_TXP"), not net.ac_coupled(?n) => ?n, ?r