Skip to content

BSI 2x2 기본 시뮬레이션

표준 2x2 베이어(Bayer) BSI 픽셀 단위 셀(unit cell)을 시뮬레이션하고 양자 효율(QE, Quantum Efficiency) 스펙트럼을 계산하는 완전한 레시피입니다.

인터랙티브 BSI 픽셀 스택 단면

스택 다이어그램에서 레이어를 선택하면 해당 재료 특성과 픽셀 스택에서의 역할을 확인할 수 있습니다.

입사광공기(반무한)마이크로렌즈0.4 - 0.8 um평탄화층0.3 - 1.0 um컬러 필터0.4 - 0.8 umBARL0.05 - 0.12 umDTIDTI실리콘2.0 - 4.0 um기판 / 금속(반무한)
스택 다이어그램에서 레이어를 선택하면 속성을 확인할 수 있습니다.

대화형 베이어 패턴 뷰어

다양한 컬러 필터 배열(CFA) 패턴을 탐색해 보세요. 픽셀을 선택하면 세부 정보를 볼 수 있습니다.

R(0,0)G(0,1)G(1,0)B(1,1)R(0,2)G(0,3)G(1,2)B(1,3)R(2,0)G(2,1)G(3,0)B(3,1)R(2,2)G(2,3)G(3,2)B(3,3)단위 셀
패턴
RGGB
단위 셀 크기
2x2
녹색 비율
50%
설명
가장 일반적인 베이어 패턴입니다. 단위 셀당 두 개의 녹색 픽셀이 인간 시각의 민감도를 모방하여 더 높은 휘도 해상도를 제공합니다.

학습 내용

  • BSI 픽셀 구성을 처음부터 설정하는 방법
  • RCWA를 사용한 파장 스윕 실행
  • 채널별 QE 스펙트럼 시각화
  • 에너지 수지 검증

사전 요구사항

bash
pip install -e ".[rcwa]"

인터랙티브 픽셀 스택 빌더

BSI 픽셀 단면의 각 층 두께를 조정하세요. 패턴 레이어는 z envelope와 실제 마이크로렌즈, 컬러 필터, grid, DTI 재료 영역을 분리해서 표시합니다.

전체 스택 높이:4.58 um
0.01.02.03.04.0마이크로렌즈0.60 umn=1.00 / 1.56평탄화층0.30 umn=1.46컬러 필터0.60 umn=1.46 / 1.55n=1.8실리콘3.00 umn=3.5DTI

구성 설정

설정 딕셔너리를 생성합니다 (또는 YAML에서 로드):

python
config = {
    "pixel": {
        "pitch": 1.0,
        "unit_cell": [2, 2],
        "bayer_map": [["R", "G"], ["G", "B"]],
        "layers": {
            "air": {"thickness": 1.0, "material": "air"},
            "microlens": {
                "enabled": True,
                "height": 0.6,
                "radius_x": 0.48,
                "radius_y": 0.48,
                "material": "polymer_n1p56",
                "profile": {"type": "superellipse", "n": 2.5, "alpha": 1.0},
                "shift": {"mode": "none"},
            },
            "planarization": {"thickness": 0.3, "material": "sio2"},
            "color_filter": {
                "pattern": "bayer_rggb",
                "red": {"material": "cf_red", "thickness": 0.62, "contact_angle": 66.0},
                "green": {"material": "cf_green", "thickness": 0.60, "contact_angle": 72.0},
                "blue": {"material": "cf_blue", "thickness": 0.65, "contact_angle": 62.0},
                "grid": {"enabled": True, "width": 0.05, "thickness": 0.47, "material": "tungsten"},
            },
            "barl": {
                "layers": [
                    {"thickness": 0.010, "material": "sio2"},
                    {"thickness": 0.025, "material": "hfo2"},
                    {"thickness": 0.015, "material": "sio2"},
                    {"thickness": 0.030, "material": "si3n4"},
                ]
            },
            "silicon": {
                "thickness": 3.0,
                "material": "silicon",
                "photodiode": {"position": [0, 0, 0.5], "size": [0.7, 0.7, 2.0]},
                "dti": {"enabled": True, "width": 0.1, "material": "sio2"},
            },
        },
    },
    "solver": {
        "name": "torcwa",
        "type": "rcwa",
        "params": {"fourier_order": [9, 9], "dtype": "complex64"},
        "stability": {
            "precision_strategy": "mixed",
            "allow_tf32": False,
            "fourier_factorization": "li_inverse",
        },
    },
    "source": {
        "type": "planewave",
        "wavelength": {
            "mode": "sweep",
            "sweep": {"start": 0.40, "stop": 0.70, "step": 0.01},
        },
        "angle": {"theta_deg": 0.0, "phi_deg": 0.0},
        "polarization": "unpolarized",
    },
    "compute": {"backend": "auto"},
}

시뮬레이션 실행

python
from compass.runners.single_run import SingleRunner

result = SingleRunner.run(config)

print(f"Wavelengths: {result.wavelengths.shape[0]} points "
      f"({result.wavelengths[0]*1000:.0f}-{result.wavelengths[-1]*1000:.0f} nm)")
print(f"Pixels: {list(result.qe_per_pixel.keys())}")

QE 스펙트럼 시각화

python
from compass.visualization.qe_plot import plot_qe_spectrum
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8, 5))
plot_qe_spectrum(result, ax=ax)
ax.set_title("BSI 2x2 Bayer (1 um pitch) - QE Spectrum")
plt.tight_layout()
plt.savefig("bsi_2x2_qe.png", dpi=150)
plt.show()

에너지 수지 확인

python
from compass.analysis.energy_balance import EnergyBalance

check = EnergyBalance.check(result, tolerance=0.02)
print(f"Valid: {check['valid']}, max error: {check['max_error']:.4f}")

에너지 균형: R + T + A = 1

실리콘 두께와 BARL 품질을 조정하여 가시광선 스펙트럼에서 반사, 투과, 흡수가 입사광을 어떻게 분배하는지 확인합니다.

최대 오차:0.00e+0
평균 오차:0.00e+0
검증:✓ 통과
최대 흡수:380 nm
0.00.20.40.60.81.0400450500550600650700750파장 (nm)비율반사 (R)투과 (T)흡수 (A)

채널별 QE 추출

python
from compass.analysis.qe_calculator import QECalculator

channel_qe = QECalculator.spectral_response(result.qe_per_pixel, result.wavelengths)

for color, (wl, qe) in channel_qe.items():
    peak_idx = qe.argmax()
    print(f"{color}: peak QE = {qe[peak_idx]:.1%} at {wl[peak_idx]*1000:.0f} nm")

예상 출력 (근사값):

B: peak QE = 62.3% at 460 nm
G: peak QE = 71.5% at 540 nm
R: peak QE = 59.8% at 620 nm

대화형 QE 스펙트럼 차트

실리콘 두께, BARL 품질, 메탈 그리드 폭이 Red, Green, Blue 채널의 양자 효율 스펙트럼에 미치는 영향을 살펴봅니다.

Blue 최대 QE:46.7%
Green 최대 QE:54.5%
Red 최대 QE:42.8%
평균 QE:48.0%
0%20%40%60%80%400450500550600650700750파장 (nm)QE (%)BlueGreenRed

변형 실험

더 작은 피치 (0.8 um)

python
config["pixel"]["pitch"] = 0.8
config["pixel"]["layers"]["microlens"]["radius_x"] = 0.38
config["pixel"]["layers"]["microlens"]["radius_y"] = 0.38
config["pixel"]["layers"]["silicon"]["photodiode"]["size"] = [0.55, 0.55, 1.6]

더 두꺼운 실리콘 (4 um)

python
config["pixel"]["layers"]["silicon"]["thickness"] = 4.0
config["pixel"]["layers"]["silicon"]["dti"]["depth"] = 4.0
config["pixel"]["layers"]["silicon"]["photodiode"]["size"] = [0.7, 0.7, 3.0]

마이크로렌즈 없음

python
config["pixel"]["layers"]["microlens"]["enabled"] = False

마이크로렌즈 유무에 따른 QE를 비교하여 마이크로렌즈의 기여도를 정량화할 수 있습니다.

재현성 안내

위에 표시된 수치는 특정 실행에서 얻은 예시 값입니다. 솔버 버전, 재료, 하드웨어(GPU/CPU, fp32/fp64), 설정에 따라 달라집니다. 결론을 내리기 전에 자신의 환경에서 직접 레시피를 다시 실행하여 검증하세요.

함께 보기