Files
tcad-devsim/devsim/wisetop_bjt/Makefile
T

349 lines
13 KiB
Makefile

# =============================================================================
# Makefile for DEVSIM BJT Simulation
# =============================================================================
# 本 Makefile 詳細列出每個模擬步驟所需的指令
#
# 使用方式:
# make all - 完整模擬流程 (refine → init → 所有分析)
# make quick - 快速模擬 (無網格細化)
#
# 細部步驟:
# make mesh - 生成初始網格
# make refine - 執行網格細化迴圈 (LOOPS 次)
# make init - 零偏壓初始化 (drift-diffusion)
# make gummel - Gummel 曲線掃描
# make output - 輸出特性掃描
# make cb - 共基極特性掃描
# make ac - AC 小信號分析
# make batch - 批次參數掃描 (多組參數)
# =============================================================================
# -----------------------------------------------------------------------------
# 工具設定
# -----------------------------------------------------------------------------
PYTHON ?= python3 # Python 解譯器
GMSH ?= gmsh # Gmsh 路徑
NPROC ?= $(shell nproc 2>/dev/null || echo 4) # CPU 核心數 (自動偵測)
GMSH_OPTS = -nt $(NPROC) # Gmsh 多執行緒選項
# -----------------------------------------------------------------------------
# 檔案定義
# -----------------------------------------------------------------------------
GEO_FILE = bjt.geo
MESH_FILE = bjt.msh
REFINED_MESH = bjt_refined.msh
INIT_MSH = bjt_dd_0.msh
BG_POS = bjt_bg.pos
# -----------------------------------------------------------------------------
# 細化設定
# -----------------------------------------------------------------------------
LOOPS ?= 1
# -----------------------------------------------------------------------------
# 預設參數
# -----------------------------------------------------------------------------
VB_DEFAULT ?= 0.7
VC_DEFAULT ?= 0.5
VC_GUMMEL ?= 2.0
# -----------------------------------------------------------------------------
# PHONY 目標宣告
# -----------------------------------------------------------------------------
.PHONY: help all quick mesh refine init gummel output cb ac batch clean
# =============================================================================
# HELP - 顯示可用指令
# =============================================================================
help:
@echo "=============================================================="
@echo " DEVSIM BJT Simulation Makefile"
@echo "=============================================================="
@echo ""
@echo " 完整模擬流程:"
@echo " make all 執行完整流程 (refine → init → 分析)"
@echo " make quick 快速流程 (無網格細化)"
@echo ""
@echo " 細部步驟 - 網格處理:"
@echo " make mesh 生成初始網格"
@echo " make refine 網格細化迴圈 (LOOPS=$(LOOPS))"
@echo ""
@echo " 細部步驟 - 模擬:"
@echo " make init 零偏壓初始化 (drift-diffusion)"
@echo " make gummel Gummel 曲線 (Ic,Ib vs Vb)"
@echo " make output 輸出特性 (Ic vs Vc)"
@echo " make cb 共基極特性 (Ic vs Ve)"
@echo " make ac AC 小信號分析"
@echo " make batch 批次參數掃描"
@echo ""
@echo " 其他:"
@echo " make clean 清除所有生成檔案"
@echo ""
@echo " 環境變數:"
@echo " LOOPS=N 細化迭代次數 (預設: 3)"
@echo " NPROC=N 設定 Gmsh 執行緒數 (預設: 自動偵測)"
@echo " VB_DEFAULT=x output 的 Vb 值 (預設: 0.7)"
@echo " VC_DEFAULT=x cb/ac 的 Vc 值 (預設: 0.5)"
@echo ""
@echo " 目前設定: NPROC=$(NPROC), LOOPS=$(LOOPS)"
@echo ""
# =============================================================================
# 完整/快速模擬流程
# =============================================================================
# all: 完整模擬流程
# 流程: refine → init → gummel → output → cb → ac
all: refine init gummel output cb ac
@echo "=========================================="
@echo ">>> [ALL] 完整模擬流程完成!"
@echo "=========================================="
# quick: 快速模擬 (無網格細化)
# 流程: mesh → init → gummel
quick: mesh init gummel
@echo "=========================================="
@echo ">>> [QUICK] 快速模擬完成!"
@echo "=========================================="
# =============================================================================
# 網格處理
# =============================================================================
# -----------------------------------------------------------------------------
# mesh: 生成初始網格
# 指令: gmsh -nt N -2 -format msh2 bjt.geo -o bjt.msh
# 輸入: bjt.geo
# 輸出: bjt.msh
# 備註: -nt N 啟用多執行緒 (N = CPU 核心數)
# -----------------------------------------------------------------------------
mesh: $(GEO_FILE)
@echo ">>> [mesh] 生成初始網格..."
@echo " 指令: $(GMSH) $(GMSH_OPTS) -2 -format msh2 $(GEO_FILE) -o $(MESH_FILE)"
$(GMSH) $(GMSH_OPTS) -2 -format msh2 $(GEO_FILE) -o $(MESH_FILE)
@echo ">>> [mesh] 完成: $(MESH_FILE)"
@echo ""
# -----------------------------------------------------------------------------
# refine: 網格細化迴圈
# 步驟:
# 1. 生成初始網格: gmsh -nt N -2 bjt.geo -o current_mesh.msh
# 2. 迴圈 (預設 3 次):
# a. E-field 分析: python bjt_refine.py current_mesh.msh
# 輸出: bjt_bg.pos (背景網格場,依據電場強度計算網格尺寸)
# b. 依背景場重新生成網格:
# gmsh -nt N -2 bjt.geo -bgm bjt_bg.pos -o current_mesh.msh
# 3. 複製最終結果: cp current_mesh.msh bjt_refined.msh
# 備註: -nt N 啟用多執行緒
# -----------------------------------------------------------------------------
refine: mesh
@echo ">>> [refine] 開始網格細化迴圈 ($(LOOPS) 次)..."
@echo ""
@echo " [Step 0] 生成初始網格"
@echo " 指令: $(GMSH) $(GMSH_OPTS) -2 -format msh2 $(GEO_FILE) -o current_mesh.msh"
@$(GMSH) $(GMSH_OPTS) -2 -format msh2 $(GEO_FILE) -o current_mesh.msh
@echo ""
@for i in $$(seq 1 $(LOOPS)); do \
echo " === 迭代 $$i / $(LOOPS) ==="; \
echo " [Step 1] E-field 分析,計算細化指標"; \
echo " 指令: $(PYTHON) bjt_refine.py current_mesh.msh"; \
$(PYTHON) bjt_refine.py current_mesh.msh; \
echo " 輸出: $(BG_POS)"; \
echo ""; \
echo " [Step 2] 依背景場重新生成網格"; \
echo " 指令: $(GMSH) $(GMSH_OPTS) -2 -format msh2 $(GEO_FILE) -bgm $(BG_POS) -o current_mesh.msh"; \
$(GMSH) $(GMSH_OPTS) -2 -format msh2 $(GEO_FILE) -bgm $(BG_POS) -o current_mesh.msh; \
echo ""; \
done
@echo " [Step 3] 複製最終結果"
@echo " 指令: cp current_mesh.msh $(REFINED_MESH)"
@cp current_mesh.msh $(REFINED_MESH)
@echo ""
@echo ">>> [refine] 完成: $(REFINED_MESH)"
@echo ""
# =============================================================================
# 模擬步驟
# =============================================================================
# -----------------------------------------------------------------------------
# init: 零偏壓初始化 (Drift-Diffusion 建立)
# 指令: python bjt_dd.py
# 輸入: bjt_refined.msh (或 bjt.msh)
# 輸出: bjt_dd_0.msh, bjt_dd_0.tec
# 說明:
# 1. 載入網格並設定摻雜
# 2. 求解 Potential Only
# 3. 設定 Drift-Diffusion 模型
# 4. 零偏壓 DC 求解
# 5. 輸出初始狀態檔案
# -----------------------------------------------------------------------------
init:
@if [ ! -f $(REFINED_MESH) ] && [ ! -f $(MESH_FILE) ]; then \
echo ">>> [init] 未找到網格檔案,先執行 mesh..."; \
$(MAKE) mesh; \
fi
@echo ">>> [init] 執行零偏壓初始化..."
@echo " 指令: $(PYTHON) bjt_dd.py"
@echo " 輸入: $(REFINED_MESH) (優先) 或 $(MESH_FILE)"
@echo " 步驟:"
@echo " 1. 載入網格 + 設定摻雜參數"
@echo " 2. Potential Only Solve"
@echo " 3. Drift-Diffusion 參數設定"
@echo " 4. Zero Bias DC Solve"
@echo " 5. 輸出 bjt_dd_0.msh, bjt_dd_0.tec"
$(PYTHON) bjt_dd.py
@echo ""
@echo ">>> [init] 完成: $(INIT_MSH)"
@echo ""
# -----------------------------------------------------------------------------
# gummel: Gummel 曲線掃描
# 指令: python bjt_circuit3.py
# 輸入: bjt_dd_0.msh (初始狀態)
# 輸出: gummel.csv
# 說明:
# - 固定 Vc = 2V
# - 掃描 Vb: 0 → 0.8V (20mV 步進)
# - 記錄 Ic, Ib vs Vb
# -----------------------------------------------------------------------------
gummel:
@if [ ! -f $(INIT_MSH) ]; then \
echo ">>> [gummel] 未找到初始狀態,先執行 init..."; \
$(MAKE) init; \
fi
@echo ">>> [gummel] 執行 Gummel 曲線掃描..."
@echo " 指令: $(PYTHON) bjt_circuit3.py"
@echo " 輸入: $(INIT_MSH)"
@echo " 參數:"
@echo " - Vc = 2.0V (固定)"
@echo " - Vb: 0 → 0.8V (20mV 步進)"
@echo " 輸出: gummel.csv"
$(PYTHON) bjt_circuit3.py
@echo ""
@echo ">>> [gummel] 完成: gummel.csv"
@echo ""
# -----------------------------------------------------------------------------
# output: 輸出特性掃描 (Ic vs Vc)
# 指令: python bjt_circuit2.py <Vb>
# 輸入: bjt_dd_0.msh
# 輸出: output_Vb<Vb>.csv
# 說明:
# - 固定 Vb (預設 0.7V)
# - 掃描 Vc: 0 → 2V (0.1V 步進)
# - 記錄 Ic, Ib, Ie vs Vc
# -----------------------------------------------------------------------------
output:
@if [ ! -f $(INIT_MSH) ]; then \
echo ">>> [output] 未找到初始狀態,先執行 init..."; \
$(MAKE) init; \
fi
@echo ">>> [output] 執行輸出特性掃描 (Vb=$(VB_DEFAULT)V)..."
@echo " 指令: $(PYTHON) bjt_circuit2.py $(VB_DEFAULT)"
@echo " 輸入: $(INIT_MSH)"
@echo " 參數:"
@echo " - Vb = $(VB_DEFAULT)V (固定)"
@echo " - Vc: 0 → 2V (0.1V 步進)"
@echo " 輸出: output_Vb$(VB_DEFAULT).csv"
$(PYTHON) bjt_circuit2.py $(VB_DEFAULT)
@echo ""
@echo ">>> [output] 完成: output_Vb$(VB_DEFAULT).csv"
@echo ""
# -----------------------------------------------------------------------------
# cb: 共基極特性掃描 (Ic vs Ve)
# 指令: python bjt_circuit4.py <Vc>
# 輸入: bjt_dd_0.msh
# 輸出: cb_Vc<Vc>.csv
# 說明:
# - 固定 Vc (預設 0.5V)
# - 掃描 Ve: 0 → -1V (-0.05V 步進)
# - 記錄 Ic, Ib, Ie vs Ve
# -----------------------------------------------------------------------------
cb:
@if [ ! -f $(INIT_MSH) ]; then \
echo ">>> [cb] 未找到初始狀態,先執行 init..."; \
$(MAKE) init; \
fi
@echo ">>> [cb] 執行共基極特性掃描 (Vc=$(VC_DEFAULT)V)..."
@echo " 指令: $(PYTHON) bjt_circuit4.py $(VC_DEFAULT)"
@echo " 輸入: $(INIT_MSH)"
@echo " 參數:"
@echo " - Vc = $(VC_DEFAULT)V (固定)"
@echo " - Ve: 0 → -1V (-50mV 步進)"
@echo " 輸出: cb_Vc$(VC_DEFAULT).csv"
$(PYTHON) bjt_circuit4.py $(VC_DEFAULT)
@echo ""
@echo ">>> [cb] 完成: cb_Vc$(VC_DEFAULT).csv"
@echo ""
# -----------------------------------------------------------------------------
# ac: AC 小信號分析
# 指令: python bjt_circuit5.py <Vc> <fmin> <fmax> <ppd>
# 輸入: bjt_dd_0.msh
# 輸出: ac_Vc<Vc>_Ve<Ve>.csv
# 說明:
# - DC 偏置: Vc=0.5V, Ve=-0.7V
# - 頻率掃描: 1kHz → 100GHz
# - ppd = 3 (每十倍頻 3 點)
# - 輸出 AC 電流響應 (magnitude, phase)
# -----------------------------------------------------------------------------
ac:
@if [ ! -f $(INIT_MSH) ]; then \
echo ">>> [ac] 未找到初始狀態,先執行 init..."; \
$(MAKE) init; \
fi
@echo ">>> [ac] 執行 AC 小信號分析..."
@echo " 指令: $(PYTHON) bjt_circuit5.py $(VC_DEFAULT) 1e3 1e11 3"
@echo " 輸入: $(INIT_MSH)"
@echo " 參數:"
@echo " - DC 偏置: Vc=$(VC_DEFAULT)V, Ve=-0.7V"
@echo " - 頻率: 1kHz → 100GHz"
@echo " - ppd = 3 (每十倍頻 3 點)"
@echo " 輸出: ac_Vc$(VC_DEFAULT)_Ve-0.7.csv"
$(PYTHON) bjt_circuit5.py $(VC_DEFAULT) 1e3 1e11 3
@echo ""
@echo ">>> [ac] 完成"
@echo ""
# -----------------------------------------------------------------------------
# batch: 批次參數掃描
# 指令: bash sims.sh
# 輸入: bjt_dd_0.msh
# 輸出: data/ 目錄下的多個 log 檔案
# 說明: 執行多組參數的完整掃描
# - Circuit 2: Output (Vb = 0.5, 0.6, 0.7, 0.8, 0.9)
# - Circuit 3: Gummel (Vc = 2.0)
# - Circuit 4: CB (Vc = 0.5, 1.0, 1.5)
# - Circuit 5: AC (Vc = 2.0)
# -----------------------------------------------------------------------------
batch:
@if [ ! -f $(INIT_MSH) ]; then \
echo ">>> [batch] 未找到初始狀態,先執行 init..."; \
$(MAKE) init; \
fi
@echo ">>> [batch] 執行批次參數掃描..."
@echo " 指令: bash sims.sh"
@echo " 輸入: $(INIT_MSH)"
@echo " 掃描內容:"
@echo " - Output (Vb=0.5~0.9)"
@echo " - Gummel (Vc=2.0)"
@echo " - CB (Vc=0.5, 1.0, 1.5)"
@echo " - AC (Vc=2.0)"
@echo " 輸出: data/*.log"
bash sims.sh
@echo ""
@echo ">>> [batch] 完成: 結果在 data/ 目錄"
@echo ""
# =============================================================================
# CLEAN - 清除所有生成檔案
# =============================================================================
clean:
@echo ">>> [clean] 清除所有生成檔案..."
@echo " rm -f *.msh *.pos *.tec *.csv *.log"
@echo " rm -rf data"
rm -f *.msh *.pos *.tec *.csv *.log
rm -rf data
@echo ">>> [clean] 完成"