net.bus_like
a shared-distribution net (ground plane, global rail, or rail-scale fan-out), the series-reach walk's stop predicate
What it is ¶
net.bus_like(net) yields one row per net the engine treats as a shared-distribution node
rather than a point-to-point signal: a ground plane, a global-by-name rail, or any net whose
fan-out is rail-scale. It is the named form of the exact predicate the series-reach walk
(reaches) refuses to cross, so “which nets are bus-scale?” is a query, not a constant buried
in the walk.
A net is bus-like when any one of three holds:
- it carries the
globalattribute (a power/ground rail resolved design-wide), or - its name reads as ground (
GND,VSS,AGND, …), or - more than 16 pins connect to it (rail-scale fan-out).
Distinct from bus(label, kind), which reports a reader-detected unmodeled bus label
(WS1-034), a syntactic construct the reader saw but did not expand. net.bus_like is about a
solved net’s electrical role, not a source-file token.
For hardware engineers ¶
These are the nets you would never trace a signal through to find what it drives. Power and ground distribution, and any net so heavily loaded that “what connects to it” is a distribution question, not a path question. During a review you query it to sanity-check that the walk-based rules (ESD, input-protection, feedback-probe) are stopping where you expect: if a signal net you thought was point-to-point shows up here, its fan-out is higher than intended, or its name collides with a rail convention.
For software engineers ¶
Think of a bus-like net as a global singleton in a dependency graph: reachability analysis
must not follow an edge into it, or the whole graph collapses into one component. The
series-reach walk is a bounded BFS over pass elements (resistors, ferrites, fuses); net.bus_like
is its stop set. The relation is a projection over Nets() with a boolean filter, so rows are
1:1 with nets that pass the predicate, and an empty result means the design is all point-to-point
(no rails, no ground-named nets, nothing over the fan-out ceiling).
Go projector ¶
netBusLikeFacts in check/facts.go walks Model.Nets() and emits a row for each net where
isBusLike(n) holds. isBusLike (in check/reach.go) is the single definition shared with the
Reach walk’s stop check, so the relation and the walk cannot drift, because they call the same
function. One row per bus-like net; empty for a purely point-to-point design.
Datalog ¶
List every bus-like net:
net.bus_like(?n) => ?n
Find components sitting on a bus-like net (the loads on rails and ground):
net.bus_like(?n), component-on-net(?r, ?n) => ?r