SwimlaneLayout
Two-axis "swimlane" placement for the flow views (data / control / ICFG), shared by Cytoscape and Sigma — both consume view.position, so a single computed layout positions both. Cytoscape additionally draws the function / namespace / element constructs as foldable compound boxes (data.parent); Sigma shows the same leaf coordinates flat, without boxes.
A swimlane is NOT a Sugiyama layout — one axis is given by the data, the other computed. So this is a direct preset placement (no ELK):
x (lane) = function column, ASSIGNED. Functions are sorted
harness → activity → other, then by name. One lane per function.
y (rank) = GLOBAL execution order, computed by longest-path layering over the
flow edges (layer(v) = 1 + max(layer(pred))). Lanes therefore start
at DIFFERENT heights — a function called late sits below its
caller's call site — rather than every lane resetting to row 0.
Within a lane the rank is kept monotone + collision-free (one per Y).Compound boxes (function, and its namespace / class / element ancestors) are positioned as the bounding box of their descendants — bottom-up — so Sigma can plot them and Cytoscape's preset has a sensible parent rect to start from. Cross-lane edges are left to the viewers to route (no waypoints here), exactly like the nested ELK path.
ELK-layered (Layout) stays the strategy for the compound/hierarchical and summarized SVG views; this is the strategy for the flow views.