Jump to content
    

gdspy - модуль Python для работы с GDS

Коллеги, хочу вам рассказать о полезном модуле 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 файл.

Я также написал несколько простых скриптов с использованием этого модуля, которыми я поделюсь в следующих постах.

Share this post


Link to post
Share on other sites

Скрипт для конвертации 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")

 


 

Share this post


Link to post
Share on other sites

Следующий скрипт делает 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 by Whiteman

Share this post


Link to post
Share on other sites

Следующий скрипт мёрджит все полигоны в 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")

 

Share this post


Link to post
Share on other sites

Следующий скрипт делает "плоский" 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')

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...