STUDIO HAZE · jeniapp
Topaz source
Open by house policy. Topaz is our own language.
Topaz 5.20.2 · 63 files
apps/circuit/core/fault.tpz
Topaz · 3349 B · Original file
1
// 고장 주입. fault 노드 stuck0|stuck1 줄을 읽어 고장 노드를 고정값만 내는 INPUT 으로 바꾼 회로를 만듭니다.2
// 입력은 토큰으로 나눈 fault 줄과 평탄 회로이고 출력은 고장 목록, 고장 회로, 오류 문구입니다.3
// 같은 입력이면 늘 같은 고장 회로가 나옵니다. 고정값은 게이트 진리표를 건너뛸 뿐 신호 산술이 아닙니다.4
// 고장을 그리지 않습니다. 렌더러가 원래 게이트를 고장색으로 칠합니다.5
// Stuck-at fault injection: faulted nodes become INPUTs that only emit their stuck value.7
import core.netlist9
export type 고장 = { 노드: string, 값: bool }11
function 고장읽기(토큰들: Array<string>) -> Result<고장, string> {12
if 토큰들.length != 3 { return Err("fault 줄 형식은 fault <노드> <stuck0|stuck1> 입니다") }13
match 토큰들[2] {14
case "stuck0" => Ok({ 노드: 토큰들[1], 값: false })15
case "stuck1" => Ok({ 노드: 토큰들[1], 값: true })16
case _ => Err("고장 종류는 stuck0 또는 stuck1 이어야 합니다: " + 토큰들[2])17
}18
}20
// 틀린 줄이 여럿이면 첫 줄의 오류에서 멈춥니다.21
export function 고장파싱(줄들: Array<Array<string>>) -> Result<Array<고장>, string> {22
let mut 고장들: Array<고장> = []23
for 토큰들 in 줄들 { 고장들.push(고장읽기(토큰들)?) }24
Ok(고장들)25
}27
// 없는 노드를 가리키는 고장이 여럿이면 첫 고장을 알립니다.28
export function 고장검증(고장들: Array<고장>, 노드들: Array<netlist.노드>) -> Result<Array<고장>, string> {29
let 아이디들 = 노드들.map(노드값 => 노드값.아이디)30
let 없는고장들 = 고장들.filter(고장값 => !(고장값.노드 in 아이디들))31
if 없는고장들.length > 0 { return Err("고장 대상 노드가 없습니다: " + 없는고장들[0].노드) }32
Ok(고장들)33
}35
// 같은 노드에 고장이 여럿이면 마지막 고장을 씁니다.36
export function 고장회로(회로값: netlist.회로, 고장들: Array<고장>) -> netlist.회로 {37
let mut 고정값표: Map<string, int> = Map.new()38
for 고장값 in 고장들 { 고정값표.insert(고장값.노드, if 고장값.값 { 1 } else { 0 }) }39
{ 노드들: 회로값.노드들.map(노드값 => 고정하기(고정값표, 노드값)), 전선들: 회로값.전선들 }40
}42
function 고정하기(고정값표: Map<string, int>, 노드값: netlist.노드) -> netlist.노드 {43
let 고정값 = 고정값표.getOr(노드값.아이디, -1)44
if 고정값 < 0 { 노드값 } else { 노드값{ 종류: "INPUT", 값: 고정값 } }45
}47
export function 고장노드들(고장들: Array<고장>) -> Array<string> {48
고장들.map(고장값 => 고장값.노드)49
}51
// 칩 하나 안으로 들어갈 때 인스턴스 접두를 한 겹만 벗깁니다. 남은 부분은 더 깊은 칩의 이름공간일 수 있어 __ 로 다시 잇습니다.52
export function 내부고장(고장들: Array<고장>, 아이디: string) -> Array<고장> {53
let 나뉜고장들 = 고장들.map(고장값 => ({ 부분들: 고장값.노드.split("__"), 값: 고장값.값 }))54
[for 나뉜 in 나뉜고장들 if 나뉜.부분들.length >= 2 && 나뉜.부분들[0] == 아이디 => ({55
노드: 나뉜.부분들.slice(1, 나뉜.부분들.length).join("__"),56
값: 나뉜.값,57
})]58
}SHA256 80a87cf5e80807b6232f4951d0500a824289332ac308f35139f5b7903138562e