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. When a net’s only
capacitors return to ground or a rail, the net 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 and 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. That shows up as a link that will not train, or one that trains and then errors under load.
Coupling versus decoupling ¶
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. Without that test, a predicate would mark nearly every net on the board as AC-coupled, since most carry a bypass cap.
For software engineers ¶
It is a filtered projection over Nets(), 1:1 with coupled nets. It is empty on a board with no
series caps, which is the common case for a low-speed design. That empty result is 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.net(?r, ?n) => ?n, ?r
High-speed pairs that are NOT coupled, the shape a link-integrity review asks about:
component.net(?r, ?n), str.suffix(?n, "_TXP"), not net.ac_coupled(?n) => ?n, ?r