SILVACO社ATLAS TFT2D Tips

New!: 2024/11/19 まだプログラムは公開していませんが、汎用最適化フレームワーク を用いた optimize_ATLAS.pyで最小二乗フィッティングができるようになりました

 

本ページでは、半導体デバイスシミュレータ SILVACO社 ATLASについて以下の話題を取り上げます

対象者:

注意:


以下の内容は、神谷が解析した結果を含みますので、全てのATLASバージョン・配布パッケージについて同じであることを保証するものではありません。
読者が解析する際のご参考としてお読みください

  1. AlmaLinuxでの使用について (サポート対象外)
  2. C-Interpreterについて (C-Interpreter自体は正規の機能です)
  3. C-Interpreterで使われるCコンパイラとC言語機能の制限 (神谷の独自解析)
  4. ATLAS/deckbuildにおけるC-Interpreterの動作 (神谷の推測)
     動的リンクライブラリ (Windows: DLL - Dynamic Load Library, Linux: shared library)
  5. pythonからのC言語呼び出し
  6. 高度なC-Interpreter機能の呼び出し (神谷の独自解釈・推測を含む)
     C-Interpreter DLLの呼び出し
     C-Interpreter DLLへの他コード、多言語、ライブラリ等のリンク

AlmaLinuxでの使用について (サポート対象外)

機能: 現在ATLASでサポートしているのは、RHEL, CentOS, Rocky Linuxのみです。
    本項についてのSILVACO社サポートへのお問い合わせはご遠慮ください。
    また、本稿及び本Webページの記載に関しての結果は、すべて実施者本人の責任でお願いします。
    以下の作業にはroot権限が必要です。実施される場合、十分な対策と注意をお願いします。

  1. ATLASをインストールした後、root権限で[sedatools]/updates/linux_patch.sh を実行し、ダイナミックリンクライブラリへのソフトリンクを張るなどの修正が必要です。
    linux_patch.shでは OSチェックをしているため、AlmaLinuxでパッチを当てるためには以下の修正を加える必要です。
    Original:
    case $(sed -e 's/\(.*\)\srelease\(.*\)/\1/' /etc/redhat-release) in 
      "Red Hat Enterprise Linux"* ) 
          os="rhel" 
          ;;
      "CentOS"* ) 
          os="centos" 
          ;; 
      "Rocky Linux"* ) 
          os="rockyl" 
          ;; 
        * ) 
          os="unknown" 
          ;;
        esac
     
    修正後:
    case $(sed -e 's/\(.*\)\srelease\(.*\)/\1/' /etc/redhat-release) in 
      "Red Hat Enterprise Linux"* ) 
          os="rhel" 
          ;;
      "CentOS"* ) 
          os="centos" 
          ;; 
      "Rocky Linux"* ) 
          os="rockyl" 
          ;; 
       "AlmaLinux"* ) 
          os="rockyl" 

          ;; 
        * ) 
          os="unknown" 
          ;;
        esac

C-Interpreterについて (C-Interpreter自体は正規の機能ですが、以下にはサポート対象外の事項が含まれます)

機能: 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言語呼び出し 参照  (公式サポート対象外)

 

C-Interpreterで使われるCコンパイラとC言語機能の制限
ATLAS/deckbuildにおけるC-Interpreterの動作 (神谷の推測)

 動作状況及び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するほうが無難です。

shared library使用時の注意: 大域変数の初期化

注意: 初期化が必要な大域変数はstatic宣言をすること。
    初期化が不確かな場合、定数であってもC-Interpreter関数の局所変数として毎回初期化するほうが無難。
    #define で定数マクロとして展開すれば大丈夫だと思いますが、確認はしていません。

 仕様上、shared libraryが読み込まれるとき、呼び出されるときは、大域変数は初期化されません。
ただし、static宣言された静的大域変数はコンパイル時に値が割り当てられるため、shared libraryが読み込まれた時点で大域変数に初期値が設定されています。
#defineで定義される定数マクロはプリプロッセスで展開されて定数に置換されるため、初期化の問題はないと思われます(未確認)。

 

optimizerの使用方法 (optimizerは正規の機能です)

注意: 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 最適化条件設定ファイル