net.external
the net may extend onto an unread sheet (read-gap marker)
What it is ¶
net.external(net) yields one row per net the read flagged as possibly continuing onto something it
did not cover: a net joined by a name-based mechanism (a global label, a power symbol) whose other
ends may live in files or sheets the read never opened. It is a read-gap marker, not a topology
fact.
It is about read scope, not sheet membership. A net that spans ten sheets of a fully-read design
carries no net.external marking, because “which sheets does this net touch” is derivable topology.
net.external marks only nets where the read itself may be incomplete.
For hardware engineers ¶
A row here means: what the tool sees on this net is not proof of what the board has on it. There may be more pins, more sources, more loads on a sheet the read did not reach. So a rule that would fire on incomplete connectivity (a decoupling-cap-missing or crystal-load check) suppresses itself on an external net rather than report a violation it cannot stand behind. During a review you query it to see where the read is admitting a gap.
For software engineers ¶
This is the silence-is-not-coverage marker. Absence of a connection on an external net is not
evidence of no connection; the read simply may not have covered the far end, the way a partial index
cannot prove a symbol is unreferenced. Rules use it as a negative guard: fire only where the read is
known-complete. The relation is a projection over Nets() filtered on the external net attribute
(netgraph.AttrExternal), so rows are 1:1 with flagged nets, and an empty result means the read is
complete and the guard is a no-op.
Go projector ¶
netExternalFacts in check/facts.go walks Model.Nets() and emits a row for each net whose
Attributes[netgraph.AttrExternal] is "true". The attribute is stamped by the netgraph solver
(internal/netgraph/irout.go) on a by-name net whose other ends may sit in unread files, and cleared
once a complete read resolves it (it becomes global instead). One row per external net; empty when
the read is complete.
Datalog ¶
List every net the read flagged as a possible read gap:
net.external(?n) => ?n
Use it as a caveat filter: single-connection nets that are genuinely single-pin, excluding the ones that only look isolated because the read did not cover their far end:
net.pin_count(?n, 1), not net.external(?n) => ?n