Closed ogamespec closed 2 years ago
На самом деле нет необходимости "подгонять" виасы, это бессмысленно и беспощадно.
Проще сохранять сущность в Netlist (Graphml) и в утилите yEd выполнять авто-расстановку графа.
Поэтому таска переквалифицируется в "Сохранить сущности как Netlist"
Кто ещё не видел как yEd умеет расставлять графы, можно посмотреть демо тут:
https://live.yworks.com/demos/layout/layoutstyles/index.html?layout=hierarchic&sample=hierarchic
Для цифровых схем хорошо подходит например Hierarchic Layout.
Так.
Идею с алиасами отбросил, как непонятную. Юзер должен помнить что у него A1 на одном конце и A1 на другом - одна вершина - бред короче.
Сделал сегменты проводов - ребрами.
Немного пришлось поколдовать над TraverseWires, плюс не уверен что алгоритм оптимальный (рекурсивный проход по смежным проводам сопровождается проходом по всем сущностям для проверки что в месте стыка нет виаса).
Изоморфизм достигнут:
На очереди группировка виасов ячеек/юнитов (на картинке выше группировка сделана уже руками в yEd).
И ещё нужно будет поднастроить ориентацию ребер - чтобы выходы были ориентированы на входы.
Необходимо из RubberTool перетащить алгоритм эластичной трансформации, но только для векторных данных.
Вкратце задача выглядит так:
EDIT: Вместо бессмысленных приседаний по выравниванию веселых картинок лучше сделать сохранение сущностей как Netlist (GRAPHML). При этом для "стыковки" двух виасов достаточно назвать их одинаковым именем.