349 lines
13 KiB
Makefile
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] 完成"
|