文法ガイド
このセクションはJoSIMの中で利用可能な文法の包括的なガイドになります。
JoSIMはCaSe InSeNsItIvEであり各行は読み込また際に大文字に変換されます。
付け加えると、いくつかの特定のケースでは値を解釈する際混乱を生むことになるため値に単位をつけるのは推奨されません。例えばキャパシタにファラド(F)を指定したとき、後ろにFがついている値というのはフェムト(f)に解釈されてしまうかもしれません。これは5ファラドのキャパシタが欲しくても5フェムトファラドのキャパシタになってしまうということです。素子のタイプが単位を示すため、決してシミュレータによっては単位は解釈されません。
基本的な文法
各行はノーブレークスペースを識別子として用いる似たような構文に則っています。各識別子はJoSIMに各行をどのように処理すればいいかを指定しています。
識別子は例えばL, C, Rのような回路中の物理素子に関係する文字から始まっています。この類の行はほぼ常にラベルと2つのノードを必要とする同様の文法に則っています。ノードには英数字を使うことができ、ただし0とGNDは接地されたノードであることを示します。そして、JoSIMの予約語であるため、ピリオド(.)またはパイプ(|)のラベルまたはノード名への使用は禁止されています。
ピリオド(.)によって始まる行は何らかのシミュレーションコントロールに関係していることを示しています。このような場合コマンドはコントロールを示すピリオドの後に続きます(.tran, .print, .endなど)。
アスタリスク(*)もしくはシャープ(#)に続く行はコメントです。コメントは置かれている行に入っていることになりますが行末に置かれた場合は機能しません。
行がプラス(+)から始まっている場合その行は前の行からの続きであることを表しています。内部的には二つの行は結合されます。多くの場合において素子のVALUEは変数名や式によって置き換え可能です。変数は.PARAMコントロールを用いて定義可能です。これについてはさらに詳しく議論されていきます。
JoSIMでの値は工学的記数法またはSI接頭語を用いて調整することができます。使用可能なSI接頭語のリストは以下の通りです:
SI接頭語 | 意味 | 工学的記数法での値 |
---|---|---|
F | Femto | 1E-15 |
P | Pico | 1E-12 |
N | Nano | 1E-9 |
U | Micro | 1E-6 |
M | Milli | 1E-3 |
K | Kilo | 1E3 |
MEG | Mega | 1E6 |
X | Mega | 1E6 |
G | Giga | 1E9 |
T | Tera | 1E12 |
基本素子
ここからは全ての使用可能な物理素子と制限について見ていきます。角括弧の中のパラメータは任意のものでありネストされた角括弧はその前のものがあることに依存した、カプセル化されたパラメータを意味しています。
抵抗
RLabel \(N^{+}\) \(N^{-}\) VALUE [temp=<TEMP>] [neb=<FREQ>]
抵抗の値はオームです。
温度はノイズ解析に使用され、単位はケルビンです。JoSIMではケルビンとしてKを使おうとしてもキロとして解釈されるため、単位は除外しておく必要があります。(例:4Kは4000になります。)
任意の周波数パラメータはノイズ解析における雑音の有効帯域幅を設定します。デフォルトは1GHzです。
インダクタ
LLabel \(N^{+}\) \(N^{-}\) VALUE
インダクタの値はヘンリーで表されます。
キャパシタ
CLabel \(N^{+}\) \(N^{-}\) VALUE
キャパシタの値はファラドで表されます。
Josephson Junction (JJ)
BLabel \(N^{+}\) \(N^{-}\) <PhaseNode> MODEL [area=<AREA>] [ic=<IC>] [temp=<TEMP>] [neb=<FREQ>]
ジョセフソン接合は二端子デバイスですがWRspiceとの互換性のため三番目の接続されていないノードと共に定義することも可能です。このノードはJoSIMでは使用されません。
ジョセフソン接合には、.MODELコントロールを用いてプログラムのどこにでも定義することができるモデル名の詳細が必要です。
AREAまたはICが指定されていない場合area=1がデフォルトで使用されます。
tempとnebコマンドの説明は抵抗と同じです。
モデル
モデルコントロールは次のような文法を持ちます。
This model control has the following syntax
.MODEL ModelName ModelType([MODEL PARAMETERS])
JoSIMで現在サポートしている接合モデルはRCSJモデルだけであるため唯一使用可能なモデルタイプは次のようにパラメータが設定可能なjjだけです:
パラメータ | 範囲 | デフォルト | 説明 |
---|---|---|---|
RTYPE | 0, 1 | 1 | 線型化モデルが使われている |
VG or VGAP | -\(\infty\), \(\infty\) | 2.8E-3 | 超電導ギャップ電圧 |
IC or ICRIT | -\(\infty\), \(\infty\) | 1E-3 | 超電導臨界電流値 |
RN | 0, \(\infty\) | 5 | 接合抵抗 |
R0 | 0, \(\infty\) | 30 | サブギャップ抵抗 |
C or CAP | 0, \(\infty\) | 2.5E-12 | 接合容量 |
T | 0, \(\infty\) | 4.2 | 接合部温度 (K) |
TC | 0, \(\infty\) | 9.1 | 超電導素材の臨界温度 |
DELV | 0, \(\infty\) | 0.1E-3 | サブギャップから常伝導状態への転移電圧 |
D | 0.0, 1 | 0.0 | 電流位相関係に影響する接点の透過率 |
ICFCT or ICFACT | 0, 1 | \(\frac{\pi}{4}\) | 臨界電流の準粒子ステップ高さに対する比 |
PHI | 0, \(2\pi\) | 0 | \(\pi\)-junctionのようなphi-junctionを実現可能にする |
CPR | {\(-\infty\), \(\infty\)) | {1} | 現在の位相関係の高調波振幅を設定します。 |
.model の行はサブサーキット固有であるため同じ名前の異なるモデルを分離されたサブサーキット下にそれぞれ置くことができます。サブサーキット下にモデルが見つからなかった場合グローバルなものを探すことになり、それでも見つからない場合はデフォルトの値(デフォルトのモデル)が使用されます。
AREAとICパラメータはモデルパラメータの修飾子としてはたらきます。ICが指定されるとAREAの値は\(AREA=\frac{IC_{jj}}{IC_{model}}\)によって置き換えられる、臨界電流でかけられた値となります。
モデルのPHIパラメータを設定することで、JJ電流の\(\sin(\phi)\)部分の中にある位相(\(\phi\))から常に引いたものが位相の値になります。これによって\(\pi\)-junctionのような素子をモデル化可能です。
CPR パラメータは、ジャンクション超電流の個々の高調波を変更します。 単一の値、または中括弧でカプセル化された n 個の値の配列のいずれかです。 つまり、CPR={0.9, 0.1} は、現在の位相関係を次の \(I = I_C(0.9\sin(\phi) + 0.1\sin(2\phi))\) に設定します。12
Transmission Line
TLabel \(N^{+}_{1}\) \(N^{-}_{1}\) \(N^{+}_{2}\) \(N^{-}_{2}\) TD=VALUE Z0=VALUE
TDは単位時間あたりの遅延時間です。
Z0はオームで表したインピーダンスです。
相互インダクタンス
KLabel \(L_{1}\) \(L_{2}\) VALUE
値は結合係数kです。
Sources
Independent Sources
電圧源
VLabel \(N^{+}\) \(N^{-}\) SOURCETYPE
電流源
ILabel \(N^{+}\) \(N^{-}\) SOURCETYPE
位相源
PLabel \(N^{+}\) \(N^{-}\) SOURCETYPE
Dependent Sources
電流制御電流源
FLabel \(N^{+}\) \(N^{-}\) \(N^{+}\)Control \(N^{-}\)Control CURRENT GAIN
電流制御電圧源
HLabel \(N^{+}\) \(N^{-}\) \(N^{+}\)Control \(N^{-}\)Control TRANSRESISTANCE IN OHMS
電圧制御電流源
GLabel \(N^{+}\) \(N^{-}\) \(N^{+}\)Control \(N^{-}\)Control TRANSCONDUCTANCE IN MHOS
電圧制御電圧源
ELabel \(N^{+}\) \(N^{-}\) \(N^{+}\)Control \(N^{-}\)Control VOLTAGE GAIN
Source Types
区分線形 (PWL)
pwl(0 0 \(T_{1}\) \(A_{1}\) ... \(T_{n}\) \(A_{n}\))
このソースは指定された振幅間で、シミュレーション中の各時間において線形に振幅を補間します。
最初の2つの値はシミュレーションのはじめに0にしておく必要があります。
パルス
pulse(\(A_{1}\) \(A_{2}\) [\(T_{D}\) [\(T_{R}\) [\(T_{F}\) [PW [PER]]]]] )
このソースは二つの振幅(\(A_{1}\)と\(A_{2}\))にわたり、\(T_{D}\)後に始まってrise・fallタイム(\(T_{R}\) & \(T_{F}\))を持つパルスを生成します。rise・fallタイムのデフォルトはトランジェントシミュレーションのステップサイズです。
PWとPERはそれぞれパルス幅と周期を参照しています。この値は指定されていないときデフォルトではトランジェントシミュレーションの停止時間となります。
このソースでは周波数を設定したとき継続的にパルスを発生させられるようになります。
サイン波
sin(\(A_{O}\) \(A\) [\(f\) [\(T_{D}\) [\(\theta\)]]] )
\(A_{O}\)がオフセット、\(A\)が振幅、\(f\) が周波数で\(\frac{1}{T_{STOP}}\)がデフォルトであるようなサイン波を生成するソースです。
\(T_{D}\) 停止時間を設定し、\(\theta\)は信号振幅を変調させます。
この関数は次の式に基づきトランジェント解析中の各ステップにおいてデータ点を生成します:
\(f(t)=A_{O}+A\sin(2\pi f(t-T_{D}))e^{-\theta(t-T_{D})}\)
カスタム波形
cus( wavefile \(T_{S}\) SF IM [\(T_{D}\) PER] )
このソースはテキストの波形ファイルの中の点に基づいて関数を生成することが出来ます。このファイルは一行でスペース区切りの数値が入っていなければなりません。(例:0 2 3 6 2 1 0)
行中の各数値はタイムステップ\(T_{S}\)で分けられた振幅を表しており、スケールファクターSFによって拡大縮小されています。点と点の間の値は補間なし(0)、線形補間(1)、またはキュービック補間(2)のいずれかを用いて補間されます。関数はPERが1にセットされていると周期的にすることができ、ここでパターンはシミュレーション全体にわたって繰り返されます。
波形は\(T_{D}\)から始まります。
DC
dc \(A\)
DCソースはシミュレーションの間いつでも\(A\)となります。 A DC source that is always at \(A\) at any given time during the simulation.
ノイズ
noise(\(A\) \(T_{D}\) \(T_{STEP}\))
このソースは\(T_{D}\)の後のタイムステップに対しノイズ値を生み出します。\(T_{STEP}\)は、.neb
を使うことでグローバルに、またはneb=
を用いて抵抗に対しローカルに設定される、ノイズの有効帯域幅の逆数です。
返されるノイズ値は次の式を用いて計算されます:
\(f(t) = A\frac{GRAND()}{\sqrt{2T_{STEP}}}\)
\(GRAND()\)はガウシアン乱数生成関数です。
指数関数
exp( \(A_{1}\) \(A_{2}\) \(T_{D1}\) \(\tau_{1}\) \(T_{D2}\) \(\tau_{2}\))
Parameter | Default |
---|---|
\(T_{D1}\) | 0.0 |
\(T_{D2}\) | \(T_{STEP}\) |
\(\tau_{1}\) | \(T_{D1}+T_{STEP}\) |
\(\tau_{2}\) | \(T_{STEP}\) |
3つの異なる時間区分で異なる値を返します。
\(t < T_{D1}\)において:
\(f(t)=A_{1}\)
\(T_{D1}\le t < T_{D2}\)において:
\(f(t) = A_{1}+(A_{2}-A_{1})(1-e^{\frac{t - T_{D1}}{\tau_{1}}})\)
$T_{D2} \le t $において:
\(f(t) = A_{1}+(A_{2}-A_{1})(1-e^{\frac{t - T_{D1}}{\tau_{1}}})+(A_{1}-A_{2})(1-e^{\frac{t - T_{D2}}{\tau_{2}}})\)
コントロールコマンド
シミュレーションエンジンには、今ちょうど供給されたコンポーネントに対して何をしたらいいか知るためのコントロールコマンドが必要です。
コントロールコマンドの中では、それ抜きでシミュレーションは出来ないので、トランジェントシミュレーションコマンドが一番大事になります。
トランジェント解析
.tran \(T_{STEP}\) \(T_{STOP}\) [\(P_{START}\) [\(P_{STEP}\)]] DST
これによって0から\(T_{STOP}\)までを走るシミュレーションが生成されます。実行されるシミュレーションステップ量は\(n=\frac{T_{STOP}}{T_{STEP}}\)です。
\(P_{START}\)はどの点の出力が最初に出力されるかを示します。\(P_{STEP}\)は出力ステップの大きさを設定します。これは\(T_{STEP}\)以上でなければなりません。
DSTはstart-up timeを使用できなくします。start-up timeとは部品がついているシミュレータによって内部的に計算されている時間のことです。これは回路が最初に電力を受け取ってから(電源スイッチがonになってから)の数psと同等です。
サブサーキット
サブサーキットによって、大きなデザインを部分に分割し小さな回路を再利用することが可能です。サブサーキットによって囲まれると、コントロールデバイスはネットリストの任意の場所で記述されているものと同じ名前を持つことができ、サブサーキットによって完全に隔離されているのと同じ状態になります。
サブサーキットは次のようなラップするためのコントロール文を持っています。
.subckt SubcktName IO Nodes
...
.ends
SubcktNameはサブサーキットの名前を指定しておりIO Nodesはサブサーキット内でどのノードが外側につながっているのかを指定しています。
サブサーキットはメインのネットリストまたは他のサブサーキット(ネスト)で次の文法により使うことができます:
XLabel SubcktName IO Nodes (JSIM mode)
XLabel IO Nodes SubcktName (WRspice (normal SPICE) mode)
さらに、LABEL=VALUEの形で書かれるキーワードはサブサーキット記述の最後の行に追加することができ、インスタンス化された際サブサーキット内のLABELコンポーネントの値は関連するVALUEに置き換えられます。独立なサブサーキットのインスタンス化が可能になるため、元のサブサーキットの変更をしたり、同じ定義のサブサーキットを複数作ったりすることなく様々なパラメータをテストするのに役立つことでしょう。
ノイズ
技術的な議論の中でも述べられているように、各抵抗と並列な電流源として自動的にノイズを入れることが可能です。この熱雑音の温度と帯域幅は次のコマンドを使うことで大域的に指定することが可能です:
.temp 温度(ケルビン)
.neb 帯域幅(Hz)
ばらつき
JoSIMはインダクタ、抵抗、キャパシタ、JJ (area/Ic)の仮の値から指定したパーセンテージの範囲内で均一にばらつきを持たせることが出来ます。毎回この値は(行列生成に)使われ、一様な分布から新しいランダムな値が選ばれます。
これによりプロセスによる変動をシミュレーションすることができます。
大域的にばらつきを設定するには、次のコントロールを設定する必要があります:
.spread 正規化されたパーセンテージ [L=インダクタのばらつき] [B=JJのばらつき] [C=キャパシタのばらつき] [R=抵抗のばらつき]
各部品は、部品を定義している行にspread= と名付けられたパラメータを追加することでばらつかせることができます。
優先順位としてはまずローカル、特定のグローバル変数、そしてグローバル変数の順です。つまり、グローバルなばらつきやインダクタ特有のグローバルなばらつきが設定されていたとしても、ローカルなばらつきを持ったインダクタが追加された場合それが最も優先されます。
例:
インダクタが2pHという値を持っていた場合、これが仮の値になります。もしローカルで0.2のばらつきが指定されていた場合、これはランダムな値が1.6pHから2.4pHの間で選ばれることを意味しています。もしグローバルにインダクタ固有のばらつきが0.3に指定されておりローカルなばらつきは指定されていない場合、値は1.4pH - 2.6pHの範囲をとり得ます。同じようにグローバルなばらつきが0.5と定義されていた場合毎回のシミュレーションでは1pHから3pHの間の値を取ります。
IV曲線
JoSIM allows the user to output an IV curve for a specified JJ model within the netlist using the following command:
JoSIMでは次のコマンドでネットリスト中において指定されたJJモデルのIV曲線を出力することができます:
.iv モデル名 最大電流 ファイルパス
このコマンドはfilepathに指定されたカンマ区切り(CSV)の値を、modelnameのIV曲線のデータについて、負のmax_currentから正のmax_currentまで出力します。
サブサーキットのモデルは、modelname やサブサーキットのNAMEの間を.
(ピリオド)もしくは|
(パイプ)で区切って出力することができます。
出力
シミュレーションは結果のポスト処理が行われるまで意味がありません。この出力をどう保存するかシミュレータが知るためには出力コントロールコマンドを必要とします。
出力コマンドはどちらの場合もあり得ます:
.print .plot .save
どちらのコマンドでも、いずれかのコマンドが続く場合があります:
PrintType Device or Node
PType(Device or Node)\(_0\) ... PType(Device or Node)\(_n\)
ここでPrintTypeはデバイス電圧(DEVV)、デバイス電流(DEVI)、デバイス位相(PHASE)、ノード電圧(NODEV)、またはノード位相(NODEP)となる可能性があります。
デバイスタイプを指定する場合一つだけのデバイスが指定出来ますが、ノードタイプの場合2つのノードの差を指定することが可能です。
PTypeは上の省略形で行ごとに複数持つことが出来ます。PTypeはV、I(またはC)、Pのいずれかとなり、括弧の中に入る形でデバイスまたはノードの後に続きます。もし一つより多いデバイスまたはノードがカンマ区切りで指定される場合(最大は2)、2つのデバイスまたはノードの差が格納されます。
次のような文法で追加のセーブ型も存在します:
@Device[PType]
これは指定されたデバイスのPTypeを保存します。
サブサーキットのパラメータは.
(ピリオド)または|
(パイプ)をデバイスのラベルとサブサーキットのラベルのセパレータとして用いて出力可能です。
例: .print v(14.X01) p(B01.X02)
この方法ではネストしたサブサーキットが使われているとき内側から外側に向かって辿っていっています。
前に述べたようにサブサーキットはシミュレーション上で展開されるためほぼ無限にネストすることが可能です。
もしラベルが直ちに明らかになってはおらず出力に必要な場合、シミュレーションは展開されたメイン回路を示すため-V 3
CLIオプションを使って実行される可能性があり、正確なラベル名が識別できるようになります。
ファイル
次のコマンドで出力コマンドを分けることにより複数ファイル出力を実現できます:
.file filepath
このコマンドに従う全ての出力リクエストはfilepathによって指定されたファイルの中に格納されている必要があるということを示しています。
例:
.file output1.csv
.print p(B1) p(B2) p(B3)
.file output2.dat
.plot i(L01) i(L02) i(L03)
.file output3
.save v(1) v(2) v(3)
これにより3つの出力ファイルが作られます。最初の行により位相出力のみのCSVファイルができます。2番目のファイルは電流のみを含むスペース区切りファイルです。最後に、3番目のファイルはSPICE RAWフォーマットとなり電圧のみを含みます。
このコマンドの使用によってファイルを出力するためのコマンドラインオプションに影響を与えることはありません。コマンドライン出力オプションがもし与えられれば、全ての出力リクエスト(位相、電流、電圧)が含まれた追加のファイルが出力されます。
パラメータ
JoSIMの中で重要となる最後のコントロールコマンドは次の構文を持つパラメータコマンドです:
.param VarName=Expression
VarNameは回路中のどこでも使える変数名で、Expressionはダイクストラ操車場アルゴリズムの実装を用いて評価される数式であり、ここで数式は逆ポーランド記法(RPN)に変換され評価されます。
さらに、数式に他の変数やパラメータが含まれる場合全ての変数が値へと変換されるまで続けて評価されます。もし変数がプログラム内に定義されていない場合終了しエラーを出します。
数式のパースは.param コントロール限定です。つまり素子の値やプロットのパラメータやモデルのコントロールとして数式が広く全体に使われてしまうと、JoSIMは文字列をdouble型に変換しようとして std::invalid_argument: stod: no conversionのエラーを起こします。
コントロールブロック
次の構文を用いて、上に書かれた全てのコントロールはコントロールブロックの中にまとめることが出来ます:
.control
...
.endc
ここで全てのコントロールはコマンドに通常ついている.
(ピリオド)を省略することで指定可能です。
このブロックは、今のところ一見無意味なようですが、将来的にさらに発展的な機能として使われます。
Include
JoSIMは次の構文を用いて.include コントロール句を使えるようになっています:
.include relative_path_to_file
このコマンドは、ネットリストをパースした際の関連パスによって指し示される関連ファイルの内容を読み込みます。これは大きなサブサーキットが含まれていたり、サブサーキットの再利用が複数ファイルに渡って必要な場合に非常に便利です。
これはシミュレーションに使われる全てのモデルをまとめておくのにも使えるので、モデルが変更されるような際にも変更の中心を決めておくことができます。
標準入力
JoSIMは現在標準入力からの入力を受け付けるようになっており.end句が見つかるまで、もしくは代わりにEOF文字が返されるまでネットリストを一行一行読み込むことができます。
定数
JoSIMはビルトインの定数セットを持っており、展開された時対応する値になります。以下は定数とその値のリストです。定数名は大文字でも小文字でも無関係です:
Constant | Symbol | Value |
---|---|---|
PI | \(\pi\) | 3.141592653589793238463 |
PHI_ZERO | \(\Phi_{0}\) | 2.067833831170082E-15 |
BOLTZMANN | \(k_{B}\) | 1.38064852E-23 |
EV | \(e\) | 1.6021766208E-19 |
HBAR | \(\bar{h}\) | 1.0545718001391127E-34 |
C | \(c\) | 299792458 |
MU0 | \(\mu_{0}\) | 12.566370614E-7 |
EPS0 | \(\epsilon_{0}\) | 8.854187817E-12 |
SIGMA | \(\sigma\) (short for \(\frac{\Phi_{0}}{2\pi}\)) | 3.291059757E-16 |
-
I. Salameh, E. G. Friedman and S. Kvatinsky, "Superconductive Logic Using 2ϕ—Josephson Junctions With Half Flux Quantum Pulses," in IEEE Transactions on Circuits and Systems II: Express Briefs, vol. 69, no. 5, pp. 2533-2537, May 2022, doi: 10.1109/TCSII.2022.3162723. ↩
-
S. V. Bakurskiy et al., "Current-phase relations in SIsFS junctions in the vicinity of 0-\(\pi\) Transition", Phys. Rev. B Condens. Matter, vol. 95, pp. 94522-94528, Mar. 2017. ↩