slow.monster

STUDIO HAZE · jeniapp

Topaz source

Open by house policy. Topaz is our own language.

Topaz 5.20.2 · 63 files

apps/circuit/core/truthtable.tpz

Topaz · 2221 B · Original file

1// 진리표. 평탄 회로의 INPUT 을 모든 조합으로 바꿔 가며 평가해 OUTPUT 값을 모읍니다.
2// 입력은 평탄 회로이고 출력은 입력과 출력 아이디 목록과 조합마다 한 행입니다. 첫 입력이 가장 낮은 자리입니다.
3// 같은 회로면 늘 같은 표가 나옵니다. 모든 칸은 미리 적은 값이 아니라 엔진이 계산한 값입니다.
4// 입력이 여덟 개를 넘으면 표를 만들지 않습니다.
5// Truth table: enumerate every INPUT combination of the flat circuit and evaluate each OUTPUT.
7import core.netlist
8import core.sim
10export type 진리행 = { 입력값들: Array<int>, 출력값들: Array<int> }
11export type 진리표 = { 입력들: Array<string>, 출력들: Array<string>, 행들: Array<진리행> }
13// 여덟 개면 256 행입니다.
14let 최대입력 = 8
16function 진리행만들기(평탄: netlist.회로, 입력들: Array<string>, 출력들: Array<string>, 비트들: Array<int>) -> 진리행 {
17 let 입력값들 = [for i in 0..<입력들.length => ({ 아이디: 입력들[i], 값: 비트들[i] })]
18 let 시뮬 = sim.평가회로({ 노드들: netlist.입력적용(평탄.노드들, 입력값들), 전선들: 평탄.전선들 })
19 { 입력값들: 비트들, 출력값들: 출력들.map(출력 => if sim.신호로(시뮬, 출력).신호 { 1 } else { 0 }) }
22export function 진리표만들기(평탄: netlist.회로) -> Result<진리표, string> {
23 let 입력들 = 평탄.노드들.filter(노드값 => netlist.입력노드인가(노드값.종류)).map(노드값 => 노드값.아이디)
24 let 출력들 = 평탄.노드들.filter(노드값 => netlist.출력노드인가(노드값.종류)).map(노드값 => 노드값.아이디)
25 if 입력들.length > 최대입력 { return Err("입력이 너무 많아 전체 진리표를 만들 수 없습니다(최대 8개)") }
26 let mut 자리값들: Array<int> = []
27 let mut 행수 = 1
28 for 입력 in 입력들 {
29 자리값들.push(행수)
30 행수 = 행수 * 2
31 }
32 let 행들 = map(0..<행수, 조합 => 진리행만들기(평탄, 입력들, 출력들, 자리값들.map(자리값 => (조합 / 자리값) % 2)))
33 Ok({ 입력들: 입력들, 출력들: 출력들, 행들: 행들 })

SHA256 76e9ee22975c6fd2128446b71c918188947fc90f04ca1f46886cbd626ed3b988