Без заголовка
Повторюсь: два чтения -- в одном квадратики действительно интерфейсы, а модули "компилируют" между этими языками, описанными интерфейсами (реализуют интерфейсы по обе стороны) и обозначены просто пустыми местами или стрелками между квадратиками. Второй вариант: чтение квадратика как модуля, но без идиотизма повторения по обе стороны от интерфейса одного и того же имени протокола. Хватит и одного раза, для верхнего протокола (а нижний -- тот же самый. что верхний протокол нижележащего уровня).
Есть множество примеров обоих представлений, разница в нотации. Мне нотация не так интересна, как суть дела.