TFT n-チャネルトランジスタ電気特性解析ツール

プロジェクト概要

tftanalyze.py は、TFT (Thin-Film Transistor) のn-チャネルデバイスにおけるI-V特性(伝達特性 (ID-VG) および出力特性 (ID-VD))データを解析し、結果をExcelレポートとPNGプロットとして出力するためのPythonスクリプトです。

このツールは、CSV形式の測定データを自動的にエンコーディングを検出して読み込み、伝達特性データから閾値電圧 (Vth)、移動度 (Mobility)、サブスレッショルドスイング (S) などの主要なデバイスパラメータを抽出します。また、出力特性データから線形領域のコンダクタンス (gd) や移動度 (mu_lin, mu_eff) を評価します。データの平滑化にはサビツキー・ゴレイフィルターをサポートしており、解析結果はインタラクティブなグラフ表示とPNGファイルとして保存されます。全ての解析結果、生データ、平滑化データはExcelファイルに集約されて出力されます。

関連リンク: tftanalyze_usage

インストール

このプログラムを実行するには、以下の非標準Pythonライブラリが必要です。pip を使用してインストールできます。

pip install chardet numpy scipy pandas matplotlib scikit-learn

使用方法

このスクリプトはコマンドラインから実行します。基本的な使用例は以下の通りです。

python tftanalyze.py --mode all --infile_vg transfer.csv --infile_vd output.csv

コマンドライン引数

tftanalyze.py は以下のコマンドライン引数をサポートしています。

  • --infile_vg

    • デフォルト: TFT_Vg-Id_STD-ide3 [AS220518TFT-anneal(454) ; 2022_05_25 18_00_33].csv

    • VG掃引データを含む入力 .csv ファイルのパス。

  • --infile_vd

    • デフォルト: TFT_Vd-Id-ide [AS220518TFT-anneal(455) ; 2022_05_25 18_01_11].csv

    • VD掃引データを含む入力 .csv ファイルのパス。

  • --mode

    • 選択肢: read, analyze_idvg, analyze_idvd, all

    • デフォルト: all

    • 実行する解析モードを指定します。

      • read: データの読み込みと平滑化のプレビューのみ。

      • analyze_idvg: 伝達特性 (ID-VG) の詳細解析。

      • analyze_idvd: 出力特性 (ID-VD) の詳細解析。

      • all: 全ての解析を実行。

  • --out_excel

    • デフォルト: None

    • 出力Excelファイルのパス。省略された場合、モードに応じたファイル名が使用されます。

  • --L

    • タイプ: float

    • デフォルト: 50.0

    • チャネル長 [um]。

  • --W

    • タイプ: float

    • デフォルト: 300.0

    • チャネル幅 [um]。

  • --dg

    • タイプ: float

    • デフォルト: 150.0

    • ゲート絶縁膜の厚さ [nm]。

  • --epsg

    • タイプ: float

    • デフォルト: 3.9

    • ゲート絶縁膜の比誘電率。

  • --ID_S

    • タイプ: float

    • デフォルト: 1e-9

    • サブスレッショルドスイング (S) 抽出のための参照ドレイン電流 [A]。

  • --Imin

    • タイプ: float

    • デフォルト: 1e-15

    • 対数解析のための最小電流フロア [A]。

  • --smooth_npoints

    • タイプ: int

    • デフォルト: 5

    • サビツキー・ゴレイフィルターのウィンドウ長(点数)。

  • --lsq_order

    • タイプ: int

    • デフォルト: 2

    • サビツキー・ゴレイフィルターの多項式の次数。

  • --show_plot

    • デフォルト: True

    • プロットをインタラクティブに表示します。

  • --no_show_plot

    • デフォルト: False

    • プロットをインタラクティブに表示しません。

  • --region_factor

    • タイプ: float

    • デフォルト: 3.0

    • 領域チェックのための安全係数。飽和領域は VD >= factor*(VG-Vth)、線形領域は VG-Vth >= factor*VD を要求します。

  • --save_plot

    • デフォルト: True

    • 解析プロットをPNGファイルとして保存します。

  • --no_save_plot

    • デフォルト: False

    • 解析プロットを保存しません。

  • --plot_dir

    • デフォルト: tft_analysis_plots

    • プロット画像を保存するディレクトリ。

  • --reverse_vg

    • デフォルト: False

    • データ読み込み後に VG の符号を反転します。p-チャネルデータの前処理を意図しています。

  • --idx_vg

    • タイプ: int

    • デフォルト: 0

    • VG 掃引データ用スイープセグメントインデックス。VG 掃引方向が変わるたびにインクリメントされます。

  • --idx_vd

    • タイプ: int

    • デフォルト: 0

    • VD 掃引データ用スイープセグメントインデックス。VD 掃引方向が変わるたびにインクリメントされます。

  • --read_smooth_domain

    • 選択肢: log, linear

    • デフォルト: log

    • mode=read での平滑化ドメイン。出力 ID-VD プレビューでは、線形平滑化/線形Y軸プロットが強制されます。

  • --read_keep_edge_raw

    • デフォルト: True

    • mode=read で、端点付近のSavitzky-Golay平滑化を適用せず、生データを維持します。

  • --read_smooth_edges

    • デフォルト: False

    • 端点付近にもSavitzky-Golay平滑化を適用します。

機能説明

  • CSV形式の測定データを自動的にエンコーディングを検出して読み込みます。

  • 伝達特性 (ID-VG) データから閾値電圧 (Vth)、移動度 (Mobility)、サブスレッショルドスイング (S) などの主要なデバイスパラメータを抽出します。

  • 出力特性 (ID-VD) データから線形領域のコンダクタンス (gd) や移動度 (mu_lin, mu_eff) を評価します。

  • サビツキー・ゴレイフィルターを用いたデータの平滑化をサポートします。

  • 解析結果をインタラクティブなグラフ表示とPNGファイルとして保存します。

  • 全ての解析結果と生データ、平滑化データをExcelファイルに集約して出力します。

クラスと関数リファレンス

クラス

stdout/stderr をコンソールとログファイルへ同時出力する簡単な Tee

詳細説明: このクラスは、複数のファイルライクオブジェクトに書き込み操作をミラーリングするために使用されます。 例えば、標準出力への書き込みと同時にログファイルへの書き込みを行う場合に便利です。

:param streams: データを書き込む対象となる一つ以上のファイルライクオブジェクト。 :type streams: file-like objects

関数

コマンドライン引数をパースします。

詳細説明: この関数は、tftanalyze.py スクリプトに必要な全てのコマンドライン引数を定義し、 ユーザーが指定した引数をパースして返します。 引数には、入力ファイルパス、解析モード、TFTデバイスの物理的寸法、 誘電体定数、電流の閾値、平滑化パラメータ、プロット表示・保存設定などが含まれます。

:returns: パースされた引数を含む argparse.Namespace オブジェクト。 :rtype: argparse.Namespace

ゲート酸化膜容量 (Cox) を計算します。

詳細説明: ゲート絶縁膜の厚さ (ナノメートル単位) と比誘電率から、 単位面積あたりのゲート酸化膜容量 (F/cm^2) を計算します。 物理定数として真空の誘電率 (EPS0) を使用します。 計算式は以下の通りです。

C_{ox} = \frac{\epsilon_g \epsilon_0}{d_g}

ここで、\epsilon_g はゲート絶縁膜の比誘電率 (epsg)、\epsilon_0 は真空の誘電率 (EPS0)、d_g はゲート絶縁膜の厚さ (メートル単位の dg_nm) です。

:param dg_nm: ゲート絶縁膜の厚さ [nm]。 :type dg_nm: float :param epsg: ゲート絶縁膜の比誘電率。 :type epsg: float :returns: 単位面積あたりのゲート酸化膜容量 [F/cm^2]。 :rtype: float

指定された解析モードに応じたデフォルトのExcelファイル名を返します。

詳細説明: 異なる解析モード('read', 'analyze_idvg', 'analyze_idvd', 'all')に対して、 それぞれ適切なデフォルトのExcelファイル名を決定します。 指定されたモードが辞書にない場合は、汎用的なレポートファイル名を返します。

:param mode: 解析モードを示す文字列。 :type mode: str :returns: デフォルトのExcelファイル名。 :rtype: str

出力名の基準にする入力ファイルを選びます。存在確認はゆるく行います。

詳細説明: 複数のファイルパスが与えられた場合、最初に空でないパス、 または提供されたパスのリストの最初のパスを Path オブジェクトとして返します。 ファイルシステムの存在チェックは行いません。

:param paths: 検査するファイルパスの可変引数。 :type paths: str :returns: 基準として選択されたファイルパスの Path オブジェクト。 :rtype: pathlib.Path

Excel/PNG/log の保存先を入力ファイルと同じディレクトリにそろえます。

詳細説明: 入力ファイルパス(args.infile_vg, args.infile_vd)を基準に、 Excelレポート、PNGプロット、ログファイルの出力ディレクトリとファイル名を決定し、 args オブジェクトに設定します。これにより、全ての出力が関連する入力ファイルの近くに集約されます。

:param args: コマンドライン引数を含む argparse.Namespace オブジェクト。 infile_vg, infile_vd, mode, out_excel 属性を使用します。 :type args: argparse.Namespace :returns: 出力パスが設定された argparse.Namespace オブジェクト。 :rtype: argparse.Namespace

入力stemつきPNG保存パスを作成します。

詳細説明: コマンドライン引数 (args) から取得した出力ステムとプロットディレクトリを基に、 指定された名前 (name) でPNGファイルの完全な保存パスを構築します。

:param args: コマンドライン引数を含む argparse.Namespace オブジェクト。 output_stem および plot_dir 属性を使用します。 :type args: argparse.Namespace :param name: 保存するPNGファイルの名前(拡張子なし)。 :type name: str :returns: 生成されたPNGファイルの完全なパス。 :rtype: str

サビツキー・ゴレイフィルターを適用し、オプションで端点付近の生データを保持します。

詳細説明: scipy.signal.savgol_filter は端点付近を外挿/補間することがあります。 TFT出力曲線では、VD=0 側の点数が少ないため、端点平滑化が系統的なずれのように見えることがあります。 keep_edge_raw=True の場合、完全な中心ウィンドウを持つ点のみが平滑化された値に置き換えられ、 端点付近のデータは元のクリップされたデータのまま維持されます。 データ長が短すぎる場合、またはウィンドウ長が不正な場合は、元のデータが返され、 平滑化が適用されなかったことを示すブール配列が返されます。

:param y: 平滑化するデータ配列。 :type y: numpy.ndarray or list :param win: サビツキー・ゴレイフィルターのウィンドウ長。奇数である必要があります。 :type win: int :param order: フィルターの多項式の次数。 :type order: int :param keep_edge_raw: True の場合、完全な中心ウィンドウを持たない端点付近のデータを生データのまま保持します。 :type keep_edge_raw: bool :returns: 平滑化されたデータ配列と、各点が平滑化に使用されたかを示すブール配列のタプル。 :rtype: tuple[numpy.ndarray, numpy.ndarray]

データフレームに電流のクリッピングと平滑化された電流の列を追加します。

詳細説明: この関数は、読み込み/プレビューモードのために、各グループ(またはデータ全体)に対して、 以下の列を追加します: ID_abs_floor: ID の絶対値を args.Imin でクリッピングした値。 ID_smooth_linear: 線形スケールで平滑化された IDlogID_smooth: 対数スケールで平滑化された log10(abs(ID))ID_smooth_log: logID_smooth を元に対数スケールで平滑化された IDID_smooth: args.read_smooth_domain に応じて ID_smooth_linear または ID_smooth_logsavgol_used_linear, savgol_used_log, savgol_used: Savitzky-Golay平滑化が適用された点を示すブールマスク。

重要な点: 伝達特性 (ID-VG) のプレビューは、デフォルトで log10(abs(ID)) の平滑化後に逆変換します。 出力特性 (ID-VD) のプレビューは、線形電流平滑化と線形Y軸プロットを強制します。 デフォルトでは、端点付近ではSavitzky-Golayフィルターの完全な中心ウィンドウがないため、 平滑化は無効化されます。これにより、VD=0 付近の人工的なずれを回避します。

:param df: 処理対象の DataFrame。 :type df: pandas.DataFrame :param xcol: データのX軸となる列名(例: 'VG', 'VD')。 :type xcol: str :param groupcol: グループ化に使用する列名(例: 'VD', 'VG')。この列が存在しない場合、データ全体が単一のグループとして扱われます。 :type groupcol: str :param args: コマンドライン引数を含むオブジェクト。Imin, lsq_order, smooth_npoints, read_keep_edge_raw, read_smooth_domain 属性を使用します。 :type args: argparse.Namespace :returns: クリップおよび平滑化された電流列が追加された DataFrame。 :rtype: pandas.DataFrame

読み込み/プレビューモードで平滑化されたデータをプロットします。

詳細説明: 生のクリップされたデータ (ID_abs_floor) と平滑化されたデータ (ID_smooth) を X軸 (xcol) に対してプロットします。 groupcol が指定されている場合、データはグループごとにプロットされ、凡例に表示されます。 Y軸はオプションで対数スケールに設定できます。 生成されたプロットは、args.save_plotTrue の場合、指定されたディレクトリにPNGファイルとして保存されます。

:param df_read: 読み込み/プレビュー用に処理されたデータを含む DataFrame。 :type df_read: pandas.DataFrame :param xcol: X軸としてプロットする列名(例: 'VG', 'VD')。 :type xcol: str :param groupcol: データをグループ化するための列名(例: 'VD', 'VG')。 この列が存在しない場合、データ全体が単一のグループとして扱われます。 :type groupcol: str :param title: プロットのタイトル。 :type title: str :param args: コマンドライン引数を含むオブジェクト。save_plotplot_dir 属性を使用します。 :type args: argparse.Namespace :param fname_base: 保存するPNGファイル名のベース。 :type fname_base: str :param yscale: Y軸のスケール('log'または'linear')。None の場合、線形スケール。デフォルトは'log'。 :type yscale: str or None :returns: 生成されたMatplotlibの Figure オブジェクト。 :rtype: matplotlib.figure.Figure

読み込み/プレビューモードの処理を実行します。

詳細説明: 指定された入力ファイル(伝達特性と出力特性)を読み込み、Imin で電流をクリッピングし、 Savitzky-Golayフィルターで平滑化します。その後、処理されたデータをプロットし、 結果の概要をコンソールに出力します。 伝達特性 (ID-VG) データは対数電流平滑化がデフォルトですが、 出力特性 (ID-VD) データは線形電流平滑化と線形Y軸プロットが強制されます。 処理されたデータフレームとサマリー情報は、Excelエクスポートのために返されます。

:param args: コマンドライン引数を含むオブジェクト。 infile_vg, infile_vd, reverse_vg, idx_vg, idx_vd, Imin, read_smooth_domain, save_plot, plot_dir 属性を使用します。 :type args: argparse.Namespace :returns:

  • Matplotlibの Figure オブジェクトのリスト。

  • 読み込まれた/処理されたデータフレームをタグ('vg'または'vd')で格納した辞書。

  • 読み込み処理のサマリー情報を含む辞書(各グループごと)のリスト。 :rtype: tuple[list[matplotlib.figure.Figure], dict[str, pandas.DataFrame], list[dict]]

測定CSVの列名を解析用の標準名へそろえます。

詳細説明: 例: VG(V) -> VG, Id -> ID。 既存の解析コードは VG, VD, ID などの大文字文字列名を仮定しているため、 読み込み直後にここで正規化します。

:param name: 正規化する列名。 :type name: str :returns: 標準化された列名。 :rtype: str

全列を可能な範囲で数値化します。

:param df: 数値化する DataFrame。 :type df: pandas.DataFrame :returns: 全列が数値化された DataFrame。 :rtype: pandas.DataFrame

4155/4156系CSVメタデータからfloat値を取り出します。

:param metadata: メタデータを含む辞書。 :type metadata: dict :param key: 取得するメタデータのキー。 :type key: str :returns: 取得されたfloat値。変換できない場合は None。 :rtype: float or None

4155/4156系CSVメタデータからint値を取り出します。

:param metadata: メタデータを含む辞書。 :type metadata: dict :param key: 取得するメタデータのキー。 :type key: str :returns: 取得されたint値。変換できない場合や有効な数値でない場合は None。 :rtype: int or None

Primary/Secondary掃引に対応する電圧名を推定します。

詳細説明: Keysight/Agilent 4155系CSVでは、通常 Channel.VName = VD, VS, VGChannel.Func = VAR2, CONST, VAR1 のようなメタデータがあり、VAR1 がPrimary、VAR2 がSecondaryに対応します。

:param metadata: メタデータを含む辞書。 :type metadata: dict :param sweep_role: 掃引の役割('Primary'または'Secondary')。 :type sweep_role: str :returns: 推定された電圧名(例: 'VG', 'VD')。推定できない場合は None。 :rtype: str or None

Primary/Secondary掃引の値リストをメタデータから推定します。

:param metadata: メタデータを含む辞書。 :type metadata: dict :param role: 掃引の役割('Primary'または'Secondary')。 :type role: str :returns: 推定された掃引値のリスト。 :rtype: list[float]

Primary掃引1枝あたりの点数をメタデータから推定します。

:param metadata: メタデータを含む辞書。 :type metadata: dict :returns: Primary掃引1枝あたりの点数。推定できない場合は None。 :rtype: int or None

Primary掃引がダブル掃引(往復掃引)であるか判定します。

:param metadata: メタデータを含む辞書。 :type metadata: dict :returns: ダブル掃引である場合は True、そうでない場合は False。 :rtype: bool

4155系DataName/DataValue CSVに不足しがちな掃引列を補います。

詳細説明: DataName/DataValueブロックにはPrimary変数、IDIG だけが保存され、 Secondary変数(今回の例では VD)が各行に書かれない場合があります。 その場合、メタデータのSecondary Start/Step/Countから各行の VD を復元します。

:param df: 処理対象の DataFrame。 :type df: pandas.DataFrame :param metadata: メタデータを含む辞書。 :type metadata: dict :returns: 掃引列が補完された DataFrame。 :rtype: pandas.DataFrame

Keysight/Agilent 4155系の DataName/DataValue CSV を読み込みます。

詳細説明: 戻り値は (df, metadata) です。DataValue行が見つからない場合は (None, metadata) を返し、通常CSV読み込みへフォールバックできるようにします。

:param filepath: 読み込むCSVファイルのパス。 :type filepath: str :param encoding: ファイルの文字コード。デフォルトは'utf-8-sig'。 :type encoding: str :returns: データを含む DataFrame とメタデータの辞書のタプル。 DataValue行が見つからない場合は (None, metadata)。 :rtype: tuple[pandas.DataFrame or None, dict]

文字コードをゆるく推定してCSVを行単位で読み込みます。

:param filepath: 読み込むCSVファイルのパス。 :type filepath: str :returns: ファイルの行リストと推定された文字コードのタプル。 :rtype: tuple[list[str], str]

CSVファイルからTFT解析用データを自動検出して読み込みます。

詳細説明: 対応形式:

  1. 既存対応の「列ヘッダ行 + 数値データ行」形式

  2. Keysight/Agilent 4155系の DataName / DataValue 形式

後者では、DataValueブロックに VDVG などのSecondary掃引列が明示されない場合でも、 メタデータから VD または VG を復元して既存解析コードへ渡します。

:param filepath: 読み込むCSVファイルのパス。 :type filepath: str :param reverse_vg: True の場合、VG の符号を反転します。p-チャネルデータの前処理を意図しています。 :type reverse_vg: bool :returns: 読み込まれたデータを含む DataFrame。ファイルが見つからないかデータが読み込めない場合は None。 :rtype: pandas.DataFrame or None

指定されたデータ点数に対して有効な奇数のSavitzky-Golayウィンドウ長を返します。

詳細説明: サビツキー・ゴレイフィルターのウィンドウ長は、多項式の次数よりも大きく、 かつ奇数である必要があります。また、データ点数を超えることはできません。 この関数は、与えられた制約 (n, requested, order) に基づいて、 これらの条件を満たす最小かつ有効な奇数のウィンドウ長を計算して返します。

:param n: データ点の総数。 :type n: int :param requested: 要求されたSavitzky-Golayウィンドウ長。 :type requested: int :param order: Savitzky-Golayフィルターの多項式の次数。 :type order: int :returns: 有効な奇数のSavitzky-Golayウィンドウ長。 :rtype: int

データフレーム内で指定された目標電流 (target_id) に最も近い ID_smooth を持つ行を検索します。

詳細説明: データフレーム dfID_smooth 列を基に、目標電流値 target_id との絶対差が最小となる行を特定します。 見つかった行のインデックスとその行全体のデータを返します。 データフレームが空の場合、または ID_smooth 列が存在しない場合は、None を返します。

:param df: 検索対象の DataFrameID_smooth 列が必要です。 :type df: pandas.DataFrame :param target_id: 検索する目標電流値 [A]。 :type target_id: float :returns: 目標電流に最も近い行のインデックスと、その行の Pandas Series。 データフレームが空の場合は (None, None) を返します。 :rtype: tuple[int or None, pandas.Series or None]

指定された列の掃引方向の変化に基づいて、掃引セグメントのインデックスを追加します。

詳細説明: データフレームの指定された列 (col) の値の連続的な変化を分析し、 掃引方向が反転するたびに掃引セグメントのインデックスを1つ増やします。 これにより、多方向掃引データ(例: VG の往復掃引)を個別のセグメントに分割できます。 結果のインデックスは新しい列 (idx_col) としてデータフレームに追加されます。

:param df: 処理対象の DataFrame。 :type df: pandas.DataFrame :param col: 掃引方向を検出する基準となる列名(例: 'VG', 'VD')。 :type col: str :param idx_col: 生成される掃引インデックス列の名前。 :type idx_col: str :returns: 掃引セグメントインデックス列が追加された DataFrame。 :rtype: pandas.DataFrame

掃引方向の変化インデックスに基づいて、DataFrame から特定の掃引セグメントを選択します。

詳細説明: この関数は、add_sweep_index() を使用して、指定された列 (col) の掃引セグメントインデックスを計算し、 その後、要求されたインデックス (idx) に対応するセグメントのみをフィルタリングして返します。 要求されたインデックスが存在しない場合、利用可能な最初のセグメントがフォールバックとして選択されます。 オプションで、選択されたセグメントを col 列でソートできます。

:param df: 処理対象の DataFrame。 :type df: pandas.DataFrame or None :param col: 掃引セグメントを識別する基準となる列名(例: 'VG', 'VD')。 :type col: str :param idx: 選択する掃引セグメントのインデックス。 :type idx: int :param label: 警告メッセージなどで使用するインデックスのラベル(例: 'idx_vg')。 :type label: str :param sort_after: True の場合、選択後に col 列で DataFrame をソートします。デフォルトはTrue。 :type sort_after: bool :param verbose: True の場合、選択されたセグメントに関する詳細情報を出力します。デフォルトはFalse。 :type verbose: bool :returns: 選択された掃引セグメントを含む DataFrame。元の DataFrameNone または空の場合、 または col 列がない場合は、元の DataFrame または None を返します。 :rtype: pandas.DataFrame or None

伝達特性解析の主要点をロングフォーマットで返します。

詳細説明: res 辞書から Vth, Smin, mu_max などの主要な解析ポイントを抽出し、 Excelサマリーシートに適したリスト形式で提供します。 各ポイントは、その VG, ID, 導関数、移動度などの詳細な情報とともに辞書として格納されます。

:param res: 伝達特性解析結果を含む辞書。df (解析対象の DataFrame) および idx_ で始まるキー (各ポイントのインデックス) が必要です。 :type res: dict :returns: 各解析ポイントのデータを格納した辞書のリスト。 :rtype: list[dict]

飽和領域動作の条件をチェックします。

詳細説明: トランジスタが飽和領域で動作しているかどうかを判断するために、 指定された VGVDVth、および安全係数 (factor) を使用して VD >= factor * (VG - Vth) の条件を確認します。 VG-Vth が正でない場合、または条件が満たされない場合は警告が生成されます。

:param vd: ドレイン電圧 [V]。 :type vd: float :param vg: ゲート電圧 [V]。 :type vg: float :param vth: 閾値電圧 [V]。 :type vth: float :param factor: 飽和領域を保証するための安全係数。デフォルトは3.0。 :type factor: float :returns: 飽和領域チェックの結果を含む辞書。 ok (bool), warning (str), VD_abs (float), VG_minus_Vth (float), ratio (float), criterion (str) を含みます。 :rtype: dict

線形領域動作の条件をチェックします。

詳細説明: トランジスタが線形領域で動作しているかどうかを判断するために、 指定された VGVDVth、および安全係数 (factor) を使用して VG - Vth >= factor * VD の条件を確認します。 VD が正でない場合、VG-Vth が負の場合、または条件が満たされない場合は警告が生成されます。

:param vd: ドレイン電圧 [V]。 :type vd: float :param vg: ゲート電圧 [V]。 :type vg: float :param vth: 閾値電圧 [V]。 :type vth: float :param factor: 線形領域を保証するための安全係数。デフォルトは3.0。 :type factor: float :returns: 線形領域チェックの結果を含む辞書。 ok (bool), warning (str), VD_abs (float), VG_minus_Vth (float), ratio (float), criterion (str) を含みます。 :rtype: dict

線形/飽和/中間領域の推奨を返します。

詳細説明: 線形領域チェックと飽和領域チェックの結果に基づいて、 現在解析中の動作点が線形、飽和、またはどちらでもない中間領域のどれに属するかを分類します。 分類結果と、それに関連する推奨/警告メッセージを返します。

:param linear_check: region_check_linear() 関数からの結果辞書。 :type linear_check: dict :param saturation_check: region_check_saturation() 関数からの結果辞書。 :type saturation_check: dict :returns: 推奨される領域タイプと、関連する警告/説明メッセージのタプル。 :rtype: tuple[str, str]

特定 VD スライスの ID-VG から、線形法と飽和法の両方で Vth/移動度を抽出します。

詳細説明: ID-VG データに基づいて、線形領域(最大相互コンダクタンス gm から)と 飽和領域(最大 d(sqrt(ID))/dVg から)の閾値電圧 (Vth) と移動度を抽出します。 サブスレッショルドスイング (S) やオフ電流 (Ioff) も計算します。 抽出されたポイントの動作領域チェックも行い、推奨される抽出方法を提示します。

:param df_full: 全ての VG-ID 測定データを含む DataFrame。 :type df_full: pandas.DataFrame :param vd_val: 解析対象のドレイン電圧 [V]。 :type vd_val: float :param args: コマンドライン引数を含むオブジェクト。smooth_npoints, lsq_order, Imin, L, W, region_factor, ID_S 属性を使用します。 :type args: argparse.Namespace :param cox: 単位面積あたりのゲート酸化膜容量 [F/cm^2]。 :type cox: float :returns: 特定 VD スライスにおける詳細な解析結果を含む辞書。データが不十分な場合は None。 :rtype: dict or None

Matplotlibのプロットに垂直線とテキストアノテーションを追加します。

詳細説明: 指定されたX座標 (x) に垂直線 (axvline) を引き、 その線の近くにテキストラベル (label) を回転させて配置します。 Y軸の範囲 (ymin, ymax) が指定されていない場合、現在のプロットのY軸範囲が使用されます。

:param ax: プロット対象のMatplotlib Axes オブジェクト。 :type ax: matplotlib.axes.Axes :param x: 垂直線を引くX座標。 :type x: float :param label: 垂直線の横に表示するテキストラベル。 :type label: str :param ymin: 垂直線が描画されるY軸の下限。None の場合、現在のY軸の下限が使用されます。 :type ymin: float or None :param ymax: 垂直線が描画されるY軸の上限。None の場合、現在のY軸の上限が使用されます。 :type ymax: float or None :returns: なし :rtype: None

伝達特性解析結果を 2x2 サブプロットとして可視化します。

詳細説明: ID-VG データに基づいて計算された様々なデバイス特性(ID-VG 曲線、線形抽出、飽和抽出、移動度プロファイル)を 2x2のサブプロットとして表示します。各プロットには、VthSmin、移動度最大値などの主要な解析ポイントが アノテーションとして表示されます。プロットはファイルに保存することも可能です。

:param res: analyze_vg_core() 関数によって生成された、単一 VD スライスの解析結果を含む辞書。 :type res: dict :param args: コマンドライン引数を含むオブジェクト。save_plot および plot_dir 属性を使用します。 :type args: argparse.Namespace :returns: 生成されたMatplotlibの Figure オブジェクト。 :rtype: matplotlib.figure.Figure

plot_idvg_quad() と同じ機能を持ちます。コード上は plot_idvg_quad のエイリアスとして定義されています。

詳細説明: 伝達特性解析結果を 2x2 サブプロットとして可視化します。 ID-VG データに基づいて計算された様々なデバイス特性(ID-VG 曲線、線形抽出、飽和抽出、移動度プロファイル)を 2x2のサブプロットとして表示します。各プロットには、VthSmin、移動度最大値などの主要な解析ポイントが アノテーションとして表示されます。プロットはファイルに保存することも可能です。

:param res: analyze_vg_core() 関数によって生成された、単一 VD スライスの解析結果を含む辞書。 :type res: dict :param args: コマンドライン引数を含むオブジェクト。save_plot および plot_dir 属性を使用します。 :type args: argparse.Namespace :returns: 生成されたMatplotlibの Figure オブジェクト。 :rtype: matplotlib.figure.Figure

伝達特性解析結果をコンソールに整形して出力します。

詳細説明: analyze_vg_core() 関数によって生成された伝達特性の解析結果辞書 (res) から、 線形領域と飽和領域の閾値電圧 (Vth)、移動度 (mu)、サブスレッショルドスイング (Smin)、 オフ電流 (Ioff) などの主要なデバイスパラメータを抽出し、 コンソールに分かりやすい形式で詳細なレポートを出力します。 また、各移動度抽出点における動作領域の適合性チェック結果も表示されます。

:param res: 伝達特性解析結果を含む辞書。 :type res: dict :returns: なし :rtype: None

単一の VG 出力曲線内で、要求された VD 値における ID の絶対値を線形補間します。

詳細説明: 与えられたデータフレーム (df_vg) が特定の VG での ID-VD データを含んでいると仮定し、 vd_target における abs(ID) の絶対値を線形補間によって推定します。 vd_target が測定範囲外の場合、またはデータが不足している場合は np.nan を返します。 補間は VDID 列をソートした後に行われます。

:param df_vg: 単一の VG 値における ID-VD データを含む DataFrameVDID 列が必要です。 :type df_vg: pandas.DataFrame :param vd_target: 補間したい目標ドレイン電圧 [V]。 :type vd_target: float :returns: vd_target における補間された abs(ID) の絶対値。データが利用できない場合や範囲外の場合は np.nan。 :rtype: float

TFTの出力特性 (ID-VD) を解析し、デバイスの線形領域特性と移動度を評価します。

詳細説明: 入力された ID-VD データフレームから、以下の解析を実行します:

  1. 最大の VD 値における伝達特性スライス (df_full) を用いて、参照閾値電圧 (vth_ref) を抽出します。

  2. VG 値における ID-VD 曲線に対して、線形領域(低い VD)での伝達コンダクタンス (gd) を線形回帰で計算します。

  3. 低い VD スライスにおける ID-VG データから、相互コンダクタンス (gm) と S 値を計算します。

  4. 抽出された gdgm、および vth_ref を用いて、実効移動度 (mu_eff) と線形移動度 (mu_lin) を導出します。

    • 線形領域移動度 (mu_lin):

      \mu_{lin} = \frac{g_m L}{W C_{ox} V_D}
      
    • 実効移動度 (mu_eff):

      \mu_{eff} = \frac{g_d L}{W C_{ox} (V_G - V_{th})}
      
  5. 各移動度抽出点に対して線形領域条件のチェック (region_check_linear()) を行い、警告情報を記録します。

  6. 解析結果の概要をコンソールに出力し、出力曲線と移動度プロットを生成します。

:param df: ID-VD データを含む DataFrameVG, VD, ID 列が必要です。 :type df: pandas.DataFrame :param args: コマンドライン引数を含むオブジェクト。 idx_vg, idx_vd, Imin, L, W, region_factor, save_plot, plot_dir 属性を使用します。 :type args: argparse.Namespace :param cox: 単位面積あたりのゲート酸化膜容量 [F/cm^2]。 :type cox: float :returns: 各 VG における解析結果の辞書リストと、生成されたMatplotlibの Figure オブジェクトのタプル。 有効なデータがない場合は ([], None) を返します。 :rtype: tuple[list[dict], matplotlib.figure.Figure or None]

伝達特性解析結果のリストから、Excel出力用の Pandas DataFrame を作成します。

詳細説明: t_summary リスト内の各解析結果辞書から、Excelサマリーシートに適した 主要なパラメータを抽出します。 元のデータフレーム (df) や詳細な分析ポイント (analysis_points)、 および内部的なインデックス (idx_ で始まるキー) は除外されます。 結果は Pandas DataFrame として整形され、Excelへのエクスポートに適した形式で提供されます。

:param t_summary: 各 VD スライスでの伝達特性解析結果を含む辞書のリスト。 :type t_summary: list[dict] :returns: 主要な解析結果パラメータを含む Pandas DataFrame。 :rtype: pandas.DataFrame

スクリプトのメイン実行ロジックをカプセル化します。

詳細説明: この関数は、コマンドライン引数をパースし、ゲート酸化膜容量 (Cox) を計算します。 選択された解析モード (read, analyze_idvg, analyze_idvd, all) に応じて、 対応するデータ読み込み、解析、プロット生成の関数を呼び出します。 すべての結果(生データ、平滑化データ、解析サマリー、詳細分析ポイント)は集約され、 最終的に単一のExcelレポートファイルとPNGプロットとして出力されます。 プロットは --show_plot が指定されている場合、インタラクティブに表示されます。

:param args: コマンドライン引数を含む argparse.Namespace オブジェクト。 :type args: argparse.Namespace :returns: なし。解析結果はファイルシステムに出力されます。 :rtype: None

プログラムのエントリポイントです。

詳細説明: この関数は、コマンドライン引数をパースし、Excel、PNG、ログファイルの 出力パスを準備します。標準出力と標準エラー出力をコンソールとログファイルの両方に 出力するように設定した後、run_analysis() 関数を呼び出して主要な解析ロジックを実行します。 解析終了後、Tee 機能は解除されます。

:returns: なし :rtype: None