@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,1009 +0,0 @@
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