value / mask
Quine-McCluskey Optimization Core
메모리 폭발을 줄이고, 중복 탐색을 지우는 4-Phase 최적화 파이프라인
Minterm과 Don't Care를 비트 마스크로 압축하고, PI Chart를 Cyclic Core까지 축소한 뒤, Algorithm X 방식의 타겟 DFS로 최적 SOP를 찾습니다.
문자열 비교 대신 XOR, popcount, mask 연산 사용
EPI와 Dominance로 불필요한 행/열 제거
MRV 열을 고정해 순열 중복을 구조적으로 차단
EPI + Dominance
MRV target column
Product -> Literal -> Inverter
System Architecture
전체 파이프라인은 “생성 → 축소 → 탐색 → 선별”로 흐릅니다
각 Phase는 다음 단계가 다룰 데이터의 크기와 상태 복잡도를 줄이도록 설계되어 있습니다.
비트 연산 기반 PI 유도
입력된 Minterm과 Don't Care를 value, mask로 변환하고, 인접 그룹 간 XOR로 차이가 1비트인 항을 병합합니다.
PI Chart 한계 축소
PI를 행, Minterm을 열로 놓은 표에서 EPI 추출과 지배 규칙을 반복해 Cyclic Core만 남깁니다.
Algorithm X 기반 타겟 DFS
가장 제약이 심한 Minterm 열을 타겟으로 고정하고, 그 열을 덮는 PI만 분기합니다.
3단계 비용 필터링
유효 해를 Product 수, Literal 수, Inverter 수 순서로 정렬해 전역 최적 해를 고릅니다.
Compression Story
탐색 전에 문제를 작게 만들고, 탐색 중에는 같은 조합을 다시 보지 않습니다
Minterms + Don't Cares
병합되지 않은 항만 생존
EPI와 Dominance 적용
DFS가 풀어야 할 핵심만 남김
Data Structures
데이터 구조는 단계별 수명 주기에 맞춰 분리됩니다
PI 생성용 상태와 표/DFS 상태를 섞지 않아 플래그 충돌과 복구 버그를 줄입니다.
CombinedTerm
value: 항의 이진수 값mask: Don't Care 자리minterms: 포함한 원본 최소항is_combined: PI 선출 여부
PrimeImplicantRow
value, mask: PI 비트 표현covered_minterms: 덮는 Mintermis_deleted: 행 소거/배제 독립 플래그
MintermColumn
minterm_value: 최소항 번호is_covered: DFS 경로상 커버 상태- Don't Care는 최종 열에서 제외
SOPCandidate
pis: 회로 구성 PI 조합product_count: 곱항 수literal_count: 리터럴 수inverter_count: 인버터 수
Key Algorithms
핵심은 비트 병합, MRV 타겟팅, 엄격한 비용 정렬입니다
초고속 상태 병합: Bitwise Merge
문자열 대신 정수 비트 연산으로 병합 가능성을 판정합니다. mask가 같고 value 차이가 1비트라면 새로운 Don't Care 자리를 mask에 반영합니다. 덧셈을 쓰지 않아 carry로 인한 오류를 피합니다.
순환 코어 해결: Exact Cover & Algorithm X
아직 덮이지 않은 Minterm 중 후보 PI가 가장 적은 열을 먼저 선택합니다. 그 열을 덮는 PI만 분기하므로 순차 PI 선택이 만드는 순열 중복을 줄입니다. 재귀 후에는 Undo로 상태를 복구하고, 검사 완료 PI는 삭제 마크합니다.
- 1stProduct 수 최소
- 2ndLiteral 수 최소
- 3rdInverter 수 최소
엄격한 약한 정렬: Strict Weak Ordering
DFS 가지치기는 Product 수가 최고 기록을 초과할 때만 수행합니다.
동률 최적 해를 보존한 뒤, operator< 기준으로 Product, Literal, Inverter를 차례대로 비교해 최종 해를 고릅니다.
Internal Functions
함수는 Phase의 책임 경계를 그대로 따릅니다
각 함수는 생성, 축소, 탐색, 포매팅 중 하나의 역할에 집중합니다.
Phase 1: PI 유도
group_by_onion_count()- 입력값을 popcount 기준으로 그룹화합니다.
merge_terms_generation()- 인접 그룹 간 비트 연산으로 병합 항을 생성합니다.
generate_all_PIs()- 병합이 멈출 때까지 반복하고 최종 PI 배열을 반환합니다.
Phase 2: 표 축소
reduce_pi_chart()- 표가 steady-state에 도달할 때까지 축소 함수를 반복합니다.
find_and_extract_EPIs()- 단 하나의 PI만 덮는 열을 찾아 필수 주항으로 확정합니다.
apply_row_dominance()- 커버리지가 포함되는 하위 호환 행을 영구 소거합니다.
Phase 3: 백트래킹 탐색
solve_cyclic_core_target_dfs()- 현재 비용 가지치기, 모든 열 커버 기저 조건, MRV 타겟 선정, 상태 백업/복구, 탐색 완료 PI 배제까지 담당하는 DFS 엔진입니다.
Phase 4: 출력 포매팅
calculate_costs()- mask와 value로 Literal 및 Inverter 수를 계산합니다.
convert_bit_to_string()- 비트 인덱스를
x{i+1}형태의 대수 문자열로 변환합니다. print_final_optimized_sops()- 동일 최적 비용을 가진 공동 1위 해들을 모두 출력합니다.