Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диплом.Екимова_v3_2.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
4.48 Mб
Скачать
      1. Оптимизация программного кода.

При построении можно придумать сотни алгоритмов создания ячейки и множество вариантов их реализации. Нужно стремиться к нахождению оптимального, минимального по количествам условий, алгоритма.

После создания первой версии ячейки нами была проведена оптимизация кода. Были сделаны следующие изменения:

  1. использованы зависимые слои;

  2. улучшен способ создания контактов;

  3. применен подход для быстрого перехода на новую технологию.

Применение зависимых слоев и использование «распределенных контактов».

В первоначальном варианте все слои прорисовывались отдельно, как простые прямоугольники. Использовалась функция rodCreateRect(). Высчитывались координаты каждого прямоугольника, их ширина и длина. Но мы столкнулись со следующими проблемами:

  1. Загромождение кода – много внутренних параметров.

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

  1. Не распределенные контакты в области стока/истока, что плохо, так как подаваемое в эти области напряжение распределяется неравномерно.

При увеличении ширины транзистора количество контактов к стоковой/истоковой области должно увеличиваться, чтобы обеспечить надежность работы транзистора. Так как есть зависимость от ширины, можно простым перебором условий задавать количество контактов, найдя формулу, по которой вычисляются граничные условия. Тогда каждому набору задаваемых параметров будет соответствовать определенное количество контактов (Рис.2.12). Но этот способ не универсален, так как невозможно задать бесконечное количество вариантов.

Рисунок 2.12. Пример создания контактов путем простого перебора условий.

Для минимизации кода было предложено создавать зависимые слои. За основу берется один слой, а все остальные строятся относительно него. Для этого была использована функция rodAlign(), которая позволяет выравнивать объекты относительно друг друга. Это сократило код, так как не нужно было высчитывать координаты каждого слоя, но не решила проблему расположения контактов. Их можно было уже расположить либо с определенного края, либо по центру. Но расстояние между ними было так же фиксировано (Рис.2.13, 2.14).

Рисунок 2.13. Примеры создания контактов с помощью функция rodAlign() выравнивание по нижнему краю.

Рисунок 2.14. Примеры создания контактов с помощью функция rodAlign() выравнивание по центру.

В качестве решения обоих проблем мы использовали функции rodCreateRect() и rodCreatePath(), с дополнительными свойствами:

?encSubPathпозволяет создавать один слой перекрывающий другой

?offsetSubPath – позволяет создавать слои, ориентированные относительно главного слоя

?subRect или ?subRectArray – позволяют создавать слои или массивы слоев. Это свойство можно использовать для создания «распределенных контактов»:

?subRectArray

list( list(

?layer list("contact" "drawing") - описание слоя

?width drmContWidth - описание ширины

?length drmContWidth - описание длины

?gap "distribute"

?spaceY drmContSpace -расстояние между контактами

?lowerLeftOffsetX drmMetal1EncCont - описание выступа нижней левой точки слоя относительно главного слоя (по оси Х)

?lowerLeftOffsetY drmMetal1EncCont - описание выступа нижней левой точки слоя относительно главного слоя (по оси Y)

?upperRightOffsetX -drmMetal1EncCont - описание выступа верхней правой точки слоя относительно главного слоя (по оси Х)

?upperRightOffsetY -drmMetal1EncCont - описание выступа верхней правой точки слоя относительно главного слоя (по оси Y)

))

Указываются смещения нижней и верхней точки относительно главного слоя, минимальное расстояние между контактами и их размеры (Рис.2.15). По всей длине создаются контакты. Их количество зависит от заданной длины.

Рисунок 2.15. Распределенный контакт.

Это значительно сократило код и решило проблемы с контактами.

Переход на новую версию технологии.

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

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

drmPolyExtActive = 0.20 ; определяет минимальное расстояние, на которое слой «Poly» должен выступать за слой «Active» (Правило 13-3).

drmMetal1MinWidth = 0.32 ; определяет минимально-допустимую ширину слоя «Metal1» (Правило 23-1).

drmPplusSpace = 0.48 ; определяет минимально-допустимое расстояние между одинаковыми слоями «Pplus» (Правило 17-2).

drmMetal1EncCont = 0.04 ; определяет минимальное расстояние, на которое слой «Metal1» должен перекрывать слой «Cont» (Правило23-3).

Но этот способ не универсален, так как при переходе на новую версию технологии нужно будет вручную переписывать все значения для каждой ячейки. Это займет много времени.

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

tfId = techGetTechFile (ddGetObj ("Lib2013") )

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

pplusActiveEnclose = techGetOrderedSpacingRule (tfId "minEnclosure" "pplus" "active") – определяет минимальное расстояние, на которое слой «pplus» должен перекрывать слой «active»

polyWidth = techGetSpacingRule (tfId "minWidth" "poly") – определяет минимально допустимую ширину слоя «poly»

nwellActiveSep = techGetSpacingRule (tfId "minSpacing" "nwell" "active") – определяет минимальное расстояние между слоями «nwell» «active»

Значение шага сетки, указанное в технологическом файле:

grid = techGetMfgGridResolution (tfId)

Данное решение позволяет существенно сократить время при переходе на новую версию технологии.