slow.monster

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.
7import core.netlist
8import core.hierarchy
10// 값 토큰은 INPUT 에만 붙습니다. 다른 종류에 붙이면 파서가 거부합니다.
11function 노드줄(노드값: netlist.노드) -> string {
12 let 값조각 = if netlist.입력노드인가(노드값.종류) { " {노드값.값}" } else { "" }
13 "node {노드값.아이디} {노드값.종류} {노드값.x} {노드값.y}{값조각}\n"
16function 전선줄(선: netlist.전선) -> string {
17 "wire {선.시작노드}:{선.시작핀} {선.끝노드}:{선.끝핀}\n"
20function 칩줄(배치: hierarchy.인스턴스) -> string {
21 "chip {배치.아이디} {배치.칩이름} {배치.x} {배치.y}\n"
24function 칩정의글(정의: 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("")
36// version 머리는 파서가 무시하는 지시라 다시 읽어도 안전합니다.
37export function 직렬화(분해값: hierarchy.분해결과) -> string {
38 [
39 "version 1\n",
40 분해값.정의들.map(칩정의글).join(""),
41 분해값.본체.노드들.map(노드줄).join(""),
42 분해값.본체.전선들.map(전선줄).join(""),
43 분해값.본체.인스턴스들.map(칩줄).join(""),
44 ].join("")

SHA256 c427e573aae493ab9779a0fc5906f542a4f6edbeaccdacf9835eec9869177d5a