@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,1009 @@
1
+ /**
2
+ * Transistors — subset aligned with Python `elements/transistors.py`.
3
+ */
4
+ import { Element } from "../element.js";
5
+ import { Element2Term } from "../element2term.js";
6
+ import { getParam } from "../params.js";
7
+ import { GAP, Segment, SegmentCircle, SegmentPoly } from "../segment.js";
8
+ import { reswidth } from "./twoterm.js";
9
+ const u = reswidth * 0.5;
10
+ function addVerticalMos(segments, variant, diode, circle, circleLw) {
11
+ segments.push(new Segment([
12
+ [-3 * u, -6.5 * u],
13
+ [-3 * u, -7.5 * u],
14
+ ]));
15
+ segments.push(new Segment([
16
+ [-3 * u, -9.5 * u],
17
+ [-3 * u, -10.5 * u],
18
+ ]));
19
+ segments.push(new Segment([
20
+ [-3 * u, -12.5 * u],
21
+ [-3 * u, -13.5 * u],
22
+ ]));
23
+ segments.push(new Segment([[0, -7 * u], [0, 0]]));
24
+ segments.push(new Segment([[-3 * u, -7 * u], [0, -7 * u]]));
25
+ segments.push(new Segment([[0, -20 * u], [0, -13 * u]]));
26
+ segments.push(new Segment([[-3 * u, -13 * u], [0, -13 * u]]));
27
+ const anchors = {};
28
+ if (variant === "nmos") {
29
+ segments.push(new Segment([[-10 * u, -14 * u], [-5 * u, -14 * u]]));
30
+ segments.push(new Segment([[-5 * u, -14 * u], [-5 * u, -6 * u]]));
31
+ segments.push(new Segment([[-3 * u, -10 * u], [0, -10 * u]], {
32
+ arrow: "<-",
33
+ arrowwidth: 2 * u,
34
+ arrowlength: 2 * u,
35
+ }));
36
+ segments.push(new Segment([[0, -10 * u], [0, -13 * u]]));
37
+ anchors.drain = [0, 0];
38
+ anchors.gate = [-10 * u, -14 * u];
39
+ anchors.center = [0, -10 * u];
40
+ anchors.source = [0, -20 * u];
41
+ }
42
+ else {
43
+ segments.push(new Segment([[-10 * u, -6 * u], [-5 * u, -6 * u]]));
44
+ segments.push(new Segment([[-5 * u, -6 * u], [-5 * u, -14 * u]]));
45
+ segments.push(new Segment([[-3 * u, -10 * u], [0, -10 * u]], {
46
+ arrow: "->",
47
+ arrowwidth: 2 * u,
48
+ arrowlength: 2 * u,
49
+ }));
50
+ segments.push(new Segment([[0, -10 * u], [0, -7 * u]]));
51
+ anchors.source = [0, 0];
52
+ anchors.gate = [-10 * u, -6 * u];
53
+ anchors.center = [0, -10 * u];
54
+ anchors.drain = [0, -20 * u];
55
+ }
56
+ if (diode) {
57
+ segments.push(new Segment([[0, -7 * u], [3 * u, -7 * u]]));
58
+ segments.push(new Segment([[3 * u, -7 * u], [3 * u, -9 * u]]));
59
+ segments.push(new Segment([[2 * u, -9 * u], [4 * u, -9 * u]]));
60
+ segments.push(new SegmentPoly([
61
+ [3 * u, -9 * u],
62
+ [2 * u, -11 * u],
63
+ [4 * u, -11 * u],
64
+ ], { closed: true, fill: false }));
65
+ segments.push(new Segment([[3 * u, -11 * u], [3 * u, -13 * u]]));
66
+ segments.push(new Segment([[3 * u, -13 * u], [0, -13 * u]]));
67
+ }
68
+ if (circle) {
69
+ segments.push(new SegmentCircle([-1 * u, -10 * u], 7 * u, { lw: circleLw }));
70
+ }
71
+ return anchors;
72
+ }
73
+ /** Vertical NMOS. */
74
+ export class NMos extends Element {
75
+ constructor(userParams = {}) {
76
+ super(userParams);
77
+ Object.assign(this.defaults, { diode: false, circle: false });
78
+ const diode = getParam(this.params, "diode", false);
79
+ const circle = getParam(this.params, "circle", false);
80
+ const circleLw = getParam(this.params, "circle_lw", undefined);
81
+ const a = addVerticalMos(this.segments, "nmos", diode, circle, circleLw);
82
+ Object.assign(this.anchors, a);
83
+ this.elmParams.drop = [0, -20 * u];
84
+ this.elmParams.lblloc = "rgt";
85
+ }
86
+ }
87
+ /** Vertical PMOS. */
88
+ export class PMos extends Element {
89
+ constructor(userParams = {}) {
90
+ super(userParams);
91
+ Object.assign(this.defaults, { diode: false, circle: false });
92
+ const diode = getParam(this.params, "diode", false);
93
+ const circle = getParam(this.params, "circle", false);
94
+ const circleLw = getParam(this.params, "circle_lw", undefined);
95
+ const a = addVerticalMos(this.segments, "pmos", diode, circle, circleLw);
96
+ Object.assign(this.anchors, a);
97
+ this.elmParams.drop = [0, -20 * u];
98
+ this.elmParams.lblloc = "rgt";
99
+ }
100
+ }
101
+ function addHorizontalMos2(segments, variant, diode, circle, circleLw) {
102
+ segments.push(new Segment([
103
+ [0, 0],
104
+ [7 * u, 0],
105
+ [7 * u, -3 * u],
106
+ GAP,
107
+ [13 * u, -3 * u],
108
+ [13 * u, 0],
109
+ [20 * u, 0],
110
+ ]));
111
+ segments.push(new Segment([[6.5 * u, -3 * u], [7.5 * u, -3 * u]]));
112
+ segments.push(new Segment([[9.5 * u, -3 * u], [10.5 * u, -3 * u]]));
113
+ segments.push(new Segment([[12.5 * u, -3 * u], [13.5 * u, -3 * u]]));
114
+ const anchors = {};
115
+ if (variant === "nmos") {
116
+ segments.push(new Segment([[14 * u, -10 * u], [14 * u, -5 * u]]));
117
+ segments.push(new Segment([[14 * u, -5 * u], [6 * u, -5 * u]]));
118
+ segments.push(new Segment([[10 * u, -3 * u], [10 * u, 0]], {
119
+ arrow: "<-",
120
+ arrowwidth: 2 * u,
121
+ arrowlength: 2 * u,
122
+ }));
123
+ segments.push(new Segment([[10 * u, 0], [13 * u, 0]]));
124
+ anchors.drain = [0, 0];
125
+ anchors.gate = [14 * u, -10 * u];
126
+ anchors.source = [20 * u, 0];
127
+ }
128
+ else {
129
+ segments.push(new Segment([[6 * u, -10 * u], [6 * u, -5 * u]]));
130
+ segments.push(new Segment([[6 * u, -5 * u], [14 * u, -5 * u]]));
131
+ segments.push(new Segment([[10 * u, -3 * u], [10 * u, 0]], {
132
+ arrow: "->",
133
+ arrowwidth: 2 * u,
134
+ arrowlength: 2 * u,
135
+ }));
136
+ segments.push(new Segment([[10 * u, 0], [7 * u, 0]]));
137
+ anchors.source = [0, 0];
138
+ anchors.gate = [6 * u, -10 * u];
139
+ anchors.drain = [20 * u, 0];
140
+ }
141
+ anchors.center = [10 * u, 0];
142
+ if (diode) {
143
+ segments.push(new Segment([[7 * u, 0], [7 * u, 3 * u]]));
144
+ segments.push(new Segment([[7 * u, 3 * u], [9 * u, 3 * u]]));
145
+ segments.push(new Segment([[9 * u, 2 * u], [9 * u, 4 * u]]));
146
+ segments.push(new SegmentPoly([
147
+ [9 * u, 3 * u],
148
+ [11 * u, 2 * u],
149
+ [11 * u, 4 * u],
150
+ ], { closed: true, fill: false }));
151
+ segments.push(new Segment([[11 * u, 3 * u], [13 * u, 3 * u]]));
152
+ segments.push(new Segment([[13 * u, 3 * u], [13 * u, 0]]));
153
+ }
154
+ if (circle) {
155
+ segments.push(new SegmentCircle([10 * u, -1 * u], 7 * u, { lw: circleLw }));
156
+ }
157
+ return anchors;
158
+ }
159
+ export class NMos2 extends Element2Term {
160
+ constructor(userParams = {}) {
161
+ super(userParams);
162
+ Object.assign(this.defaults, { diode: false, circle: false });
163
+ const diode = getParam(this.params, "diode", false);
164
+ const circle = getParam(this.params, "circle", false);
165
+ const circleLw = getParam(this.params, "circle_lw", undefined);
166
+ const a = addHorizontalMos2(this.segments, "nmos", diode, circle, circleLw);
167
+ Object.assign(this.anchors, a);
168
+ this.elmParams.drop = [20 * u, 0];
169
+ this.elmParams.lblloc = "bottom";
170
+ }
171
+ }
172
+ export class PMos2 extends Element2Term {
173
+ constructor(userParams = {}) {
174
+ super(userParams);
175
+ Object.assign(this.defaults, { diode: false, circle: false });
176
+ const diode = getParam(this.params, "diode", false);
177
+ const circle = getParam(this.params, "circle", false);
178
+ const circleLw = getParam(this.params, "circle_lw", undefined);
179
+ const a = addHorizontalMos2(this.segments, "pmos", diode, circle, circleLw);
180
+ Object.assign(this.anchors, a);
181
+ this.elmParams.drop = [20 * u, 0];
182
+ this.elmParams.lblloc = "bottom";
183
+ }
184
+ }
185
+ const fetw = reswidth * 4;
186
+ const feth = reswidth * 5;
187
+ const fetl = feth / 2;
188
+ const fetgap = reswidth;
189
+ const fetr = reswidth * 0.7;
190
+ export class NFet extends Element {
191
+ constructor(userParams = {}) {
192
+ super(userParams);
193
+ Object.assign(this.defaults, { bulk: false, arrowlength: 0.25, arrowwidth: 0.2 });
194
+ this.segments.push(new Segment([
195
+ [0, 0],
196
+ [0, -fetl],
197
+ [fetw, -fetl],
198
+ [fetw, -fetl - fetw],
199
+ [0, -fetl - fetw],
200
+ [0, -2 * fetl - fetw],
201
+ ]));
202
+ this.segments.push(new Segment([[fetw + fetgap, -fetl], [fetw + fetgap, -fetl - fetw]]));
203
+ this.segments.push(new Segment([[fetw + fetgap, -fetl - fetw / 2], [fetw + fetgap + fetl + fetr, -fetl - fetw / 2]]));
204
+ this.anchors.source = [0, -2 * fetl - fetw];
205
+ this.anchors.drain = [0, 0];
206
+ this.anchors.gate = [fetw + fetgap + fetl + fetr, -fetl - fetw / 2];
207
+ this.anchors.center = [0, -fetl - fetw / 2];
208
+ this.elmParams.drop = [0, -2 * fetl - fetw];
209
+ this.elmParams.lblloc = "lft";
210
+ if (getParam(this.params, "bulk", false)) {
211
+ this.segments.push(new Segment([[0, -fetl - fetw / 2], [fetw, -fetl - fetw / 2]], {
212
+ arrow: "->",
213
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
214
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
215
+ }));
216
+ this.anchors.bulk = [0, -fetl - fetw / 2];
217
+ }
218
+ }
219
+ }
220
+ export class PFet extends Element {
221
+ constructor(userParams = {}) {
222
+ super(userParams);
223
+ Object.assign(this.defaults, { bulk: false, arrowlength: 0.25, arrowwidth: 0.2 });
224
+ this.segments.push(new Segment([
225
+ [0, 0],
226
+ [0, -fetl],
227
+ [fetw, -fetl],
228
+ [fetw, -fetl - fetw],
229
+ [0, -fetl - fetw],
230
+ [0, -2 * fetl - fetw],
231
+ ]));
232
+ this.segments.push(new Segment([[fetw + fetgap, -fetl], [fetw + fetgap, -fetl - fetw]]));
233
+ this.segments.push(new Segment([[fetw + fetgap + fetr * 2, -fetl - fetw / 2], [fetw + fetgap + fetl + fetr, -fetl - fetw / 2]]));
234
+ this.segments.push(new SegmentCircle([fetw + fetgap + fetr, -fetl - fetw / 2], fetr));
235
+ this.anchors.source = [0, 0];
236
+ this.anchors.drain = [0, -2 * fetl - fetw];
237
+ this.anchors.gate = [fetw + fetgap + fetl + fetr, -fetl - fetw / 2];
238
+ this.anchors.center = [0, -fetl - fetw / 2];
239
+ this.elmParams.drop = [0, -2 * fetl - fetw];
240
+ this.elmParams.lblloc = "lft";
241
+ if (getParam(this.params, "bulk", false)) {
242
+ this.segments.push(new Segment([[0, -fetl - fetw / 2], [fetw, -fetl - fetw / 2]], {
243
+ arrow: "->",
244
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
245
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
246
+ }));
247
+ this.anchors.bulk = [0, -fetl - fetw / 2];
248
+ }
249
+ }
250
+ }
251
+ export class NFet2 extends Element2Term {
252
+ constructor(userParams = {}) {
253
+ super(userParams);
254
+ Object.assign(this.defaults, { bulk: false, arrowlength: 0.25, arrowwidth: 0.2 });
255
+ this.segments.push(new Segment([
256
+ [0, 0],
257
+ [fetl, 0],
258
+ [fetl, fetw],
259
+ [fetl + fetw, fetw],
260
+ [fetl + fetw, 0],
261
+ [2 * fetl + fetw, 0],
262
+ ]));
263
+ this.segments.push(new Segment([[fetl, fetw + fetgap], [fetl + fetw, fetw + fetgap]]));
264
+ this.segments.push(new Segment([[fetl + fetw / 2, fetw + fetgap], [fetl + fetw / 2, fetw + fetgap + fetr + fetl]]));
265
+ this.anchors.isource = [2 * fetl + fetw, 0];
266
+ this.anchors.idrain = [0, 0];
267
+ this.anchors.gate = [fetl + fetw / 2, fetw + fetgap + fetr + fetl];
268
+ this.elmParams.lblloc = "bottom";
269
+ if (getParam(this.params, "bulk", false)) {
270
+ this.segments.push(new Segment([[fetl + fetw / 2, 0], [fetl + fetw / 2, fetw]], {
271
+ arrow: "->",
272
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
273
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
274
+ }));
275
+ this.anchors.bulk = [fetl + fetw / 2, 0];
276
+ }
277
+ }
278
+ placeAnchors(start, end) {
279
+ super.placeAnchors(start, end);
280
+ this.anchors.source = this.anchors.end;
281
+ this.anchors.drain = this.anchors.start;
282
+ if (getParam(this.params, "reverse", false)) {
283
+ this.anchors.source = this.anchors.start;
284
+ this.anchors.drain = this.anchors.end;
285
+ }
286
+ }
287
+ }
288
+ export class PFet2 extends Element2Term {
289
+ constructor(userParams = {}) {
290
+ super(userParams);
291
+ Object.assign(this.defaults, { bulk: false, arrowlength: 0.25, arrowwidth: 0.2 });
292
+ this.segments.push(new Segment([
293
+ [0, 0],
294
+ [fetl, 0],
295
+ [fetl, fetw],
296
+ [fetl + fetw, fetw],
297
+ [fetl + fetw, 0],
298
+ [2 * fetl + fetw, 0],
299
+ ]));
300
+ this.segments.push(new Segment([[fetl, fetw + fetgap], [fetl + fetw, fetw + fetgap]]));
301
+ this.segments.push(new SegmentCircle([fetl + fetw / 2, fetw + fetgap + fetr], fetr));
302
+ this.segments.push(new Segment([[fetl + fetw / 2, fetw + fetgap + fetr * 2], [fetl + fetw / 2, fetw + fetgap + fetr + fetl]]));
303
+ this.anchors.isource = [2 * fetl + fetw, 0];
304
+ this.anchors.idrain = [0, 0];
305
+ this.anchors.gate = [fetl + fetw / 2, fetw + fetgap + fetr + fetl];
306
+ this.elmParams.lblloc = "bottom";
307
+ if (getParam(this.params, "bulk", false)) {
308
+ this.segments.push(new Segment([[fetl + fetw / 2, 0], [fetl + fetw / 2, fetw]], {
309
+ arrow: "->",
310
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
311
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
312
+ }));
313
+ this.anchors.bulk = [fetl + fetw / 2, 0];
314
+ }
315
+ }
316
+ placeAnchors(start, end) {
317
+ super.placeAnchors(start, end);
318
+ this.anchors.source = this.anchors.end;
319
+ this.anchors.drain = this.anchors.start;
320
+ if (getParam(this.params, "reverse", false)) {
321
+ this.anchors.source = this.anchors.start;
322
+ this.anchors.drain = this.anchors.end;
323
+ }
324
+ }
325
+ }
326
+ // --- Analog-style FETs (Python `AnalogNFet` / `AnalogPFet` / `AnalogBiasedFet`) ---
327
+ const afetw = reswidth * 2.5;
328
+ const afeth = afetw * 2;
329
+ const afetl = afeth * 0.5;
330
+ const afetgap = afetw * 0.2;
331
+ const afeti = afeth * 0.1;
332
+ const afetb = afeti * 0.75;
333
+ const afeta = 0.25;
334
+ /** N 沟道模拟画法 FET(竖向)。 */
335
+ export class AnalogNFet extends Element {
336
+ constructor(userParams = {}) {
337
+ super(userParams);
338
+ Object.assign(this.defaults, { bulk: false, offset_gate: true, arrow: true });
339
+ const bulk = getParam(this.params, "bulk", false);
340
+ const offsetGate = getParam(this.params, "offset_gate", true);
341
+ const arrowParam = getParam(this.params, "arrow", true);
342
+ const _arrow = arrowParam && !bulk;
343
+ this.segments.push(new Segment([
344
+ [0, 0],
345
+ [0, -afetl],
346
+ [afetw, -afetl],
347
+ [afetw, -afetl - afeth],
348
+ [0, -afetl - afeth],
349
+ [0, -2 * afetl - afeth],
350
+ ]));
351
+ if (_arrow) {
352
+ this.segments.push(new Segment([
353
+ [afetw, -afetl - afeth],
354
+ [0, -afetl - afeth],
355
+ ], {
356
+ arrow: "->",
357
+ arrowwidth: afeta,
358
+ arrowlength: afeta,
359
+ }));
360
+ }
361
+ this.segments.push(new Segment([
362
+ [afetw + afetgap, -afetl - afeti],
363
+ [afetw + afetgap, -afetl - afeth + afeti],
364
+ ]));
365
+ if (offsetGate) {
366
+ this.segments.push(new Segment([
367
+ [afetw + afetgap, -afetl - afeth + afeti],
368
+ [afetw + afetgap + afetl, -afetl - afeth + afeti],
369
+ ]));
370
+ this.anchors.gate = [afetw + afetgap + afetl, -afetl - afeth + afeti];
371
+ }
372
+ else {
373
+ this.segments.push(new Segment([
374
+ [afetw + afetgap, -afetl - afeth / 2],
375
+ [afetw + afetgap + afetl, -afetl - afeth / 2],
376
+ ]));
377
+ this.anchors.gate = [afetw + afetgap + afetl, -afetl - afeth / 2];
378
+ }
379
+ this.anchors.source = [0, -2 * afetl - afeth];
380
+ this.anchors.drain = [0, 0];
381
+ this.anchors.center = [0, -afetl - afeth / 2];
382
+ this.elmParams.drop = [0, -2 * afetl - afeth];
383
+ this.elmParams.lblloc = "lft";
384
+ if (bulk) {
385
+ this.segments.push(new Segment([
386
+ [0, -afetl - afeth / 2],
387
+ [afetw, -afetl - afeth / 2],
388
+ ], {
389
+ arrow: "->",
390
+ arrowwidth: afeta,
391
+ arrowlength: afeta,
392
+ }));
393
+ this.anchors.bulk = [0, -afetl - afeth / 2];
394
+ }
395
+ }
396
+ }
397
+ /** P 沟道模拟画法 FET(竖向)。 */
398
+ export class AnalogPFet extends Element {
399
+ constructor(userParams = {}) {
400
+ super(userParams);
401
+ Object.assign(this.defaults, { bulk: false, offset_gate: true, arrow: true });
402
+ const bulk = getParam(this.params, "bulk", false);
403
+ const offsetGate = getParam(this.params, "offset_gate", true);
404
+ const arrowParam = getParam(this.params, "arrow", true);
405
+ const _arrow = arrowParam && !bulk;
406
+ this.segments.push(new Segment([
407
+ [0, 0],
408
+ [0, -afetl],
409
+ [afetw, -afetl],
410
+ [afetw, -afetl - afeth],
411
+ [0, -afetl - afeth],
412
+ [0, -2 * afetl - afeth],
413
+ ]));
414
+ if (_arrow) {
415
+ this.segments.push(new Segment([
416
+ [0, -afetl],
417
+ [afetw, -afetl],
418
+ ], {
419
+ arrow: "->",
420
+ arrowwidth: afeta,
421
+ arrowlength: afeta,
422
+ }));
423
+ }
424
+ this.segments.push(new Segment([
425
+ [afetw + afetgap, -afetl - afeti],
426
+ [afetw + afetgap, -afetl - afeth + afeti],
427
+ ]));
428
+ if (offsetGate) {
429
+ this.segments.push(new Segment([
430
+ [afetw + afetgap, -afetl - afeti],
431
+ [afetw + afetgap + afetl, -afetl - afeti],
432
+ ]));
433
+ this.anchors.gate = [afetw + afetgap + afetl, -afetl - afeti];
434
+ }
435
+ else {
436
+ this.segments.push(new Segment([
437
+ [afetw + afetgap, -afetl - afeth / 2],
438
+ [afetw + afetgap + afetl, -afetl - afeth / 2],
439
+ ]));
440
+ this.anchors.gate = [afetw + afetgap + afetl, -afetl - afeth / 2];
441
+ }
442
+ this.anchors.source = [0, 0];
443
+ this.anchors.drain = [0, -2 * afetl - afeth];
444
+ this.anchors.center = [0, -afetl - afeth / 2];
445
+ this.elmParams.drop = [0, -2 * afetl - afeth];
446
+ this.elmParams.lblloc = "lft";
447
+ if (bulk) {
448
+ this.segments.push(new Segment([
449
+ [afetw, -afetl - afeth / 2],
450
+ [0, -afetl - afeth / 2],
451
+ ], {
452
+ arrow: "->",
453
+ arrowwidth: afeta,
454
+ arrowlength: afeta,
455
+ }));
456
+ this.anchors.bulk = [0, -afetl - afeth / 2];
457
+ }
458
+ }
459
+ }
460
+ /** 带偏置点的小信号 FET(模拟画法)。 */
461
+ export class AnalogBiasedFet extends Element {
462
+ constructor(userParams = {}) {
463
+ super(userParams);
464
+ Object.assign(this.defaults, { bulk: false, offset_gate: true, arrow: true });
465
+ const bulk = getParam(this.params, "bulk", false);
466
+ const offsetGate = getParam(this.params, "offset_gate", true);
467
+ const arrowParam = getParam(this.params, "arrow", true);
468
+ const _arrow = arrowParam && !bulk;
469
+ this.segments.push(new Segment([
470
+ [0, 0],
471
+ [0, -afetl],
472
+ [afetw, -afetl],
473
+ [afetw, -afetl - afeth],
474
+ [0, -afetl - afeth],
475
+ [0, -2 * afetl - afeth],
476
+ ]));
477
+ if (_arrow) {
478
+ this.segments.push(new SegmentCircle([afetb * 2, -afetl - afeth], afetb, { fill: true }));
479
+ }
480
+ this.segments.push(new Segment([
481
+ [afetw + afetgap, -afetl - afeti],
482
+ [afetw + afetgap, -afetl - afeth + afeti],
483
+ ]));
484
+ if (offsetGate) {
485
+ this.segments.push(new Segment([
486
+ [afetw + afetgap, -afetl - afeth + afeti],
487
+ [afetw + afetgap + afetl, -afetl - afeth + afeti],
488
+ ]));
489
+ this.anchors.gate = [afetw + afetgap + afetl, -afetl - afeth + afeti];
490
+ }
491
+ else {
492
+ this.segments.push(new Segment([
493
+ [afetw + afetgap, -afetl - afeth / 2],
494
+ [afetw + afetgap + afetl, -afetl - afeth / 2],
495
+ ]));
496
+ this.anchors.gate = [afetw + afetgap + afetl, -afetl - afeth / 2];
497
+ }
498
+ this.anchors.source = [0, -2 * afetl - afeth];
499
+ this.anchors.drain = [0, 0];
500
+ this.anchors.center = [0, -afetl - afeth / 2];
501
+ this.elmParams.drop = [0, -2 * afetl - afeth];
502
+ this.elmParams.lblloc = "lft";
503
+ if (bulk) {
504
+ this.segments.push(new Segment([
505
+ [0, -afetl - afeth / 2],
506
+ [afetw, -afetl - afeth / 2],
507
+ ]));
508
+ this.segments.push(new SegmentCircle([afetw - afetb * 2, -afetl - afeth / 2], afetb, { fill: true }));
509
+ this.anchors.bulk = [0, -afetl - afeth / 2];
510
+ }
511
+ }
512
+ }
513
+ // --- JFET(Python `JFet` / `JFet2` 系)---
514
+ const fete = fetw * 0.2;
515
+ const jfetw = reswidth * 3;
516
+ export class JFet extends Element {
517
+ constructor(userParams = {}) {
518
+ super(userParams);
519
+ Object.assign(this.defaults, {
520
+ circle: false,
521
+ arrowlength: 0.25,
522
+ arrowwidth: 0.2,
523
+ });
524
+ this.segments.push(new Segment([
525
+ [0, 0],
526
+ [0, -fetl],
527
+ [jfetw, -fetl],
528
+ [jfetw, -fetl + fete],
529
+ [jfetw, -fetl - jfetw - fete],
530
+ [jfetw, -fetl - jfetw],
531
+ [0, -fetl - jfetw],
532
+ [0, -2 * fetl - jfetw],
533
+ ]));
534
+ this.segments.push(new Segment([
535
+ [jfetw, -fetl - jfetw],
536
+ [jfetw + fetl, -fetl - jfetw],
537
+ ]));
538
+ this.elmParams.drop = [jfetw + fetl, -fetl - jfetw];
539
+ this.anchors.source = [0, -2 * fetl - jfetw];
540
+ this.anchors.drain = [0, 0];
541
+ this.anchors.gate = [jfetw + fetl, -fetl - jfetw];
542
+ this.anchors.center = [0, -fetl - jfetw / 2];
543
+ this.elmParams.lblloc = "lft";
544
+ if (getParam(this.params, "circle", false)) {
545
+ this.segments.push(new SegmentCircle([jfetw / 2, -fetw], fetw * 1.1, {
546
+ lw: getParam(this.params, "circle_lw", undefined),
547
+ }));
548
+ }
549
+ }
550
+ }
551
+ export class JFetN extends JFet {
552
+ constructor(userParams = {}) {
553
+ super(userParams);
554
+ this.segments.push(new Segment([
555
+ [jfetw + 0.1, -fetl - jfetw],
556
+ [jfetw + 0.3, -fetl - jfetw],
557
+ ], {
558
+ arrow: "->",
559
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
560
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
561
+ }));
562
+ }
563
+ }
564
+ export class JFetP extends JFet {
565
+ constructor(userParams = {}) {
566
+ super(userParams);
567
+ this.segments.push(new Segment([
568
+ [jfetw + 0.25, -fetl - jfetw],
569
+ [jfetw, -fetl - jfetw],
570
+ ], {
571
+ arrow: "->",
572
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
573
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
574
+ }));
575
+ }
576
+ }
577
+ export class JFet2 extends Element2Term {
578
+ constructor(userParams = {}) {
579
+ super(userParams);
580
+ Object.assign(this.defaults, {
581
+ circle: false,
582
+ arrowlength: 0.25,
583
+ arrowwidth: 0.2,
584
+ });
585
+ this.segments.push(new Segment([
586
+ [0, 0],
587
+ [fetl, 0],
588
+ [fetl, jfetw],
589
+ [fetl + jfetw, jfetw],
590
+ [fetl + jfetw, 0],
591
+ [2 * fetl + jfetw, 0],
592
+ ]));
593
+ this.segments.push(new Segment([
594
+ [fetl - fete, jfetw],
595
+ [fetl + jfetw + fete, jfetw],
596
+ ]));
597
+ this.segments.push(new Segment([
598
+ [fetl + jfetw, jfetw],
599
+ [fetl + jfetw, jfetw + fetl],
600
+ ]));
601
+ this.anchors.isource = [2 * fetl + jfetw, 0];
602
+ this.anchors.idrain = [0, 0];
603
+ this.anchors.gate = [fetl + jfetw, jfetw + fetl];
604
+ this.elmParams.lblloc = "bottom";
605
+ if (getParam(this.params, "circle", false)) {
606
+ this.segments.push(new SegmentCircle([fetl + jfetw / 2, jfetw / 2], fetw * 1.1, {
607
+ lw: getParam(this.params, "circle_lw", undefined),
608
+ }));
609
+ }
610
+ }
611
+ placeAnchors(start, end) {
612
+ super.placeAnchors(start, end);
613
+ this.anchors.source = this.anchors.end;
614
+ this.anchors.drain = this.anchors.start;
615
+ if (getParam(this.params, "reverse", false)) {
616
+ this.anchors.source = this.anchors.start;
617
+ this.anchors.drain = this.anchors.end;
618
+ }
619
+ }
620
+ }
621
+ export class JFetN2 extends JFet2 {
622
+ constructor(userParams = {}) {
623
+ super(userParams);
624
+ this.segments.push(new Segment([
625
+ [fetl + jfetw, jfetw],
626
+ [fetl + jfetw, jfetw + 0.3],
627
+ ], {
628
+ arrow: "->",
629
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
630
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
631
+ }));
632
+ }
633
+ }
634
+ export class JFetP2 extends JFet2 {
635
+ constructor(userParams = {}) {
636
+ super(userParams);
637
+ this.segments.push(new Segment([
638
+ [fetl + jfetw, jfetw + 0.3],
639
+ [fetl + jfetw, jfetw],
640
+ ], {
641
+ arrow: "->",
642
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
643
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
644
+ }));
645
+ }
646
+ }
647
+ const hemtGap = (fetw + 2 * fetr) / 5;
648
+ /** HEMT / 分裂栅 FET(竖向)。 */
649
+ export class Hemt extends Element {
650
+ constructor(userParams = {}) {
651
+ super(userParams);
652
+ Object.assign(this.defaults, { split: true, arrow: true, arrowlength: 0.25, arrowwidth: 0.2 });
653
+ const split = getParam(this.params, "split", true);
654
+ const arrow = this.params.arrow;
655
+ const aw = getParam(this.params, "arrowwidth", 0.2);
656
+ const al = getParam(this.params, "arrowlength", 0.25);
657
+ if (split) {
658
+ this.segments.push(new Segment([
659
+ [0, 0],
660
+ [0, -fetl],
661
+ [fetw, -fetl],
662
+ GAP,
663
+ [fetw, -fetl + fetr],
664
+ [fetw, -fetl + fetr - hemtGap],
665
+ GAP,
666
+ [fetw, -fetl + fetr - 2 * hemtGap],
667
+ [fetw, -fetl + fetr - 3 * hemtGap],
668
+ GAP,
669
+ [fetw, -fetl + fetr - 4 * hemtGap],
670
+ [fetw, -fetl + fetr - 5 * hemtGap],
671
+ GAP,
672
+ [fetw, -fetl - fetw],
673
+ [0, -fetl - fetw],
674
+ [0, -2 * fetl - fetw],
675
+ ]));
676
+ }
677
+ else {
678
+ this.segments.push(new Segment([
679
+ [0, 0],
680
+ [0, -fetl],
681
+ [fetw, -fetl],
682
+ GAP,
683
+ [fetw, -fetl + fetr],
684
+ [fetw, -fetl - fetw - fetr],
685
+ GAP,
686
+ [fetw, -fetl - fetw],
687
+ [0, -fetl - fetw],
688
+ [0, -2 * fetl - fetw],
689
+ ]));
690
+ }
691
+ this.segments.push(new Segment([
692
+ [fetw, -fetl - fetw / 2],
693
+ [fetw + fetl + fetr, -fetl - fetw / 2],
694
+ ]));
695
+ if (arrow === ">") {
696
+ this.segments.push(new Segment([
697
+ [0, -fetl - fetw],
698
+ [fetw, -fetl - fetw],
699
+ ], {
700
+ arrow: "->",
701
+ arrowwidth: aw,
702
+ arrowlength: al,
703
+ }));
704
+ }
705
+ else if (arrow !== false) {
706
+ this.segments.push(new Segment([
707
+ [0, -fetl - fetw],
708
+ [fetw, -fetl - fetw],
709
+ ], {
710
+ arrow: "<-",
711
+ arrowwidth: aw,
712
+ arrowlength: al,
713
+ }));
714
+ }
715
+ this.anchors.drain = [0, -2 * fetl - fetw];
716
+ this.anchors.source = [0, 0];
717
+ this.anchors.gate = [fetw + fetl + fetr, -fetl - fetw / 2];
718
+ this.anchors.center = [0, -fetl - fetw / 2];
719
+ this.elmParams.drop = [0, -2 * fetl - fetw];
720
+ this.elmParams.lblloc = "lft";
721
+ }
722
+ }
723
+ const bjt_r0 = reswidth * 3.3;
724
+ const bjt_v = (bjt_r0 * 2) / 3;
725
+ const bjt_v_len = bjt_r0 * (4 / 3);
726
+ const bjt_a = bjt_v_len / 4;
727
+ const bjt_emx = bjt_v + bjt_r0 * 0.7;
728
+ const bjt_emy = bjt_v_len * 0.7;
729
+ export class Bjt extends Element {
730
+ constructor(userParams = {}) {
731
+ super(userParams);
732
+ Object.assign(this.defaults, { circle: false, arrowwidth: 0.2, arrowlength: 0.25 });
733
+ this.segments.push(new Segment([[0, 0], [bjt_v, 0]]));
734
+ this.segments.push(new Segment([[bjt_v, bjt_v_len / 2], [bjt_v, -bjt_v_len / 2]]));
735
+ this.segments.push(new Segment([
736
+ [bjt_v, bjt_a],
737
+ [bjt_emx, bjt_emy],
738
+ [bjt_emx, bjt_emy + bjt_a],
739
+ ]));
740
+ this.segments.push(new Segment([
741
+ [bjt_v, -bjt_a],
742
+ [bjt_emx, -bjt_emy],
743
+ [bjt_emx, -bjt_emy - bjt_a],
744
+ ]));
745
+ if (getParam(this.params, "circle", false)) {
746
+ this.segments.push(new SegmentCircle([bjt_r0, 0], bjt_r0, {
747
+ lw: getParam(this.params, "circle_lw", undefined),
748
+ }));
749
+ }
750
+ this.elmParams.drop = [bjt_emx, bjt_emy + bjt_a];
751
+ this.anchors.base = [0, 0];
752
+ this.anchors.collector = [bjt_emx, bjt_emy + bjt_a];
753
+ this.anchors.emitter = [bjt_emx, -bjt_emy - bjt_a];
754
+ this.anchors.center = [bjt_emx, 0];
755
+ }
756
+ }
757
+ export class BjtNpn extends Bjt {
758
+ constructor(userParams = {}) {
759
+ super(userParams);
760
+ this.segments.push(new Segment([
761
+ [bjt_v, -bjt_a],
762
+ [bjt_emx, -bjt_emy],
763
+ ], {
764
+ arrow: "->",
765
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
766
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
767
+ }));
768
+ }
769
+ }
770
+ export class BjtPnp extends Bjt {
771
+ constructor(userParams = {}) {
772
+ super(userParams);
773
+ this.segments.push(new Segment([
774
+ [bjt_emx, bjt_emy],
775
+ [bjt_v, bjt_a],
776
+ ], {
777
+ arrow: "->",
778
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
779
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
780
+ }));
781
+ this.anchors.base = [0, 0];
782
+ this.anchors.collector = [bjt_emx, -bjt_emy - bjt_a];
783
+ this.anchors.emitter = [bjt_emx, bjt_emy + bjt_a];
784
+ }
785
+ }
786
+ const bjt2_r = 0.55;
787
+ const bjt_diag_ofst = 0.2;
788
+ const bjt_base_w = 0.75;
789
+ const bjt_base_h = 0.42;
790
+ const bjt_width = 1.1;
791
+ export class Bjt2 extends Element2Term {
792
+ constructor(userParams = {}) {
793
+ super(userParams);
794
+ Object.assign(this.defaults, {
795
+ circle: false,
796
+ lblloc: "bottom",
797
+ theta: 90,
798
+ arrowwidth: 0.2,
799
+ arrowlength: 0.25,
800
+ });
801
+ this.segments.push(new Segment([
802
+ [0, 0],
803
+ [bjt_width / 2 - bjt_diag_ofst, bjt_base_h],
804
+ [bjt_width / 2 + bjt_diag_ofst, bjt_base_h],
805
+ [bjt_width, 0],
806
+ ]));
807
+ this.segments.push(new Segment([
808
+ [bjt_width / 2 - bjt_base_w / 2, bjt_base_h],
809
+ [bjt_width / 2 + bjt_base_w / 2, bjt_base_h],
810
+ ]));
811
+ this.segments.push(new Segment([
812
+ [bjt_width / 2, bjt_base_h],
813
+ [bjt_width / 2, bjt_base_h + bjt_base_w / 2],
814
+ ]));
815
+ if (getParam(this.params, "circle", false)) {
816
+ this.segments.push(new SegmentCircle([bjt_width / 2, bjt2_r / 2], bjt2_r, {
817
+ lw: getParam(this.params, "circle_lw", undefined),
818
+ }));
819
+ }
820
+ this.anchors.base = [bjt_width / 2, bjt_base_h + bjt_base_w / 2];
821
+ this.anchors.icollector = [bjt_width, 0];
822
+ this.anchors.iemitter = [0, 0];
823
+ }
824
+ placeAnchors(start, end) {
825
+ super.placeAnchors(start, end);
826
+ this.anchors.emitter = this.anchors.start;
827
+ this.anchors.collector = this.anchors.end;
828
+ if (getParam(this.params, "reverse", false)) {
829
+ this.anchors.emitter = this.anchors.end;
830
+ this.anchors.collector = this.anchors.start;
831
+ }
832
+ }
833
+ }
834
+ export class BjtNpn2 extends Bjt2 {
835
+ constructor(userParams = {}) {
836
+ super(userParams);
837
+ this.segments.push(new Segment([
838
+ [0, 0],
839
+ [bjt_width / 2 - bjt_diag_ofst, bjt_base_h],
840
+ ], {
841
+ arrow: "->",
842
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
843
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
844
+ }));
845
+ }
846
+ }
847
+ export class BjtPnp2 extends Bjt2 {
848
+ constructor(userParams = {}) {
849
+ super(userParams);
850
+ this.segments.push(new Segment([
851
+ [bjt_width / 2 + bjt_diag_ofst, bjt_base_h],
852
+ [bjt_width, 0],
853
+ ], {
854
+ arrow: "->",
855
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
856
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
857
+ }));
858
+ const ic = this.anchors.icollector;
859
+ const ie = this.anchors.iemitter;
860
+ this.anchors.icollector = ie;
861
+ this.anchors.iemitter = ic;
862
+ }
863
+ placeAnchors(start, end) {
864
+ super.placeAnchors(start, end);
865
+ this.anchors.emitter = this.anchors.end;
866
+ this.anchors.collector = this.anchors.start;
867
+ if (getParam(this.params, "reverse", false)) {
868
+ this.anchors.emitter = this.anchors.start;
869
+ this.anchors.collector = this.anchors.end;
870
+ }
871
+ }
872
+ }
873
+ /** PNP 双集电极(竖向 BJT 符号)。 */
874
+ export class BjtPnp2c extends BjtPnp {
875
+ constructor(userParams = {}) {
876
+ super(userParams);
877
+ const dy = -0.25;
878
+ this.segments.push(new Segment([
879
+ [bjt_v, -bjt_a - dy],
880
+ [bjt_emx, -bjt_emy - dy],
881
+ ]));
882
+ this.anchors.C2 = [bjt_emx, -bjt_emy - dy];
883
+ }
884
+ }
885
+ const schottZ = 0.1;
886
+ /** NPN + 肖特基箝位。 */
887
+ export class NpnSchottky extends BjtNpn {
888
+ constructor(userParams = {}) {
889
+ super(userParams);
890
+ this.segments.push(new Segment([
891
+ [bjt_v, bjt_v_len / 2],
892
+ [bjt_v, bjt_v_len / 2 + schottZ],
893
+ [bjt_v + schottZ, bjt_v_len / 2 + schottZ],
894
+ [bjt_v + schottZ, bjt_v_len / 2],
895
+ ]));
896
+ this.segments.push(new Segment([
897
+ [bjt_v, -bjt_v_len / 2],
898
+ [bjt_v, -bjt_v_len / 2 - schottZ],
899
+ [bjt_v - schottZ, -bjt_v_len / 2 - schottZ],
900
+ [bjt_v - schottZ, -bjt_v_len / 2],
901
+ ]));
902
+ }
903
+ }
904
+ /** PNP + 肖特基箝位。 */
905
+ export class PnpSchottky extends BjtPnp {
906
+ constructor(userParams = {}) {
907
+ super(userParams);
908
+ this.segments.push(new Segment([
909
+ [bjt_v, bjt_v_len / 2],
910
+ [bjt_v, bjt_v_len / 2 + schottZ],
911
+ [bjt_v - schottZ, bjt_v_len / 2 + schottZ],
912
+ [bjt_v - schottZ, bjt_v_len / 2],
913
+ ]));
914
+ this.segments.push(new Segment([
915
+ [bjt_v, -bjt_v_len / 2],
916
+ [bjt_v, -bjt_v_len / 2 - schottZ],
917
+ [bjt_v + schottZ, -bjt_v_len / 2 - schottZ],
918
+ [bjt_v + schottZ, -bjt_v_len / 2],
919
+ ]));
920
+ }
921
+ }
922
+ /** NPN 光电晶体管(无基极引线)。 */
923
+ export class NpnPhoto extends BjtNpn {
924
+ constructor(userParams = {}) {
925
+ super(userParams);
926
+ this.segments.shift();
927
+ const sep = 0.25;
928
+ this.segments.push(new Segment([
929
+ [-0.1, bjt_v],
930
+ [bjt_v * 0.75, 0.1],
931
+ ], {
932
+ arrow: "->",
933
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
934
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
935
+ }));
936
+ this.segments.push(new Segment([
937
+ [-0.1, bjt_v - sep],
938
+ [bjt_v * 0.75, 0.1 - sep],
939
+ ], {
940
+ arrow: "->",
941
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
942
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
943
+ }));
944
+ }
945
+ }
946
+ /** PNP 光电晶体管。 */
947
+ export class PnpPhoto extends BjtPnp {
948
+ constructor(userParams = {}) {
949
+ super(userParams);
950
+ this.segments.shift();
951
+ const sep = 0.25;
952
+ this.segments.push(new Segment([
953
+ [-0.1, bjt_v],
954
+ [bjt_v * 0.75, 0.1],
955
+ ], {
956
+ arrow: "->",
957
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
958
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
959
+ }));
960
+ this.segments.push(new Segment([
961
+ [-0.1, bjt_v - sep],
962
+ [bjt_v * 0.75, 0.1 - sep],
963
+ ], {
964
+ arrow: "->",
965
+ arrowwidth: getParam(this.params, "arrowwidth", 0.2),
966
+ arrowlength: getParam(this.params, "arrowlength", 0.25),
967
+ }));
968
+ }
969
+ }
970
+ const igbtGap = 0.15;
971
+ /** N 沟道 IGBT(绝缘栅)。 */
972
+ export class IgbtN extends BjtNpn {
973
+ constructor(userParams = {}) {
974
+ super(userParams);
975
+ this.segments.shift();
976
+ this.segments.push(new Segment([
977
+ [bjt_v - igbtGap, bjt_v - igbtGap / 2],
978
+ [bjt_v - igbtGap, -bjt_v + igbtGap / 2],
979
+ [bjt_v - igbtGap * 2, -bjt_v + igbtGap / 2],
980
+ ]));
981
+ this.anchors.base = [bjt_v - igbtGap * 2, -bjt_v + igbtGap / 2];
982
+ }
983
+ }
984
+ /** P 沟道 IGBT。 */
985
+ export class IgbtP extends BjtPnp {
986
+ constructor(userParams = {}) {
987
+ super(userParams);
988
+ this.segments.shift();
989
+ this.segments.push(new Segment([
990
+ [bjt_v - igbtGap * 2, bjt_v - igbtGap / 2],
991
+ [bjt_v - igbtGap, bjt_v - igbtGap / 2],
992
+ [bjt_v - igbtGap, -bjt_v + igbtGap / 2],
993
+ ]));
994
+ this.anchors.base = [bjt_v - igbtGap * 2, bjt_v - igbtGap / 2];
995
+ }
996
+ }
997
+ /** 双集电极 PNP(Bjt2 横版)。 */
998
+ export class BjtPnp2c2 extends BjtPnp2 {
999
+ constructor(userParams = {}) {
1000
+ super(userParams);
1001
+ const dy = 0.25;
1002
+ this.segments.push(new Segment([
1003
+ [dy, 0],
1004
+ [dy + bjt_width / 2 - bjt_diag_ofst, bjt_base_h],
1005
+ ]));
1006
+ this.anchors.C2 = [dy, 0];
1007
+ }
1008
+ }
1009
+ //# sourceMappingURL=transistors.js.map