Q Logic Minimization Core

Quine-McCluskey Optimization Core

메모리 폭발을 줄이고, 중복 탐색을 지우는 4-Phase 최적화 파이프라인

Minterm과 Don't Care를 비트 마스크로 압축하고, PI Chart를 Cyclic Core까지 축소한 뒤, Algorithm X 방식의 타겟 DFS로 최적 SOP를 찾습니다.

1 비트 병합

문자열 비교 대신 XOR, popcount, mask 연산 사용

2 표 축소

EPI와 Dominance로 불필요한 행/열 제거

3 타겟 DFS

MRV 열을 고정해 순열 중복을 구조적으로 차단

System Flow
Input Minterms + Don't Cares
01 PI 유도

value / mask

02 표 축소

EPI + Dominance

03 DFS 탐색

MRV target column

04 비용 필터

Product -> Literal -> Inverter

Output x1x2'x3 + x4...

System Architecture

전체 파이프라인은 “생성 → 축소 → 탐색 → 선별”로 흐릅니다

각 Phase는 다음 단계가 다룰 데이터의 크기와 상태 복잡도를 줄이도록 설계되어 있습니다.

Phase 1

비트 연산 기반 PI 유도

입력된 Minterm과 Don't Care를 value, mask로 변환하고, 인접 그룹 간 XOR로 차이가 1비트인 항을 병합합니다.

Phase 2

PI Chart 한계 축소

PI를 행, Minterm을 열로 놓은 표에서 EPI 추출과 지배 규칙을 반복해 Cyclic Core만 남깁니다.

Phase 3

Algorithm X 기반 타겟 DFS

가장 제약이 심한 Minterm 열을 타겟으로 고정하고, 그 열을 덮는 PI만 분기합니다.

Phase 4

3단계 비용 필터링

유효 해를 Product 수, Literal 수, Inverter 수 순서로 정렬해 전역 최적 해를 고릅니다.

Compression Story

탐색 전에 문제를 작게 만들고, 탐색 중에는 같은 조합을 다시 보지 않습니다

Raw Terms

Minterms + Don't Cares

Prime Implicants

병합되지 않은 항만 생존

Reduced Chart

EPI와 Dominance 적용

Cyclic Core

DFS가 풀어야 할 핵심만 남김

Data Structures

데이터 구조는 단계별 수명 주기에 맞춰 분리됩니다

PI 생성용 상태와 표/DFS 상태를 섞지 않아 플래그 충돌과 복구 버그를 줄입니다.

Phase 1

CombinedTerm

  • value: 항의 이진수 값
  • mask: Don't Care 자리
  • minterms: 포함한 원본 최소항
  • is_combined: PI 선출 여부
Phase 2~3

PrimeImplicantRow

  • value, mask: PI 비트 표현
  • covered_minterms: 덮는 Minterm
  • is_deleted: 행 소거/배제 독립 플래그
Phase 2~3

MintermColumn

  • minterm_value: 최소항 번호
  • is_covered: DFS 경로상 커버 상태
  • Don't Care는 최종 열에서 제외
Phase 4

SOPCandidate

  • pis: 회로 구성 PI 조합
  • product_count: 곱항 수
  • literal_count: 리터럴 수
  • inverter_count: 인버터 수

Key Algorithms

핵심은 비트 병합, MRV 타겟팅, 엄격한 비용 정렬입니다

diff = A.value ^ B.value popcount(diff) == 1 new_mask = A.mask | diff new_value = A.value & ~new_mask

초고속 상태 병합: Bitwise Merge

문자열 대신 정수 비트 연산으로 병합 가능성을 판정합니다. mask가 같고 value 차이가 1비트라면 새로운 Don't Care 자리를 mask에 반영합니다. 덧셈을 쓰지 않아 carry로 인한 오류를 피합니다.

m4 2 PI
m7 5 PI
m9 4 PI

순환 코어 해결: Exact Cover & Algorithm X

아직 덮이지 않은 Minterm 중 후보 PI가 가장 적은 열을 먼저 선택합니다. 그 열을 덮는 PI만 분기하므로 순차 PI 선택이 만드는 순열 중복을 줄입니다. 재귀 후에는 Undo로 상태를 복구하고, 검사 완료 PI는 삭제 마크합니다.

  1. 1stProduct 수 최소
  2. 2ndLiteral 수 최소
  3. 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 엔진입니다.
MRV target collect PIs backup recurse undo delete tested

Phase 4: 출력 포매팅

calculate_costs()
mask와 value로 Literal 및 Inverter 수를 계산합니다.
convert_bit_to_string()
비트 인덱스를 x{i+1} 형태의 대수 문자열로 변환합니다.
print_final_optimized_sops()
동일 최적 비용을 가진 공동 1위 해들을 모두 출력합니다.