Te / GeTe ALD 공정의 XRF 계측 워크북을 읽어 레시피를 파싱하고, 두께 모델을 적합하고, 단일 HTML 대시보드로 뽑아내는 데스크톱 앱.
pywebview 창 안에서 도는 오프라인 애플리케이션이다. 엑셀 파일 하나를 던져 주면
레시피명·펄스 스킴 문자열을 구조화하고, 사이클 수 대비 두께를 회귀해서 GPC를 뽑고,
결과를 차트가 들어간 HTML 로 렌더링한다. 서버도 인터넷도 필요 없다.
⚠️ 이 저장소는 실행 바이너리에서 복구한 것이다. 원본.py소스는 소실되었다. 무엇이 남았고 무엇이 사라졌는지는 복구 상태에 정확히 적어 두었다.
| 공정 | Te / GeTe / GeSe ALD (+ Al₂O₃ cap, TeO₂) |
| 입력 | XRF 계측 워크북 (.xlsx) |
| 출력 | 단일 파일 HTML 대시보드 |
| 스택 | Python 3.13 · pandas · numpy · pywebview (WebView2) |
| 빌드 | PyInstaller 6.x onedir → Te_ALD_Simulator.exe |
2026-08-05 에 빌드한 Te_ALD_Simulator.exe 만 남아 있고, 원본 소스 트리는 디스크에서
사라졌다. exe 는 PyInstaller onedir 번들이라 내용물을 되꺼낼 수 있었다.
| 파일 | 크기 | 내용 |
|---|---|---|
app/template.html |
165 KB | 대시보드 UI 전체 + 클라이언트 계산 로직 전부. 레이아웃, 스타일, Chart.js 구성, predict / fitOf / tempTerm / buildALD 등 화면에서 도는 모델 코드가 원본 그대로 들어 있다 |
sample_data/XRF_Te.xlsx |
40 KB | 앱이 처음 실행될 때 쓰는 기본 워크북 |
template.html 은 Python 이 계산한 payload 를 주입받는 템플릿이면서, 동시에 대화형
계산(슬라이더 반응, 예측, 등급 판정)을 자기 안의 JavaScript 로 수행한다. 즉 앱이
보여 주는 물리/통계 모델의 상당 부분은 손실 없이 살아 있다.
recovered/bytecode/ 에 Python 3.13 .pyc 5 개가 들어 있다. 2026-09 기준 3.13 을
지원하는 디컴파일러는 존재하지 않으므로 .py 로 되돌릴 수는 없다.
| 모듈 | 바이트코드 | 역할 |
|---|---|---|
desktop_app |
4.5 KB | pywebview 래퍼. 창 생성, Api.open_excel (파일 다이얼로그 → 재계산 → 새로고침), 마지막 워크북 경로 기억 |
app_paths |
2.7 KB | 번들/사용자 디렉터리 해석, 기본 워크북 배치, 템플릿·산출물 경로 |
build_dashboard_data |
25.6 KB | 핵심. 행 구성 → 설계행렬 → OLS 적합 → 부트스트랩(N=1000) → payload → HTML 주입 |
preprocess_v2 |
15.2 KB | 워크북 로딩, 컬럼 검증, 압력·스로틀·기판 정규화, 사이클 필드 병합 |
recipe_parser_v2 |
16.4 KB | 레시피명/펄스 스킴 파서. 증착 경로 10종 분류 |
하지만 재작성에 필요한 정보는 거의 다 뽑아냈다. recovered/api_map.md
에 모듈별로 다음이 들어 있다:
- 전체 함수·클래스 목록과 인자 이름·타입 애노테이션·원본 줄 번호
- 원본 docstring
- 정규식 리터럴 전부 —
Te\s*\(\s*OEt\s*\)\s*4[_\s]*(?:\(|\[)?\s*(\d+(?:\.\d+)?)\s*cyc(?:le|yle)같은 것까지 - dataclass 필드명, 라우트 상수, 컬럼명, 경고 메시지 전문
- 참조한 전역/속성 이름 (호출 그래프의 뼈대)
사라진 것은 제어 흐름뿐이다 (if / for / try 의 배치). 도메인 지식 —
어떤 정규식으로 무엇을 잡고, 어떤 필드를 만들고, 언제 어떤 경고를 내는지 — 는 남았다.
# 1. exe 에서 앱 바이트코드 추출 (vendor/stdlib 자동 제외)
python tools/extract_pyinstaller.py path/to/Te_ALD_Simulator.exe -o recovered/bytecode
# 2. 바이트코드에서 API 인벤토리 생성
python tools/api_map.py recovered/bytecode -o recovered/api_map.mdtools/extract_pyinstaller.py 는 exe 꼬리의 CArchive 쿠키를 찾아 TOC 를 파싱하고,
진입 스크립트와 PYZ.pyz 안의 모듈을 zlib 해제해 저장한다. 서드파티 판별은
_internal/ 에 실제로 풀려 있는 패키지 디렉터리와 *.dist-info 로 자동 수행한다.
레시피명과 펄스 스킴 문자열을 읽어 10 개 경로 중 하나로 판정한다.
GETE_ONLY GeTe only
GETE_THEN_TE GeTe/Te
GETE_GESE_THEN_TE GeTe+GeSe/Te
GESE_ONLY GeSe only
TE_2STEP Te only, 2단
TE_4STEP Te only, 4단
TE_COREACTANT_4STEP Te + 공반응물 4단
TE_OXIDE TeO2
OTHER_COMPLEX_ROUTE Other
PARSE_UNCERTAIN 판별 실패
파서의 설계 의도는 원본 docstring 에 남아 있다:
The parser intentionally preserves process blocks instead of collapsing every number into one total. In particular, a GeTe -> Te recipe keeps the GeTe pulse block and the following Te pulse block separate.
split_top_level 은 (), [], {} 안의 구분자를 보존하며 자르고, _expand_term 은
(...)*N 반복 표기를 전개한다. 파싱 실패는 버리지 않고 parse_status /
parse_note 로 표면화한다 — "단계 수가 홀수여서 inject/purge 쌍 합계를 확정하지 않음"
같은 메시지가 그대로 남아 있다.
추출하는 반응물: Te(OEt)4, (Me3Si)2Te/Se, Isopropylamine, Methanol, DIW, Ar.
- 창 기간: 안정 구간
2025-10-01~2026-01-14, 전체2022-11-24~2025-11-24 design_matrix→fit_ols로 최소자승 적합linfit_intercept(cycles, thick)로 사이클-두께 직선에서 GPC 와 절편(핵생성 지연) 분리- 부트스트랩
N_BOOT = 1000 build_hidden이 그룹 통계(장비/온도 구간/니들/쿠폰 수)를 계산inject_into_html이 payload 를 템플릿에 주입해 단일 HTML 생성
recovered/api_map.md 를 명세로 삼아 5 개 모듈을 재작성한 뒤:
pip install -r requirements.txt
python desktop_app.py # 창 실행
python build_dashboard_data.py <xlsx> # 대시보드 HTML 만 생성
pyinstaller --onedir --windowed \
--add-data "template.html;." \
--add-data "sample_data;sample_data" \
desktop_app.py빌드 당시 고정 버전: Python 3.13 · numpy 2.5.1 · pandas 2.3.3.
| 저장소 | 공정 |
|---|---|
| dry-etch-ai | SiO₂ Dry Etch |
| implant-anneal-ai | Ion Implantation + Annealing |
| process-ai-dashboard | Fab 전반 · 공정 Split 추천 |
| semicon-ai-lab | 합성 데이터 기반 방법론 검증 5종 |
MIT — LICENSE