slow.monster

STUDIO HAZE · jeniapp

Topaz source

Open by house policy. Topaz is our own language.

Topaz 5.20.2 · 63 files

apps/circuit/ui/waveform.tpz

Topaz · 2564 B · Original file

1// 파형 패널. 프로브마다 한 행에 틱별 0/1 계단 선을 그리고 현재 틱을 점선으로 표시합니다.
2// 입력은 프로브별 틱 신호 열과 현재 틱이고 출력은 SVG 조각입니다. 프로브가 없으면 빈 문자열입니다.
3// 같은 파형이면 늘 같은 조각이 나옵니다.
4// 회로를 평가하지 않습니다. 신호 열은 core.history 가 만듭니다.
5// Waveform panel: one 0/1 step trace per probe with a current-tick marker.
7import core.history
8import ui.signalviz
10let 라벨폭 = 76
11let 틱폭 = 16
12let 행높이 = 40
13let 위여백 = 16
15function 파형칸(파형값: history.파형, t: int, 높은y: int, 낮은y: int) -> string {
16 let x = 라벨폭 + t * 틱폭
17 let y = if 파형값.값들[t] { 높은y } else { 낮은y }
18 let 수평선 = "<line x1=\"{x}\" y1=\"{y}\" x2=\"{x + 틱폭}\" y2=\"{y}\" stroke=\"{signalviz.신호색(파형값.값들[t])}\" stroke-width=\"2\" data-wave=\"{파형값.프로브}\" data-tick=\"{t}\" />"
19 if t + 1 >= 파형값.값들.length { return 수평선 }
20 let 다음y = if 파형값.값들[t + 1] { 높은y } else { 낮은y }
21 if 다음y == y { 수평선 } else { 수평선 + "<line x1=\"{x + 틱폭}\" y1=\"{y}\" x2=\"{x + 틱폭}\" y2=\"{다음y}\" stroke=\"{signalviz.흑연}\" stroke-width=\"1\" />" }
24function 파형행(파형값: history.파형, 기준y: int) -> string {
25 let 높은y = 기준y + 6
26 let 낮은y = 기준y + 26
27 let 칸들 = map(0..<파형값.값들.length, t => 파형칸(파형값, t, 높은y, 낮은y))
28 "<text x=\"4\" y=\"{낮은y}\" font-size=\"11\" font-family=\"monospace\" fill=\"{signalviz.먹}\">{파형값.프로브}</text>" + 칸들.join("")
31export function 그리기파형(파형들: Array<history.파형>, 현재틱: int) -> string {
32 if 파형들.length == 0 { return "" }
33 let 틱수 = 파형들[0].값들.length
34 let 폭 = 라벨폭 + 틱수 * 틱폭 + 20
35 let 높이 = 위여백 + 파형들.length * 행높이 + 10
36 let 표시선 = if 현재틱 >= 0 && 현재틱 < 틱수 {
37 let 표시x = 라벨폭 + 현재틱 * 틱폭 + 틱폭 / 2
38 "<line x1=\"{표시x}\" y1=\"0\" x2=\"{표시x}\" y2=\"{높이}\" stroke=\"{signalviz.시그널}\" stroke-width=\"1\" stroke-dasharray=\"2 2\" />"
39 } else { "" }
40 let 행들 = map(0..<파형들.length, 행 => 파형행(파형들[행], 위여백 + 행 * 행높이))
41 "<svg viewBox=\"0 0 {폭} {높이}\" width=\"100%\" style=\"border:1px solid #d8dad6;background:{signalviz.벨럼};margin-top:10px\" data-waveform=\"1\">" + 표시선 + 행들.join("") + "</svg>"

SHA256 eea52d6a9de115e378177147fdda88c602dd4bc0f94e4af182041504caabda48