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/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.
7import core.netlist
9export type 고장 = { 노드: string, 값: bool }
11function 고장읽기(토큰들: 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 }
20// 틀린 줄이 여럿이면 첫 줄의 오류에서 멈춥니다.
21export function 고장파싱(줄들: Array<Array<string>>) -> Result<Array<고장>, string> {
22 let mut 고장들: Array<고장> = []
23 for 토큰들 in 줄들 { 고장들.push(고장읽기(토큰들)?) }
24 Ok(고장들)
27// 없는 노드를 가리키는 고장이 여럿이면 첫 고장을 알립니다.
28export function 고장검증(고장들: Array<고장>, 노드들: Array<netlist.노드>) -> Result<Array<고장>, string> {
29 let 아이디들 = 노드들.map(노드값 => 노드값.아이디)
30 let 없는고장들 = 고장들.filter(고장값 => !(고장값.노드 in 아이디들))
31 if 없는고장들.length > 0 { return Err("고장 대상 노드가 없습니다: " + 없는고장들[0].노드) }
32 Ok(고장들)
35// 같은 노드에 고장이 여럿이면 마지막 고장을 씁니다.
36export function 고장회로(회로값: netlist.회로, 고장들: Array<고장>) -> netlist.회로 {
37 let mut 고정값표: Map<string, int> = Map.new()
38 for 고장값 in 고장들 { 고정값표.insert(고장값.노드, if 고장값.값 { 1 } else { 0 }) }
39 { 노드들: 회로값.노드들.map(노드값 => 고정하기(고정값표, 노드값)), 전선들: 회로값.전선들 }
42function 고정하기(고정값표: Map<string, int>, 노드값: netlist.노드) -> netlist.노드 {
43 let 고정값 = 고정값표.getOr(노드값.아이디, -1)
44 if 고정값 < 0 { 노드값 } else { 노드값{ 종류: "INPUT", 값: 고정값 } }
47export function 고장노드들(고장들: Array<고장>) -> Array<string> {
48 고장들.map(고장값 => 고장값.노드)
51// 칩 하나 안으로 들어갈 때 인스턴스 접두를 한 겹만 벗깁니다. 남은 부분은 더 깊은 칩의 이름공간일 수 있어 __ 로 다시 잇습니다.
52export function 내부고장(고장들: Array<고장>, 아이디: string) -> Array<고장> {
53 let 나뉜고장들 = 고장들.map(고장값 => ({ 부분들: 고장값.노드.split("__"), 값: 고장값.값 }))
54 [for 나뉜 in 나뉜고장들 if 나뉜.부분들.length >= 2 && 나뉜.부분들[0] == 아이디 => ({
55 노드: 나뉜.부분들.slice(1, 나뉜.부분들.length).join("__"),
56 값: 나뉜.값,
57 })]

SHA256 80a87cf5e80807b6232f4951d0500a824289332ac308f35139f5b7903138562e