
Лабы 1-2 / Лабораторная работа #1 Python liberty (1)
.docxЛабораторная работа № 1-2
«Расчет задержек библиотечных элементов с использованием языка высокого уровня Python3»
Краткие теоретические сведения:
Библиотека стандартных ячеек — это коллекция низкоуровневых ячеек для логических функций, триггеров, регистров и буферов. Все ячейки реализованы с фиксированной высотой и переменной шириной. Ключевым свойством библиотек является одинаковость высот ячеек, что позволяет располагать их рядами, упрощая задачу автоматического расположения элементов. Ячейки обычно оптимизированы для уменьшения занимаемой площади и задержки.
Типичная библиотека условно делится на две части:
Front-end включает в себя логические описания (Verilog, VHDL), характеризацию ячеек (Synopsys Liberty, ALF и SDF), а также вспомогательные элементы для функциональной верификации (MET, Fastscan и т. д).
Back-end содержит описания, относящиеся в физической реализации ячеек. Это физические абстракции в формате Cadence LEF format либо Synopsys Milkyway format, экстрагированные и rtl-нетлисты. В зависимости от условий распространения библиотеки она может содержать дополнительно GDS-файлы, OA- или CDBA-базу данных.
Ядром front-end описания является характеризованная библиотека стандартных элементов. Промышленным форматом де-факто стал Synopsys Liberty Format (.lib), хотя существуют и альтернативные форматы, например, ALF (Advanced library format).
Оригинальный .lib содержит в себе временные характеристики ячеек в табличной форме (NLDM). Обычно используются 2-мерные таблицы, описывающие задержку элемента в зависимости от нагрузки и времени входного фронта.
Пример такой таблицы:
AND cell, cell fall |
||||||||||
Input transition, ps |
Output capacitance, fF |
|||||||||
|
0.400 |
0.798 |
1.591 |
3.172 |
6.325 |
12.612 |
25.149 |
50.148 |
100.00 |
|
0.4 |
2.456 |
2.792 |
3.371 |
4.411 |
6.382 |
10.252 |
17.936 |
33.242 |
63.758 |
|
3.75 |
3.184 |
3.501 |
4.058 |
5.091 |
7.067 |
10.944 |
18.633 |
33.942 |
64.458 |
|
7.5 |
3.829 |
4.149 |
4.710 |
5.744 |
7.717 |
11.596 |
19.289 |
34.600 |
65.118 |
|
15 |
4.681 |
5.038 |
5.602 |
6.616 |
8.595 |
12.486 |
20.172 |
35.487 |
66.004 |
|
30 |
5.789 |
6.194 |
6.843 |
7.880 |
9.821 |
13.703 |
21.421 |
36.713 |
67.230 |
|
60 |
7.106 |
7.582 |
8.345 |
9.532 |
11.502 |
15.394 |
23.117 |
38.448 |
68.980 |
|
120 |
8.510 |
9.079 |
9.984 |
11.412 |
13.624 |
17.544 |
25.403 |
40.864 |
71.425 |
|
240 |
9.662 |
10.328 |
11.426 |
13.158 |
15.875 |
20.128 |
28.084 |
43.972 |
74.941 |
|
480 |
9.871 |
10.658 |
12.007 |
14.170 |
17.550 |
22.857 |
31.339 |
47.510 |
79.487 |
Простой поиск по таблице с округлением до ближнего значения может быть визуализирован следующим образом:
AND cell, cell fall, ps Trinp = 15.1 ps; Cout = 12.7 fF |
||||||||||
Input transition, ps |
Output capacitance, fF |
|||||||||
|
0.400 |
0.798 |
1.591 |
3.172 |
6.325 |
12.612 |
25.149 |
50.148 |
100.00 |
|
0.4 |
2.456 |
2.792 |
3.371 |
4.411 |
6.382 |
10.252 |
17.936 |
33.242 |
63.758 |
|
3.75 |
3.184 |
3.501 |
4.058 |
5.091 |
7.067 |
10.944 |
18.633 |
33.942 |
64.458 |
|
7.5 |
3.829 |
4.149 |
4.710 |
5.744 |
7.717 |
11.596 |
19.289 |
34.600 |
65.118 |
|
15 |
4.681 |
5.038 |
5.602 |
6.616 |
8.595 |
12.486 |
20.172 |
35.487 |
66.004 |
|
30 |
5.789 |
6.194 |
6.843 |
7.880 |
9.821 |
13.703 |
21.421 |
36.713 |
67.230 |
|
60 |
7.106 |
7.582 |
8.345 |
9.532 |
11.502 |
15.394 |
23.117 |
38.448 |
68.980 |
|
120 |
8.510 |
9.079 |
9.984 |
11.412 |
13.624 |
17.544 |
25.403 |
40.864 |
71.425 |
|
240 |
9.662 |
10.328 |
11.426 |
13.158 |
15.875 |
20.128 |
28.084 |
43.972 |
74.941 |
|
480 |
9.871 |
10.658 |
12.007 |
14.170 |
17.550 |
22.857 |
31.339 |
47.510 |
79.487 |
Билинейная интерполяция
Визуализация использования билинейной интерполяции выглядит так:
AND cell, cell fall, ps Trinp = 15.1 ps; Cout = 12.7 fF |
||||||||||
Input transition, ps |
Output capacitance, fF |
|||||||||
|
0.400 |
0.798 |
1.591 |
3.172 |
6.325 |
12.612 |
25.149 |
50.148 |
100.00 |
|
0.4 |
2.456 |
2.792 |
3.371 |
4.411 |
6.382 |
10.252 |
17.936 |
33.242 |
63.758 |
|
3.75 |
3.184 |
3.501 |
4.058 |
5.091 |
7.067 |
10.944 |
18.633 |
33.942 |
64.458 |
|
7.5 |
3.829 |
4.149 |
4.710 |
5.744 |
7.717 |
11.596 |
19.289 |
34.600 |
65.118 |
|
15 |
4.681 |
5.038 |
5.602 |
6.616 |
8.595 |
12.486 |
20.172 |
35.487 |
66.004 |
|
30 |
5.789 |
6.194 |
6.843 |
7.880 |
9.821 |
13.703 |
21.421 |
36.713 |
67.230 |
|
60 |
7.106 |
7.582 |
8.345 |
9.532 |
11.502 |
15.394 |
23.117 |
38.448 |
68.980 |
|
120 |
8.510 |
9.079 |
9.984 |
11.412 |
13.624 |
17.544 |
25.403 |
40.864 |
71.425 |
|
240 |
9.662 |
10.328 |
11.426 |
13.158 |
15.875 |
20.128 |
28.084 |
43.972 |
74.941 |
|
480 |
9.871 |
10.658 |
12.007 |
14.170 |
17.550 |
22.857 |
31.339 |
47.510 |
79.487 |
Дано:
P(y) = 15.1 (ps), P(x) = 12.7 (fF)
Найти: f(P)
Решение:
Согласно таблице, y1 = 15 ps, y2 = 30 ps, x1 = 12.612 fF, x2 = 25.149 fF.
Отсюда Q11 = 12.486 пс, Q12 = 13.703 пс, Q21 = 20.172 пс, Q22 = 21.421 пс.
f(R1) = (x2 - x) / (x2 - x1) * Q11 + (x - x1) / (x2 - x1) * Q21 = 12.539 пс.
f(R2) = (x2 - x) / (x2 - x1) * Q12 + (x - x1) / (x2 - x1) * Q22 = 13.757 пс.
f(P) = (y2 - y) / (y2 - y1) * f(R1) + (y - y1) / (y2 - y1) * f(R2) = 12.548 пс.
Для выполнения задания требуется решить ряд задач, основная из которых – парсинг имеющегося файла. Чтение файла осуществляется построчно. Обработку файлов необходимо производить с помощью флагов – отдельно заниматься выставлением флагов, отдельно их обработкой. Флаг – индикатор, который сообщает, что будет находиться на следующих строчках. Например, если текущая строка -- «column_output_capacitance», то на следующей строчке будут находиться индексы для столбцов таблицы NLDM. Необходимо на текущей линии выставить соответствующий флаг, а после перехода на следующую строку и окончания обработки строки флаг сбросить. Некоторые флаги, например, при сохранении таблиц надо держать в течение нескольких строк. Можно искать строки путем строгого сравнения с заданным шаблоном, что неудобно, поскольку приходится учитывать все пробелы в конце и начале строки и символы перехода на новую строку. Можно воспользоваться функцией match из библиотеки регулярных выражений re, которая будет проверять наличие заданного шаблона в строке и возвращать единицу в случае, если такой шаблон в строке присутствует.
После обнаружения нужных строк необходимо обработать – после сохранения строк это всё ещё строки, которые надо преобразовать в массив из чисел. Во-первых, необходимо удалить символы перехода на новую строку с помощью метода replace(), заменяя символ “\n” на пустую строку. Во-вторых, необходимо «разбить» строку на составляющие с помощью функции split(), указав в качестве разделителя запятую. В-третьих, необходимо изменить тип данных полученного массива со строковых на численные с форматом плавающей запятой. Это можно сделать разными способами. Можно через цикл преобразовать каждый элемент к типу данных float и оставить тот же list. Можно воспользоваться функцией создания массива array из библиотеки математических функций numpy и получить массив numpy, можно воспользоваться list comprehension и получить новый list.
После парсинга всех требуемых значений необходимо воспользоваться приведенными выше формулами для получения результата билинейной интерполяции.
Примеры с кодом приведены здесь https://replit.com/@elkapetan/VIaPIV-Laboratornaia-rabota-1-2
Задание на лабораторные работы 1-2:
Написать скрипт, рассчитывающий выходную задержку и время выходного фронта в зависимости от нагрузки и времени входного фронта в соответствии с вариантом. В случае, если значение выходной емкости и времени входного фронта не совпадают с индексными значениями, округлить их до ближайшего индексного значения.
-
Вариант 1
Вариант 2
Вариант 3
Вариант 4
Вариант 5
AND, p
NAND, p
BUF, p
INV, p
OR, p
Вариант 6
Вариант 7
Вариант 8
Вариант 9
Вариант 10
NOR, p
XOR, p
XNOR, p
AND, n
NAND, n
Вариант 11
Вариант 12
Вариант 13
Вариант 14
Вариант 15
BUF, n
INV, n
OR, n
NOR, n
XOR, n
Вариант 16
Вариант 17
Вариант 18
Вариант 19
Вариант 20
XNOR, n
AND, p
NAND, p
BUF, p
INV, p
Добавить в существующий скрипт расчет с использованием билинейной интерполяции.
Переписать код, оформив класс Gate с методами get_delay(edge, tr_in, c_out), get_transition(edge, tr_in, c_out), propagate(edge, tr_in, c_out).
Использовать код для расчета схемы из нескольких элементов в соответствии с вариантом. Второй вход для логических элементов выбирать таким образом, чтобы обеспечить переключение элемента.
Вариант 1, 6, 11, 16 – схема #1;
Вариант 2, 7, 12, 17 – схема #2;
Вариант 3, 8, 13, 18 – схема #3;
Вариант 4, 9, 14, 19 – схема #4;
Вариант 5, 10, 15, 20 – схема #5.
Оформить в формате Word отчет о выполненной работе. Требования к отчету:
название работы / формулировка заданий;
таблица истинности для каждой схемы;
заключение по результатам выполненной работы.