digraph T { /* Make sure our payloads are always drawn below the driver node */ subgraph cluster_driver { fillcolor = grey; style = filled; edge [dir=none]; driver -> payload1; driver -> payload2 [penwidth=3]; edge [dir=""]; } /* Driver malloc references */ edge [style=dashed]; driver -> port1; driver -> port2; driver -> port3:e; driver -> port4 [color=grey]; payload1:s -> port1:e; payload2:s -> port3:e [penwidth=3]; edge [style=""]; subgraph cluster_topology { label="Topology Manager"; labelloc=bottom; /* Topology references */ mstb1 -> {port1, port2}; port1 -> mstb2; edge [color=grey]; port2 -> mstb3 -> {port3, port4}; port3 -> mstb4; edge [color=""]; /* Malloc references */ edge [style=dashed;dir=back]; mstb1 -> {port1, port2}; port1 -> mstb2; port2 -> mstb3 [penwidth=3]; mstb3 -> port3 [penwidth=3]; edge [color=grey]; mstb3 -> port4; port3 -> mstb4; } mstb1 [label="MSTB #1";style=filled;fillcolor=palegreen]; mstb2 [label="MSTB #2";style=filled;fillcolor=palegreen]; mstb3 [label="MSTB #3";style=filled;fillcolor=palegreen;penwidth=3]; mstb4 [label="MSTB #4";style=filled;fillcolor=grey]; port1 [label="Port #1"]; port2 [label="Port #2";penwidth=5]; port3 [label="Port #3";penwidth=3]; port4 [label="Port #4";style=filled;fillcolor=grey]; driver [label="DRM driver";style=filled;shape=box;fillcolor=lightblue]; payload1 [label="Payload #1";style=filled;shape=box;fillcolor=lightblue]; payload2 [label="Payload #2";style=filled;shape=box;fillcolor=lightblue;penwidth=3]; }