[VLSI CAD] BDD vs SAT: EDA에서 Boolean function을 “표현”할 것인가, “풀” 것인가

TL;DR 1) BDD의 출발점: “decision”을 그래프로 들고 다니기 BDD는 결국 “변수 하나 고르고(분기), 0/1로 내려가며 답(leaf)에 도달”하는 decision graph 다. 핵심 제약은 Ordered : 모든 path에서 변수가 정해진 순서로만...

[VLSI CAD] BDD vs SAT: EDA에서 Boolean function을 “표현”할 것인가, “풀” 것인가
Photo by Thomas T / Unsplash

TL;DR

  • BDD(특히 ROBDD) = Boolean function의 canonical representation(variable ordering이 고정되면 “딱 하나의 그래프”)을 만든다. 그래서 equivalence checking이 “root pointer 비교”로 끝나는 장점이 있다.
  • SAT = Boolean function을 다 표현하지 않고, “SAT/UNSAT만” 빠르게 판정하고 한 개 satisfying assignment(counterexample)을 뽑는 쪽에 최적화되어 있다. 실무에서 “그냥 풀기(just solve it)”는 SAT가 BDD를 많이 밀어냈다.
  • 현실 트레이드오프는 깔끔하다:
    • BDD는 SPACE(메모리) 가 터질 수 있고
    • SAT는 TIME(탐색 시간) 이 터질 수 있다

1) BDD의 출발점: “decision”을 그래프로 들고 다니기

BDD는 결국 “변수 하나 고르고(분기), 0/1로 내려가며 답(leaf)에 도달”하는 decision graph다. 핵심 제약은 Ordered: 모든 path에서 변수가 정해진 순서로만 등장하고, 한 path에서 같은 변수를 두 번 보지 않는다. (중간 변수를 skip 하는 건 가능)

이 한 줄이 엄청 중요하다. “ordered”가 있어야, 그 다음에 나오는 reduction으로 canonical form까지 간다.


2) ROBDD로 만드는 3개의 Reduction Rule (이게 본체)

BDD를 “Reduced Ordered BDD(ROBDD)”로 만들기 위해 그래프 중복을 제거한다. 목표는 두 가지:

  • graph size를 줄이고
  • 같은 function이면(같은 variable order일 때) 그래프가 유일하도록 만드는 것

Rule 1) Merge equivalent leaves

0 leaf는 하나, 1 leaf도 하나만 남긴다. 나머지 leaf로 들어오던 edge는 전부 그 하나로 redirect.

Rule 2) Merge isomorphic nodes

같은 variable을 테스트하고, child가 “물리적으로 동일한 노드”(same pointers)인 두 노드는 구분 불가능이다 → 하나로 합친다.

Rule 3) Eliminate redundant tests

어떤 variable node에서 low child == high child면, 그 variable을 테스트할 이유가 없다 → 그 node를 제거하고 child로 bypass.

이 3개를 적용하면 결론:

  • 같은 function은 같은 ROBDD 그래프가 된다(같은 ordering 가정).
  • 그래서 Boolean function은 “그래프”가 아니라 사실상 root node pointer 하나로 표현된다.

3) BDD가 verification에서 좋은 이유: equivalence가 O(1)

ROBDD에서는 “function equality”가 보통 생각하는 것처럼 진리표 비교가 아니다.

  • F에 대한 ROBDD 만들고
  • G에 대한 ROBDD 만들고
  • root pointer가 같으면 F==G

이게 canonical representation의 힘이다.

그리고 “어떤 input에서 다르냐?”도 쉽게 간다:

  • H = F ⊕ G 를 만들고
  • H가 satisfiable이면 그 path가 곧 counterexample

4) 실무 구현 관점: “netlist를 걸어가며 operator를 누적”

BDD는 보통 gate-level network를 따라가며 쌓는다. input var부터 만들고, gate마다 AND/OR 같은 BDD operator로 새로운 BDD를 만든다.
예: T1 = And(A,B), Out = Or(T1,T2) 같은 스크립트 방식

중요한 구현 포인트는 딱 하나:

  • 각 operator가 입력 BDD가 shared + reduced + ordered이면 출력도 그렇게 되게 만들어야 한다
    (이게 보통 unique table / computed table 같은 엔지니어링으로 구현된다)

5) Multi-rooted BDD sharing: “한 개만 하지 말고 여러 개를 같이 줄여라”

BDD는 “여러 function”을 따로 만들면 손해다. 같은 subgraph를 공유할 수 있는데, root를 여러 개 두고 하나의 큰 DAG로 공유하면 size가 확 줄어든다.
Adder 예시에서 separate vs shared node count 차이가 크게 난다(64-bit에서 특히).


6) BDD로 쉬워지는 것들

  • Satisfiability: “root에서 1 leaf로 가는 path가 하나라도 있으면 SAT, 그 path가 assignment”
  • Tautology checking: BDD 만들고 “graph == 1”이면 끝

BDD는 “표현을 만들어놨기 때문에” 이런 질의들이 깔끔하다.


7) BDD의 단점: variable ordering 하나로 linear ↔ exponential

BDD가 “너무 좋아 보이는” 이유는, 잘 되는 케이스만 보면 그렇다. 문제는 ordering이다.

같은 function이라도 ordering이 나쁘면 node 수가 exponential growth로 터진다.
그래서 BDD 세계의 본질은 사실 “좋은 ordering 찾기” 싸움이다.


8) SAT: “표현”보다 “판정 + 한 방 해”에 집중

SAT 정의는 단순하다:

  • 변수들에 값을 넣어서 F()=1이 되게 하는 assignment를 찾거나
  • 그런 assignment가 없음을 증명(UNSAT)

그리고 SAT solver가 먹기 좋은 표준 입력이 CNF(Conjunctive Normal Form) 다.


9) DPLL의 뼈대: DECISION + DEDUCTION (그리고 recurse)

SAT solving의 큰 흐름은 이것뿐이다:

  • DECISION: 어떤 variable을 골라 값을 찍고, formula를 단순화
  • DEDUCTION: 단순화된 clause 구조를 보고 더 강제되는 assignment를 계속 유도
  • 더 이상 진전 없으면 다시 DECISION으로 recursion

DEDUCTION을 현실적으로 굴리는 핵심이 BCP(Boolean Constraint Propagation), 그중 가장 유명한 규칙이 Unit Clause Rule이다:

  • clause에 unassigned literal이 딱 하나만 남으면, 그 literal은 강제로 정해진다(implication).

10) Gate-level → CNF: “gate마다 local constraint를 붙여라” (Tseitin 스타일)

많은 사람이 “CNF 만들려면 Boolean algebra로 POS 변환해야 하나?”를 먼저 떠올린다. 실무는 다르게 간다:

  • netlist의 각 gate 출력에 내부 변수(z 같은 것)를 두고
  • gate마다 gate consistency function을 CNF clause로 추가한다
  • 전체 CNF는 그냥 이 clause들을 AND로 묶은 것

예를 들어 NAND는 이런 형태로 쓴다(슬라이드 규칙 그대로).

왜 XOR / MUX가 SAT에서 골칫덩이냐

XOR는 gate consistency가 clause 수가 늘어나고 구조가 “either-or”라 탐색이 까다롭다.
2-input XOR만 해도 CNF가 4개 clause로 늘어난다.

(MUX도 비슷하게 “선택에 따라 달라지는” 구조라 solver 입장에서 branching을 유도한다)


11) SAT 실전 대표 예시: equivalence checking (miter)

“두 회로가 같은가?”는 SAT의 전형적인 먹이다:

  • F와 G를 비교하려면, 새로운 네트워크를 만들어서 SAT를 건다
  • SAT면 “다르게 만드는 input pattern”을 준다
  • UNSAT면 “동일”

BDD로도 가능(앞에서 말한 F⊕G BDD 후 satisfiable)
실무에선 큰 문제에서 SAT가 더 자주 이긴다.


12) BDD vs SAT: 언제 뭐 쓰냐

BDD

  • function ϕ의 full representation을 만든다
  • 그 위에서 AND/OR/NOT, 심지어 quantification 같은 다양한 operator를 할 수 있다
  • 대신 어떤 문제는 BDD를 만들다가 SPACE(메모리) 가 먼저 끝난다

SAT

  • ϕ를 “다 표현”하지 않고, SAT/UNSAT 판정과 하나의 assignment에 집중
  • 대신 어떤 문제는 탐색이 길어져서 TIME 이 먼저 끝난다
  • 그래서 “just solve it”류 앱에서 SAT가 BDD를 많이 대체했다(스케일).

글 참여 도구

공유하기 토론 참여
이 글이 어떤 도움을 줬나요? 공개 숫자 없이 품질 개선 신호로만 사용합니다.

비공개 제보

오류나 추가 설명이 필요한가요?

공개 토론 대신 편집자에게 직접 보낼 수정·질문·다음 글 요청을 남겨주세요.

VLSI Korea

비공개 제보 보내기

작성한 내용은 [email protected]로 전달됩니다.

어떻게 받을까요?

익명 모드는 이름과 이메일을 보내지 않습니다. 다만 전송 서비스가 IP 등 기술 정보를 처리할 수 있어 절대적인 익명성을 보장하지는 않습니다.

ENGINEER DISCUSSION

현장에서는 어떻게 보고 계신가요?

동의, 반론, 보완 자료와 현업 경험을 남겨주세요. 답글 알림이 다시 토론으로 연결됩니다.

VLSI KOREA BRIEFING

매일, 중요한 신호만.

반도체 설계와 산업의 변화를 현직 엔지니어 관점에서 정리합니다. 무료이며 페이월이 없습니다.

FOR BUSINESS

이런 기술 콘텐츠가 필요하신가요?

기업용 기술 콘텐츠, 스폰서드 딥다이브, 사내 브리핑을 명확한 범위와 가격으로 진행합니다.

협업 방식·가격 보기 →
VLSI Korea Free forever · No paywall · Weekly semiconductor insights from practicing engineers
MY VLSI

내 읽기 보관함

저장한 글과 읽던 글을 한곳에서 이어보세요.