Whiteman 1 February 10, 2025 Posted February 10, 2025 · Report post Коллеги, хочу вам рассказать о полезном модуле Python - gdspy. https://gdspy.readthedocs.io/en/stable/ gdspy — это библиотека Python, предназначенная для работы с GDSII-файлами. Она позволяет создавать, модифицировать и анализировать GDSII-данные, что делает её полезной для разработки и проектирования микросхем. Вот основные возможности и особенности модуля gdspy: 1. Создание и манипуляция объектами: • gdspy позволяет создавать такие объекты, как прямоугольники, круги, пути, полигоны и другие геометрические элементы, которые могут быть использованы для проектирования схем. 2. Уровни и ячейки: • В GDSII файлах содержатся ячейки, каждая из которых может содержать несколько слоёв. gdspy поддерживает работу с этими ячейками и слоями, что позволяет организовывать и структурировать проект. 3. Работа с массивами: • Модуль предоставляет возможность создавать массивы объектов, что полезно при проектировании повторяющихся структур. 4. Запись и чтение GDSII файлов: • gdspy может как записывать данные в GDSII формат, так и читать существующие файлы, что позволяет интегрировать его в существующие рабочие процессы. 5. Генерация GDSII файлов: • Модуль предоставляет простые средства для создания GDSII файлов с нуля, включая различные геометрические формы и их взаимодействие. 6. Поддержка сложных преобразований: • В gdspy есть возможности для выполнения преобразований объектов: перевороты, масштабирование, вращение и другие трансформации. 7. Экспорт в SVG • gdspy позволяет экспортировать GFDII в SVG для визуализации в WEB или полиграфии. Правда при большом размере GDSII полученный файл SVG может также оказаться слишком большим для отображения на обычных ПК. Пример использования: import gdspy # Создание новой ячейки cell = gdspy.Cell('MyCell') # Добавление геометрии: например, прямоугольника rect = gdspy.Rectangle((0, 0), (10, 5)) cell.add(rect) # Создание и сохранение GDSII файла lib = gdspy.GdsLibrary() lib.add(cell) lib.write_gds('example.gds') В этом примере создаётся простая ячейка с прямоугольником, который затем сохраняется в GDSII файл. Я также написал несколько простых скриптов с использованием этого модуля, которыми я поделюсь в следующих постах. 1 Quote Share this post Link to post Share on other sites More sharing options...
Whiteman 1 February 11, 2025 Posted February 11, 2025 · Report post Скрипт для конвертации GDSII в SVG. Принимает имя GDSII-файла в качестве аргумента командной строки. import numpy import gdspy import sys filename='' del sys.argv[0] try: filename=str(sys.argv[0]) except: print(f"Must provide a filename") print(f"Usage example: gds2svg ../path_to/gds_files/*/*latest.gds") exit() for file in sys.argv: filename=str(file) print(f"Generating .svg files for {filename}") lib = gdspy.GdsLibrary(infile=filename) cellList = lib.cells for val in cellList: cell = cellList[val] print(f"Processing {cell}") cell.write_svg(f"{val}.gds.svg") Quote Share this post Link to post Share on other sites More sharing options...
Whiteman 1 February 13, 2025 Posted February 13, 2025 (edited) · Report post Следующий скрипт делает allcell GDS из списка GDS файлов. Я его написал для создания GDS-файла со всеми стандартными ячейками, когда у меня были отдельные GDS для каждой ячейки: import numpy import gdspy import sys filename='' del sys.argv[0] try: filename=str(sys.argv[0]) except: print(f'Must provide a filename') print(f'do_allcell create a gds file containing all cells from given gds list') print(f'Usage example: do_allcell /path/*.gds') exit() libToAdd = gdspy.GdsLibrary() for file in sys.argv: filename=str(file) libFromAdd = gdspy.GdsLibrary(infile=filename) print('Adding cell "'+''.join(libFromAdd.cells)+'" from '+filename+'to "allcell.gds"') cellList = {**libFromAdd.cells , **libToAdd.cells} libToAdd.cells = cellList libToAdd.write_gds('allcell.gds') Edited February 13, 2025 by Whiteman Quote Share this post Link to post Share on other sites More sharing options...
Whiteman 1 February 13, 2025 Posted February 13, 2025 · Report post Следующий скрипт мёрджит все полигоны в GDS: import sys import collections import gdspy def merge_layers_and_datatypes(cell): print(f"Processing cell {cell.name}") polygonSet = collections.defaultdict(list) for p in cell.polygons: for l, d, points in zip(p.layers, p.datatypes, p.polygons): polygonSet[(l, d)].append(points) cell.polygons = [] for (l, d), plist in polygonSet.items(): if len(plist) > 1: print(f" Layer {l}, datatype {d}: {len(plist)} polygons to merge") result = gdspy.boolean(plist, None, "or", layer=l, datatype=d) elif len(plist) == 1: cell.add(gdspy.Polygon(plist[0], layer=l, datatype=d)) if len(sys.argv) < 2: print(f"Missing filename\nUsage: python3 {sys.argv[0]} FILENAME") exit(1) filename = sys.argv[1] print(f"Merging all shapes in {filename}") lib = gdspy.GdsLibrary(infile=filename) for cell in lib.cells.values(): merge_layers_and_datatypes(cell) filename = filename.split('/')[-1].split('.')[0] print('filename',filename) lib.write_gds(f"{filename}_merged_polygons.gds") Quote Share this post Link to post Share on other sites More sharing options...
Whiteman 1 February 14, 2025 Posted February 14, 2025 · Report post Следующий скрипт делает "плоский" GDSII из иерархического: import numpy import gdspy import sys import copy # input("Press Enter to continue...") filename='' try: filename=str(sys.argv[1]) except: print('Must provide a filename') exit() cellsToRemove = '' print('Processing '+filename) lib = gdspy.GdsLibrary(infile=filename) topCell = lib.top_level()[0] print('TopCellList: ',topCell,'\n\n') cellsToLeave = [] for c in topCell.references: # print(dir(c)) print(str(c)) # if c : if 'FILL' in str(c) or 'VIA' in str(c): print('Remove ',c) c = [] print(topCell) #topCell.references = [] topCell = topCell.flatten() print('TopCell: ',topCell,'\n\n') lib.cells[topCell.name].write_svg('ASIC_pad_ring.gds.svg') lib.write_gds(topCell.name+'_only.gds') Quote Share this post Link to post Share on other sites More sharing options...