This is an old revision of the document!
В настоящем документе описывается использование gnetlist. Настоящий
документ и gnetlist в целом находятся в состоянии альфа-версии, так что
имейте это в виду, когда будете использовать их для создания списков
соединений. Каждому инженеру известно, что ни в коем случае не следует слепо
доверять программным средствам, полагая, что они всегда дают верный результат.
gnetlist определённо не является исключением из этого правила. Очень важно
проверять каждый из создаваемых вами списков соединений. Как и большинство
программ (включая все программы в gEDA), gnetlist поставляется БЕЗ
КАКИХ БЫ ТО НИ БЫЛО ГАРАНТИЙ. Я ненавижу, что приходится это говорить, но,
надеюсь, данное предупреждение удержит пользователя от мнения, что
gnetlist создаёт идеальные списки соединений. Тем не менее, если вы
найдёте ошибку, дайте знать по адресу ahvezda@geda.seul.org.
Настоящий документ очень сырой, так что посылайте все исправления на
ahvezda@geda.seul.org или заполните отчёт об ошибке на домашней странице
gEDA http://www.gpleda.org. Спасибо!
gnetlist — это генератор списка соединений gEDA. Он принимает на
входе файлы схем и производит списки соединений. Список соединений является
текстовым представлением схемы. Это текстовое представление полностью
описывает все соединения между устройствами. Это означает, что все
подключения, относящиеся к одному соединению группируются вместе. Генератор
списка соединений обрабатывает также иерархически связанные схемы.
gnetlist имеет очень гибкую архитектуру. Основная программа, написанная на
C, читает схему (используя подпрограммы из libgeda) и создаёт
внутреннее представление данных схемы. Это внутреннее представление дальше
обрабатывается низкоуровневыми модулями (драйверами), ответственными за
вывод списков соединений в различных форматах. Драйверы для
каждого формата написаны на языке Scheme (а конкретнее, на его
разновидности Guile). Данная архитектура не только допускает бесчисленное
количество форматов списков соединений, но и позволяет генератору списка
соединений создавать другие документы (например,
перечни элементов).
С версии 20001006 gnetlist имеет драйверы на Scheme для поддержки
следующих форматов:
Этот список постоянно растёт. Несколько отсутствующих возможностей (на момент версии 20001006): отсутствует поддержка шин, определение ошибок и сообщения о них весьма ограничены,… и многое другое.
Надеюсь, что программа gnetlist уже установлена на вашей машине. В данном документе установка не описывается. Свою установку можно проверить запуском:
libgeda-config --version gesym-config --version which gnetlist ldd `which gnetlist`
Первые две команды должны показать версии установленных программ (libgeda и библиотеки символов), следующая команда должна выдать путь к бинарному файлу gnetlist. Последняя команда (только на Unix-подобных операционных системах, включающих утилиту ldd для вывода динамических зависимостей исполняемых файлов или совместно используемых объектов) покажет библиотеки, слинкованные с gnetlist; чтобы программа gnetlist могла запуститься, все запрашиваемые библиотеки должны быть найдены. Если эти программы не выдают ожидаемых результатов, скорее всего программы gEDA не установлены должным образом. Для более подробной информации по установке программ gEDA обратитесь к соответствующим документам INSTALL (поставляемым в дистрибутиве).
Запуск gnetlist очень прост. У программы gnetlist простой интерфейс
командной строки, так что нет никакого докучного GUI для работы с ней . Для
получения списка аргументов командной строки запустите gnetlist -h
.
Для запуска gnetlist нужно указать два параметра:
-g guile_procedure
(определяет драйвер, который надо запустить для схем)filename.sch
(определяет файлы схем)
В командной строке можно указать несколько схем. По умолчанию для вывода
созданного списка соединений используется имя файла output.net
. Можно
изменить это умолчание указанием ключа -o filename
.
Немного примеров запуска gnetlist:
gnetlist -g geda -o stack.net stack_1.sch
(выводит список соединений для схемы stack_1.sch
в stack.net
,
используя родной формат gEDA)
Есть также несколько ключей для отладки. Первый из них — это ключ -v
,
включающий режим вывода подробной информации. В этом режиме выводится большой
объём информации о том, что делает gnetlist, а также дамп внутреннего
представления данных. Ключ -i
, переводящий gnetlist в интерактивный
режим, очень полезен для отладки драйверов на Scheme, он
обычно не используется конечными пользователями.
Для получения подробного списка аргументов командной строки обратитесь к
man-странице gnetlist.
Данный раздел описывает, что должно быть в схемах/символах, чтобы их можно было использовать с gnetlist. Чтобы программа gnetlist работала корректно, и схема, и поддерживаемые символы должны быть правильны. В основном это требование относится к определению атрибутов. В системе gEDA атрибуты повсюду используются для представления информации. Атрибуты — это единственный способ добавления информации для компонентов, соединений, выводов и т.д.. Для получения более подробной информации об атрибутах, упомянутых в данном документе, обратитесь к странице документации Перечень основных атрибутов.
device=
.pin#=#
. Этот атрибут со временем изменит форму, но сейчас он должен быть в виде pin#=#
.pinlabel=
.slot=
, атрибут slot#=#
для каждого элемента и атрибут numslots=#
. Разбивка на элементы также изменится в ближайшем будущем, но сейчас она должна описываться указанным способом.net=
внутри символа. Для подробной информации обратитесь к Мини-HOWTO по атрибуту net=.graphical=1
.refdes=
. Это ОЧЕНЬ важно. Программа gnetlist должна предупредить вас, если вы используете компонент, в котором нет refdes=
, но есть ошибки, которые не вызывают такого предупреждения.label=
. Эту метку нужно прикрепить только к одному сегменту соединения, чтобы все сегменты данного соединения (электрически связанные с ним) унаследовали эту метку.TBA
TBA
Обратите внимание, что данный раздел всё ещё находится в стадии развития. Приведённая здесь информация должна быть верной, но не является полной.
gnetlist выполняет загрузку базы данных схемы из файлов .sch
,
строит внутреннее представление и, затем, вызывает функцию, специфичную для
указанного типа выходного списка соединений, которая и создаёт фактический
список соединений. Каждый драйвер gnetlist содержится в файле,
называемом gnet-<backend>.scm
. Где <backend> – это имя отдельного
драйвера. Например, gnet-switcap.scm
содержит код, используемый
командой gnetlist -g switcap
, а gnet-drc.scm
содержит код,
используемый командой gnetlist -g drc
. Драйверы
написаны на языке программирования Scheme. Частная реализация Scheme
– это Guile, что означает “GNU’s Ubiquitous Intelligent Language for
Extensions” (“повсеместный интеллектуальный язык GNU для расширений”). Больше
информации по Guile можно найти на
http://www.gnu.org/software/guile/guile.html.
Каждый из драйверов списков соединений обязан предоставлять
функцию, имя которой соответствует типу его списка соединений. Например, драйвер
switcap, содержащийся в gnet-switcap.scm должен иметь функцию,
называемую switcap
. Это та функция, которую вызовет gnetlist, чтобы
инициировать создание списка соединений. Входной функции задаётся один
аргумент, который является именем файла выходного списка соединений. Обычно первое, что
генератор списка соединений делает, это открывает данный файл на запись.
Следующий отрывок из драйвера switcap показывает начало входной функции и
показывает выходной файл, который нужно открыть. В конце данной функции
выходной файл закрывается.
;; --------------------------------------- ;; Switcap netlist generation -- top level ;; --------------------------------------- (define switcap (lambda (output-filename) (let ((port (open-output-file output-filename))) ;; rest of netlisting goes here ;; close the output file and return (close-output-port port))))
После открытия выходного списка соединений производятся все необходимые
действия по специфической инициализации, которые должны выполняться для
списков соединений данного конкретного типа. В примере switcap мы должны инициализировать имя
соединения и базу данных псевдонимов позиционных обозначений (refdes
). Это
нужно потому, что switcap предъявляет более строгие требования
к именам соединений, чем gschem. Кроме того switcap предъявляет особые
требования к позиционным обозначениям списка соединений. Для
таких ситуаций gnetlist предоставляет некоторые функции общего назначения,
переименовывающие соединения и позиционные обозначения так, чтобы они
соответствовали требованиям целевого списка соединений. Подробнее об этом
позже. А пока просто отметьте, что драйвер switcap использует следующий
код:
;; initialize the net-name aliasing (gnetlist:build-net-aliases switcap:map-net-names all-unique-nets) ;; initialize the refdes aliasing (gnetlist:build-refdes-aliases switcap:map-refdes packages)
Другая инициализация, которая хотя и не требуется для всех типов списков соединений, но обычно производится, состоит в выводе некоторого рода заголовка. Этот заголовок может явно содержаться во входной функции или для ясности кода может находиться в своей собственной функции. В драйвере switcap, вызов такой:
(switcap:write-top-header port)
Учтите, что есть соглашение о том, что имена любых специфических функций
драйвера должны содержать префикс в виде имени этого драйвера. Например все
специфические для switcap функции начинаются с switcap:
. Функции,
пригодные для всех драйверов и предоставляемые программой
gnetlist, имеют префикс gnetlist:
.
switcap:write-top-header
определяется следующим образом:
;; ;; Switcap netlist header ;; (define switcap:write-top-header (lambda (port) (display "/* Switcap netlist produced by gnetlist (part of gEDA) */\n" port) (display "/* See http://www.geda.seul.org for more information. */\n" port) (display "/* Switcap backend written by Dan McMahill */\n" port) (display "\n\n" port) ) )
Далее входная функция вызывает функции для каждого раздела выходного списка
соединений. Переменная packages
предопределена программой gnetlist и
является списком всех компонентов в проекте, а all-unique-nets
является
списком всех соединений в проекте. Различные функции, используемые драйвером
для каждого раздела списка соединений, будут использовать эти переменные.
Например, основная часть списка соединений switcap, содержащая компоненты
и их соединения, записывается в выходной файл так:
(switcap:write-netlist port packages)
Обычно целевой тип списков соединений предъявляет более строгие требования
к именам соединений, чем gschem. Могут быть, например, ограничения на
длину, разрешённые символы или их регистр. Для решения данной проблемы
gnetlist предоставляет возможность использования псевдонимов имён
соединений. Чтобы использовать эту возможность, функция
gnetlist:build-netaliases
вызывается как часть раздела инициализации
входной функции.
Например, в драйвере switcap,
;; initialize the net-name aliasing (gnetlist:build-net-aliases switcap:map-net-names all-unique-nets)
Функция switcap:map-net-names
является функцией, специфической для
драйвера (в данном случае switcap
), которая принимает в качестве аргумента
имя соединения gschem и возвращает изменённое имя,
удовлетворяющее требованиям формата выходного списка соединений. В случае switcap
требования следующие: “земля” называется “0”, имена соединений имеют не больше 7
знаков и код списка соединений регистронезависим.
;; This procedure takes a net name as determined by ;; gnetlist and modifies it to be a valid SWITCAP net name. ;; (define switcap:map-net-names (lambda (net-name) (let ((rx (make-regexp "^unnamed_net")) (net-alias net-name) ) ;; XXX we should use a dynamic regexp based on the ;; current value for the unnamed net base string. (cond ;; Change "GND" to "0" ((string=? net-name "GND") (set! net-alias "0")) ;; remove the 'unnamed_net' part ((regexp-exec rx net-name) (set! net-alias (substring net-name 11))) (else net-name) ) ;; Truncate to 7 characters (if (> (string-length net-alias) 7) (set! net-alias (substring net-alias 0 7)) ) ;; Convert to all upper case (string-upcase net-alias) ) ) )
Функция gnetlist:build-net-aliases
создаёт базу данных, которая потом
позволит вам искать имя выходного соединения по имени соединения в
gschem или имя соединения в gschem по имени выходного
соединения. Кроме того, она выполняет очень важную задачу обеспечения
отсутствия коротких замыканий при изменении имён соединений. В качестве
примера предположим, что у вас в схеме есть соединение с именем “MyNet”, и
ещё одно — с именем “mynet”. Они уникальны, но после преобразования обоих
в верхний регистр, они станут одним соединением.
gnetlist:build-net-aliases
определит это условие, выдаст ошибку и
остановит создание списка соединений.
Теперь, когда база данных инициализирована, для нахождения имени соединения
в списке по имени соединения в gschem, генератор списка соединений
просто использует:
(gnetlist:alias-net somenet)
Подобный набор функций предоставляется и для псевдонимов позиционных обозначений.
Полезным средством для отладки является запуск gnetlist в интерактивном
режиме. Для gnetlist этот режим запускается с помощью ключа -i
. При
этом появится оболочка, где можно будет вводить команды Scheme. Это
простой способ проверки различных переменных и тестирования разных функций.
Пример запуска gnetlist в интерактивном режиме приведён ниже.
% gnetlist -i ../../gnetlist/examples/switcap/*.sch gEDA/gnetlist version 20041228 gEDA/gnetlist comes with ABSOLUTELY NO WARRANTY; see COPYING for more details. This is free software, and you are welcome to redistribute it under certain conditions; please see the COPYING file for more details. Loading schematic [../../gnetlist/examples/switcap/analysis.sch] Loading schematic [../../gnetlist/examples/switcap/ckt.sch] Loading schematic [../../gnetlist/examples/switcap/clocks.sch] gnetlist> all-unique-nets ("unnamed_net6" "unnamed_net5" "unnamed_net4" "OUT" "unnamed_net3" "unnamed_net2" "unnamed_net1" "GND") gnetlist> packages ("TIMING" "CLK1" "S7" "S8" "S6" "S5" "C3" "S4" "C2" "C1" "E1" "S3" "S1" "V1" "S2" "OPTIONS" "TITLE" "ANA1") gnetlist> (quit) %