@skillpet/circuit 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/README.md +131 -0
  2. package/dist/circuit.bundle.js +31103 -0
  3. package/dist/circuit.bundle.js.map +7 -0
  4. package/dist/circuit.bundle.min.js +273 -0
  5. package/dist/circuit.bundle.min.js.map +7 -0
  6. package/dist/circuit.esm.js +31069 -0
  7. package/dist/circuit.esm.js.map +7 -0
  8. package/dist/config.d.ts +26 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/config.js +23 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/container.d.ts +32 -0
  13. package/dist/container.d.ts.map +1 -0
  14. package/dist/container.js +101 -0
  15. package/dist/container.js.map +1 -0
  16. package/dist/drawing-gradient.d.ts +13 -0
  17. package/dist/drawing-gradient.d.ts.map +1 -0
  18. package/dist/drawing-gradient.js +39 -0
  19. package/dist/drawing-gradient.js.map +1 -0
  20. package/dist/drawing-stack.d.ts +16 -0
  21. package/dist/drawing-stack.d.ts.map +1 -0
  22. package/dist/drawing-stack.js +32 -0
  23. package/dist/drawing-stack.js.map +1 -0
  24. package/dist/drawing-transition.d.ts +34 -0
  25. package/dist/drawing-transition.d.ts.map +1 -0
  26. package/dist/drawing-transition.js +181 -0
  27. package/dist/drawing-transition.js.map +1 -0
  28. package/dist/drawing.d.ts +117 -0
  29. package/dist/drawing.d.ts.map +1 -0
  30. package/dist/drawing.js +337 -0
  31. package/dist/drawing.js.map +1 -0
  32. package/dist/element-label.d.ts +54 -0
  33. package/dist/element-label.d.ts.map +1 -0
  34. package/dist/element-label.js +377 -0
  35. package/dist/element-label.js.map +1 -0
  36. package/dist/element-style.d.ts +34 -0
  37. package/dist/element-style.d.ts.map +1 -0
  38. package/dist/element-style.js +51 -0
  39. package/dist/element-style.js.map +1 -0
  40. package/dist/element.d.ts +114 -0
  41. package/dist/element.d.ts.map +1 -0
  42. package/dist/element.js +514 -0
  43. package/dist/element.js.map +1 -0
  44. package/dist/element2term.d.ts +25 -0
  45. package/dist/element2term.d.ts.map +1 -0
  46. package/dist/element2term.js +245 -0
  47. package/dist/element2term.js.map +1 -0
  48. package/dist/elements/cables.d.ts +22 -0
  49. package/dist/elements/cables.d.ts.map +1 -0
  50. package/dist/elements/cables.js +100 -0
  51. package/dist/elements/cables.js.map +1 -0
  52. package/dist/elements/capacitor.d.ts +23 -0
  53. package/dist/elements/capacitor.d.ts.map +1 -0
  54. package/dist/elements/capacitor.js +93 -0
  55. package/dist/elements/capacitor.js.map +1 -0
  56. package/dist/elements/compound.d.ts +41 -0
  57. package/dist/elements/compound.d.ts.map +1 -0
  58. package/dist/elements/compound.js +266 -0
  59. package/dist/elements/compound.js.map +1 -0
  60. package/dist/elements/connectors.d.ts +81 -0
  61. package/dist/elements/connectors.d.ts.map +1 -0
  62. package/dist/elements/connectors.js +578 -0
  63. package/dist/elements/connectors.js.map +1 -0
  64. package/dist/elements/crystal.d.ts +8 -0
  65. package/dist/elements/crystal.d.ts.map +1 -0
  66. package/dist/elements/crystal.js +31 -0
  67. package/dist/elements/crystal.js.map +1 -0
  68. package/dist/elements/diode-more.d.ts +36 -0
  69. package/dist/elements/diode-more.d.ts.map +1 -0
  70. package/dist/elements/diode-more.js +233 -0
  71. package/dist/elements/diode-more.js.map +1 -0
  72. package/dist/elements/diode.d.ts +14 -0
  73. package/dist/elements/diode.d.ts.map +1 -0
  74. package/dist/elements/diode.js +58 -0
  75. package/dist/elements/diode.js.map +1 -0
  76. package/dist/elements/element-compound.d.ts +16 -0
  77. package/dist/elements/element-compound.d.ts.map +1 -0
  78. package/dist/elements/element-compound.js +68 -0
  79. package/dist/elements/element-compound.js.map +1 -0
  80. package/dist/elements/element-drawing.d.ts +10 -0
  81. package/dist/elements/element-drawing.d.ts.map +1 -0
  82. package/dist/elements/element-drawing.js +16 -0
  83. package/dist/elements/element-drawing.js.map +1 -0
  84. package/dist/elements/ground.d.ts +6 -0
  85. package/dist/elements/ground.d.ts.map +1 -0
  86. package/dist/elements/ground.js +30 -0
  87. package/dist/elements/ground.js.map +1 -0
  88. package/dist/elements/ic.d.ts +169 -0
  89. package/dist/elements/ic.d.ts.map +1 -0
  90. package/dist/elements/ic.js +816 -0
  91. package/dist/elements/ic.js.map +1 -0
  92. package/dist/elements/image.d.ts +9 -0
  93. package/dist/elements/image.d.ts.map +1 -0
  94. package/dist/elements/image.js +27 -0
  95. package/dist/elements/image.js.map +1 -0
  96. package/dist/elements/inductor.d.ts +15 -0
  97. package/dist/elements/inductor.d.ts.map +1 -0
  98. package/dist/elements/inductor.js +111 -0
  99. package/dist/elements/inductor.js.map +1 -0
  100. package/dist/elements/line.d.ts +8 -0
  101. package/dist/elements/line.d.ts.map +1 -0
  102. package/dist/elements/line.js +14 -0
  103. package/dist/elements/line.js.map +1 -0
  104. package/dist/elements/lines-arc-labels.d.ts +223 -0
  105. package/dist/elements/lines-arc-labels.d.ts.map +1 -0
  106. package/dist/elements/lines-arc-labels.js +822 -0
  107. package/dist/elements/lines-arc-labels.js.map +1 -0
  108. package/dist/elements/lines-elements.d.ts +89 -0
  109. package/dist/elements/lines-elements.d.ts.map +1 -0
  110. package/dist/elements/lines-elements.js +271 -0
  111. package/dist/elements/lines-elements.js.map +1 -0
  112. package/dist/elements/misc-elements.d.ts +25 -0
  113. package/dist/elements/misc-elements.d.ts.map +1 -0
  114. package/dist/elements/misc-elements.js +160 -0
  115. package/dist/elements/misc-elements.js.map +1 -0
  116. package/dist/elements/oneterm.d.ts +29 -0
  117. package/dist/elements/oneterm.d.ts.map +1 -0
  118. package/dist/elements/oneterm.js +163 -0
  119. package/dist/elements/oneterm.js.map +1 -0
  120. package/dist/elements/opamp.d.ts +11 -0
  121. package/dist/elements/opamp.d.ts.map +1 -0
  122. package/dist/elements/opamp.js +72 -0
  123. package/dist/elements/opamp.js.map +1 -0
  124. package/dist/elements/outlets.d.ts +39 -0
  125. package/dist/elements/outlets.d.ts.map +1 -0
  126. package/dist/elements/outlets.js +285 -0
  127. package/dist/elements/outlets.js.map +1 -0
  128. package/dist/elements/resistor-more.d.ts +42 -0
  129. package/dist/elements/resistor-more.d.ts.map +1 -0
  130. package/dist/elements/resistor-more.js +171 -0
  131. package/dist/elements/resistor-more.js.map +1 -0
  132. package/dist/elements/resistor.d.ts +6 -0
  133. package/dist/elements/resistor.d.ts.map +1 -0
  134. package/dist/elements/resistor.js +22 -0
  135. package/dist/elements/resistor.js.map +1 -0
  136. package/dist/elements/source-v.d.ts +3 -0
  137. package/dist/elements/source-v.d.ts.map +1 -0
  138. package/dist/elements/source-v.js +3 -0
  139. package/dist/elements/source-v.js.map +1 -0
  140. package/dist/elements/sources.d.ts +111 -0
  141. package/dist/elements/sources.d.ts.map +1 -0
  142. package/dist/elements/sources.js +519 -0
  143. package/dist/elements/sources.js.map +1 -0
  144. package/dist/elements/switches.d.ts +66 -0
  145. package/dist/elements/switches.d.ts.map +1 -0
  146. package/dist/elements/switches.js +328 -0
  147. package/dist/elements/switches.js.map +1 -0
  148. package/dist/elements/transformer.d.ts +17 -0
  149. package/dist/elements/transformer.d.ts.map +1 -0
  150. package/dist/elements/transformer.js +184 -0
  151. package/dist/elements/transformer.js.map +1 -0
  152. package/dist/elements/transistors.d.ts +197 -0
  153. package/dist/elements/transistors.d.ts.map +1 -0
  154. package/dist/elements/transistors.js +1009 -0
  155. package/dist/elements/transistors.js.map +1 -0
  156. package/dist/elements/tubes.d.ts +70 -0
  157. package/dist/elements/tubes.d.ts.map +1 -0
  158. package/dist/elements/tubes.js +386 -0
  159. package/dist/elements/tubes.js.map +1 -0
  160. package/dist/elements/twoports.d.ts +47 -0
  161. package/dist/elements/twoports.d.ts.map +1 -0
  162. package/dist/elements/twoports.js +231 -0
  163. package/dist/elements/twoports.js.map +1 -0
  164. package/dist/elements/twoterm-extras.d.ts +50 -0
  165. package/dist/elements/twoterm-extras.d.ts.map +1 -0
  166. package/dist/elements/twoterm-extras.js +243 -0
  167. package/dist/elements/twoterm-extras.js.map +1 -0
  168. package/dist/elements/twoterm.d.ts +4 -0
  169. package/dist/elements/twoterm.d.ts.map +1 -0
  170. package/dist/elements/twoterm.js +4 -0
  171. package/dist/elements/twoterm.js.map +1 -0
  172. package/dist/geometry/point.d.ts +28 -0
  173. package/dist/geometry/point.d.ts.map +1 -0
  174. package/dist/geometry/point.js +99 -0
  175. package/dist/geometry/point.js.map +1 -0
  176. package/dist/geometry/roundcorners.d.ts +7 -0
  177. package/dist/geometry/roundcorners.d.ts.map +1 -0
  178. package/dist/geometry/roundcorners.js +64 -0
  179. package/dist/geometry/roundcorners.js.map +1 -0
  180. package/dist/geometry/transform.d.ts +14 -0
  181. package/dist/geometry/transform.d.ts.map +1 -0
  182. package/dist/geometry/transform.js +33 -0
  183. package/dist/geometry/transform.js.map +1 -0
  184. package/dist/geometry/util.d.ts +12 -0
  185. package/dist/geometry/util.d.ts.map +1 -0
  186. package/dist/geometry/util.js +36 -0
  187. package/dist/geometry/util.js.map +1 -0
  188. package/dist/index.cjs +31456 -0
  189. package/dist/index.cjs.map +7 -0
  190. package/dist/index.d.ts +77 -0
  191. package/dist/index.d.ts.map +1 -0
  192. package/dist/index.js +68 -0
  193. package/dist/index.js.map +1 -0
  194. package/dist/json/anchor-ref.d.ts +5 -0
  195. package/dist/json/anchor-ref.d.ts.map +1 -0
  196. package/dist/json/anchor-ref.js +35 -0
  197. package/dist/json/anchor-ref.js.map +1 -0
  198. package/dist/json/mount.d.ts +60 -0
  199. package/dist/json/mount.d.ts.map +1 -0
  200. package/dist/json/mount.js +369 -0
  201. package/dist/json/mount.js.map +1 -0
  202. package/dist/json/registry.d.ts +7 -0
  203. package/dist/json/registry.d.ts.map +1 -0
  204. package/dist/json/registry.js +323 -0
  205. package/dist/json/registry.js.map +1 -0
  206. package/dist/json/render.d.ts +59 -0
  207. package/dist/json/render.d.ts.map +1 -0
  208. package/dist/json/render.js +113 -0
  209. package/dist/json/render.js.map +1 -0
  210. package/dist/json/theme.d.ts +18 -0
  211. package/dist/json/theme.d.ts.map +1 -0
  212. package/dist/json/theme.js +57 -0
  213. package/dist/json/theme.js.map +1 -0
  214. package/dist/json/types.d.ts +42 -0
  215. package/dist/json/types.d.ts.map +1 -0
  216. package/dist/json/types.js +2 -0
  217. package/dist/json/types.js.map +1 -0
  218. package/dist/json/validate.d.ts +11 -0
  219. package/dist/json/validate.d.ts.map +1 -0
  220. package/dist/json/validate.js +77 -0
  221. package/dist/json/validate.js.map +1 -0
  222. package/dist/label-hint.d.ts +11 -0
  223. package/dist/label-hint.d.ts.map +1 -0
  224. package/dist/label-hint.js +2 -0
  225. package/dist/label-hint.js.map +1 -0
  226. package/dist/logic/and.d.ts +13 -0
  227. package/dist/logic/and.d.ts.map +1 -0
  228. package/dist/logic/and.js +63 -0
  229. package/dist/logic/and.js.map +1 -0
  230. package/dist/logic/bitfield.d.ts +32 -0
  231. package/dist/logic/bitfield.d.ts.map +1 -0
  232. package/dist/logic/bitfield.js +271 -0
  233. package/dist/logic/bitfield.js.map +1 -0
  234. package/dist/logic/buffer.d.ts +11 -0
  235. package/dist/logic/buffer.d.ts.map +1 -0
  236. package/dist/logic/buffer.js +46 -0
  237. package/dist/logic/buffer.js.map +1 -0
  238. package/dist/logic/extras.d.ts +36 -0
  239. package/dist/logic/extras.d.ts.map +1 -0
  240. package/dist/logic/extras.js +211 -0
  241. package/dist/logic/extras.js.map +1 -0
  242. package/dist/logic/kmap.d.ts +16 -0
  243. package/dist/logic/kmap.d.ts.map +1 -0
  244. package/dist/logic/kmap.js +163 -0
  245. package/dist/logic/kmap.js.map +1 -0
  246. package/dist/logic/or.d.ts +18 -0
  247. package/dist/logic/or.d.ts.map +1 -0
  248. package/dist/logic/or.js +117 -0
  249. package/dist/logic/or.js.map +1 -0
  250. package/dist/logic/timing.d.ts +44 -0
  251. package/dist/logic/timing.d.ts.map +1 -0
  252. package/dist/logic/timing.js +791 -0
  253. package/dist/logic/timing.js.map +1 -0
  254. package/dist/logic/tristate.d.ts +11 -0
  255. package/dist/logic/tristate.d.ts.map +1 -0
  256. package/dist/logic/tristate.js +48 -0
  257. package/dist/logic/tristate.js.map +1 -0
  258. package/dist/math-render.d.ts +9 -0
  259. package/dist/math-render.d.ts.map +1 -0
  260. package/dist/math-render.js +53 -0
  261. package/dist/math-render.js.map +1 -0
  262. package/dist/package-api.d.ts +20 -0
  263. package/dist/package-api.d.ts.map +1 -0
  264. package/dist/package-api.js +75 -0
  265. package/dist/package-api.js.map +1 -0
  266. package/dist/params.d.ts +6 -0
  267. package/dist/params.d.ts.map +1 -0
  268. package/dist/params.js +35 -0
  269. package/dist/params.js.map +1 -0
  270. package/dist/react/index.d.ts +22 -0
  271. package/dist/react/index.d.ts.map +1 -0
  272. package/dist/react/index.js +52 -0
  273. package/dist/react/index.js.map +1 -0
  274. package/dist/schemdraw-ts.bundle.js +30448 -0
  275. package/dist/schemdraw-ts.bundle.js.map +7 -0
  276. package/dist/segment.d.ts +267 -0
  277. package/dist/segment.d.ts.map +1 -0
  278. package/dist/segment.js +844 -0
  279. package/dist/segment.js.map +1 -0
  280. package/dist/style.d.ts +18 -0
  281. package/dist/style.d.ts.map +1 -0
  282. package/dist/style.js +230 -0
  283. package/dist/style.js.map +1 -0
  284. package/dist/subsystems/dsp.d.ts +65 -0
  285. package/dist/subsystems/dsp.d.ts.map +1 -0
  286. package/dist/subsystems/dsp.js +267 -0
  287. package/dist/subsystems/dsp.js.map +1 -0
  288. package/dist/subsystems/flow.d.ts +92 -0
  289. package/dist/subsystems/flow.d.ts.map +1 -0
  290. package/dist/subsystems/flow.js +315 -0
  291. package/dist/subsystems/flow.js.map +1 -0
  292. package/dist/subsystems/index.d.ts +22 -0
  293. package/dist/subsystems/index.d.ts.map +1 -0
  294. package/dist/subsystems/index.js +22 -0
  295. package/dist/subsystems/index.js.map +1 -0
  296. package/dist/subsystems/parsing.d.ts +41 -0
  297. package/dist/subsystems/parsing.d.ts.map +1 -0
  298. package/dist/subsystems/parsing.js +456 -0
  299. package/dist/subsystems/parsing.js.map +1 -0
  300. package/dist/subsystems/pictorial.d.ts +73 -0
  301. package/dist/subsystems/pictorial.d.ts.map +1 -0
  302. package/dist/subsystems/pictorial.js +469 -0
  303. package/dist/subsystems/pictorial.js.map +1 -0
  304. package/dist/svg/constants.d.ts +5 -0
  305. package/dist/svg/constants.d.ts.map +1 -0
  306. package/dist/svg/constants.js +5 -0
  307. package/dist/svg/constants.js.map +1 -0
  308. package/dist/svg/figure.d.ts +157 -0
  309. package/dist/svg/figure.d.ts.map +1 -0
  310. package/dist/svg/figure.js +634 -0
  311. package/dist/svg/figure.js.map +1 -0
  312. package/dist/svg/fmt.d.ts +2 -0
  313. package/dist/svg/fmt.d.ts.map +1 -0
  314. package/dist/svg/fmt.js +7 -0
  315. package/dist/svg/fmt.js.map +1 -0
  316. package/dist/svg/svg-style.d.ts +15 -0
  317. package/dist/svg/svg-style.d.ts.map +1 -0
  318. package/dist/svg/svg-style.js +46 -0
  319. package/dist/svg/svg-style.js.map +1 -0
  320. package/dist/types.d.ts +39 -0
  321. package/dist/types.d.ts.map +1 -0
  322. package/dist/types.js +21 -0
  323. package/dist/types.js.map +1 -0
  324. package/dist/version.d.ts +3 -0
  325. package/dist/version.d.ts.map +1 -0
  326. package/dist/version.js +3 -0
  327. package/dist/version.js.map +1 -0
  328. package/dist/vue/index.d.ts +43 -0
  329. package/dist/vue/index.d.ts.map +1 -0
  330. package/dist/vue/index.js +55 -0
  331. package/dist/vue/index.js.map +1 -0
  332. package/package.json +71 -0
@@ -0,0 +1,791 @@
1
+ import { Element } from "../element.js";
2
+ import { Segment, SegmentPoly, SegmentText } from "../segment.js";
3
+ import { linspace } from "../geometry/util.js";
4
+ import { Point } from "../geometry/point.js";
5
+ import { bbox } from "../types.js";
6
+ // ---------------------------------------------------------------------------
7
+ // Helpers
8
+ // ---------------------------------------------------------------------------
9
+ function stateLevel(state) {
10
+ return state
11
+ .replace(/[2-9]|=|x/g, "V")
12
+ .replace(/u/g, "1")
13
+ .replace(/d/g, "0")
14
+ .replace(/[nN]/g, "1")
15
+ .replace(/[pP]/g, "0")
16
+ .replace(/[lL]/g, "0")
17
+ .replace(/[hH]/g, "1");
18
+ }
19
+ function flattenSignals(signals) {
20
+ const result = [];
21
+ for (const item of signals) {
22
+ if (typeof item === "string")
23
+ continue;
24
+ if (Array.isArray(item)) {
25
+ result.push(...flattenSignals(item));
26
+ }
27
+ else if (typeof item === "object" && item !== null) {
28
+ result.push(item);
29
+ }
30
+ }
31
+ return result;
32
+ }
33
+ function expcurve(height) {
34
+ const xs = linspace(0, 1, 10);
35
+ const ys = xs.map((v) => height * Math.exp(-v * 6));
36
+ return { xs, ys };
37
+ }
38
+ // ---------------------------------------------------------------------------
39
+ // Doublesigmoid — break/split marker used in timing waveforms
40
+ // ---------------------------------------------------------------------------
41
+ class Doublesigmoid {
42
+ y0;
43
+ height;
44
+ curve1x;
45
+ curve2x;
46
+ extend;
47
+ rate = 25;
48
+ constructor(x0, y0, y1, extend = 0.1, gap = 0.2) {
49
+ this.y0 = y0;
50
+ this.extend = extend;
51
+ this.height = y1 - y0;
52
+ this.curve1x = x0 - gap * this.height / 2;
53
+ this.curve2x = x0 + gap * this.height / 2;
54
+ }
55
+ curve(side) {
56
+ const fullh = this.height * (1 + this.extend * 2);
57
+ const drop = this.height * this.extend;
58
+ const sigx = linspace(-0.15, 0.15);
59
+ const sigy = sigx.map((x) => 1 / (1 + Math.exp(-x * this.rate)) * fullh - drop);
60
+ const cx = side === "left" ? this.curve1x : this.curve2x;
61
+ return {
62
+ xs: sigx.map((x) => x + cx),
63
+ ys: sigy.map((y) => y + this.y0),
64
+ };
65
+ }
66
+ }
67
+ function getSplitSegments(x0, y0, y1) {
68
+ const sig = new Doublesigmoid(x0, y0, y1);
69
+ const left = sig.curve("left");
70
+ const right = sig.curve("right");
71
+ const leftPts = left.xs.map((x, i) => [x, left.ys[i]]);
72
+ const rightPts = right.xs.map((x, i) => [x, right.ys[i]]);
73
+ return [
74
+ new Segment(leftPts, { lw: 1, zorder: 3 }),
75
+ new Segment(rightPts, { lw: 1, zorder: 3 }),
76
+ new SegmentPoly([...leftPts, ...[...rightPts].reverse()], {
77
+ zorder: 3,
78
+ color: "none",
79
+ fill: "white",
80
+ lw: 1,
81
+ closed: false,
82
+ }),
83
+ ];
84
+ }
85
+ // ---------------------------------------------------------------------------
86
+ // Wave section classes — each renders one character of a wave string
87
+ // ---------------------------------------------------------------------------
88
+ class Wave0 {
89
+ params;
90
+ x0;
91
+ xend;
92
+ y0;
93
+ y1;
94
+ y1_prev;
95
+ pstate;
96
+ nstate;
97
+ plevel;
98
+ rise;
99
+ xrise;
100
+ xrisehalf;
101
+ yhalf;
102
+ xcenter;
103
+ xtext;
104
+ kwargs;
105
+ constructor(params) {
106
+ this.params = params;
107
+ this.x0 = params.x0;
108
+ this.xend = params.xend;
109
+ this.y0 = params.y0;
110
+ this.y1 = params.y1;
111
+ this.y1_prev = params.y1_prev;
112
+ this.pstate = params.pstate;
113
+ this.nstate = params.nstate;
114
+ this.plevel = params.plevel;
115
+ this.rise = params.rise;
116
+ this.xrise = this.x0 + this.rise;
117
+ this.xrisehalf = this.x0 + this.rise / 2;
118
+ this.yhalf = (this.y0 + this.y1) / 2;
119
+ this.xcenter = (this.x0 + this.xend) / 2;
120
+ this.xtext = this.xcenter + this.rise / 2;
121
+ this.kwargs = params.kwargs;
122
+ }
123
+ vertsIn() {
124
+ const m = {
125
+ "-": [[this.x0, this.y0]],
126
+ "|": [[this.x0, this.y0]],
127
+ "0": [
128
+ [this.x0, this.y0],
129
+ [this.xrisehalf, this.yhalf],
130
+ [this.xrise, this.y0],
131
+ ],
132
+ "1": [
133
+ [this.x0, this.y1],
134
+ [this.xrise, this.y0],
135
+ ],
136
+ "z": [
137
+ [this.x0, this.yhalf],
138
+ [this.xrisehalf, this.y0],
139
+ ],
140
+ "V": [[this.xrise, this.y0]],
141
+ };
142
+ return m[this.plevel] ?? [];
143
+ }
144
+ vertsOut() {
145
+ return [[this.xend, this.y0]];
146
+ }
147
+ segments() {
148
+ const verts = [...this.vertsIn(), ...this.vertsOut()];
149
+ return [new Segment(verts, this.kwargs)];
150
+ }
151
+ }
152
+ class WaveL extends Wave0 {
153
+ vertsIn() {
154
+ if ("pP".includes(this.params.pstate)) {
155
+ return [[this.x0, this.y0]];
156
+ }
157
+ return [
158
+ [this.x0, this.y1],
159
+ [this.x0, this.y0],
160
+ ];
161
+ }
162
+ segments() {
163
+ const segs = super.segments();
164
+ if (this.params.state === "L") {
165
+ const alength = 0.25;
166
+ const awidth = 0.12;
167
+ segs.push(new Segment([
168
+ [this.x0, this.yhalf + alength / 2],
169
+ [this.x0, this.yhalf - alength / 2],
170
+ ], { arrow: "->", arrowwidth: awidth, arrowlength: alength }));
171
+ }
172
+ return segs;
173
+ }
174
+ }
175
+ class Wave1 extends Wave0 {
176
+ vertsIn() {
177
+ const m = {
178
+ "-": [[this.x0, this.y1]],
179
+ "h": [[this.x0, this.y1]],
180
+ "H": [[this.x0, this.y1]],
181
+ "l": [[this.x0, this.y1]],
182
+ "L": [[this.x0, this.y1]],
183
+ "0": [
184
+ [this.x0, this.y0],
185
+ [this.xrise, this.y1],
186
+ ],
187
+ "1": this.y1_prev !== this.y1
188
+ ? [
189
+ [this.x0, this.y1_prev],
190
+ [this.xrise, this.y1],
191
+ ]
192
+ : [
193
+ [this.x0, this.y1],
194
+ [this.xrisehalf, this.yhalf],
195
+ [this.xrise, this.y1],
196
+ ],
197
+ "z": [
198
+ [this.x0, this.yhalf],
199
+ [this.xrisehalf, this.y1],
200
+ ],
201
+ "V": [[this.xrise, this.y1]],
202
+ };
203
+ return m[this.plevel] ?? [];
204
+ }
205
+ vertsOut() {
206
+ return [[this.xend, this.y1]];
207
+ }
208
+ }
209
+ class WaveH extends Wave1 {
210
+ vertsIn() {
211
+ if ("nN".includes(this.params.pstate)) {
212
+ return [[this.x0, this.y1]];
213
+ }
214
+ return [
215
+ [this.x0, this.y0],
216
+ [this.x0, this.y1],
217
+ ];
218
+ }
219
+ segments() {
220
+ const segs = super.segments();
221
+ if (this.params.state === "H") {
222
+ const alength = 0.25;
223
+ const awidth = 0.12;
224
+ segs.push(new Segment([
225
+ [this.x0, this.yhalf - alength / 2],
226
+ [this.x0, this.yhalf + alength / 2],
227
+ ], { arrow: "->", arrowwidth: awidth, arrowlength: alength }));
228
+ }
229
+ return segs;
230
+ }
231
+ }
232
+ class Wavez extends Wave0 {
233
+ vertsIn() {
234
+ const { xs: xcurve, ys: yexp } = expcurve((this.y1 - this.y0) / 2);
235
+ const ycurve = yexp.map((yc) => this.yhalf + yc);
236
+ const ycurveflip = yexp.map((yc) => this.yhalf - yc);
237
+ const xc = xcurve.map((x) => this.x0 + x * this.rise * 6);
238
+ const m = {
239
+ "-": [[this.x0, this.yhalf]],
240
+ "0": xc.map((x, i) => [x, ycurveflip[i]]),
241
+ "1": xc.map((x, i) => [x, ycurve[i]]),
242
+ "z": [[this.x0, this.yhalf]],
243
+ "V": [[this.xrise + this.rise, this.yhalf]],
244
+ };
245
+ return m[this.plevel] ?? [];
246
+ }
247
+ vertsOut() {
248
+ return [[this.xend, this.yhalf]];
249
+ }
250
+ }
251
+ class WaveV extends Wave0 {
252
+ vertsIn() {
253
+ const m = {
254
+ "-": [
255
+ [this.x0, this.y1],
256
+ [this.x0, this.y0],
257
+ ],
258
+ "|": [
259
+ [this.x0, this.y1],
260
+ [this.x0, this.y0],
261
+ ],
262
+ "0": [
263
+ [this.xrise, this.y1],
264
+ [this.x0, this.y0],
265
+ ],
266
+ "1": [
267
+ [this.x0, this.y1],
268
+ [this.xrise, this.y0],
269
+ ],
270
+ "z": [
271
+ [this.xrise, this.y1],
272
+ [this.xrisehalf, this.yhalf],
273
+ [this.xrise, this.y0],
274
+ ],
275
+ "V": [
276
+ [this.xrise, this.y1],
277
+ [this.xrisehalf, this.yhalf],
278
+ [this.xrise, this.y0],
279
+ ],
280
+ };
281
+ return m[this.plevel] ?? [];
282
+ }
283
+ vertsOut() {
284
+ const nstate = "=23456789x".includes(this.nstate) ? "V" : this.nstate;
285
+ const m = {
286
+ "0": [
287
+ [this.xend + this.rise, this.y0],
288
+ [this.xend, this.y1],
289
+ ],
290
+ "L": [
291
+ [this.xend, this.y0],
292
+ [this.xend, this.y1],
293
+ ],
294
+ "l": [
295
+ [this.xend, this.y0],
296
+ [this.xend, this.y1],
297
+ ],
298
+ "1": [
299
+ [this.xend, this.y0],
300
+ [this.xend + this.rise, this.y1],
301
+ ],
302
+ "H": [
303
+ [this.xend, this.y0],
304
+ [this.xend, this.y1],
305
+ ],
306
+ "h": [
307
+ [this.xend, this.y0],
308
+ [this.xend, this.y1],
309
+ ],
310
+ "z": [
311
+ [this.xend, this.y0],
312
+ [this.xend, this.y1],
313
+ ],
314
+ "V": [
315
+ [this.xend, this.y0],
316
+ [this.xend + this.rise / 2, this.yhalf],
317
+ [this.xend, this.y1],
318
+ ],
319
+ "-": [
320
+ [this.xend, this.y0],
321
+ [this.xend, this.y1],
322
+ ],
323
+ "n": [
324
+ [this.xend, this.y0],
325
+ [this.xend, this.y1],
326
+ ],
327
+ "p": [
328
+ [this.xend, this.y0],
329
+ [this.xend, this.y1],
330
+ ],
331
+ "N": [
332
+ [this.xend, this.y0],
333
+ [this.xend, this.y1],
334
+ ],
335
+ "P": [
336
+ [this.xend, this.y0],
337
+ [this.xend, this.y1],
338
+ ],
339
+ };
340
+ return m[nstate] ?? [];
341
+ }
342
+ fillOpts() {
343
+ const colorMap = {
344
+ "3": "#feffc2",
345
+ "4": "#ffe2ba",
346
+ "5": "#abd9ff",
347
+ "6": "#bdfbff",
348
+ "7": "#bdffcb",
349
+ "8": "#e3a5fa",
350
+ "9": "#f7b7bd",
351
+ };
352
+ return {
353
+ fill: colorMap[this.params.state],
354
+ hatch: this.params.state === "x",
355
+ };
356
+ }
357
+ segments() {
358
+ const { fill, hatch } = this.fillOpts();
359
+ const segs = [];
360
+ const pOpen = "-|".includes(this.pstate);
361
+ const nOpen = "-|".includes(this.nstate);
362
+ if (pOpen && nOpen) {
363
+ segs.push(new Segment([
364
+ [this.x0, this.y0],
365
+ [this.xend, this.y0],
366
+ ], this.kwargs));
367
+ segs.push(new Segment([
368
+ [this.x0, this.y1],
369
+ [this.xend, this.y1],
370
+ ], this.kwargs));
371
+ segs.push(new SegmentPoly([
372
+ [this.x0, this.y0],
373
+ [this.xend, this.y0],
374
+ [this.xend, this.y1],
375
+ [this.x0, this.y1],
376
+ ], { color: "none", fill, hatch }));
377
+ }
378
+ else if (pOpen) {
379
+ segs.push(new SegmentPoly([[this.x0, this.y0], ...this.vertsOut(), [this.x0, this.y1]], { closed: false, fill, hatch, ...this.kwargs }));
380
+ }
381
+ else if (nOpen) {
382
+ segs.push(new SegmentPoly([[this.xend, this.y1], ...this.vertsIn(), [this.xend, this.y0]], { closed: false, fill, hatch, ...this.kwargs }));
383
+ }
384
+ else {
385
+ segs.push(new SegmentPoly([...this.vertsIn(), ...this.vertsOut()], {
386
+ fill,
387
+ hatch,
388
+ ...this.kwargs,
389
+ }));
390
+ }
391
+ if (this.params.data.length > 0 && this.params.state !== "x") {
392
+ segs.push(new SegmentText([this.xtext, this.yhalf], this.params.data[0], {
393
+ color: this.params.datacolor,
394
+ fontsize: 11,
395
+ align: ["center", "center"],
396
+ }));
397
+ this.params.data.shift();
398
+ }
399
+ return segs;
400
+ }
401
+ }
402
+ class WaveU extends Wave1 {
403
+ vertsIn() {
404
+ const { xs: xcurve, ys: yexp } = expcurve(this.y1 - this.y0);
405
+ const xc = xcurve.map((x) => this.x0 + x * this.rise * 6);
406
+ const ycurvef = yexp.map((yc) => this.y1 - yc);
407
+ const ycurvehf = yexp.map((yc) => this.y1 - yc / 2);
408
+ const m = {
409
+ "-": [[this.x0, this.y1]],
410
+ "0": xc.map((x, i) => [x, ycurvef[i]]),
411
+ "1": [[this.x0, this.y1]],
412
+ "z": xc.map((x, i) => [x, ycurvehf[i]]),
413
+ "V": [[this.xrise, this.y1]],
414
+ };
415
+ return m[this.plevel] ?? [];
416
+ }
417
+ segments() {
418
+ const verts = this.vertsIn();
419
+ return [
420
+ new Segment(verts, this.kwargs),
421
+ new Segment([verts[verts.length - 1], [this.xend, this.y1]], {
422
+ ...this.kwargs,
423
+ ls: ":",
424
+ }),
425
+ ];
426
+ }
427
+ }
428
+ class WaveD extends Wave0 {
429
+ vertsIn() {
430
+ const { xs: xcurve, ys: yexp } = expcurve(this.y1 - this.y0);
431
+ const xc = xcurve.map((x) => this.x0 + x * this.rise * 6);
432
+ const ycurve = yexp.map((yc) => this.y0 + yc);
433
+ const ycurveh = yexp.map((yc) => this.y0 + yc / 2);
434
+ const m = {
435
+ "-": [[this.x0, this.y0]],
436
+ "0": [[this.x0, this.y0]],
437
+ "1": xc.map((x, i) => [x, ycurve[i]]),
438
+ "z": xc.map((x, i) => [x, ycurveh[i]]),
439
+ "V": [[this.x0, this.y0]],
440
+ };
441
+ return m[this.plevel] ?? [];
442
+ }
443
+ segments() {
444
+ const verts = this.vertsIn();
445
+ return [
446
+ new Segment(verts, this.kwargs),
447
+ new Segment([verts[verts.length - 1], [this.xend, this.y0]], {
448
+ ...this.kwargs,
449
+ ls: ":",
450
+ }),
451
+ ];
452
+ }
453
+ }
454
+ class WaveClk extends Wave0 {
455
+ vertsIn() {
456
+ const state = this.params.state;
457
+ const period = this.params.period;
458
+ let yh = this.y1;
459
+ let yl = this.y0;
460
+ if ("nN".includes(state)) {
461
+ [yh, yl] = [yl, yh];
462
+ }
463
+ const verts = [];
464
+ for (let p = 0; p < this.params.periods; p++) {
465
+ verts.push([this.x0 + period * p, yl], [this.x0 + period * p, yh], [this.x0 + period * p + period / 2, yh], [this.x0 + period * p + period / 2, yl]);
466
+ }
467
+ if (("nN".includes(state) && "lL".includes(this.params.pstate)) ||
468
+ ("pP".includes(state) && "hH".includes(this.params.pstate))) {
469
+ return verts.slice(1);
470
+ }
471
+ return verts;
472
+ }
473
+ vertsOut() {
474
+ const yl = "nN".includes(this.params.state) ? this.y1 : this.y0;
475
+ return [[this.xend, yl]];
476
+ }
477
+ segments() {
478
+ const segs = super.segments();
479
+ if ("NP".includes(this.params.state)) {
480
+ const period = this.params.period;
481
+ const alength = 0.25;
482
+ const awidth = 0.12;
483
+ let yhead = this.yhalf - alength / 2;
484
+ let ytail = this.yhalf + alength / 2;
485
+ if (this.params.state === "P") {
486
+ [yhead, ytail] = [ytail, yhead];
487
+ }
488
+ for (let p = 0; p < this.params.periods; p++) {
489
+ const xc = this.x0 + period * p;
490
+ segs.push(new Segment([
491
+ [xc, ytail],
492
+ [xc, yhead],
493
+ ], {
494
+ arrow: "->",
495
+ arrowwidth: awidth,
496
+ arrowlength: alength,
497
+ ...this.kwargs,
498
+ }));
499
+ }
500
+ }
501
+ return segs;
502
+ }
503
+ }
504
+ // ---------------------------------------------------------------------------
505
+ // Wave class lookup
506
+ // ---------------------------------------------------------------------------
507
+ const WAVE_LOOKUP = {
508
+ "0": Wave0,
509
+ "1": Wave1,
510
+ H: WaveH,
511
+ h: WaveH,
512
+ L: WaveL,
513
+ l: WaveL,
514
+ z: Wavez,
515
+ u: WaveU,
516
+ d: WaveD,
517
+ n: WaveClk,
518
+ p: WaveClk,
519
+ N: WaveClk,
520
+ P: WaveClk,
521
+ };
522
+ // ---------------------------------------------------------------------------
523
+ // TimingDiagram
524
+ // ---------------------------------------------------------------------------
525
+ export class TimingDiagram extends Element {
526
+ waveData;
527
+ yheight;
528
+ ygap;
529
+ risetime;
530
+ _fontSize;
531
+ namecolor;
532
+ datacolor;
533
+ gridcolor;
534
+ tickcolor;
535
+ edgecolor;
536
+ hscale;
537
+ showGrid;
538
+ constructor(waved, userParams = {}) {
539
+ super(userParams);
540
+ this.waveData = waved;
541
+ this.yheight = userParams.yheight ?? 0.5;
542
+ this.ygap = userParams.ygap ?? 0.3;
543
+ this.risetime = userParams.risetime ?? 0.15;
544
+ this._fontSize = userParams.fontsize ?? 12;
545
+ this.namecolor = userParams.namecolor ?? "blue";
546
+ this.datacolor = userParams.datacolor;
547
+ this.gridcolor = userParams.gridcolor ?? "#DDDDDD";
548
+ this.tickcolor = userParams.tickcolor ?? "#888888";
549
+ this.edgecolor = userParams.edgecolor ?? "blue";
550
+ this.showGrid = userParams.grid ?? true;
551
+ const signals = this.waveData.signal ?? [];
552
+ const signalsFlat = flattenSignals(signals);
553
+ const config = this.waveData.config ?? {};
554
+ this.hscale = config.hscale ?? 1;
555
+ const head = this.waveData.head ?? {};
556
+ const foot = this.waveData.foot ?? {};
557
+ const height = (this.yheight + this.ygap) * signalsFlat.length;
558
+ let periods = 0;
559
+ for (const w of signalsFlat) {
560
+ periods = Math.max(periods, (w.wave ?? "").length);
561
+ }
562
+ if (this.showGrid) {
563
+ this._drawGrid(periods, height);
564
+ }
565
+ const clipBox = bbox(0, this.yheight + 0.05, periods * this.yheight * 2 * this.hscale, -height);
566
+ let y0 = 0;
567
+ for (const signal of signalsFlat) {
568
+ this._drawName(signal.name ?? "", y0);
569
+ this._drawWave(signal, y0, clipBox);
570
+ y0 -= this.yheight + this.ygap;
571
+ }
572
+ this._drawEdges(signalsFlat);
573
+ this._drawHeadFoot(head, foot, periods, y0);
574
+ this.anchors.topleft = [0, 0];
575
+ }
576
+ _drawGrid(periods, height) {
577
+ for (let p = 0; p <= periods; p++) {
578
+ const x = p * 2 * this.yheight * this.hscale;
579
+ this.segments.push(new Segment([
580
+ [x, this.yheight + this.ygap / 2],
581
+ [x, this.yheight - height],
582
+ ], { ls: ":", lw: 1, color: this.gridcolor, zorder: 0 }));
583
+ }
584
+ }
585
+ _drawName(name, y0) {
586
+ if (!name)
587
+ return;
588
+ const textpad = 0.2;
589
+ this.segments.push(new SegmentText([-textpad, y0], name, {
590
+ align: ["right", "bottom"],
591
+ fontsize: this._fontSize,
592
+ color: this.namecolor,
593
+ }));
594
+ }
595
+ _drawWave(signal, y0, clip) {
596
+ const wave = signal.wave ?? "";
597
+ if (!wave)
598
+ return;
599
+ const phase = signal.phase ?? 0;
600
+ let level = signal.level ?? "0";
601
+ const waverise = signal.risetime ?? this.risetime;
602
+ const wavekwargs = {
603
+ color: signal.color ?? undefined,
604
+ lw: signal.lw ?? 1,
605
+ clip,
606
+ };
607
+ const data = signal.data
608
+ ? Array.isArray(signal.data)
609
+ ? [...signal.data]
610
+ : signal.data.split(" ")
611
+ : [];
612
+ if (level.length === 1) {
613
+ level = level.repeat(wave.length);
614
+ }
615
+ else if (level.length < wave.length) {
616
+ level += level[level.length - 1].repeat(wave.length - level.length);
617
+ }
618
+ const period = 2 * this.yheight * (signal.period ?? 1) * this.hscale;
619
+ let signalHeight = this.yheight;
620
+ let i = 0;
621
+ let pstate = "-";
622
+ let y1_prev = y0 + signalHeight;
623
+ let x = -period * phase;
624
+ while (i < wave.length) {
625
+ const state = wave[i];
626
+ const splits = [];
627
+ let pcount = 1;
628
+ const lvl = parseInt(level[i], 10);
629
+ if (!isNaN(lvl) && lvl > 0) {
630
+ signalHeight = (lvl / 10) * this.yheight;
631
+ }
632
+ if (signalHeight === 0)
633
+ signalHeight = this.yheight;
634
+ let k = i + 1;
635
+ while (k < wave.length && (wave[k] === "|" || wave[k] === ".")) {
636
+ if (wave[k] === "|")
637
+ splits.push(pcount);
638
+ pcount++;
639
+ k++;
640
+ }
641
+ const nstate = k < wave.length ? wave[k] : "-";
642
+ const y1 = y0 + signalHeight;
643
+ const xend = x + pcount * period;
644
+ const params = {
645
+ state,
646
+ pstate,
647
+ nstate,
648
+ plevel: stateLevel(pstate),
649
+ nlevel: stateLevel(nstate),
650
+ periods: pcount,
651
+ period,
652
+ x0: x,
653
+ xend,
654
+ y0,
655
+ y1,
656
+ y1_prev,
657
+ rise: waverise,
658
+ data,
659
+ datacolor: this.datacolor,
660
+ kwargs: wavekwargs,
661
+ };
662
+ const WaveCls = WAVE_LOOKUP[state] ?? WaveV;
663
+ this.segments.push(...new WaveCls(params).segments());
664
+ for (const split of splits) {
665
+ this.segments.push(...getSplitSegments(x + (split + 1) * period - period / 2, y0, y1));
666
+ }
667
+ pstate = state;
668
+ y1_prev = y1;
669
+ x += pcount * period;
670
+ i = k;
671
+ }
672
+ }
673
+ _drawEdges(signalsFlat) {
674
+ const edges = this.waveData.edge ?? [];
675
+ if (edges.length === 0)
676
+ return;
677
+ const period = 2 * this.yheight * this.hscale;
678
+ for (let edgeStr of edges) {
679
+ let label = "";
680
+ if (edgeStr.includes(" ")) {
681
+ const idx = edgeStr.indexOf(" ");
682
+ label = edgeStr.slice(idx + 1);
683
+ edgeStr = edgeStr.slice(0, idx);
684
+ }
685
+ const styleMatch = edgeStr.match(/\{(.*?)\}/);
686
+ let edgeColor = this.edgecolor;
687
+ if (styleMatch) {
688
+ const parts = styleMatch[1].split(",");
689
+ edgeColor = parts[0] || edgeColor;
690
+ edgeStr = edgeStr.replace(/\{.*?\}/, "");
691
+ }
692
+ let arrow;
693
+ if (edgeStr.includes("<") && edgeStr.includes(">"))
694
+ arrow = "<>";
695
+ else if (edgeStr.includes("<"))
696
+ arrow = "<";
697
+ else if (edgeStr.includes(">"))
698
+ arrow = ">";
699
+ const nodeRefs = edgeStr.match(/\[(.+?)\]/g);
700
+ if (nodeRefs && nodeRefs.length === 2) {
701
+ const endpoints = [];
702
+ for (const ref of nodeRefs) {
703
+ const inner = ref.slice(1, -1);
704
+ const colonIdx = inner.indexOf(":");
705
+ const waveNumStr = inner.slice(0, colonIdx);
706
+ const timeStr = inner.slice(colonIdx + 1);
707
+ const waveNum = parseInt(waveNumStr.replace(/[^0-9]/g, ""), 10);
708
+ const time = parseFloat(timeStr);
709
+ let ofst = this.yheight / 2;
710
+ if (waveNumStr.includes("^"))
711
+ ofst = this.yheight + 0.2;
712
+ else if (waveNumStr.includes("v"))
713
+ ofst = -0.2;
714
+ const sigPhase = signalsFlat[waveNum]?.phase ?? 0;
715
+ const nodex = time * period - period * sigPhase;
716
+ const nodey = -waveNum * (this.yheight + this.ygap) + ofst;
717
+ endpoints.push([nodex, nodey]);
718
+ }
719
+ if (endpoints.length === 2) {
720
+ this.segments.push(new Segment(endpoints, {
721
+ lw: 1,
722
+ color: edgeColor,
723
+ arrow,
724
+ zorder: 3,
725
+ }));
726
+ if (label) {
727
+ const cx = (endpoints[0][0] + endpoints[1][0]) / 2;
728
+ const cy = (endpoints[0][1] + endpoints[1][1]) / 2;
729
+ this.segments.push(new SegmentText([cx, cy], label, {
730
+ fontsize: 8,
731
+ color: edgeColor,
732
+ align: ["center", "center"],
733
+ zorder: 4,
734
+ }));
735
+ }
736
+ }
737
+ }
738
+ else if (edgeStr.length >= 3) {
739
+ const first = edgeStr[0];
740
+ const last = edgeStr[edgeStr.length - 1];
741
+ const anchorStart = this.anchors[`node_${first}`];
742
+ const anchorEnd = this.anchors[`node_${last}`];
743
+ if (anchorStart && anchorEnd) {
744
+ const toXY = (a) => a instanceof Point ? [a.x, a.y] : [a[0], a[1]];
745
+ const p0 = toXY(anchorStart);
746
+ const pn = toXY(anchorEnd);
747
+ this.segments.push(new Segment([p0, pn], { lw: 1, color: edgeColor, arrow, zorder: 3 }));
748
+ if (label) {
749
+ const cx = (p0[0] + pn[0]) / 2;
750
+ const cy = (p0[1] + pn[1]) / 2;
751
+ this.segments.push(new SegmentText([cx, cy], label, {
752
+ fontsize: 8,
753
+ color: edgeColor,
754
+ align: ["center", "center"],
755
+ zorder: 4,
756
+ }));
757
+ }
758
+ }
759
+ }
760
+ }
761
+ }
762
+ _drawHeadFoot(head, foot, periods, yBottom) {
763
+ if (head.tick !== undefined || head.tock !== undefined) {
764
+ const tk = (head.tick ?? head.tock ?? 0);
765
+ const every = head.every ?? 1;
766
+ const startx = head.tick !== undefined ? 0 : this.hscale / 2;
767
+ for (let p = 0; p < periods; p += every) {
768
+ const x = (startx + p * this.hscale) * 2 * this.yheight;
769
+ this.segments.push(new SegmentText([x, this.yheight + this.ygap], String(tk + p), {
770
+ color: this.tickcolor,
771
+ fontsize: this._fontSize,
772
+ align: ["center", "bottom"],
773
+ }));
774
+ }
775
+ }
776
+ if (foot.tick !== undefined || foot.tock !== undefined) {
777
+ const tk = (foot.tick ?? foot.tock ?? 0);
778
+ const every = foot.every ?? 1;
779
+ const startx = foot.tick !== undefined ? 0 : this.hscale / 2;
780
+ for (let p = 0; p < periods; p += every) {
781
+ const x = (startx + p * this.hscale) * 2 * this.yheight;
782
+ this.segments.push(new SegmentText([x, yBottom + this.yheight], String(tk + p), {
783
+ color: this.tickcolor,
784
+ fontsize: this._fontSize,
785
+ align: ["center", "top"],
786
+ }));
787
+ }
788
+ }
789
+ }
790
+ }
791
+ //# sourceMappingURL=timing.js.map