SPICE(スパイス)は、電子回路シミュレータである。カリフォルニア大学バークレー校で1970年代前半頃に開発が始まり、以後何回かバージョンアップされた。集積回路の設計に利用可能なように開発されたため、長さや幅などといったパラメータによりトランジスタであれば特性や駆動能力を、配線であればインピーダンスと過渡特性といったものまでシミュレーションする能力まで持つが、単純にディスクリートの素子を定義し、配線は全て等電位とするといったようにして簡単に電子工作のシミュレーションを行う、といった用途にも問題なく使える。

シミュレーション対象となる回路は一般的な受動素子(抵抗、コンデンサなど)と能動素子(ダイオード、トランジスタ、真空管など)と伝送線路、各種電源を組み合わせたものである。解析手法としては過渡解析、直流解析、小信号交流解析、雑音解析などが可能である。

現在使われている、名称にSPICEの語を含むシミュレータは、このバークレー校のものを元に改良、機能付加したものである。それらを含めた総称としてSPICEと呼ばれることもある。

## 回路、動作記述

### 概略

シミュレータへの入力となる回路や動作、制御文などはテキストで記述する。各項目の基本は行単位であるが複数行にまたがる記述も可能であり、その場合には次の行の先頭を `+` にする。コマンドの記述は終止符 (`.`) から始まる。

最初の行は表題となり、次の行以降に回路や制御文を記述する。回路網はSPICE書式のネットリスト にて表現する。最後の行は `.END` で終了する。`.END`と記述した次の行は新たな回路記述として認識され、複数回路のシミュレーションが可能。

回路記述は1行1素子で記述する。各行の行頭は素子のインスタンス名(固有の名前)を示し最初の一文字が素子種別を表す。抵抗なら`Rインスタンス名`、インダクタンスなら `Lインスタンス名` といった名前となる。続けて、素子の各端子が接続されるノード名を記述し、最後に素子の特性値などを記述する。インスタンス名、ノード名などの区切りには空白文字を使用する。

行頭が `*` である行は人間のための注釈である。

簡単な例1:CR回路

ここでR1の行の最後は$10\Omega$、`C1` の行の最後は$20F$を示す。`0`、`1`、`2` はそれぞれの端子のノードを示す。結果として抵抗とキャパシタが直列につながった回路となる。

これだけでは回路記述のみであり電気回路として動作しない。回路として動作させるためには、例えば次のように電圧源(`V` で始まる素子)を付加する。

簡単な例2:CR回路 + 直流電源

この例では前述の回路の両端(+側がノード `2` で-側がノード `0` )に$5V$の電圧を加えたことになる。電源には直流のほか正弦波やパルス波形、定電流源なども指定できる。電源も形式的には素子との位置づけであり他の素子同様、回路記述内に含める。ノード `0` (グランド)は、必ず含まれていなくてはならない。各部の電圧とは、指定した場所の電位とノード `0` との電位差として定義されている。

これを実際に動作させるには解析内容を指定する。

簡単な例3:CR回路 + 直流電源 + 過渡解析

`.TRAN` 文は $1sec$ きざみで $10sec$ まで経過させることを意味する(過渡解析)。なおピリオドに始まる語は各種制御文を意味する。

シミュレータとしては動作した結果の観測も可能でなければならない。次の指定で表示ができる。

簡単な例4:CR回路 + 直流電源 + 過渡解析 + 表示

`.PRINT` 文でノード1の電圧と電源`V1`の電流を一覧として出力する。ほかに `.PLOT` 文もありグラフ化することができる。

期待するような、コンデンサに充電されていくようなシミュレーション結果はこのままだと出てこない。これはSPICEは過渡解析を行う前に自動的にDC解析により初期条件の電位を決定し、この際コンデンサはショート状態として扱われるため、コンデンサに充電された状態でシミュレーションが開始してしまうためである。充電されていない状態でシミュレーションを開始するためには、`.IC` 文を使用して初期条件における電位を明示的に指定する。

簡単な例5:CR回路 + 直流電源 + 過渡解析 + 初期条件 + 表示

この例では、コンデンサ`C1`の抵抗`R1`側のノードの初期電位を$2V$に設定する。これは`V1`の電圧と等しいため、コンデンサが充電されていない状態からシミュレーションが行われる。

なお先頭行と`.END`の間の記述順序は任意である。

SPICEはテキストによる記述を基本としているが、商用版ソフトウェアなどでは回路図CADと統合化してグラフィカルな記述も可能となり、より使いやすくなっている。

### 素子詳細

素子の記述は一般に頭が種別を示すインスタンス名、それに続くノード名の列挙、必要に応じてパラメータなどの値の列挙が続く形式となっている。ノード名は初期は数値が基本であるがSPICEの種類、バージョンにより英数字での単語も可能となっている。
以下に主要な素子を列挙する。(細かいオプションは略)

#### 抵抗(R)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `N+` | 必須 | プラス端子に接続するネット名。 |
| `N-` | 必須 | マイナス端子に接続するネット名。 |
| 値 | 必須 | 抵抗値。単位はオーム。単位は記述しないが、接辞は使える。 |

#### キャパシタ(C)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `N+` | 必須 | プラス端子に接続するネット名。 |
| `N-` | 必須 | マイナス端子に接続するネット名。 |
| 値 | 必須 | 容量値。単位はファラド。単位は記述しないが、接辞は使える。 |

#### インダクタ(L)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `N+` | 必須 | プラス端子に接続するネット名。 |
| `N-` | 必須 | マイナス端子に接続するネット名。 |
| 値 | 必須 | インダクタンス値。単位はヘンリー。単位は記述しないが、接辞は使える。 |

#### 相互インダクタ(K)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `Lインスタンス名1次` | 必須 | 1次側のインダクタの体識別名。 |
| `Lインスタンス名2次` | 必須 | 2次側のインダクタの体識別名。 |
| M結合 | 必須 | 結合係数。 |

#### 独立電圧源(V)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `N+` | 必須 | プラス端子に接続するネット名。 |
| `N-` | 必須 | マイナス端子に接続するネット名。 |
| `オプション ...` | 任意 | オプション。交流・直流の区別や形式や電圧値など。 |

#### 独立電流源(I)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `N+` | 必須 | プラス端子に接続するネット名。 |
| `N-` | 必須 | マイナス端子に接続するネット名。 |
| `オプション ...` | 任意 | オプション。交流・直流の区別や電圧値など。 |

#### 電圧制御電流源(G)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `N+` | 必須 | プラス端子に接続するネット名。 |
| `N-` | 必須 | マイナス端子に接続するネット名。 |
| `N制御+` | 必須 | 制御電圧プラス端子に接続するネット名。。 |
| `N制御-` | 必須 | 制御電圧マイナス端子に接続するネット名。 |
| `値` | 必須 | 相互コンダクタンス値。 |

#### 電圧制御電圧源(E)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `N+` | 必須 | プラス端子に接続するネット名。 |
| `N-` | 必須 | マイナス端子に接続するネット名。 |
| `N制御+` | 必須 | 制御電圧プラス端子に接続するネット名。。 |
| `N制御-` | 必須 | 制御電圧マイナス端子に接続するネット名。 |
| `値` | 必須 | 電圧増幅率。 |

#### 電流制御電流源(F)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `N+` | 必須 | プラス端子に接続するネット名。 |
| `N-` | 必須 | マイナス端子に接続するネット名。 |
| `N制御` | 必須 | 制御電流がある電圧源のノード名。 |
| `値` | 必須 | 電流増幅率。 |

#### 電流制御電圧源(H)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `N+` | 必須 | プラス端子に接続するネット名。 |
| `N-` | 必須 | マイナス端子に接続するネット名。 |
| `N制御` | 必須 | 制御電流がある電圧源のノード名。 |
| `値` | 必須 | 相互抵抗値。 |

#### ダイオード(D)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `NA` | 必須 | アノード端子に接続するネット名。 |
| `NK` | 必須 | カソード端子に接続するネット名。 |
| `モデル名` | 必須 | モデル名。 |
| `オプション ...` | 任意 | オプション |

#### バイポーラトランジスタ(Q)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `NC` | 必須 | コレクタ端子に接続するネット名。 |
| `NB` | 必須 | ベース端子に接続するネット名。 |
| `NE` | 必須 | エミッタ端子に接続するネット名。 |
| `モデル名` | 必須 | モデル名。 |
| `オプション ...` | 任意 | オプション |

#### 接合形電界効果トランジスタ(J)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `ND` | 必須 | ドレイン端子に接続するネット名。 |
| `NG` | 必須 | ゲート端子に接続するネット名。 |
| `NS` | 必須 | ソース端子に接続するネット名。 |
| `NB` | 任意 | バルク端子(バックゲート端子)に接続するネット名。 |
| `モデル名` | 必須 | モデル名。 |
| `オプション ...` | 任意 | オプション |

#### MOS形電界効果トランジスタ(M)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `ND` | 必須 | ドレイン端子に接続するネット名。 |
| `NG` | 必須 | ゲート端子に接続するネット名。 |
| `NS` | 必須 | ソース端子に接続するネット名。 |
| `NB` | 任意 | バルク端子(バックゲート端子)に接続するネット名。 |
| `モデル名` | 必須 | モデル名。 |
| `オプション ...` | 任意 | オプション |

#### 無損失伝送線路(T)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `N1+` | 必須 | 1次側の+端子に接続するネット名。 |
| `N1-` | 必須 | 1次側の-端子に接続するネット名。 |
| `N1+` | 必須 | 2次側の+端子に接続するネット名。 |
| `N1-` | 必須 | 2次側の-端子に接続するネット名。 |
| `値` | 必須 | 特性インピーダンス値。 |

#### 有損失伝送線路(O)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `N1+` | 必須 | 1次側の+端子に接続するネット名。 |
| `N1-` | 必須 | 1次側の-端子に接続するネット名。 |
| `N1+` | 必須 | 2次側の+端子に接続するネット名。 |
| `N1-` | 必須 | 2次側の-端子に接続するネット名。 |
| `モデル名` | 必須 | モデル名。 |

#### 一様分布RC線路(U)

| 項目 | 任意性 | 指定するべきもの |
| --- | --- | --- |
| `インスタンス名` | 必須 | インスタンス名。 |
| `N+` | 必須 | RC伝送線路が結ぶノードのネット名。 |
| `N-` | 必須 | RC伝送線路が結ぶノードのネット名。`N+` の反対側。 |
| `NC` | 必須 | キャパシタがつながるネット名。 |
| `length` | 必須 | RC伝送線路の長さ。 |
| `オプション ...` | 任意 | オプション |

#### サブサーキット

##### 定義の仕方

素子ではないが同一の回路ブロックを複数使用する場合、それを階層化するために用いる。`N1`、`N2`、`...` は端子名。

##### 利用の仕方

この回路の利用するには、

と記述する。

### 制御文詳細

#### 過渡解析初期設定(.IC)

| 項目 | 指定すべき値 |
| --- | --- |
| `Vインスタンス名n` | 初期値を指定したいノードの名前。 |
| `初期値n` | `Vインスタンス名n`で指定したノードの初期値。 |

#### 過渡解析指定(.TRAN)

| 項目 | 指定すべき値 |
| --- | --- |
| `ステップ` | `.PRINT` または `.PLOT` の区切り時間。 |
| `最終時刻` | `.PRINT` または `.PLOT` の最終時刻。 |
| `オプション ...` | オプション |

#### 直流解析指定(.DC)

| 項目 | 指定すべき値 |
| --- | --- |
| `対象のインスタンス名` | 対象の独立電圧源または電流源のインスタンス名。 |
| `開始値` | 開始値。 |
| `終了値` | 終了値。 |
| `増分` | 増分。 |
| `オプション ...` | オプション。 |

#### 温度指定(.TEMP)

| 項目 | 指定すべき値 |
| --- | --- |
| `温度` | 温度。 |

#### オプション(.OPTIONS)

| 項目 | 指定すべき値 |
| --- | --- |
| `オプションn` | オプション。 |

## 歴史

初期のバージョンはFORTRANで書かれておりフリーウェアとして公開されている。後にはC言語に移植された(バージョン3)。

- 1973年 SPICE
- 1975年 SPICE2
- 1981年 SPICE2G.6 主要商用版の元
- 1985年 SPICE3 この版よりC言語化

1980年代 商用版各種登場(HSPICE、PSPICEなど)

## 派生したSPICEソフトウェア

- spice3f (バークレイによる最終版)
- ngspice (オープンソース版SPICEのひとつ)
- Qucs (オープンソース版SPICEのひとつ入手ページ)
- HSPICE (meta software社開発、現シノプシス)
- PSpice (MicroSim社開発、現ケイデンス・デザイン・システムズ)
- SmartSpice (シルバコ社 入手ページ)
- LTSpice (アナログ・デバイセズ社配布 入手ページ)
- TINA-TI (テキサス・インスツルメンツ社配布 入手ページ)

## 名前の由来

SPICE という名前は、英語の「simulation program with integrated circuit emphasis」に由来する。