Проблема с "rank = same" в подграфах и кластерах - PullRequest
1 голос
/ 07 апреля 2019

При переключении с «нормальных» подграфов на кластеры, rank=same перестает работать.

Чтобы показать мою проблему, взгляните на следующий примерный график.

digraph INV_X1 {
    rankdir = "LR";
    edge [penwidth="2"];

/* Component styles */
    M_i_0 [shape=none;image="res/nmos.jpg"];
    M_i_1 [shape=none;image="res/pmos.jpg"];

/* Node styles */
    A [style=filled;color=green];
    ZN [style=filled;color=green];

/* Connections */
    M_i_0:n -> ZN;
    A -> M_i_0:w;
    /* Put M_i_0 and _VSS_0 on the same rank. */
    subgraph g_VSS_0 {
        rank=same;
        label="_VSS_0";
        _VSS_0 [shape=none;image="res/gnd.jpg";label=""];
        M_i_0 -> _VSS_0 [arrowhead=none];
    }
    M_i_1:s -> ZN;
    A -> M_i_1:w;
    /* Put M_i_1 and _VDD_1 on the same rank. */
    subgraph g_VDD_1 {
        rank=same;
        label="_VDD_1";
        _VDD_1 [shape=none;image="res/pwr.jpg";label=""];
        _VDD_1 -> M_i_1 [arrowhead=none];
    }
}

Вывод показан на следующем рисунке. Я надеюсь, что это не слишком запутанно, поскольку я использовал некоторые изображения для узлов Я создал два подграфа, чтобы сгруппировать по два узла в каждом и поставить их в один ранг. Один подграф находится в центре вверху, другой в центре внизу.

Graph with subgraphs

Теперь я хочу переключиться с подграфов на кластеры, чтобы убедиться, что сгруппированные узлы всегда располагаются близко друг к другу, и я хочу иметь границы и метки, чтобы сделать кластеры видимыми. Но когда я просто изменяю имена подграфов на «cluster _...», это выглядит так:

Same graph with clusters

В чем здесь проблема? Почему rank=same больше не работает, как ожидалось? Также указанная позиция порта больше не работает должным образом (ребро больше не подключено на юге / севере узла).

Я пытался вытащить rank=same из кластера в собственный оператор, но, похоже, он полностью перезаписывает предыдущий оператор кластера, когда границы и метки исчезают. Кроме того, я попытался использовать constraint=false на соединениях с узлами, но это портит порядок узлов, поэтому я не был удовлетворен таким подходом.

Любая помощь приветствуется. Вы можете найти используемые изображения здесь , если хотите воссоздать график.

1 Ответ

2 голосов
/ 07 апреля 2019

Вы правы, поскольку документация гласит , атрибут "rank" работает только с подграфами (кластер больше не является подграфом). Но в чем проблема, поместите другой подграф в кластер!

digraph INV_X1 {
    rankdir = "LR";
    edge [penwidth="2"];

/* Component styles */
    M_i_0 [shape=none;image="res/nmos.jpg"];
    M_i_1 [shape=none;image="res/pmos.jpg"];

/* Node styles */
    A [style=filled;color=green];
    ZN [style=filled;color=green];

/* Connections */
    M_i_0:n -> ZN;
    A -> M_i_0:w;
    subgraph cluster_a{
    /* Put M_i_0 and _VSS_0 on the same rank. */
        label="_VSS_0";
        subgraph g_VSS_0 {
            rank=same;
            _VSS_0 [shape=none;image="res/gnd.jpg";label=""];
            _VSS_0 -> M_i_0 [arrowhead=none];
        }
    }
    M_i_1:s -> ZN;
    A -> M_i_1:w;
    /* Put M_i_1 and _VDD_1 on the same rank. */
    subgraph cluster_b {
        label="_VDD_1";
        subgraph g_VDD_1 {
            rank=same;
            _VDD_1 [shape=none;image="res/pwr.jpg";label=""];
            M_i_1 -> _VDD_1 [arrowhead=none];
        }
    }
}

Также обратите внимание, что я изменил порядок ваших ребер M_i_1 -> _VDD_1 и _VSS_0 -> M_i_0, по некоторым причинам они были инвертированы.

Результат:

...