Tauri IPC 계약¶
pccx-lab HEAD 기준 2026-04-29. 소스: ui/src-tauri/src/lib.rs,
crates/schema/src/lib.rs.
pccx-lab 프런트엔드와 Rust 백엔드는 Tauri v2 invoke 메커니즘으로
통신한다. 모든 커맨드는 ui/src-tauri/src/lib.rs의
tauri::generate_handler![] 목록에 등록되어 있다. 아래는
등록된 48개 커맨드의 전체 카탈로그다.
명령 카탈로그¶
트레이스 로드¶
커맨드 |
인수 |
반환 |
목적 |
|---|---|---|---|
|
|
|
|
|
|
|
두 번째 트레이스를 |
|
없음 |
|
캐시된 24바이트 구조체 배열 평탄 버퍼를 반환. JS 측에서 TypedArray로 직접 매핑. |
|
없음 |
|
|
|
|
|
RTL 레포의 |
mmap 스트리밍 (대용량 트레이스)¶
커맨드 |
인수 |
반환 |
목적 |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
없음 |
|
mmap 트레이스의 총 이벤트 수 반환. |
|
|
|
페이로드 내 바이트 슬라이스 반환. 제로카피 TypedArray 전송용. |
분석¶
커맨드 |
인수 |
반환 |
목적 |
|---|---|---|---|
|
없음 |
|
캐시된 트레이스에 루프라인 분석 실행. 단일 계층 결과 반환. |
|
없음 |
|
메모리 계층별 |
|
|
|
슬라이딩 윈도 병목 탐지. 기본값 256사이클 / 0.5 임계치. |
|
없음 |
|
코어별 MAC utilisation 퍼센트, 총 사이클, 총 마이크로초, 피크 TOPS JSON 반환. |
|
|
|
트레이스를 |
|
|
|
요청 사이클의 결정론적 |
|
없음 |
|
트레이스를 LLM 친화적 컨텍스트 문자열로 압축. |
리포트¶
커맨드 |
인수 |
반환 |
목적 |
|---|---|---|---|
|
|
|
트레이스 기반 리포트 생성. |
|
|
|
호출자가 지정한 섹션으로 리포트 구성 후 렌더링. |
|
|
|
Markdown 리포트 생성. 트레이스 없이 경로만으로도 합성 섹션 포함 가능. |
검증¶
커맨드 |
인수 |
반환 |
목적 |
|---|---|---|---|
|
|
|
|
|
|
|
다수의 JSONL 커버리지 파일을 병합. 빈 |
|
|
|
NUL / BOM / CRLF / 후행쉼표 정제. 항상 성공. |
|
|
|
기준 JSONL 대비 |
|
|
|
|
|
|
|
Spike |
|
없음 |
|
캐시된 트레이스의 |
합성 / 하드웨어¶
커맨드 |
인수 |
반환 |
목적 |
|---|---|---|---|
|
|
|
Vivado |
|
|
|
Vivado |
|
|
|
|
LSP (SystemVerilog)¶
커맨드 |
인수 |
반환 |
목적 |
|---|---|---|---|
|
없음 |
|
|
|
|
|
위치 기반 호버 정보. 없으면 |
|
|
|
위치 인식 자동완성. 키워드 + 사용자 정의 심볼 결합. |
|
|
|
SV 소스 진단. Monaco MarkerSeverity 숫자(8/4/2/1)로 변환. |
|
|
|
SV 파일 파싱 결과 JSON 반환. |
|
|
|
파싱된 모듈에서 Mermaid 블록 다이어그램 생성. |
|
|
|
추출된 FSM별 Mermaid 상태 다이어그램 + 데드 스테이트 반환. |
|
|
|
특정 모듈의 서브그래프 Mermaid 다이어그램 반환. |
|
|
|
SV 소스에서 모듈 문서 생성. |
AI Copilot¶
커맨드 |
인수 |
반환 |
목적 |
|---|---|---|---|
|
없음 |
|
|
|
|
|
전략명 기반 SV UVM 시퀀스 스텁 생성 ( |
|
없음 |
|
시퀀스 생성기가 허용하는 전략 이름 목록 반환. |
파일 시스템 / 보조¶
커맨드 |
인수 |
반환 |
목적 |
|---|---|---|---|
|
|
|
|
|
|
|
텍스트 파일 내용 읽기 (Monaco 버퍼용). |
|
|
|
텍스트 파일 쓰기 (Ctrl+S 저장). |
|
|
|
IEEE 1364-2005 VCD 파싱. 신호 메타 + 값변화 스트림 반환. |
|
|
|
캐시된 트레이스를 VCD 파일로 내보내기. 절대 경로 반환. |
|
|
|
캐시된 트레이스를 Google Trace Event Format JSON으로 내보내기. |
|
없음 |
|
Apache-2.0 라이선스 문자열 반환 (상태바 표시용). |
DTO 스키마¶
crates/schema/src/lib.rs는 Rust-TypeScript 공유 wire DTO를 정의한다.
모든 타입은 ts-rs의 #[derive(TS)] + #[ts(export)]를 가지며,
cargo test 실행 시 TypeScript 인터페이스 파일이 자동 생성된다.
// crates/schema/src/lib.rs (발췌)
/// 프런트엔드 → 백엔드: 트레이스 데이터 창 요청.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct ViewportRequest {
pub start_cycle: u64,
pub end_cycle: u64,
pub generation_id: u32,
}
/// 뷰포트 타일 내 단일 이벤트.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct TileEvent {
pub core_id: u32,
pub start_cycle: u64,
pub duration: u64,
pub type_id: u32,
}
/// 백엔드 → 프런트엔드: 한 세대의 이벤트 배치.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct ViewportTile {
pub events: Vec<TileEvent>,
pub generation_id: u32,
pub total_events: u64,
}
/// 적재된 트레이스 파일의 요약 메타데이터.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct TraceInfo {
pub total_cycles: u64,
pub total_events: u64,
pub num_cores: u32,
pub encoding: String,
}
MmapViewportResponse (lib.rs 인라인 정의) 역시 generation_id: u32
필드를 가지며, mmap_viewport가 이를 에코한다:
#[derive(serde::Serialize)]
struct MmapViewportResponse {
events: Vec<NpuEvent>,
generation_id: u32,
}
스키마 크레이트는 ui/, uvm_bridge/, ai_copilot/에 의존하지 않는다.
wire DTO는 도메인 로직 없는 순수 데이터 캐리어다.
경계 규칙¶
CLAUDE.md §5.5와 lib.rs 구현에서 도출된 IPC 경계 규칙.
u64 필드¶
2^53을 초과할 수 있는 u64 필드는 IPC를 거칠 때 String으로
직렬화한다. JSON number 타입으로 전달하면 JavaScript에서 정밀도가
손실된다. TileEvent.start_cycle / TileEvent.duration /
TraceInfo.total_cycles / TraceInfo.total_events 등이 해당한다.
JS 측 코드는 이 문자열 필드를 BigInt 또는 정밀도 보존
라이브러리로 역직렬화한 뒤 사용한다.
generation_id¶
모든 비동기 뷰포트 응답은 generation_id: u32를 반드시 포함한다.
프런트엔드는 응답 수신 시 현재 세대 ID와 비교해 스테일 응답을
폐기한다. 빠른 스크롤/줌 중 IPC 라운드트립이 중첩될 때
구 응답이 최신 상태를 덮어쓰는 것을 방지한다.
ViewportRequest와 MmapViewportResponse 모두 이 필드를 포함한다:
pub struct ViewportRequest {
pub start_cycle: u64,
pub end_cycle: u64,
pub generation_id: u32, // caller-supplied
}
struct MmapViewportResponse {
events: Vec<NpuEvent>,
generation_id: u32, // echoed back verbatim
}
대용량 바이너리¶
대용량 바이너리 데이터는 Rust 측 Vec<u8>으로 표현하고 JS 측에서
TypedArray로 매핑한다. fetch_trace_payload / fetch_trace_payload_b /
mmap_tile이 이 패턴을 따른다. 각각 24바이트 구조체 배열 또는
mmap 슬라이스를 Vec<u8>로 직렬화한다:
#[tauri::command]
async fn fetch_trace_payload(state: State<'_, AppState>) -> Result<Vec<u8>, String> {
let buf = state.trace_flat_buffer.lock().unwrap().clone();
Ok(buf)
}
JS 측에서는 반환값을 new Uint8Array(...) 또는
new Float32Array(...) 뷰로 래핑해 구조체 필드에 오프셋 접근한다.
원시 트레이스 데이터 IPC 금지¶
원시 트레이스 데이터(NpuTrace, NpuEvent 전체 배열)는 IPC 경계를
직접 넘지 않는다. fetch_trace_payload가 반환하는 평탄 버퍼,
mmap_viewport가 반환하는 타일된 슬라이스, analyze_roofline이
반환하는 집계 결과만이 경계를 넘는다. 이 규칙은
CLAUDE.md §5.5에 명시된 설계 결정이며,
docs/design/architecture_adoption.md 섹션 4에서 근거를 제공한다.
관련 문서¶
이 페이지 인용¶
@misc{pccx_lab_ipc_2026,
title = {pccx-lab Tauri IPC contract: 48 commands, DTO schema,
and boundary rules},
author = {Kim, Hyunwoo},
year = {2026},
howpublished = {\url{https://pccxai.github.io/pccx/ko/docs/Lab/ipc.html}},
note = {Part of pccx: \url{https://pccxai.github.io/pccx/}}
}
커맨드 소스는 https://github.com/pccxai/pccx-lab/blob/main/ui/src-tauri/src/lib.rs 에, DTO 스키마는 https://github.com/pccxai/pccx-lab/blob/main/crates/schema/src/lib.rs 에 있다.