New!: 2024/11/19 まだプログラムは公開していませんが、汎用最適化フレームワーク を用いた optimize_ATLAS.pyで最小二乗フィッティングができるようになりました
本ページでは、半導体デバイスシミュレータ SILVACO社 ATLASについて以下の話題を取り上げます
対象者:
注意:
以下の内容は、神谷が解析した結果を含みますので、全てのATLASバージョン・配布パッケージについて同じであることを保証するものではありません。
読者が解析する際のご参考としてお読みください
機能: 現在ATLASでサポートしているのは、RHEL,
CentOS, Rocky Linuxのみです。
本項についてのSILVACO社サポートへのお問い合わせはご遠慮ください。
また、本稿及び本Webページの記載に関しての結果は、すべて実施者本人の責任でお願いします。
以下の作業にはroot権限が必要です。実施される場合、十分な対策と注意をお願いします。
機能: ATLASでは、ATLAS本体に含まれていないモデルを、C言語を使ってユーザが実装できます。
C-Interpreterプログラムの作り方 (公式サポート対象):
i. atlas -help でモジュール名を確認する (TFTの場合は 'TFT')
ii. % atlas -T モジュール名
を実行すると、C-interpreterのtemplateファイルを
'モジュール名' で保存してくれる
iii. 対応する関数を編集し、適当な名前で保存する (例:
mobility.c)。電解依存移動度モデルであれば tofimun。
iv.
シミュレーションでC-Interpreterファイルを読み込みには、入力ファイルで関数名を指定する。
例:
mobility f.tofimun="mobility.c"
iv': C-Interpreterファイルは、shared libraryとしても読み込める
(公式サポート対象)
gccでコンパイルするが、デフォルトではATLASのincludeファイル
template.h は読み込めないので、#include <template.h>
を削除しておく
C-interpreterファイルでmath libaryを参照 (exp,log,powなど)
している場合、math libraryなどもリンクする
shared library作成:
gcc -fPIC -shared -o mobility.so mobiliy.c -lm
例:
option cint.dll
mobility f.tofimun="mobility.so"
iv'': C-Interpreterファイルは、main関数を追加してコンパイルすれば、通常のCプログラムとして実行できる
(公式サポート対象外)
gccでコンパイルするが、デフォルトではATLASのincludeファイル
template.h は読み込めないので、#include <template.h>
を削除しておく
C-interpreterファイルでmath libaryを参照 (exp,log,powなど)
している場合、math libraryなどもリンクする
shared library作成:
gcc -o mobility mobiliy.c -lm
iv''': shared libraryはpython等から呼び出して可視化などができる。pythonからのC言語呼び出し 参照 (公式サポート対象外)
動作状況及びATLASのパッケージ内容から、C-Interpreterはgccでコンパイルされているものと推測されます。
LinuxではPATH変数でアクセスできるgcc、Windowsでは [sedatools]\sedatools\lib\mingw
([sedatools]はATLASのインストール√ディレクトリ) に
MinGWがインストールされており、64bit Windowsでは 408.104.1.R\x86_64-windows\bin\gcc.exe
が使われているものと思われます。
そのため、C-InterpreterのCプログラムを作成した場合、main()関数を追加してこれらのgccコンパイラでコンパイルして実行可能ファイルを生成することで
プログラムの事前チェックが可能です。特に、main()関数中でC-Interpreter関数
(tofimun()など) を呼び出し、計算結果を出力することで、
プログラミングした移動度モデルなどが期待通りに動いているか、確認できます。
同様に、gccによりshared libraryを作成できます。shared
libraryはpythonからも呼び出しが可能ですし、また、ATLASからもoption
cint.dllを
使うことで呼び出すことができます。
ただし、上記gccコンパイラで通ったCプログラム
(Windows11最新版@2023で gcc (rev2, Built by MinGW-W64 project) 4.8.1)
はC99に対応しているようですが、
C-Interpreterでは局所変数は関数の先頭で宣言しないとエラーになりますので、単純に上記のgccコンパイラを使っているわけでもないようです。
また、2023/12現在、Linux版のC-Interpreterでは、for文が正常に機能していないようです。小規模のfor文の場合、unrollingするほうが無難です。
注意:
初期化が必要な大域変数はstatic宣言をすること。
初期化が不確かな場合、定数であってもC-Interpreter関数の局所変数として毎回初期化するほうが無難。
#define
で定数マクロとして展開すれば大丈夫だと思いますが、確認はしていません。
仕様上、shared
libraryが読み込まれるとき、呼び出されるときは、大域変数は初期化されません。
ただし、static宣言された静的大域変数はコンパイル時に値が割り当てられるため、shared
libraryが読み込まれた時点で大域変数に初期値が設定されています。
#defineで定義される定数マクロはプリプロッセスで展開されて定数に置換されるため、初期化の問題はないと思われます(未確認)。
注意: optimizerはLinux版限定の機能です
機能: optimizerはdeckbuildの機能として、ATLASなどの入力ファイルに含まれるパラメータを実測値のI-V特性などにフィッティングする機能を提供します。
必要なファイル:
・ フィッティング対象ファイル *.dat
フィッティング対象の実測値などのファイル。.dat形式
例:
drain current vs gate bias
7 2 2
gate bias
drain current
8 5E-07
7 4E-07
6 3E-07
5 2E-07
4 1E-07
3 8E-08
2 3E-08
・ 入力ファイル *.in
最適化するパラメータを
set文で設定する。パラメータは $変数名 で参照できる
フィッティング対象ファイルと対応させる計算値は、計算結果を.logに保存したうえで
extract文で抽出する。
例:
set nta1=1.0e20
defects region=2 continuous numa=101 numd=101 \
afile=defacc.out dfile=defdon.out \
nta=$nta1 ntd=$ntd1 wta=$wta1 wtd=$wtd1 \
(continued)
solve init
solve prev
solve vdrain=0.1 name=drain
solve vgate=0.0 vstep=1.0 vfinal=8.0 name=gate
log off
log outf=id-vg_vd=001.log no.trap
solve vgate=8.0 vstep=-1.0 vfinal= 2.0 name=gate
extract name="idvg" curve(v."gate",i."drain") outfile="idvg_calc_2onl.dat"
log off
quit
・ 最適化条件設定ファイル *.xml
最適化するパラメータ (name)、初期値 (nom:
最新バージョンでは実際の初期値はずれます)、値範囲 (min,
max)、値スケール (scale)、
フィッティングさせるフィッティング対象ファイル
(reference)とシミュレーションファイル (simulated)、
最適化条件 (maxfev: 最大繰り返し数、epscn, gtol, xtol, ftol:
収束精度)
を設定します。
例:
<optimization>
<parameter-list>
<parameter name="nta1" nom="1.0e20" min="1.0e10" max="1.0e22" scale="log" />
<parameter name="nga1" nom="5e+17" min="1.0e10" max="1.0e20" scale="log" />
</parameter-list>
<target-list>
<target name="idvg" type="curve" reference="idvg_meas.dat"
simulated="idvg_calc.dat" />
</target-list>
<settings>
<setting name="epscn" value="0.0001" />
<setting name="maxfev" value="255" />
<setting name="gtol" value="0.0" />
<setting name="xtol" value="0.01" />
<setting name="ftol" value="0.01" />
</settings>
</optimization>
・ 実行
deckbuildを以下のオプションで実行する
% deckbuild -run -ascii 入力ファイル -opt
最適化条件設定ファイル