# Схемотехническое моделирование с помощью gEDA и SPICE

Stuart Brorson
Electroniscript, inc.
sdb@electroniscript.com
5 января 2006

Перевод: Владимир Жбанов, 2010-2011 гг.

Предисловие
Linux становится всё более и более популярной платформой для проектирования. Благодаря программистам сообщества свободного программного обеспечения для проектирования электрических схем становятся доступны приложения САПР профессионального качества. Предпочтительным инструментарием проектирования электронных схем является gEDA Suite. Теперь и в Linux доступно моделирование аналоговых процессов в электрических схемах с помощью SPICE. В настоящем документе описывается маршрут проектирования, используемый для выполнении SPICE-моделирования программными средствами gEDA в Linux.

Настоящий документ разрешается копировать, распространять и/или изменять под условиями Лицензии Свободной Документации GNU1) версии 2 или любой более поздней, опубликованной организацией Free Software Foundation, без неизменяемых разделов, без текстов передней и задней обложки. Вы можете получить копию Лицензии Свободной Документации GNU от Free Software Foundation, посетив её веб-страницу (http://www.fsf.org/) или написав письмо по адресу: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 2)

## Введение

Современное проектирование является дисциплиной, интенсивно использующей вычислительную технику. Как и специалисты, работающие в других сферах проектирования, инженеры-электротехники и проектировщики электроники активно используют все виды программного обеспечения САПР, включая как программы для проектирования электрических схем и моделирования их работы, так и для производства печатных плат и интегральных схем. САПР, используемые инженерами-электротехниками, имеют особое название — САПР электроники. Это название объединяет разные виды программ САПР. Например, на этапе работы с графическими средствами инженер для ввода проекта в компьютер использует программу схемотехнического проектирования — редактор схем. Редактор схем — это, по существу, специализированная чертёжная программа, включающая набор символов, используемых для создания схем. После ввода схемы инженеру может быть нужно промоделировать процессы в её цепях, чтобы проверить, что разработанная им схема будет работать именно так, как нужно. Наиболее популярная программа для этих целей — SPICE (Simulation Program with Integrated Circuit Emphasis), её разрабатывали в Беркли3) начиная с 70-х годов и сегодня она широко доступна в разных формах. Сейчас SPICE считается фундаментальным средством проектирования и является существенной частью занятий большинства обучающихся инженеров.

Проект gEDA — работа по созданию в рамках программного обеспечения с открытым исходным кодом набора программ САПР электроники для Linux под лицензией GPL. Проект gEDA уже настолько развит, что мощь и качество его программ весьма высоки; сегодня используя gEDA Suite можно создавать сложные списки соединений (файлы) SPICE, включающие в себя файлы моделей поставщиков компонентов. Затем с помощью этих файлов можно производить SPICE-моделирование, используя различные программы моделирования, работающие в Linux. Цель настоящего документа — объяснить, как использовать программные средства gEDA (обычно работающие в Linux) для выполнения SPICE-моделирования. В частности здесь описывается использование spice-sdb, продвинутого драйвера генератора списка соединений gEDA (gnetlist), применяемого для создания списков соединений SPICE. spice-sdb входит в набор программ gEDA; если вы установили gEDA, то для создания списков соединений SPICE всё уже готово. Также в настоящем HOWTO приводятся советы по использованию ngspice/tclspice и/или LTSpice для моделирования работы схем, списки соединений для которых созданы с помощью spice-sdb.

### Целевая аудитория данного HOWTO

Настоящий HOWTO не является учебником по проектированию электрических схем или по SPICE-моделированию. Он, скорее, создан для того, чтобы помочь обучающимся инженерам начать использовать gEDA для SPICE-моделирования на платформе Linux. Поэтому я предполагаю, что вы в общих чертах уже знакомы с разработкой электронных схем, механикой ввода схем в программах САПР и SPICE-моделированием. Я также предполагаю, что вы достаточно знакомы с операционной системой GNU/Linux и с её рабочим окружением. Наконец, я предполагаю, что вы уже установили программы gEDA и знаете как ими пользоваться. Если вам нужно быстрее набраться опыта в каком-то из указанных вопросов, дополнительную информацию можно найти на следующих веб-страницах:

- Проект gEDA: http://www.geda-project.org
- FAQ по моделированию
- Синтаксис и команды SPICE 3: http://newton.ex.ac.uk/teaching/CDHW/Electronics2/userguide/
- Ngspice: http://ngspice.sourceforge.net/
- Tclspice: http://tclspice.sourceforge.net/
- LTSpice: http://www.linear.com/software/
- Ресурсы по SPICE в Linux: http://www.brorson.com/gEDA/SPICE/
- gEDA для начинающих — немного устаревший, но замечательный ресурс http://www-mdp.eng.cam.ac.uk/web/CD/engapps/geda/starting_gEDA_long.pdf

### Признательность

Настоящий документ не живёт в изоляции. В создании данного HOWTO мне помогало несколько активных членов сообщества свободных САПР электроники. Во-первых и прежде всего, Paolo Nenzi, автор ngspice, взял мой исходный HOWTO и перевёл его в документ Lyx, который я мог затем перевести в DocBook. Спасибо тебе, Paolo, за помощь в работе над этим HOWTO и, что более важно, спасибо за твою великолепную работу над ngspice! Также во главе списка значится Ales Hvezda, движущая сила проекта gEDA. Без него ничего из этого не было бы теперь возможным; его вклад в виде программы gschem неоценим. Спасибо, Ales, за создание gEDA и распространение по миру под лицензией GPL — ты начал революцию! Stefan Jones заслуживает огромной благодарности за его работу над tclspice, любезную поддержку и усилия по интеграции, когда я предлагал исправления для проекта tclspice. Я также должен поблагодарить W. Kazubski и S. Gieltjes — они написали исходные версии генераторов списков соединений SPICE, на которых основывается мой gnet-spice-sdb.scm. Я также хочу поблагодарить Ken Healy за добавление исправления сортировки списка соединений, и Peter Kaiser за то, что побудил меня включить некоторые возможности, полезные для моделирования интегральных схем. Peter заслуживает также благодарности за написание некоторых разделов данного документа, относящихся к устройствам. Наконец, я признателен за помощь и предложения, полученные от читателей списка рассылки geda-user. Прелесть свободного программного обеспечения в том, что оно побуждает к сотрудничеству, а это значит, что конечный результат всегда будет лучше того, которого можно было бы достичь в одиночку.

### Общий обзор: маршрут проектирования в gEDA

В САПР электроники важна концепция “маршрута проектирования”. gEDA — это набор программных средств для проектирования электроники, а не одно приложение. И “маршрут проектирования” определяет порядок использования этих средств для достижения цели. В зависимости от того, проектируете ли вы аналоговую или цифровую схему, разрабатываете ли платы или интегральные схемы, от того, какой тип файлов требуется производителю ваших плат, и от ряда других факторов, для достижения цели будут использоваться различные средства gEDA Suite.

Блок-схема, на которой представлен маршрут проектирования в gEDA, показана на рисунке ниже. На блок-схеме показана простая последовательность, пригодная для проектирования, моделирования и разводки печатных плат. Как можно увидеть, моделирование (голубые блоки) циклически повторяется. Это значит, что после создания схемы её моделирование производится повторно до тех пор, пока её поведение не будет соответствовать требуемым спецификациям. Маршрут проектирования в gEDA. В блоке “Моделирование” в скобках указано несколько разных программ, пригодных для моделирования. В рамках настоящего документа нас интересуют только SPICE-варианты (например, ngspice, tclspice).

### Обзор использования SPICE в gEDA

Концептуально SPICE-моделирование в gEDA включает следующие этапы:

1. Создание и подбор символов схем и файлов моделей SPICE. Часто файлы SPICE-моделей можно получить у поставщика компонентов. Как правило, многие модели можно найти на веб-странице поставщика.
2. Разработка схемы с помощью символов и моделей SPICE, созданных на первом этапе.
3. Создание списка соединений из схемы, созданной на втором этапе.
4. SPICE-моделирование схемы, представленной в виде списка соединений, созданного на третьем этапе.

На приведённой выше блок-схеме эти этапы отмечены голубым цветом.

Чтобы создать список соединений SPICE, генератор списка соединений (gnetlist) циклически проходится по всей схеме и проверяет особые части символов каждого из компонентов для формирования частей кода. Как правило, для каждого компонента может генерироваться одна или более строк кода SPICE. Информация о компоненте, необходимая генератору списка соединений, содержится в двух местах:

1. В самом символе, в атрибуте `device`, который прикрепляется при создании символа и обычно редактируется в редакторе символов.
2. В атрибутах, прикреплённых к компоненту вручную в gschem при разработке схемы.

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

### Подробное изложение процесса разработки/моделирования

Вот более подробный перечень шагов, необходимых для разработки и моделирования работы схем в gEDA:

1. Создание символов для схемы с правильными атрибутами `device`. (Обычно правильные атрибуты `device` устанавливаются в процессе создания символов и поэтому чаще всего уже заданы, но если у вас проблемы, не помешает их проверить.)
2. Разработка схемы в gschem.
3. Установка для компонентов SPICE-атрибутов (`value`, `model`, `file`, `type` и др.) в gschem или gattrib.
4. Установка атрибутов `refdes`, например с помощью refdes_renum.
5. Создание списка соединений с помощью: `gnetlist -g spice-sdb`.
6. Проверка отсутствия ошибок в списке соединений (производится вручную, нужно открыть и внимательно просмотреть содержимое файла).
7. Запуск программы SPICE-моделирования, такой как, например, LTSpice, ngspice или tclspice.
8. Построение графиков и анализ результатов (часто средства построения графиков и анализа встроены в программу моделирования).
9. Если вы недовольны характеристиками своей схемы, выявленными при моделировании, можете вернуться к шагу 2, подправить схему в gschem и далее циклически повторять этот процесс до достижения нужного результата.

Цель настоящего документа состоит в том, чтобы дать вам чёткое понимание деталей данного процесса, необходимое для его успешного направления.

## Подготовительная работа: подготовка символов и файлов SPICE

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

### Настройка символов

#### Идентификация компонента генератором списков соединений

Генератор списка соединений SPICE может идентифицировать любой конкретный символ по одному из двух атрибутов:

1. `device` или
2. `refdes`.

Каждый из них прикрепляется к символу во время его создания.

К каждому символу прикреплён атрибут `device`. Этот атрибут генератор списка соединений проверяет при обработке символа первым. Есть несколько поддерживаемых генератором списка соединений устройств (“родных” для него), имеется в виду, что генератор точно знает, как обходиться с данными типами устройств. Непосредственно поддерживаются RESISTOR, CAPACITOR, NPN_TRANSISTOR и т. д. Полный список поддерживаемых устройств представлен в Приложении A.

Обычно при работе в gschem атрибуты `device` остаются скрытыми. Чаще всего правильные значения этих атрибутов уже заданы в символах их авторами. Но поскольку атрибут `device` скрыт от обычного пользователя, он может иногда являться причиной проблем при создании списка соединений SPICE, если установлен в непредвиденное значение. Чтобы увидеть атрибуты `device`, нужно перейти в редактор символов (выделить символ для редактирования и из меню выбрать Иерархия → Внутрь символа, а затем переключить видимость атрибутов (Правка → Показать/Скрыть невидимый текст). Можно также открыть файл этого символа в текстовом редакторе и, если атрибут `device` неправилен, изменить его там.

Если символ не поддерживается (то есть генератор списка соединений не находит соответствующего встроенного типа), то чтобы определить, как его обрабатывать, генератор опирается на первую букву значения атрибута `refdes`. Префикс (первая часть) значения `refdes` также встраивается в символ при его создании. Примерами префиксов `refdes` являются R для резисторов, C для конденсаторов, Q для транзисторов и т. д. Правильные префиксы для SPICE перечислены в Приложении A. Заметьте, что опираться на `refdes` для идентификации компонента в SPICE небезопасно, — по его значению генератор списка соединений не сможет, например, различить транзисторы структуры NPN и PNP. Поэтому в своих символах лучше всего всегда использовать атрибут `device`, задавая для него значение, поддерживаемое генератором.

#### Настройка очерёдности выводов

Выводы компонента выдаются генератором списка соединений в порядке, заданном посредством атрибутов `pinseq`. Заметьте, что он не тождественен порядку физического расположения выводов. Для установки атрибутов `pinseq` сначала следует определить нужный вам порядок выводов. В SPICE для многих компонентов, в том числе для диодов и транзисторов, используется особый порядок выводов. Например, выводы биполярного транзистора перечисляются в порядке CBE (коллектор-база-эмиттер). Другой пример: если ваш символ должен представлять интегральную схему (ИС) с моделью в виде файла `.subckt` поставщика, то порядок соединений для этой подсхемы устанавливается в файле строкой `.subckt`.

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

### Настройка файлов SPICE

Файлы, содержащие сложные модели или другой код SPICE, могут быть встроены в результирующий список соединений при добавлении в схему соответствующих символов. Файлы моделей SPICE обычно можно найти у поставщиков компонентов. Работа с ними проста. Тем не менее при подготовке моделей для принципиальной схемы некоторые моменты всё же стоит иметь в виду:

- Обычно целесообразно помещать эти файлы в специально отведённый для них каталог, отличный от каталогов символов.
- Удостоверьтесь, что выводы в файлах SPICE и в символах компонентов имеют одинаковое назначение! Важность этого правила трудно переоценить. Порядок, в котором выводы перечислены в файле `.subckt` необязательно соответствует порядку их физического расположения для компонента. Как описано выше, выводы выдаются генератором списка соединений в порядке, заданном атрибутами `pinseq`.
- Удостоверьтесь, что последним символом в файле SPICE-модели является перевод строки. Если перевода строки нет, то строка следующего компонента списка соединений может оказаться в той же строке, что была последней в файле SPICE-модели.

## Создание схемы своего устройства: схемотехническое проектирование

Схемотехническое проектирование — это процесс, в котором используется специализированная чертёжная программа-редактор для вычерчивания проектируемой схемы. В окружении gEDA для разработки принципиальных схем используется программа gschem. Я предполагаю, что вы уже знаете, как использовать gschem. Если нет, обратитесь к документации, доступной на веб-сайте gEDA: http://www.geda-project.org/. Чтобы создать список соединений SPICE, вам будет нужно прикрепить к компонентам необходимые атрибуты в gschem и, возможно, включить в свой список соединений ещё и дополнительные директивы SPICE. После завершения создания схемы вам будет нужно создать список соединений SPICE, запустив для неё генератор списка соединений gEDA gnetlist.

### Атрибуты gschem для создания списков соединений SPICE

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

### Атрибуты компонентов и их значение

Здесь приведены те атрибуты, что имеют значение при создании списков соединений SPICE и могут быть прикреплены к символам компонентов в gschem:

- `refdes`: позиционное обозначение компонента. Допустимые значения зависят от типа компонента и приведены в Приложении A;
- `value`: для пассивных компонентов — это значение физической величины компонента (сопротивления, индуктивности, ёмкости), для активных — это тип (номер модели) компонента (например, 2N3904, uA741). Если модель активного компонента добавляется в схему как отдельный объект, атрибут `value` символа данного компонента должен содержать её название;
- `model`: однострочная SPICE-модель компонента;
- `file`: имя файла. Обычно это файл, содержащий, например, `.MODEL`, `.SUBCKT`, или другой код SPICE;
- `model-name`: название SPICE-модели, вызываемой из оператора `.MODEL` или `.SUBCKT`. `model-name` используется главным образом для определения названия SPICE-модели в символе `spice-model-1.sym`. При привязке активного компонента к конкретной модели или к подсхеме её название должно вызываться из атрибута `device`, а не из `model-name`;
- `type`: Определяет тип компонента и используется в SPICE при интерпретации параметров модели. Допустимые значения зависят от моделируемого устройства.

### Соглашения по позиционным обозначениям

Для трактовки относящихся к SPICE атрибутов генератору списка соединений нужно, чтобы к каждому компоненту схемы был прикреплён атрибут `refdes`. Этот атрибут может устанавливаться либо вручную (что утомительно), либо с помощью входящей в дистрибутив gEDA программы refdes_renum.

Учтите, что первые буквы `refdes` должны соответствовать буквам, указанным в соглашении по позиционным обозначениям для SPICE-моделирования. Это соглашение приведено в таблице 1 приложения A.

### Пассивные компоненты

#### Базовые пассивные компоненты

Наиболее часто в SPICE приходится иметь дело с базовыми пассивными компонентами, такими как резисторы и конденсаторы, которым кроме числовых значений никаких дополнительных атрибутов для моделирования не задаётся. Для них должны быть заданы следующие атрибуты:

- `refdes`: точное позиционное обозначение компонента;
- `value`: для пассивных элементов это числовое значение физической величины компонента, а именно сопротивления, ёмкости или индуктивности (например, 100pF). Этот атрибут может задаваться и для активных компонентов, но если где-то в схеме нет атрибута `model`, атрибут `value` не используется (во всяком случае для создания списков соединений SPICE).

Если у компонента кроме `refdes` и `value` других атрибутов нет, генератор списка соединений запишет в выходной файл только одну строку.

##### Пример 1: резистор

- `refdes` = R2
- `value` = 220

Результирующая строка SPICE: `R2 0 4 220`
(обратите внимание, что “0” и “4” — это имена узлов подключенных к компоненту соединений, генерируемые программой gnetlist автоматически.)

##### Пример 2: конденсатор

- `refdes` = C22
- `value` = 1UF

Результирующая строка SPICE: `C22 4 23 1UF`

#### Пассивные компоненты с дополнительными атрибутами

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

- `refdes`: точное позиционное обозначение компонента;
- `value`: как всегда числовое значение физической величины компонента;
- `model`: одна строка дополнительных параметров в допустимом для SPICE формате.

Эта строка включается в генерируемую программой gnetlist строку для компонента после значения его величины. Поэтому важно, чтобы строка значения атрибута `model` задавалась в виде допустимого кода SPICE. Иначе вы рискуете вызвать ругань программы моделирования.

##### Пример: резистор

- `refdes` = R5
- `value` = 1MEG
- `model` = TC=0.001,0.015

Результирующая строка SPICE: `R2 0 4 220 TC=0.001,0.015`

#### Пассивные компоненты для проектирования полупроводников

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

- `refdes`: точное позиционное обозначение компонента;
- `model-name`: соответствует модели в технологической библиотеке;
- `w`, `l`: размеры устройства.

Технологическая библиотека должна быть подключена во входном файле SPICE строкой `.include`.

##### Пример: полупроводниковый резистор

- `refdes` = R6
- `model-name` = rpoly
- `w` = 3u
- `l` = 100u

Результирующая строка SPICE: `R6 0 5 rpoly w=3u l=100u`

##### Пример: модель полупроводникового резистора

- `model rpoly R rsh=300`

Это должно быть частью технологической библиотеки вашего поставщика ASIC.

### Транзисторы и диоды

С транзисторами и диодами обычно идёт модель, специфичная для устройства. Каждая модель должна представлять детальную нелинейную динамику конкретного устройства, иначе моделирование теряет смысл. SPICE-модель может быть или в виде краткого, однострочного описания, или в виде многострочного набора параметров. Типичным однострочным описанием является перечень параметров для описания характеристик малосигнального диода. Типичные многострочные модели поставляются поставщиками компонентов, которые для своих компонентов часто предлагают текстовые файлы моделей. Так как для представления информации в SPICE существует два широко распространённых формата, то имеется и два подхода для включения этих параметров в схему:

#### Однострочное описание параметров SPICE

Чтобы в список соединений включить однострочное описание параметров SPICE, к компоненту должны быть прикреплены следующие атрибуты:

- `refdes`: точное позиционное обозначение компонента;
- `value`: номер модели или тип (номер) прибора для компонента.
- `model-name`: желаемое название для данной SPICE-модели. Для компонента это обычно номер модели или тип (номер) прибора. Если вы уже прикрепили к компоненту атрибут `value`, этот параметр необязателен.
- `model`: одна строка, содержащая дополнительные параметры. Не помещайте параметры модели в скобки — gnetlist сам это сделает за вас.

##### Пример: диод

- `refdes` = D5
- `model-name` = 1N1004
- `model` = IS=0.5UA RS=6 BV=5.20

Результирующая строка SPICE: `D5 2 6 1N1004 MODEL 1N1004 D (IS=0.5UA RS=6 BV=5.20)`

#### Файл SPICE-модели

Чтобы включить в список соединений файл с параметрами SPICE, к компоненту должны быть прикреплены следующие атрибуты:

- `refdes`: точное позиционное обозначение компонента;
- `value`: номер модели или тип (номер) прибора для компонента.
- `model-name`: желаемое название для данной SPICE-модели. Для компонента это обычно номер модели или тип (номер) прибора. Если вы уже прикрепили к компоненту атрибут `value`, этот параметр необязателен.
- `file`: Имя файла той SPICE-модели, которую нужно включить в список соединений. Имя файла может быть задано в виде относительного или абсолютного пути, но во избежание проблем при возможном перемещении своего каталога со схемами лучше, вероятно, использовать абсолютный путь.

Учтите, вам следует убедиться, что в файле вашей SPICE-модели указано то же самое название модели, что и в прикреплённых к компоненту атрибутах `value` или `model-name`. К тому же неплохо бы проверить, что выводы в файле модели SPICE и в символе компонента имеют одинаковое назначение.

### Активные компоненты - интегрированные схемы

Интегрированные схемы включаются в список соединений подобно транзисторам и диодам. Фактически код SPICE можно включать или как однострочное описание параметров или в виде файла модели.

#### Однострочное описание параметров SPICE

Для включения в список соединений однострочного описания параметров SPICE к компоненту должны быть прикреплены следующие атрибуты:

- `refdes`: точное позиционное обозначение компонента;
- `value`: номер модели или тип (номер) прибора для компонента.
- `model-name`: желаемое название для данной SPICE-модели. Для компонента это обычно номер модели или тип (номер) прибора. Если вы уже прикрепили к компоненту атрибут `value`, этот параметр необязателен.
- `model`: одна строка, содержащая дополнительные параметры. Не помещайте параметры модели в скобки — gnetlist сам это сделает за вас.

#### SPICE-модель .MODEL или файл .SUBCKT

Для включения в список соединений файла описания параметров SPICE к компоненту должны быть прикреплены следующие атрибуты:

- `refdes`: точное позиционное обозначение компонента; обратите внимание, что если файл содержит `.MODEL`, `refdes` должно начинаться с U; если файл содержит `.SUBCKT`, `refdes` должно начинаться с X. Генератор списка соединений проверяет тип файла и пытается обработать его правильно, но если вы не следуете этому правилу, могут возникнуть проблемы.
- `value`: номер модели или тип (номер) прибора для компонента.
- `model-name`: желаемое название для данной SPICE-модели. Для компонента это обычно номер модели или тип (номер) прибора. Если вы уже прикрепили к компоненту атрибут `value`, этот параметр необязателен.
- `file`: имя файла содержащего `.MODEL` или `.SUBCKT`, который нужно включить в список соединений. Имя файла может быть задано в виде относительного или абсолютного пути, но во избежание проблем при возможном перемещении своего каталога со схемами, вероятно, лучше использовать абсолютный путь.

Учтите, вам следует убедиться, что в файле вашей SPICE-модели указано то же самое название модели, что и в прикреплённых к компоненту атрибутах `value` или `model-name`. К тому же неплохо бы проверить, что выводы в файле SPICE-модели и в символе компонента имеют одинаковое назначение.

### Независимые источники

Есть два вида независимых источников: источники напряжения и источники тока. Оба типа включаются в список соединений SPICE одинаково. Для включения в свой список соединений независимого источника нужно сделать следующее:

1. Поместить независимый источник в свою схему. (Выберите Добавить → Компонент → `spice` → `<имя независимого источника>.sym`)
2. Дважды щёлкнуть по блоку и добавить/отредактировать следующие атрибуты:
   - `refdes`: V? или I?;
   - `value`: однострочное описание источника в формате SPICE.

Есть четыре зависимых источника:

: Данный раздел требует доработки.

### Компоненты SPICE

#### Блок SPICE-модели

В некоторых случаях может быть желательно внедрить блок SPICE-модели непосредственно в схему. Это можно сделать, когда у вас есть несколько устройств с атрибутами `value`, в которых вызывается SPICE-модель. В зависимости от того, является ли блок SPICE однострочным или многострочным, код можно встроить одним из двух способов:

##### Однострочная SPICE-модель

1. Поместите блок SPICE-модели в свою схему. (Выберите Добавить → Компонент → `spice` → `spice-model-1.sym`)
2. Дважды щёлкните по блоку и добавьте/отредактируйте следующие атрибуты:
   - `refdes`: A?
   - `model`: название модели (т. е. название, используемое в компонентах, для которых будет производиться моделирование)
   - `type`: один из допустимых типов компонентов, определённых в спецификации SPICE.
   - `value`: соответствующая однострочная SPICE-модель.

##### Многострочная SPICE-модель

1. Поместите блок SPICE-модели в свою схему. (Выберите Добавить → Компонент → `spice` → `spice-model-1.sym`)
2. Дважды щёлкните по блоку и добавьте/отредактируйте следующие атрибуты:
   - `refdes`: A?
   - `model`: название модели (т. е. название, используемое в компонентах, для которых будет производиться моделирование)
   - `file`: имя файла, содержащего код SPICE-модели (т. е. `.MODEL` или `.SUBCKT`).

#### Блок включения

Блок включения добавляет в список соединений директиву `.INCLUDE`.

1. Поместите блок SPICE-модели в свою схему. (Выберите Добавить → Компонент → `spice` → `spice-include-1.sym`)
2. Дважды щёлкните по блоку и добавьте/отредактируйте следующие атрибуты:
   - `refdes`: A?
   - `file`: имя подключаемого файла.

#### Блок директивы SPICE

При наличии в схеме блока директивы, в списке соединений создаётся специальный блок кода SPICE. Директивой может подключаться либо файл с операторами, либо строка, содержащаяся в атрибуте `model`. Генератор списка соединений выводит содержимое строки или файла в список соединений дословно. Подходящими примерами использования директивы является подключение следующих операторов:

- .TEMP
- .IC
- и других операторов SPICE, для которых в gschem нет символов.

Для добавления в схему директивы SPICE, сделайте следующее:

1. Поместите блок директивы в свою схему. (Выберите Добавить → Компонент → `spice` → `spice-directive-1.sym`)
2. Дважды щёлкните по блоку и добавьте/отредактируйте следующие атрибуты:
   - `refdes`: A?
   - `file`: имя подключаемого файла.

### Работа с иерархическими моделями

При SPICE-моделировании часто возникают ситуации, когда хочется представить схему какого-либо конкретного компонента в виде `.SUBCKT`, а затем внедрить модель этого компонента в основную схему. Приведём довольно распространённый пример. Допустим, при моделировании СВЧ-схемы вы решили использовать такую модель конденсатора, которая содержит не только ёмкость, но и паразитные индуктивности и сопротивления. Производители конденсаторов часто поставляют схемы, отражающие схемную топологию имеющихся паразитных элементов, и указывают значения соответствующих сопротивлений и индуктивностей. И вам бы хотелось начертить модель такого конденсатора в gschem, создать с помощью генератора списка соединений файл `.SUBCKT`, а затем использовать этот файл для моделирования процессов в основной схеме.

Поскольку такого рода задачи при SPICE-моделировании являются довольно обычными, то теперь их можно выполнять и с помощью gnet-spice-sdb (начиная с версии 20030331). Для создания файла `.SUBCKT` подсхемы и использования его в основной схеме нужно сделать следующее:

1. Начертите в gschem подсхему компонента (например, конденсатор + паразитные элементы).
2. Добавьте в неё блок `spice-subcircuit-LL` (`spice-subcircuit-LL-1.sym`). Этим самым генератору списка соединений указывается, что эта схема является подсхемой для создания `.SUBCKT`. Прикрепите к символу блока атрибут:
   - `model-name` = cap_with_parasitics
     (Конечно, cap_with_parasitics — это просто пример. В своей схеме задайте название своей модели.) Тогда при создании файла списка соединений символ блока заставит генератор первой строкой туда вставить: `.SUBCKT cap_with_parasitics`.
3. В подсхеме к каждому из соединений ввода/вывода (т. е. к соединениям с основной схемой) подключите символ `spice-subcircuit-IO` (`spice-subcircuit-IO-1.sym`). Пронумеруйте позиционные обозначения символов ввода/вывода в таком порядке, в каком соединения ввода/вывода должны перечисляться в строке `.SUBCKT` выходного файла (т. е. P1 — для первого, P2 — для второго и т. д.).
4. Когда вы закончите с подсхемой, нужно будет обычным способом создать список соединений. Например, если ваша схема называется `cap_with_parasitics.sch`, список соединений для неё создаётся командой:

       gnetlist -g spice-sdb -o cap_with_parasitics.cir cap_with_parasitics.sch

   При этом список соединений SPICE будет записан в файл `cap_with_parasitics.cir`. Внимательно просмотрите этот файл и убедитесь, что список соединений создан правильно.

5. Затем для основной схемы создайте символ, который будет указывать на `.SUBCKT`. Обратите внимание, что позиционное обозначение данного символа должно начинаться с буквы X. Чтобы обеспечить это, сделайте следующее:
   - Начертите символ в gschem. Обычно, чтобы символ модели отличался от обычных компонентов, я черчу вокруг него прямоугольник. Если хотите, можете отметить его по-другому.
   - Обеспечьте, чтобы выводы в этом символе и в `.SUBCKT` были перечислены в одинаковом порядке. Это делается редактированием символа в текстовом редакторе и установкой атрибутов `pinseq`. Генератор списка соединений выведет выводы в порядке, заданном в этих атрибутах.
   - В текстовом редакторе установите для символа атрибут `device`, например, capacitor-model. Не задавайте в этом атрибуте ни один из тех типов компонентов, что поддерживаются в SPICE и перечислены в приложении! Ваша цель — сделать особый символ, позиционное обозначение `refdes` которого начинается с X, а если же в `device` указан тип, распознаваемый в SPICE, этой цели не достичь.
   - В текстовом редакторе установите значение атрибута позиционного обозначения символа `refdes` в X?.
6. Создайте основную схему. Добавьте свой новый символ в схему столько раз, сколько нужно, и разведите соединения обычным способом.
7. Чтобы символ указывал на подсхему `.SUBCKT`, дважды щёлкните по нему и установите следующие атрибуты:
   - `file` = cap_with_parasitics.cir
   - `model-name` = cap_with_parasitics
     а также другие необходимые атрибуты (например, `refdes`).
8. Теперь создайте список соединений для своей основной схемы обычным способом. Содержимое каждого файла `.SUBCKT` будет записано в основной список соединений. Откройте полученный файл в текстовом редакторе и внимательно проверьте, что список соединений создан правильно. Особое внимание обратите на следующее:
   - Проверьте, что соединения, подключающие `.SUBCKT` подсхемы к основному списку соединений, перечислены в правильном порядке.
   - Убедитесь, что и в основной схеме, и в подсхеме (в строке объявления `.SUBCKT`) используется одно и то же название модели.

Как только список соединений готов, вы тотчас же можете начать моделирование своего проекта любой предпочитаемой программой SPICE-моделирования. Некоторые из работающих в Linux программ описаны ниже.

## Создание списка соединений SPICE

### Использование gnetlist

Когда схема начерчена, список соединений SPICE можно создать с помощью программы gEDA gnetlist, запустив её из командной строки и задав в качестве аргументов имена файлов схем. gnetlist сконструирована из двух частей: оболочки — процессора, написанного на C, читающего файл `.sch` и создающего из него внутреннее, общее представление проекта, и драйверов на Scheme — генераторов списков соединений. С такой архитектурой gnetlist является очень гибко настраиваемой программой — с помощью разных драйверов на Scheme производятся списки соединений в разных форматах. Красота этой схемы (намеренный каламбур) в том, что пользователи gEDA легко могут и сами написать подходящие генераторы списков соединений для своих собственных нужд. Файл драйвера на Scheme, с реализацией усовершенствованного создания списков соединений SPICE, называется `gnet-spice-sdb.scm` и находится в каталоге `${PREFIX}/geda/share/gEDA/scheme`.

Из командной строки вызов драйвера spice-sdb для gnetlist производится следующим образом:

    gnetlist [OPTIONS] -g spice-sdb filename1 ... filenameN

Для spice-sdb могут быть полезны следующие ключи командной строки:

    -i          интерактивный режим Scheme
    -I          записать в выходной файл ''.INCLUDE <filename>'' вместо содержимого файла модели
    -q          безмолвный режим
    -l filename загрузка файла Scheme перед загрузкой драйвера
    -m filename загрузка файла Scheme после загрузки драйвера, но всё же до выполнения процедуры
    -g proc     выполнение процедуры Scheme (то есть spice-sdb)
    -o filename имя файла выходного списка соединений
    -c string   выполнить строку как скрипт Scheme
    -v          режим подробного вывода сообщений
    -s          сортировка выходного списка соединений (для gnucap)

### Создание списка соединений при помощи gnetlist и spice-sdb

Создать список соединений SPICE из схемы довольно просто. Для этого сделайте следующее:

- Сохраните свою схему в `filename.sch`.
- Создайте список соединений SPICE, запустив `gnetlist -g spice-sdb filename.sch`. Список соединений будет выведен в файл `output.net`. Кроме того, с помощью ключа `-o` можно задать другое имя выходного файла. Например, при задании такой команды:

      gnetlist -g spice-sdb -o amplifier.cir amplifier.sch

  схема будет взята из файла `amplifier.sch`, а список соединений SPICE будет записан в файл `amplifier.cir`.

- Откройте свой список соединений в текстовом редакторе и внимательно просмотрите. Проверьте, не отсутствуют ли какие-либо атрибуты и нет ли каких-либо других проблем.

### Обычные проблемы при создании списков соединений

Здесь мы попытаемся перечислить наиболее общие проблемы, возникающие при создании списков соединений и соответствующие решения:

- ERROR_INVALID_PIN:
  Эта ошибка может появиться, если последовательность номеров, заданных в атрибутах `pinseq` символа, не начинается с 1 или в ней имеются пропуски. Это можно починить, отредактировав такой символ в текстовом редакторе.
- ERROR: In procedure caddr:
  Это весьма распространённая ошибка. Обычно она появляется в том случае, когда вы забыли добавить один из обязательных атрибутов. Чтобы локализовать проблему, попробуйте запустить gnetlist в режиме подробного вывода (`gnetlist -v -g spice-sdb filename.sch`). Тогда генератор списка соединений остановит обработку на компоненте с пропущенным атрибутом и выдаст ошибку. Определив таким образом компонент-нарушитель, вы можете заново открыть схему в gschem и поправить атрибуты.

Наконец, помните, что прежде, чем использовать свой список соединений SPICE для моделирования, важно внимательно его проверить. Имейте в виду, что данный генератор списка соединений всё ещё находится в стадии “бета-версии” и какие-то проблемы с созданием списков соединений возможно ещё имеются.

## SPICE-моделирование

Для SPICE-моделирования в GNU/Linux есть несколько вариантов, я отмечу три:

- LTSpice — свободная (freeware) программа SPICE-моделирования, изначально выпущенная в Linear Technologies как инструмент для выбора/проектирования компонентов для платформы Windows. Благодаря очень быстрому и мощному SPICE-процессору она стала популярной в среде любителей и инженеров-проектировщиков, предпочитающих использовать свободные средства. Исходно LTSpice была написана для Windows, но затем немного изменена для запуска в GNU/Linux с помощью wine; если вам нужна мощная программа SPICE-моделирования профессионального качества, рекомендую пользоваться ею.
- ngspice — “официальная” программа SPICE-моделирования в gEDA Suite. Программа ngspice — это возрождение кода SPICE 3 в Linux. Она предоставляет SPICE-процессор для моделирования, оболочку, управляемую из командной строки, и возможность графического вывода результатов моделирования в X Window System. ngspice — это программа с открытым исходным кодом, написанная для Linux. Это программа SPICE для тех, кто хочет без труда заниматься моделированием в Linux или программированием и улучшением кода SPICE.
- tclspice — ответвление разработки ngspice. tclspice представляет собой расширенный вариант ngspice, в котором (в теории) набор команд SPICE экспортируется в API языка Tcl, позволяя встраивать SPICE-анализ в программы на Tcl. Среди прочего это полезно для автоматизации задач оптимизации разработки. tclspice — программа моделирования для тех, кто интересуется продвинутой, скриптовой разработкой.

Есть ещё программа моделирования gnucap под лицензией GPL, основанная на (или являющаяся потомком) Al's Circuit Simulator (ACS). Я её особо не использовал, поэтому информация о gnucap здесь отсутствует и её нужно добавить ().

### LTSpice

Программа LTSpice была написана в Linear Technologies, её авторы — Mike Englehardt и другие. Затем LinearTech отдала её в свободное пользование как вспомогательное средство для проектирования инженерам, желающим моделировать характеристики её контроллеров блоков питания, работающих в ключевом режиме. Пакет предоставляет оболочку для редактирования принципиальных схем, простой и мощный SPICE-процессор и возможность построения графиков результатов различных видов расчётов SPICE. Лично мне оболочка для разработки схем кажется неуклюжей и неудобной для работы; gschem разбивает её наголову по простоте использования и возможностям. Однако SPICE-процессор и средства анализа в LTSpice просто превосходны.

Программа LTSpice исходно предназначалась для работы в Windows, но Mike немного изменил её, так что она довольно хорошо работает и в GNU/Linux из-под wine. (Только система меню справки сломана — остальная часть пакета работает хорошо). Ещё одной приятной стороной LTSpice является хорошая поддержка, — Mike регулярно читает новостные группы sci.electronics.cad и, как правило, всегда рад помочь тем, кто испытывает с ней проблемы. Поэтому, несмотря на её Windoze-наследие, я рекомендую LTSpice как мощный, профессионального качества драйвер моделирования и анализа для gEDA.

#### Установка и настройка LTSpice

Установка и настройка LTSpice производится следующим образом:

1. Загрузите и установите wine. Мне удалось поставить Wine-20030219. Более поздние версии наверняка тоже будут работать.
2. Загрузите LTSpice. Программа доступна по адресу http://www.linear.com/software под названием SwitcherCAD-III.
3. Запустите программу установки LTSpice в wine.

#### Запуск LTSpice с проектами gEDA

LTSpice умеет читать файлы списков соединений SPICE, сделанные в gEDA. Моделирование в LTSpice мне удавалось производить следующим образом:

1. Прежде всего регистрируйтесь в системе как обычный пользователь — wine не любит работать из-под суперпользователя.
2. В каталоге своего проекта создайте файл `Simulation.cmd` и пропишите в нём команды своего SPICE-анализа (например, .OP, .AC, .DC и т. д.).
3. Добавьте в свою схему символ блока включения SPICE. Атрибут `file` установите в Simulation.cmd.
4. Создайте для своего проекта список соединений.
5. Сделайте ссылку на свой список соединений `output.net` в каталоге установки SwCADIII. Имя файла ссылки должно содержать суффикс .cir. Например:

       ln -s ${DESIGN_HOME}/output.net ${WINE_HOME}/.wine/fake_windows/Program Files/LTC/SwCADIII/MyDesign.cir

6. Запустите LTSpice: перейдите в каталог установки SwCADIII командой cd и запустите

       wine scad3.exe

7. В окне SwCADIII выберите Файл → Открыть → `(файлы типа списков соединений [.cir])` и выберите свой файл.
8. Запустите моделирование щелчком по кнопке запуска (Run) или с помощью Моделирование → Запуск.
9. Выберите для графика переменные и щёлкните OK. Дальше программа SwCADIII всё сделает сама.

Конечно, чтобы понять, как пользоваться программой LTSpice эффективно, очень важно с ней позаниматься, но для начала вам должно быть достаточно вышеизложенного описания.

### Ngspice

ngspice начал Paolo Nenzi в Университете Рима “La Sapienza”, стремясь создать версию стандартного Berkeley SPICE версии 3 под лицензией GPL, полностью переписав этот пакет. В его планы также входило создание лучших, более ясных алгоритмов расчётов для SPICE-процессора. Больше информации можно найти на веб-странице ngspice: http://ngspice.sourceforge.net/. Но в свете этих возвышенных планов Paolo стал заниматься несколько другим: он взял код SPICE 3, много лет гуляющий по интернету, переработал его, и написал систему сборки, чтобы его можно было бы скомпилировать обычным способом с помощью GNU make. Это было главное достижение, за которое Paolo заслуживает огромной похвалы. К сожалению, судя по виду веб-страницы, разработка ngspice похоже остановилась в конце 2001 г. На самом деле после 2001 г. разработка значительно замедлилась, но в последнее время Paolo снова занялся ngspice. Последнюю версию, ngspice-rework-15, он выпустил в феврале 2004 года. Эта версия доступна только на странице загрузки сайта sourceforge; Paolo пока не обновил остальную часть веб-страницы проекта.

#### Установка и конфигурирование ngspice

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

#### Загрузка исходного кода

Скачайте самую последнюю версию дистрибутива со страницы http://sourceforge.net/projetcs/ngspice. Обязательно самую последнюю, так как у неё самая высокая производительность и наибольшее количество возможностей. На май 2004 года, последний релиз — это ngspice-rework-15. Установите исходники туда, где вы их обычно храните. Мне нравится держать свои исходники gEDA в отдельном каталоге, например, `/usr/local/geda/sources/ngspice`. Можете перенять такую схему.

#### Извлечение исходных текстов

Исходные тексты программы распространяются в виде “тарбола” — сжатого архива. Вам нужно извлечь из него файлы, сделав следующее:

    user@host:~$ cd <каталог, куда следует извлечь исходные файлы>
    user@host:~sources$ tar -xvzf </путь/к/пакету.tar.gz>
    user@host:~sources$ cd <извлечённый каталог>

В этот момент вы находитесь в корневом каталоге ngspice. Чтобы познакомиться с этой программой и процессом её установки поближе, прочитайте общеизвестные файлы, такие как `README` и `INSTALL`. Также неплохо бы почитать файл `NOTES`, в нём содержится информация, полезная для разработки или отладки возможностей ngspice.

#### Конфигурирование и компиляция ngspice

Для сборки ngspice используется обычная последовательность `configure && make && make install`, применяемая и для прочих GNU-тых программ. Для конфигурирования ngspice имеется достаточно много ключей. : Полный их перечень и сопровождающая документация нуждаются в доработке; чтобы увидеть их все, лучше всего посмотреть файл `configure.ac`. Многие из ключей, доступных на этапе конфигурирования, предназначены для отладки программы моделирования или для включения возможностей экспериментальных видов анализа. Новичкам стоит обратить внимание на три ключа:

- `--enable-xspice`: этим ключом добавляется поддержка расширений XSpice. Эти расширения позволяют вам определить устройства, чьё поведение задаётся специальными “моделями кода”. Возможно наиболее важной моделью кода является `spice2poly`, которая транслирует конструкции POLY в стиле SPICE 2 в модели XSpice, пригодные для использования в SPICE 3.
- `--with-readline`: при задании этого ключа в ngspice встраивается поддержка GNU readline. Это значит, что вы сможете использовать как клавиатурные команды в стиле emacs, так и клавиши со стрелками для перемещения в строке ввода команд. Без этой возможности интерфейс командной строки будет враждебным, то есть, если вы ошибётесь при вводе длинной команды, у вас не останется других вариантов, кроме как снова ввести её целиком. Paolo не советует использовать возможность `readline`, поскольку при этом код GPL (readline) смешивается с кодом BSD (ngspice), но для других он этот ключ оставил, чтобы люди сами могли решить, насколько быть целомудренными в этом вопросе.
- `--prefix`: этим ключом задаётся базовый каталог установки двоичных файлов программ.

Прежде чем запускать configure нужно проверить ключи, которые вы хотите задать. Краткое описание приведено в приложении (: требуется доработка). Как только будете готовы, наберите:

    user@host:~sources/<tld>$ ./configure --enable-xspice --with-readline  --prefix=/usr/local/geda <другие ключи конфигурации>

Конечно, `--prefix=` должен указывать на тот каталог, где находятся ваши файлы, относящиеся к gEDA. После выполнения этой команды программа моделирования будет сконфигурирована и готова для компиляции. Компиляция проста:

    user@host:~sources/<tld>$ make && make install

Как обычно для установки пакетов в общедоступный каталог скорее всего вам понадобятся права суперпользователя, в таком случае нужно сделать так:

    user@host:~sources/<tld>$ make
    user@host:~sources/<tld>$ su -c make install

#### Проверка установки

В этот момент вы должны быть способны запустить ngspice. Свою установку можно проверить, попробовав обработать одну из тестовых схем из каталога с тестами. Я рекомендую запустить тест `TransImpedanceAmp`, так как в нём проверяется функциональность SPICE 2 POLY.

#### Использование ngspice

Запуск ngspice очень прост. В приглашении командной строки Unix введите команду:

    user@host:~$ ngspice filename.net

и ngspice загрузит список соединений SPICE `filename.net` в своё рабочее пространство и выведет своё приглашение командной строки. Вы можете запустить моделирование, сказав “run” (запуск). Результаты будут сохранены в массиве SPICE для дальнейшей печати на принтере или черчения на плоттере. Набор имеющихся в распоряжении команд приведён на странице http://newton.ex.ac.uk/teaching/CDHW/Electronics2/userguide/sec5.html#5.

Для использования кодовой модели SPICE 2 POLY её нужно загрузить в ngspice до загрузки списка соединений. (Если вы загрузите её после загрузки списка соединений, элементы POLY в ней транслироваться не будут и потому не будут и правильно смоделированы.) Чтобы загрузить кодовую модель, в строке приглашения ngspice нужно просто сказать:

    codemodel /usr/local/geda/lib/spice/spice2poly.cm

(укажите здесь местоположение своих кодовых моделей). Учтите, что для кодовой модели следует указать абсолютное имя файла; программа ngspice не настолько сообразительна, чтобы искать её в стандартных каталогах. (Также обратите внимание, что нужно указать путь к `spice2poly.cm` на своей машине; путь, указанный выше, — мой.)

Лучшим способом для считывания кодовой модели `spice2poly` будет включение её в файл инициализации ngspice — `spinit`. Файл инициализации находится в каталоге `/usr/local/geda/share/ng-spice-rework/scripts` (или где-то ещё, где у вас установлены файлы gEDA). В файле `spinit` можно задать и другие настройки для ngspice.

### Tclspice

Когда в 2002-м году основная ветка разработки ngspice впала в спячку, несколько товарищей из MultiGig Ltd. (http://www.multigig.com/) занялись разработкой ветки ngspice, которую они назвали tclspice. tclspice — это расширенный вариант ngspice, в котором множество команд SPICE экспортируется как API к Tcl. При этом преследуется цель облегчить написание скриптов для расчётов SPICE. Это очень мощное средство: для tclspice можно написать скрипт на Tcl, который запустит цикл, подстроит значения компонентов, запустит анализ, а затем оценит характеристики схемы с подстроенными компонентами, прежде чем запускать новый цикл. Очевидно, эту возможность можно использовать для выполнения автоматических, многомерных оптимизаций схемы. Если проект будет завершён, tclspice возможно станет “приложением-убийцей” для САПР электроники с открытым исходным кодом.

#### Загрузка, установка и сборка tclspice

Домашняя страница проекта tclspice находится по адресу http://tclspice.sourceforge.net/. Исходные коды tclspice проживают по адресу http://sourceforge.net/projects/tclspice. Для загрузки и установки tclspice используются те же самые шаги, что подробно расписаны для ngspice выше. Так как tclspice является расширенным вариантом ngspice, то если нужно, из исходных текстов tclspice можно установить только ngspice. Сборка целого пакета потребует пары дополнительных шагов. Здесь я представлю последовательность шагов для сборки и ngspice (автономной программы с интерфейсом командной строки), и API для Tcl из исходных текстов tclspice.

Перед сборкой tclspice у вас уже должны быть установлены следующие пакеты:

- TclX (у меня собирается с tclx8.3.5)
- tclreadline (у меня собирается с tclreadline-2.1.0)
- BLT for Tcl (у меня собирается с blt2.4z)
- Tcl/Tk (у меня собирается с 8.4.3.)

Если на вашей Linux-машине эти пакеты ещё не установлены, их нужно найти и собрать. Обратите внимание, что сборка TclX требует наличия исходных текстов для Tcl и Tk, так что вам придётся также загрузить исходные тексты и этих пакетов, если они у вас ещё не установлены. У меня успешно работает Tcl/Tk 8.4.3, хотя возможно будут работать и версии 8.3.X. Также, если вы хотите запускать SPICE в фоновом режиме, вам придётся перекомпилировать Tcl и Tk с разрешением поддержки нитей (thread), если она уже не была разрешена (в пакетах для RedHat — нет).

Будем считать, что вы уже загрузили и установили указанные выше дополнительные пакеты. Тогда для сборки на своей машине и ngspice, и API для Tcl, вам нужно предпринять следующее:

    user@host:~sources/<tld>$ ./configure --enable-xspice --with-readline  --prefix=/usr/local/geda
    user@host:~sources/<tld>$ make && make install (этими командами собирается и устанавливается старый добрый ngspice)
    user@host:~sources/<tld>$ ./configure --enable-xspice --prefix=/usr/local/geda --enable-tcl --enable-experimental --disable-shared
    user@host:~sources/<tld>$ make tcl && make install-tcl

Как обычно для установки пакетов в общедоступный каталог скорее всего вам понадобятся права суперпользователя, в таком случае для установки своих пакетов нужно сделать так:

    user@host:~sources/<tld>$ su -c make install
    user@host:~sources/<tld>$ su -c make install-tcl

Теперь всё готово для написания скриптов на Tcl, включающих команды SPICE. Информация об использовании tclspice приведена ниже. Наконец, если вам интересно попрограммировать tclspice (и даже если нет), будет неплохо прочитать файл `NOTES`, находящийся в корневом каталоге исходников, в котором можно найти пару полезных советов.

#### Использование tclspice

tclspice разработан для экспорта команд SPICE в программы на Tcl. Чтобы использовать tclspice, в начале своей программы на Tcl нужно просто сказать `package require spice`. После этого, чтобы запустить команду SPICE, при её вызове надо просто задать пространство имён `spice`. Как пример приведём программу на Tcl, которая прочитает список соединений SPICE, прикажет сделать временной анализ, запустит моделирование, а затем начертит график напряжения для соединения Vout за указанное время:

    #! tclsh
    package require spice
    spice::codemodel /usr/local/src/tclspice-0.2.12/src/xspice/icm/spice2poly.cm
    spice::source netlistname.cir
    spice::tran 0.1ns 40ns
    spice::run
    spice::plot Vout
    puts "Всё готово!"

Обратите внимание, что поскольку tclspice не читает инициализационный файл ngspice `spinit`, любые команды инициализации вам придётся задавать непосредственно в программе на Tcl. Например, в вышеприведённом примере мы читаем кодовую модель `spice2poly` непосредственно в рабочее пространство. Доступно и много других команд; полный набор команд tclspice приводится на странице http://tclspice.sourceforge.net/docs/tclspice_com.html.

#### Проблемы в tclspice

Главная проблема tclspice (унаследованная от ngspice) — утечки памяти. Поэтому время моделирования в ней ограничено. Это значит, что если вы хотите сделать оптимизацию, многократно повторив цикл моделирования для схемы, память может быть исчерпана прежде, чем программа закончит оптимизацию. Это известная проблема в tclspice и сейчас затрачиваются большие усилия для того, чтобы утечки заткнуть.

Между тем для осуществления длительной оптимизации существуют кое-какие обходные пути, которые можно использовать для проектов среднего размера. Я применял один способ, состоящий в том, что после каждого анализа схемы оптимизатор записывает данные своего текущего состояния в файл и из этого же файла читает данные своего исходного состояния. Оптимизатор также сохраняет текущий перечень лучших вариантов компонентов в другой файл и читает этот файл при каждом запуске оптимизации. К тому же у меня есть программа на Tcl под названием TaskMgr.tcl, работающая циклически; при каждой итерации цикла она порождает дочерний процесс для запуска оптимизатора. Между тем родительский процесс ожидает 5 минут (эвристически найденное время), а затем, прежде чем повторять цикл и запускать оптимизатор снова, выдаёт дочернему процессу сигнал “KILL”. Таким образом оптимизатор никогда не работает настолько долго, чтобы съесть всю память на моей машине. Вот собственно сама программа TaskMgr.tcl:

    #! tclsh
    package require Tclx
    while {1} {
      set PID [fork]
      if {$PID} {
        # Родительский процесс
        after 300000
        puts "Собираюсь убить дочерний процесс PID = $PID . . . ."
        kill $PID
        wait $PID
      } else {
        # Дочерний процесс
        source Optimize.tcl
        # Если мы вдруг когда-нибудь пройдём через всё это, можем выдать следующее:
        error "Мы закончили!!!!!!"
      }
    }

Заметьте, что для запуска tclspice программе TaskMgr.tcl требуется, чтобы пакет TclX уже был установлен. Может быть вам следует также задать другое время ожидания в зависимости от объёма памяти и скорости вашей машины. Наконец, родительскому процессу придётся следить и за $PID (с помощью `wait`), так как когда дочерний процесс умрёт, нужно чтобы и его труп был выкинут из списка задач ядра. Иначе работа оптимизатора приведёт к порождению целой толпы процессов-зомби, подстерегающих вас на вашей машине за каждым углом, — длительная оптимизация может превратить вашу систему в “ночь живой смерти”!

Такой метод ограничения времени для дочернего процесса предпочтителен в том случае, когда одиночный анализ занимает относительно немного времени по сравнению с временем, требуемым для съедания всей памяти машины. Если же время анализа сопоставимо со временем съедания всей памяти, то лучше заставить родительский процесс следить за состоянием анализа, запустить одиночный анализ, а затем заставить этот анализ завершаться после каждой итерации. Предпочтителен ли такой вариант, зависит от размера и сложности вашего проекта; может быть вам следует поэкспериментировать со своим анализом, чтобы узнать, как долго он длится и сколько потребляет памяти. Я нашёл, что анализ для проекта из шести операционных усилителей (с соответствующими моделями поставщиков) и пятидесяти или около того пассивных элементов на PIII 333MHz c 128MB RAM будет длиться менее 10 секунд. Поэтому, чтобы одиночный анализ съел значительное количество памяти, ваш проект должен быть довольно большим.

## Приложение A. Поддерживаемые компоненты и их атрибуты

В таблице 1 представлены устройства и связанные с ними атрибуты, используемые драйвером spice-sdb. Необходимые атрибуты выделены жирным шрифтом, прочие указаны обычным. Заметьте, что атрибут `device` невидим и обычно прикрепляется к символу при его создании. Другие атрибуты прикрепляются к символу в gschem при разработке схемы.

Если вы имеете дело только с простыми активными компонентами (диодами, транзисторами) при наличии их моделей SPICE в виде файлов, то нужно задать только атрибуты `model-name` и `file`; атрибут `model` задавать не нужно. Но если для вашего простого активного компонента есть однострочная SPICE-модель, которую хотелось бы ввести непосредственно в схеме, тогда задайте атрибуты `model` и `model-name`; атрибут `file` задавать не нужно.

Таблица 1. Атрибуты, необходимые для создания списка соединений SPICE

`device` | `refdes` | `value` | `model` | `file` | `model-name` | `type` | Комментарий
--- | --- | --- | --- | --- | --- | --- | ---
RESISTOR | R? | (4) | (2) | - | Название модели | - | (11)
CAPACITOR | C? | (4) | (3) | - | Название модели | - | (11)
POLARIZED_CAPACITOR | C? | (4) | (3) | - | Название модели | - | (11)
INDUCTOR | L? | (4) | (3) | - | Название модели | - | (11)
SPICE-ccvs | H? | (5) | - | - | - | - | Источник напряжения, управляемый током
SPICE-cccs | F? | (5) | - | - | - | - | Источник тока, управляемый током
SPICE-vcvs | E? | (5) | - | - | - | - | Источник напряжения, управляемый напряжением
SPICE-vccs | G? | (5) | - | - | - | - | Источник тока, управляемый напряжением
SPICE-nullor | E? | (5) | - | - | - | - |
DIODE | D? | Тип прибора | Однострочная SPICE-модель | Имя файла модели | Название модели | - | (12)
PMOS_TRANSISTOR | M? | Тип прибора | Однострочная SPICE-модель | Имя файла модели | Название модели | - | (12)
NMOS_TRANSISTOR | M? | Тип прибора | Однострочная SPICE-модель | Имя файла модели | Название модели | - | (12)
PNP_TRANSISTOR | Q? | Тип прибора | Однострочная SPICE-модель | Имя файла модели | Название модели | - | (12)
NPN_TRANSISTOR | Q? | Тип прибора | Однострочная SPICE-модель | Имя файла модели | Название модели | - | (12)
PFET_TRANSISTOR | J? | Тип прибора | Однострочная SPICE-модель | Имя файла модели | Название модели | - | (12)
NFET_TRANSISTOR | J? | Тип прибора | Однострочная SPICE-модель | Имя файла модели | Название модели | - | (12)
MESFET_TRANSISTOR | B? | Тип прибора | Однострочная SPICE-модель | Имя файла модели | Название модели | - | (12)
IC | U? | Тип прибора |  | Имя файла `.model` | Название модели | - | Для ИС с файлом `.model`
IC | X? | Тип прибора |  | Имя файла `.subckt` | Название .subckt | - | Для ИС с файлом `.subckt`
model | A? | - | Однострочная SPICE-модель | Имя файла `.model` | (9) | (10) | (12)
include | A? | - | - | Имя файла `.include` | - | - | (13)
options | A? | (8) | - | - | - | - | (14)
directive | A? | (1) | - | - | - | - | (12)
VOLTAGE_SOURCE | V? | (6) | - | - | - | - | Независимый источник напряжения
CURRENT_SOURCE | I? | (7) | - | - | - | - | Независимый источник тока

(1) Одна строка, содержащая операторы SPICE для включения в список соединений
(2) Одна строка параметров SPICE-модели (например, `TC` и т. д.)
(3) Одна строка параметров SPICE-модели (например, `IC`, `POLY` и т. д.)
(4) Числовое значение компонента
(5) Строка, описывающая режим источника
(6) Однострочное описание, содержащее режим источника напряжения
(7) Однострочное описание, содержащее режим источника тока
(8) Строка подключаемых ключей
(9) Название модели, на которую указывают компоненты
(10) Соответствующий тип SPICE-модели (допустимые типы приведены ниже)
(11) Параметры модели помещаются внутри скобок после значения компонента
(12) Для моделирования нужно включить или модель, или файл
(13) Помещает директиву `.INCLUDE` в список соединений SPICE
(14) Помещает директиву `.OPTIONS` в список соединений SPICE

Выражение “поддерживаемый генератором списка соединений” означает, что существует соответствующий кусок кода на Scheme, который точно знает как эти компоненты обрабатывать и (почти) наверняка сгенерирует правильный код SPICE. Символы с такими атрибутами `device`, которых нет в вышеприведённом списке, обрабатываются функцией Scheme `spice-sdb:write-default-component`, которая для принятия решения о том, как обрабатывать данный компонент, смотрит на его позиционное обозначение. Как правило, при создании кода SPICE эта функция сделает “то, что надо”, но твёрдой гарантии нет. В частности, эта функция не увидит различия между транзисторами типов N и P и для строки `.MODEL` в списке соединений будет генерировать тип <unknown> (неизвестный). Вероятно это вызовет ругань программы моделирования. Поэтому лучше всего убедиться, что для всех используемых устройств задан надлежащий атрибут `device`.

## Приложение B. Допустимые значения "type"

Атрибут `type` указывает SPICE-процессору тип компонента и подготавливает его для принятия параметров модели, специфичных для данного типа. Допустимые значения атрибута `type` указаны в таблице 2.

Таблица 2. Допустимые значения атрибута `type` компонентов.

Компонент | type | Комментарий
--- | --- | ---
RESISTOR | RES | Резистор
CAPACITOR | CAP | Конденсатор
POLARIZED_CAPACITOR | CAP | Полярный конденсатор
INDUCTOR | IND | Катушка индуктивности
DIODE | D | Диод
PMOS_TRANSISTOR | PMOS | pМОП-транзистор
NMOS_TRANSISTOR | NMOS | nМОП-транзистор
PNP_TRANSISTOR | PNP | Биполярный транзистор типа pnp
NPN_TRANSISTOR | NPN | Биполярный транзистор типа npn
PFET_TRANSISTOR | PJF | Полевой транзистор с управляющим pn-переходом с каналом p-типа
NFET_TRANSISTOR | NJF | Полевой транзистор с управляющим pn-переходом с каналом n-типа
MESFET_TRANSISTOR | - | Полевой транзистор с переходом металл – полупроводник

1) GNU Free Documentation License
2) Настоящий документ выпущен под Лицензией Свободной Документации GNU благодаря щедрости Electroniscript, inc. Его последнюю версию всегда можно найти на странице http://www.brorson.com/gEDA/HOWTO/.
3) Университет в Калифорнии, родина одной из ветвей Unix. — Прим. перев.