# Усовершенствование моделирования работы электрических схем в gschem

## Обоснование

Начинающим не так-то просто использовать gschem как оболочку для схемотехнического моделирования (для ngspice или gnucap). Вот что новому пользователю хотелось бы делать в gschem:

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

Запуск моделирования и постобработка могут быть во внешней программе, вызываемой посредством IPC.

Существует несколько графических оболочек, но они не решают всех вышеуказанных проблем:

- gspiceui
- kjwaves
- easyspice

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

## Набросок проекта

Допустим, нам хотелось бы совсем немного изменить gschem и libgeda, чтобы иметь возможность по крайней мере установить несколько измерительных приборов и запустить моделирование.

### Измерительные приборы

Измерителями тока могут быть обычные источники постоянного напряжения 0 В. Легче всего в качестве такого прибора использовать символ с двумя выводами, подобный обычному амперметру. Если нам захотелось бы подключить измеритель тока к выводу, то нужно, чтобы генератор списка соединений распознал его и заместил нашим “амперметром”. Если в качестве амперметра использовать источник напряжения, генератору не нужно будет знать имён соединений внутри схемы. Все источники напряжения 0 В со специальным именем устройства являлись бы измерителями тока.

Измерителями напряжения могут быть источники тока 0 А. Второй вывод источника тока присоединяется к GND атрибутом `net`. Поэтому снова генератору списка соединений не нужно будет знать имён соединений, так как он сможет использовать соединение, подключенное к этому специальному источнику тока. Подобно вышеописанному источнику напряжения мог бы быть специальный (графический) символ, который распознавался бы генератором списка соединений.

### Источники тока и напряжения

Определить параметры источников не так просто. В настоящее время они хранятся внутри атрибутов `value` символа, например `value=pulse 0 1 10n 10n 100n 1u 2u`. Эти настройки должны соответствовать атрибутам SPICE `pulse(V1 V2 TD TR TF PW PER)`.

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

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

### Моделирование

Как сохранять параметры моделирования внутри gschem.

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

- вид анализа (dc, ac, tran,…);
- параметры программы моделирования;
- программа моделирования? (можем ли мы запускать моделирование для одной и той же схемы в двух программах моделирования сразу?);
- параметры для моделирования (глобальные параметры, температура, …).

    v 20061020 1
    C 41500 49200 1 0 0 spice-directive-1.sym
    {
    device=spice_simulation_block
    refdes=A1
    simulation_name=random name
    simulation_active=1
    simulation_type=DC 0V 1V 0.1V
    parametric_simulation1=V1 lin 0 5 0.1
    parametric_simulation2=R1.value lin 10k 100k 10k
    option_TNOM=100 Deg
    option_ABSTOL=1e-3
    global_param1=???
    global_param2=???
    }

Таких объектов моделирования в одной схеме могло бы быть много.

Для хранения дополнительных библиотек можно использовать либо директиву вложения (include), либо символ LIBRARY, содержащий все библиотеки в одном из двух видов:

- как многострочный атрибут;
- как несколько атрибутов библиотек, прикреплённых к символу LIBRARY.

Между глобальными, пользовательскими и локальными библиотеками должно быть различие. Глобальные и пользовательские библиотеки могут определяться в `gafrc` или в новом конфигурационном файле `spicerc`.

### Создание диалогового окна для моделирования внутри gschem

Допустим, всё что нам нужно, чтобы добавить поддержку моделирования в gschem, это одно диалоговое окно.

- В нём должен содержаться список моделирований (в виде списка из их названий с кнопками разрешения/запрета).
- В нём должны быть иконки для добавления измерителей.
- Оно могло бы содержать кнопки для большинства общих символов: резистора, конденсатора, катушки индуктивности, диода, … [R,C,L,D,M,E,F,G,H..]
- Оно могло бы содержать несколько диалоговых элементов для настройки SPICE.
- Оно могло бы содержать кнопки моделирования и закрытия.
- Несколько добавочных кнопок, таких как, например: копировать моделирование, удалить моделирование, общие параметры…

При создании такого диалогового окна все объекты моделирования собираются в перечень видов моделирования (в виде списка с кнопками разрешения/запрета).

При изменении настроек меняются атрибуты соответствующего объекта моделирования.

### Диалоговое окно параметров

Какие параметры нужны для этого диалогового окна? И почему?

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

- выводить на графиках все маркеры и сохранять только напряжения соответствующих узлов;
- выводить на графиках все маркеры, но сохранять все напряжения и токи (с помощью источников напряжения);
- сохранять напряжения узлов только для схемы текущего уровня или также и для подсхем.

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

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

- сохранение схемы (спрашивать пользователя или использовать временный файл?);
- создание списка соединений с помощью gnetlist;
- создание файлов моделирования и включение туда списка соединений (можно ли это сделать тоже с помощью gnetlist?);
- выполнение скрипта запуска моделирования (guile, sh, …).

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

## Приложение

### Символ измерителя тока (эскиз)

    v 20061020 1
    P 0 0 200 200 1 0 0
    {
    T 100 0 5 10 0 1 0 0 1
    pintype=pas
    T 0 100 5 10 0 1 0 0 1
    pinseq=1
    T 0 100 5 10 0 1 0 0 1
    pinnumber=1
    T 0 100 5 10 0 1 0 0 1
    pinlabel=1
    }
    V 300 300 150 3 10 0 0 -1 -1 0 -1 -1 -1 -1 -1
    L 300 200 240 360 3 10 0 0 -1 -1
    L 300 200 360 360 3 10 0 0 -1 -1
    T 0 500 9 10 0 0 0 0 1
    device=VOLTAGE_PROBE
    T 200 50 9 6 1 1 0 0 1
    refdes=I_VP?
    T 0 700 9 10 0 0 0 0 1
    net=GND:2
    T 0 900 9 10 0 0 0 0 1
    value=DC 0A

### Символ измерителя напряжения (эскиз)

    v 20061020 1
    P 0 200 150 200 1 0 0
    {
    T -150 50 5 10 0 1 0 0 1
    pintype=pas
    T 50 250 5 10 0 1 0 0 1
    pinseq=1
    T 50 250 5 10 0 1 0 0 1
    pinnumber=1
    T 50 250 5 10 0 1 0 0 1
    pinlabel=1
    }
    V 300 200 150 3 10 0 0 -1 -1 0 -1 -1 -1 -1 -1
    L 300 300 380 140 3 10 0 0 -1 -1
    L 300 300 220 140 3 10 0 0 -1 -1
    T 0 500 9 10 0 0 0 0 1
    device=CURRENT_PROBE
    T 200 370 9 6 1 1 0 0 1
    refdes=V_IP?
    P 600 200 450 200 1 0 0
    {
    T 500 50 5 10 0 1 0 0 1
    pintype=pas
    T 500 250 5 10 0 1 0 0 1
    pinseq=2
    T 500 250 5 10 0 1 0 0 1
    pinnumber=2
    T 500 250 5 10 0 1 0 0 1
    pinlabel=2
    }
    L 240 180 360 180 3 10 0 0 -1 -1
    T 0 700 9 10 0 0 0 0 1
    value=DC 0V

### Ещё один символ измерителя тока (эскиз), который использует Kurt Peters

    v 20061020 1
    T 700 650 8 10 1 1 0 0 1
    refdes=VAM?
    T 700 850 5 10 1 1 0 0 1
    device=Ammeter
    T 700 1050 5 10 0 0 0 0 1
    footprint=none
    T 700 1250 5 10 0 0 0 0 1
    numslots=0
    T 700 1450 5 10 0 0 0 0 1
    description=ammeter for spice
    P 300 1200 300 900 1 0 0
    {
    T 350 1000 5 8 1 1 0 0 1
    pinnumber=1
    T 350 1000 5 8 0 1 0 2 1
    pinseq=1
    T 400 850 9 8 1 1 0 5 1
    pinlabel=+
    T 300 700 5 8 0 1 0 5 1
    pintype=pwr
    }
    P 300 0 300 300 1 0 0
    {
    T 350 100 5 8 1 1 0 0 1
    pinnumber=2
    T 350 100 5 8 0 1 0 2 1
    pinseq=2
    T 300 500 5 8 0 1 0 3 1
    pintype=pwr
    T 300 300 5 10 1 1 0 0 1
    pinlabel=-
    }
    L 300 400 400 500 3 0 0 0 -1 -1
    L 200 500 300 400 3 0 0 0 -1 -1
    T 700 450 5 10 0 1 0 0 1
    value=DC 0V
    L 300 400 300 800 3 0 0 0 -1 -1
    L 100 800 500 400 3 0 0 0 -1 -1
    B 0 300 600 600 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
    L 200 800 100 800 3 0 0 0 -1 -1
    L 100 700 100 800 3 0 0 0 -1 -1