STUDIO HAZE · jeniapp
Topaz source
Open by house policy. Topaz is our own language.
Topaz 5.20.2 · 63 files
apps/circuit/app/serialize.tpz
Topaz · 2272 B · Original file
1
// 회로 직렬화. 분해 결과를 version 머리, 칩 정의, 본체 노드, 전선, 칩 인스턴스 순서의 정규 글로 내보냅니다.2
// 입력은 분해 결과이고 출력은 줄마다 끝에 줄바꿈이 붙은 글입니다. 칩 정의 안은 node, chip, wire, extin, extout 순서입니다.3
// 배열 순서를 그대로 지키므로 파서가 같은 회로로 다시 읽고, 내보내기와 가져오기를 되풀이해도 글이 바이트까지 같습니다.4
// 칩 정의는 펼치기 전 본체로 씁니다. 펼친 내부의 __ 아이디는 다시 읽을 때 거부되기 때문입니다.5
// Circuit serialization: canonical text that re-imports to the same circuit, byte-identical on round trip.7
import core.netlist8
import core.hierarchy10
// 값 토큰은 INPUT 에만 붙습니다. 다른 종류에 붙이면 파서가 거부합니다.11
function 노드줄(노드값: netlist.노드) -> string {12
let 값조각 = if netlist.입력노드인가(노드값.종류) { " {노드값.값}" } else { "" }13
"node {노드값.아이디} {노드값.종류} {노드값.x} {노드값.y}{값조각}\n"14
}16
function 전선줄(선: netlist.전선) -> string {17
"wire {선.시작노드}:{선.시작핀} {선.끝노드}:{선.끝핀}\n"18
}20
function 칩줄(배치: hierarchy.인스턴스) -> string {21
"chip {배치.아이디} {배치.칩이름} {배치.x} {배치.y}\n"22
}24
function 칩정의글(정의: hierarchy.칩정의) -> string {25
[26
"chipdef {정의.이름}\n",27
정의.본체.노드들.map(노드줄).join(""),28
정의.본체.인스턴스들.map(칩줄).join(""),29
정의.본체.전선들.map(전선줄).join(""),30
정의.외부입력.map(핀값 => "extin {핀값.핀} {핀값.노드}\n").join(""),31
정의.외부출력.map(핀값 => "extout {핀값.핀} {핀값.노드}\n").join(""),32
"endchip\n",33
].join("")34
}36
// version 머리는 파서가 무시하는 지시라 다시 읽어도 안전합니다.37
export function 직렬화(분해값: hierarchy.분해결과) -> string {38
[39
"version 1\n",40
분해값.정의들.map(칩정의글).join(""),41
분해값.본체.노드들.map(노드줄).join(""),42
분해값.본체.전선들.map(전선줄).join(""),43
분해값.본체.인스턴스들.map(칩줄).join(""),44
].join("")45
}SHA256 c427e573aae493ab9779a0fc5906f542a4f6edbeaccdacf9835eec9869177d5a