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.7
import core.netlist8
import core.sim10
export type 진리행 = { 입력값들: Array<int>, 출력값들: Array<int> }11
export type 진리표 = { 입력들: Array<string>, 출력들: Array<string>, 행들: Array<진리행> }13
// 여덟 개면 256 행입니다.14
let 최대입력 = 816
function 진리행만들기(평탄: 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 }) }20
}22
export 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 행수 = 128
for 입력 in 입력들 {29
자리값들.push(행수)30
행수 = 행수 * 231
}32
let 행들 = map(0..<행수, 조합 => 진리행만들기(평탄, 입력들, 출력들, 자리값들.map(자리값 => (조합 / 자리값) % 2)))33
Ok({ 입력들: 입력들, 출력들: 출력들, 행들: 행들 })34
}SHA256 76e9ee22975c6fd2128446b71c918188947fc90f04ca1f46886cbd626ed3b988