// 논리 게이트. NAND 진리표 하나만 원시 게이트로 두고 나머지 게이트는 모두 NAND 를 조립해 만듭니다.
// 입력은 bool 신호 한두 개이고 출력은 bool 신호 하나입니다.
// 같은 입력이면 늘 같은 신호가 나옵니다. 신호 경로에 산술을 쓰지 않습니다.
// 노드 종류를 고르거나 회로를 평가하지 않습니다. 그 일은 core.netlist 와 core.sim 이 합니다.
// Logic gates: NAND is the only primitive truth table and every other gate is composed from it.

export function 부정논리곱(가: bool, 나: bool) -> bool {
  if 가 && 나 { false } else { true }
}

export function 부정(가: bool) -> bool { 부정논리곱(가, 가) }

export function 논리곱(가: bool, 나: bool) -> bool { 부정(부정논리곱(가, 나)) }

export function 논리합(가: bool, 나: bool) -> bool { 부정논리곱(부정(가), 부정(나)) }

export function 부정논리합(가: bool, 나: bool) -> bool { 부정(논리합(가, 나)) }

// NAND 네 개로 짜는 표준 구성입니다.
export function 배타적논리합(가: bool, 나: bool) -> bool {
  let 가운데 = 부정논리곱(가, 나)
  부정논리곱(부정논리곱(가, 가운데), 부정논리곱(나, 가운데))
}

export function 배타적부정논리합(가: bool, 나: bool) -> bool { 부정(배타적논리합(가, 나)) }
