@skillpet/circuit 0.5.0 → 0.5.2

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 (333) hide show
  1. package/LICENSE +43 -0
  2. package/README.md +24 -30
  3. package/dist/circuit.bundle.js +0 -1
  4. package/dist/circuit.bundle.min.js +0 -1
  5. package/dist/circuit.esm.js +0 -1
  6. package/dist/config.d.ts +0 -1
  7. package/dist/container.d.ts +0 -1
  8. package/dist/drawing-gradient.d.ts +0 -1
  9. package/dist/drawing-stack.d.ts +0 -1
  10. package/dist/drawing-transition.d.ts +0 -1
  11. package/dist/drawing.d.ts +0 -1
  12. package/dist/element-label.d.ts +0 -1
  13. package/dist/element-style.d.ts +0 -1
  14. package/dist/element.d.ts +0 -1
  15. package/dist/element2term.d.ts +0 -1
  16. package/dist/elements/cables.d.ts +0 -1
  17. package/dist/elements/capacitor.d.ts +0 -1
  18. package/dist/elements/compound.d.ts +0 -1
  19. package/dist/elements/connectors.d.ts +0 -1
  20. package/dist/elements/crystal.d.ts +0 -1
  21. package/dist/elements/diode-more.d.ts +0 -1
  22. package/dist/elements/diode.d.ts +0 -1
  23. package/dist/elements/element-compound.d.ts +0 -1
  24. package/dist/elements/element-drawing.d.ts +0 -1
  25. package/dist/elements/ground.d.ts +0 -1
  26. package/dist/elements/ic.d.ts +0 -1
  27. package/dist/elements/image.d.ts +0 -1
  28. package/dist/elements/inductor.d.ts +0 -1
  29. package/dist/elements/line.d.ts +0 -1
  30. package/dist/elements/lines-arc-labels.d.ts +0 -1
  31. package/dist/elements/lines-elements.d.ts +0 -1
  32. package/dist/elements/misc-elements.d.ts +0 -1
  33. package/dist/elements/oneterm.d.ts +0 -1
  34. package/dist/elements/opamp.d.ts +0 -1
  35. package/dist/elements/outlets.d.ts +0 -1
  36. package/dist/elements/resistor-more.d.ts +0 -1
  37. package/dist/elements/resistor.d.ts +0 -1
  38. package/dist/elements/source-v.d.ts +0 -1
  39. package/dist/elements/sources.d.ts +0 -1
  40. package/dist/elements/switches.d.ts +0 -1
  41. package/dist/elements/transformer.d.ts +0 -1
  42. package/dist/elements/transistors.d.ts +0 -1
  43. package/dist/elements/tubes.d.ts +0 -1
  44. package/dist/elements/twoports.d.ts +0 -1
  45. package/dist/elements/twoterm-extras.d.ts +0 -1
  46. package/dist/elements/twoterm.d.ts +0 -1
  47. package/dist/geometry/point.d.ts +0 -1
  48. package/dist/geometry/roundcorners.d.ts +0 -1
  49. package/dist/geometry/transform.d.ts +0 -1
  50. package/dist/geometry/util.d.ts +0 -1
  51. package/dist/index.cjs +0 -1
  52. package/dist/index.d.ts +0 -1
  53. package/dist/json/anchor-ref.d.ts +0 -1
  54. package/dist/json/mount.d.ts +0 -1
  55. package/dist/json/registry.d.ts +0 -1
  56. package/dist/json/render.d.ts +0 -1
  57. package/dist/json/theme.d.ts +0 -1
  58. package/dist/json/types.d.ts +0 -1
  59. package/dist/json/validate.d.ts +0 -1
  60. package/dist/label-hint.d.ts +0 -1
  61. package/dist/logic/and.d.ts +0 -1
  62. package/dist/logic/bitfield.d.ts +0 -1
  63. package/dist/logic/buffer.d.ts +0 -1
  64. package/dist/logic/extras.d.ts +0 -1
  65. package/dist/logic/kmap.d.ts +0 -1
  66. package/dist/logic/or.d.ts +0 -1
  67. package/dist/logic/timing.d.ts +0 -1
  68. package/dist/logic/tristate.d.ts +0 -1
  69. package/dist/math-render.d.ts +0 -1
  70. package/dist/package-api.d.ts +0 -1
  71. package/dist/params.d.ts +0 -1
  72. package/dist/react/index.d.ts +0 -1
  73. package/dist/react/index.js +0 -1
  74. package/dist/segment.d.ts +0 -1
  75. package/dist/style.d.ts +0 -1
  76. package/dist/subsystems/dsp.d.ts +0 -1
  77. package/dist/subsystems/flow.d.ts +0 -1
  78. package/dist/subsystems/index.d.ts +0 -1
  79. package/dist/subsystems/parsing.d.ts +0 -1
  80. package/dist/subsystems/pictorial.d.ts +0 -1
  81. package/dist/svg/constants.d.ts +0 -1
  82. package/dist/svg/figure.d.ts +0 -1
  83. package/dist/svg/fmt.d.ts +0 -1
  84. package/dist/svg/svg-style.d.ts +0 -1
  85. package/dist/types.d.ts +0 -1
  86. package/dist/version.d.ts +0 -1
  87. package/dist/vue/index.d.ts +0 -1
  88. package/dist/vue/index.js +0 -1
  89. package/package.json +22 -9
  90. package/dist/circuit.bundle.js.map +0 -7
  91. package/dist/circuit.bundle.min.js.map +0 -7
  92. package/dist/circuit.esm.js.map +0 -7
  93. package/dist/config.d.ts.map +0 -1
  94. package/dist/config.js +0 -23
  95. package/dist/config.js.map +0 -1
  96. package/dist/container.d.ts.map +0 -1
  97. package/dist/container.js +0 -101
  98. package/dist/container.js.map +0 -1
  99. package/dist/drawing-gradient.d.ts.map +0 -1
  100. package/dist/drawing-gradient.js +0 -39
  101. package/dist/drawing-gradient.js.map +0 -1
  102. package/dist/drawing-stack.d.ts.map +0 -1
  103. package/dist/drawing-stack.js +0 -32
  104. package/dist/drawing-stack.js.map +0 -1
  105. package/dist/drawing-transition.d.ts.map +0 -1
  106. package/dist/drawing-transition.js +0 -181
  107. package/dist/drawing-transition.js.map +0 -1
  108. package/dist/drawing.d.ts.map +0 -1
  109. package/dist/drawing.js +0 -337
  110. package/dist/drawing.js.map +0 -1
  111. package/dist/element-label.d.ts.map +0 -1
  112. package/dist/element-label.js +0 -377
  113. package/dist/element-label.js.map +0 -1
  114. package/dist/element-style.d.ts.map +0 -1
  115. package/dist/element-style.js +0 -51
  116. package/dist/element-style.js.map +0 -1
  117. package/dist/element.d.ts.map +0 -1
  118. package/dist/element.js +0 -514
  119. package/dist/element.js.map +0 -1
  120. package/dist/element2term.d.ts.map +0 -1
  121. package/dist/element2term.js +0 -245
  122. package/dist/element2term.js.map +0 -1
  123. package/dist/elements/cables.d.ts.map +0 -1
  124. package/dist/elements/cables.js +0 -100
  125. package/dist/elements/cables.js.map +0 -1
  126. package/dist/elements/capacitor.d.ts.map +0 -1
  127. package/dist/elements/capacitor.js +0 -93
  128. package/dist/elements/capacitor.js.map +0 -1
  129. package/dist/elements/compound.d.ts.map +0 -1
  130. package/dist/elements/compound.js +0 -266
  131. package/dist/elements/compound.js.map +0 -1
  132. package/dist/elements/connectors.d.ts.map +0 -1
  133. package/dist/elements/connectors.js +0 -578
  134. package/dist/elements/connectors.js.map +0 -1
  135. package/dist/elements/crystal.d.ts.map +0 -1
  136. package/dist/elements/crystal.js +0 -31
  137. package/dist/elements/crystal.js.map +0 -1
  138. package/dist/elements/diode-more.d.ts.map +0 -1
  139. package/dist/elements/diode-more.js +0 -233
  140. package/dist/elements/diode-more.js.map +0 -1
  141. package/dist/elements/diode.d.ts.map +0 -1
  142. package/dist/elements/diode.js +0 -58
  143. package/dist/elements/diode.js.map +0 -1
  144. package/dist/elements/element-compound.d.ts.map +0 -1
  145. package/dist/elements/element-compound.js +0 -68
  146. package/dist/elements/element-compound.js.map +0 -1
  147. package/dist/elements/element-drawing.d.ts.map +0 -1
  148. package/dist/elements/element-drawing.js +0 -16
  149. package/dist/elements/element-drawing.js.map +0 -1
  150. package/dist/elements/ground.d.ts.map +0 -1
  151. package/dist/elements/ground.js +0 -30
  152. package/dist/elements/ground.js.map +0 -1
  153. package/dist/elements/ic.d.ts.map +0 -1
  154. package/dist/elements/ic.js +0 -816
  155. package/dist/elements/ic.js.map +0 -1
  156. package/dist/elements/image.d.ts.map +0 -1
  157. package/dist/elements/image.js +0 -27
  158. package/dist/elements/image.js.map +0 -1
  159. package/dist/elements/inductor.d.ts.map +0 -1
  160. package/dist/elements/inductor.js +0 -111
  161. package/dist/elements/inductor.js.map +0 -1
  162. package/dist/elements/line.d.ts.map +0 -1
  163. package/dist/elements/line.js +0 -14
  164. package/dist/elements/line.js.map +0 -1
  165. package/dist/elements/lines-arc-labels.d.ts.map +0 -1
  166. package/dist/elements/lines-arc-labels.js +0 -822
  167. package/dist/elements/lines-arc-labels.js.map +0 -1
  168. package/dist/elements/lines-elements.d.ts.map +0 -1
  169. package/dist/elements/lines-elements.js +0 -271
  170. package/dist/elements/lines-elements.js.map +0 -1
  171. package/dist/elements/misc-elements.d.ts.map +0 -1
  172. package/dist/elements/misc-elements.js +0 -160
  173. package/dist/elements/misc-elements.js.map +0 -1
  174. package/dist/elements/oneterm.d.ts.map +0 -1
  175. package/dist/elements/oneterm.js +0 -163
  176. package/dist/elements/oneterm.js.map +0 -1
  177. package/dist/elements/opamp.d.ts.map +0 -1
  178. package/dist/elements/opamp.js +0 -72
  179. package/dist/elements/opamp.js.map +0 -1
  180. package/dist/elements/outlets.d.ts.map +0 -1
  181. package/dist/elements/outlets.js +0 -285
  182. package/dist/elements/outlets.js.map +0 -1
  183. package/dist/elements/resistor-more.d.ts.map +0 -1
  184. package/dist/elements/resistor-more.js +0 -171
  185. package/dist/elements/resistor-more.js.map +0 -1
  186. package/dist/elements/resistor.d.ts.map +0 -1
  187. package/dist/elements/resistor.js +0 -22
  188. package/dist/elements/resistor.js.map +0 -1
  189. package/dist/elements/source-v.d.ts.map +0 -1
  190. package/dist/elements/source-v.js +0 -3
  191. package/dist/elements/source-v.js.map +0 -1
  192. package/dist/elements/sources.d.ts.map +0 -1
  193. package/dist/elements/sources.js +0 -519
  194. package/dist/elements/sources.js.map +0 -1
  195. package/dist/elements/switches.d.ts.map +0 -1
  196. package/dist/elements/switches.js +0 -328
  197. package/dist/elements/switches.js.map +0 -1
  198. package/dist/elements/transformer.d.ts.map +0 -1
  199. package/dist/elements/transformer.js +0 -184
  200. package/dist/elements/transformer.js.map +0 -1
  201. package/dist/elements/transistors.d.ts.map +0 -1
  202. package/dist/elements/transistors.js +0 -1009
  203. package/dist/elements/transistors.js.map +0 -1
  204. package/dist/elements/tubes.d.ts.map +0 -1
  205. package/dist/elements/tubes.js +0 -386
  206. package/dist/elements/tubes.js.map +0 -1
  207. package/dist/elements/twoports.d.ts.map +0 -1
  208. package/dist/elements/twoports.js +0 -231
  209. package/dist/elements/twoports.js.map +0 -1
  210. package/dist/elements/twoterm-extras.d.ts.map +0 -1
  211. package/dist/elements/twoterm-extras.js +0 -243
  212. package/dist/elements/twoterm-extras.js.map +0 -1
  213. package/dist/elements/twoterm.d.ts.map +0 -1
  214. package/dist/elements/twoterm.js +0 -4
  215. package/dist/elements/twoterm.js.map +0 -1
  216. package/dist/geometry/point.d.ts.map +0 -1
  217. package/dist/geometry/point.js +0 -99
  218. package/dist/geometry/point.js.map +0 -1
  219. package/dist/geometry/roundcorners.d.ts.map +0 -1
  220. package/dist/geometry/roundcorners.js +0 -64
  221. package/dist/geometry/roundcorners.js.map +0 -1
  222. package/dist/geometry/transform.d.ts.map +0 -1
  223. package/dist/geometry/transform.js +0 -33
  224. package/dist/geometry/transform.js.map +0 -1
  225. package/dist/geometry/util.d.ts.map +0 -1
  226. package/dist/geometry/util.js +0 -36
  227. package/dist/geometry/util.js.map +0 -1
  228. package/dist/index.cjs.map +0 -7
  229. package/dist/index.d.ts.map +0 -1
  230. package/dist/index.js +0 -68
  231. package/dist/index.js.map +0 -1
  232. package/dist/json/anchor-ref.d.ts.map +0 -1
  233. package/dist/json/anchor-ref.js +0 -35
  234. package/dist/json/anchor-ref.js.map +0 -1
  235. package/dist/json/mount.d.ts.map +0 -1
  236. package/dist/json/mount.js +0 -369
  237. package/dist/json/mount.js.map +0 -1
  238. package/dist/json/registry.d.ts.map +0 -1
  239. package/dist/json/registry.js +0 -323
  240. package/dist/json/registry.js.map +0 -1
  241. package/dist/json/render.d.ts.map +0 -1
  242. package/dist/json/render.js +0 -113
  243. package/dist/json/render.js.map +0 -1
  244. package/dist/json/theme.d.ts.map +0 -1
  245. package/dist/json/theme.js +0 -57
  246. package/dist/json/theme.js.map +0 -1
  247. package/dist/json/types.d.ts.map +0 -1
  248. package/dist/json/types.js +0 -2
  249. package/dist/json/types.js.map +0 -1
  250. package/dist/json/validate.d.ts.map +0 -1
  251. package/dist/json/validate.js +0 -77
  252. package/dist/json/validate.js.map +0 -1
  253. package/dist/label-hint.d.ts.map +0 -1
  254. package/dist/label-hint.js +0 -2
  255. package/dist/label-hint.js.map +0 -1
  256. package/dist/logic/and.d.ts.map +0 -1
  257. package/dist/logic/and.js +0 -63
  258. package/dist/logic/and.js.map +0 -1
  259. package/dist/logic/bitfield.d.ts.map +0 -1
  260. package/dist/logic/bitfield.js +0 -271
  261. package/dist/logic/bitfield.js.map +0 -1
  262. package/dist/logic/buffer.d.ts.map +0 -1
  263. package/dist/logic/buffer.js +0 -46
  264. package/dist/logic/buffer.js.map +0 -1
  265. package/dist/logic/extras.d.ts.map +0 -1
  266. package/dist/logic/extras.js +0 -211
  267. package/dist/logic/extras.js.map +0 -1
  268. package/dist/logic/kmap.d.ts.map +0 -1
  269. package/dist/logic/kmap.js +0 -163
  270. package/dist/logic/kmap.js.map +0 -1
  271. package/dist/logic/or.d.ts.map +0 -1
  272. package/dist/logic/or.js +0 -117
  273. package/dist/logic/or.js.map +0 -1
  274. package/dist/logic/timing.d.ts.map +0 -1
  275. package/dist/logic/timing.js +0 -791
  276. package/dist/logic/timing.js.map +0 -1
  277. package/dist/logic/tristate.d.ts.map +0 -1
  278. package/dist/logic/tristate.js +0 -48
  279. package/dist/logic/tristate.js.map +0 -1
  280. package/dist/math-render.d.ts.map +0 -1
  281. package/dist/math-render.js +0 -53
  282. package/dist/math-render.js.map +0 -1
  283. package/dist/package-api.d.ts.map +0 -1
  284. package/dist/package-api.js +0 -75
  285. package/dist/package-api.js.map +0 -1
  286. package/dist/params.d.ts.map +0 -1
  287. package/dist/params.js +0 -35
  288. package/dist/params.js.map +0 -1
  289. package/dist/react/index.d.ts.map +0 -1
  290. package/dist/react/index.js.map +0 -1
  291. package/dist/schemdraw-ts.bundle.js +0 -30448
  292. package/dist/schemdraw-ts.bundle.js.map +0 -7
  293. package/dist/segment.d.ts.map +0 -1
  294. package/dist/segment.js +0 -844
  295. package/dist/segment.js.map +0 -1
  296. package/dist/style.d.ts.map +0 -1
  297. package/dist/style.js +0 -230
  298. package/dist/style.js.map +0 -1
  299. package/dist/subsystems/dsp.d.ts.map +0 -1
  300. package/dist/subsystems/dsp.js +0 -267
  301. package/dist/subsystems/dsp.js.map +0 -1
  302. package/dist/subsystems/flow.d.ts.map +0 -1
  303. package/dist/subsystems/flow.js +0 -315
  304. package/dist/subsystems/flow.js.map +0 -1
  305. package/dist/subsystems/index.d.ts.map +0 -1
  306. package/dist/subsystems/index.js +0 -22
  307. package/dist/subsystems/index.js.map +0 -1
  308. package/dist/subsystems/parsing.d.ts.map +0 -1
  309. package/dist/subsystems/parsing.js +0 -456
  310. package/dist/subsystems/parsing.js.map +0 -1
  311. package/dist/subsystems/pictorial.d.ts.map +0 -1
  312. package/dist/subsystems/pictorial.js +0 -469
  313. package/dist/subsystems/pictorial.js.map +0 -1
  314. package/dist/svg/constants.d.ts.map +0 -1
  315. package/dist/svg/constants.js +0 -5
  316. package/dist/svg/constants.js.map +0 -1
  317. package/dist/svg/figure.d.ts.map +0 -1
  318. package/dist/svg/figure.js +0 -634
  319. package/dist/svg/figure.js.map +0 -1
  320. package/dist/svg/fmt.d.ts.map +0 -1
  321. package/dist/svg/fmt.js +0 -7
  322. package/dist/svg/fmt.js.map +0 -1
  323. package/dist/svg/svg-style.d.ts.map +0 -1
  324. package/dist/svg/svg-style.js +0 -46
  325. package/dist/svg/svg-style.js.map +0 -1
  326. package/dist/types.d.ts.map +0 -1
  327. package/dist/types.js +0 -21
  328. package/dist/types.js.map +0 -1
  329. package/dist/version.d.ts.map +0 -1
  330. package/dist/version.js +0 -3
  331. package/dist/version.js.map +0 -1
  332. package/dist/vue/index.d.ts.map +0 -1
  333. package/dist/vue/index.js.map +0 -1
@@ -1,791 +0,0 @@
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