@modular-circuit/transpiler 0.0.109 → 0.1.1

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 (162) hide show
  1. package/dist/index.d.mts +480 -0
  2. package/dist/index.d.ts +480 -0
  3. package/dist/index.js +3039 -0
  4. package/dist/index.mjs +2936 -0
  5. package/package.json +15 -12
  6. package/build/builder/graph_to_kicad/do_convert_graph_to_kicad_project.d.ts +0 -3
  7. package/build/builder/graph_to_kicad/do_convert_graph_to_kicad_project.d.ts.map +0 -1
  8. package/build/builder/graph_to_kicad/do_convert_graph_to_kicad_project.js +0 -115
  9. package/build/builder/graph_to_kicad/index.d.ts +0 -3
  10. package/build/builder/graph_to_kicad/index.d.ts.map +0 -1
  11. package/build/builder/graph_to_kicad/index.js +0 -63
  12. package/build/builder/index.d.ts +0 -2
  13. package/build/builder/index.d.ts.map +0 -1
  14. package/build/builder/index.js +0 -1
  15. package/build/converter/graph_to_netlist/context.d.ts +0 -13
  16. package/build/converter/graph_to_netlist/context.d.ts.map +0 -1
  17. package/build/converter/graph_to_netlist/context.js +0 -0
  18. package/build/converter/graph_to_netlist/graph_converter.d.ts +0 -8
  19. package/build/converter/graph_to_netlist/graph_converter.d.ts.map +0 -1
  20. package/build/converter/graph_to_netlist/graph_converter.js +0 -192
  21. package/build/converter/graph_to_netlist/index.d.ts +0 -3
  22. package/build/converter/graph_to_netlist/index.d.ts.map +0 -1
  23. package/build/converter/graph_to_netlist/index.js +0 -2
  24. package/build/converter/index.d.ts +0 -4
  25. package/build/converter/index.d.ts.map +0 -1
  26. package/build/converter/index.js +0 -3
  27. package/build/converter/kicad_sexpr/eeschema/drawing_sheet/index.d.ts +0 -2
  28. package/build/converter/kicad_sexpr/eeschema/drawing_sheet/index.d.ts.map +0 -1
  29. package/build/converter/kicad_sexpr/eeschema/drawing_sheet/index.js +0 -5
  30. package/build/converter/kicad_sexpr/eeschema/drawing_sheet/sch_default_drawing_sheet.d.ts +0 -2
  31. package/build/converter/kicad_sexpr/eeschema/drawing_sheet/sch_default_drawing_sheet.d.ts.map +0 -1
  32. package/build/converter/kicad_sexpr/eeschema/drawing_sheet/sch_default_drawing_sheet.js +0 -1
  33. package/build/converter/kicad_sexpr/eeschema/index.d.ts +0 -3
  34. package/build/converter/kicad_sexpr/eeschema/index.d.ts.map +0 -1
  35. package/build/converter/kicad_sexpr/eeschema/index.js +0 -2
  36. package/build/converter/kicad_sexpr/eeschema/printer.d.ts +0 -38
  37. package/build/converter/kicad_sexpr/eeschema/printer.d.ts.map +0 -1
  38. package/build/converter/kicad_sexpr/eeschema/printer.js +0 -296
  39. package/build/converter/kicad_sexpr/index.d.ts +0 -3
  40. package/build/converter/kicad_sexpr/index.d.ts.map +0 -1
  41. package/build/converter/kicad_sexpr/index.js +0 -2
  42. package/build/converter/kicad_sexpr/pcb/index.d.ts +0 -2
  43. package/build/converter/kicad_sexpr/pcb/index.d.ts.map +0 -1
  44. package/build/converter/kicad_sexpr/pcb/index.js +0 -1
  45. package/build/converter/link_to_netlist/context.d.ts +0 -12
  46. package/build/converter/link_to_netlist/context.d.ts.map +0 -1
  47. package/build/converter/link_to_netlist/context.js +0 -0
  48. package/build/converter/link_to_netlist/converter.d.ts +0 -13
  49. package/build/converter/link_to_netlist/converter.d.ts.map +0 -1
  50. package/build/converter/link_to_netlist/converter.js +0 -154
  51. package/build/converter/link_to_netlist/index.d.ts +0 -3
  52. package/build/converter/link_to_netlist/index.d.ts.map +0 -1
  53. package/build/converter/link_to_netlist/index.js +0 -2
  54. package/build/converter/link_to_netlist/links/converter_base.d.ts +0 -30
  55. package/build/converter/link_to_netlist/links/converter_base.d.ts.map +0 -1
  56. package/build/converter/link_to_netlist/links/converter_base.js +0 -156
  57. package/build/converter/link_to_netlist/links/converters.d.ts +0 -51
  58. package/build/converter/link_to_netlist/links/converters.d.ts.map +0 -1
  59. package/build/converter/link_to_netlist/links/converters.js +0 -1190
  60. package/build/converter/link_to_netlist/links/index.d.ts +0 -3
  61. package/build/converter/link_to_netlist/links/index.d.ts.map +0 -1
  62. package/build/converter/link_to_netlist/links/index.js +0 -2
  63. package/build/converter/netlist_to_kicad/context.d.ts +0 -10
  64. package/build/converter/netlist_to_kicad/context.d.ts.map +0 -1
  65. package/build/converter/netlist_to_kicad/context.js +0 -0
  66. package/build/converter/netlist_to_kicad/index.d.ts +0 -4
  67. package/build/converter/netlist_to_kicad/index.d.ts.map +0 -1
  68. package/build/converter/netlist_to_kicad/index.js +0 -3
  69. package/build/converter/netlist_to_kicad/layout.d.ts +0 -38
  70. package/build/converter/netlist_to_kicad/layout.d.ts.map +0 -1
  71. package/build/converter/netlist_to_kicad/layout.js +0 -194
  72. package/build/converter/netlist_to_kicad/netlist_converter.d.ts +0 -28
  73. package/build/converter/netlist_to_kicad/netlist_converter.d.ts.map +0 -1
  74. package/build/converter/netlist_to_kicad/netlist_converter.js +0 -398
  75. package/build/converter/netlist_to_kicad/place_blocks.d.ts +0 -6
  76. package/build/converter/netlist_to_kicad/place_blocks.d.ts.map +0 -1
  77. package/build/converter/netlist_to_kicad/place_blocks.js +0 -59
  78. package/build/index.d.ts +0 -6
  79. package/build/index.d.ts.map +0 -1
  80. package/build/index.js +0 -5
  81. package/build/kicad/constraints/index.d.ts +0 -5
  82. package/build/kicad/constraints/index.d.ts.map +0 -1
  83. package/build/kicad/constraints/index.js +0 -4
  84. package/build/kicad/index.d.ts +0 -1
  85. package/build/kicad/index.d.ts.map +0 -1
  86. package/build/kicad/index.js +0 -1
  87. package/build/kicad/label/index.d.ts +0 -3
  88. package/build/kicad/label/index.d.ts.map +0 -1
  89. package/build/kicad/label/index.js +0 -2
  90. package/build/kicad/label/net_label.d.ts +0 -4
  91. package/build/kicad/label/net_label.d.ts.map +0 -1
  92. package/build/kicad/label/net_label.js +0 -14
  93. package/build/kicad/label/sheet_pin.d.ts +0 -5
  94. package/build/kicad/label/sheet_pin.d.ts.map +0 -1
  95. package/build/kicad/label/sheet_pin.js +0 -25
  96. package/build/kicad/project/index.d.ts +0 -3
  97. package/build/kicad/project/index.d.ts.map +0 -1
  98. package/build/kicad/project/index.js +0 -2
  99. package/build/kicad/project/kicad_prl.d.ts +0 -48
  100. package/build/kicad/project/kicad_prl.d.ts.map +0 -1
  101. package/build/kicad/project/kicad_prl.js +0 -50
  102. package/build/kicad/project/kicad_pro.d.ts +0 -176
  103. package/build/kicad/project/kicad_pro.d.ts.map +0 -1
  104. package/build/kicad/project/kicad_pro.js +0 -224
  105. package/build/kicad/project/kicad_project_archive.d.ts +0 -237
  106. package/build/kicad/project/kicad_project_archive.d.ts.map +0 -1
  107. package/build/kicad/project/kicad_project_archive.js +0 -53
  108. package/build/kicad/project/wildcards_and_files_ext.d.ts +0 -62
  109. package/build/kicad/project/wildcards_and_files_ext.d.ts.map +0 -1
  110. package/build/kicad/project/wildcards_and_files_ext.js +0 -61
  111. package/build/kicad/sheet/index.d.ts +0 -2
  112. package/build/kicad/sheet/index.d.ts.map +0 -1
  113. package/build/kicad/sheet/index.js +0 -1
  114. package/build/kicad/sheet/sheet.d.ts +0 -8
  115. package/build/kicad/sheet/sheet.d.ts.map +0 -1
  116. package/build/kicad/sheet/sheet.js +0 -44
  117. package/build/kicad/symbols/index.d.ts +0 -3
  118. package/build/kicad/symbols/index.d.ts.map +0 -1
  119. package/build/kicad/symbols/index.js +0 -2
  120. package/build/kicad/symbols/lib_symbol/gnd.d.ts +0 -3
  121. package/build/kicad/symbols/lib_symbol/gnd.d.ts.map +0 -1
  122. package/build/kicad/symbols/lib_symbol/gnd.js +0 -121
  123. package/build/kicad/symbols/lib_symbol/index.d.ts +0 -3
  124. package/build/kicad/symbols/lib_symbol/index.d.ts.map +0 -1
  125. package/build/kicad/symbols/lib_symbol/index.js +0 -2
  126. package/build/kicad/symbols/lib_symbol/vcc.d.ts +0 -3
  127. package/build/kicad/symbols/lib_symbol/vcc.d.ts.map +0 -1
  128. package/build/kicad/symbols/lib_symbol/vcc.js +0 -119
  129. package/build/kicad/symbols/sch_symbol/gnd.d.ts +0 -4
  130. package/build/kicad/symbols/sch_symbol/gnd.d.ts.map +0 -1
  131. package/build/kicad/symbols/sch_symbol/gnd.js +0 -66
  132. package/build/kicad/symbols/sch_symbol/index.d.ts +0 -3
  133. package/build/kicad/symbols/sch_symbol/index.d.ts.map +0 -1
  134. package/build/kicad/symbols/sch_symbol/index.js +0 -2
  135. package/build/kicad/symbols/sch_symbol/vcc.d.ts +0 -4
  136. package/build/kicad/symbols/sch_symbol/vcc.d.ts.map +0 -1
  137. package/build/kicad/symbols/sch_symbol/vcc.js +0 -66
  138. package/build/kicad/symbols/symbol_utils.d.ts +0 -2
  139. package/build/kicad/symbols/symbol_utils.d.ts.map +0 -1
  140. package/build/kicad/symbols/symbol_utils.js +0 -1
  141. package/build/kicad/wire/gen_wire.d.ts +0 -4
  142. package/build/kicad/wire/gen_wire.d.ts.map +0 -1
  143. package/build/kicad/wire/gen_wire.js +0 -12
  144. package/build/tsconfig.build.tsbuildinfo +0 -1
  145. package/build/utils/collect_sub_sheets.d.ts +0 -7
  146. package/build/utils/collect_sub_sheets.d.ts.map +0 -1
  147. package/build/utils/collect_sub_sheets.js +0 -156
  148. package/build/utils/collect_sub_sheets_by_id.d.ts +0 -7
  149. package/build/utils/collect_sub_sheets_by_id.d.ts.map +0 -1
  150. package/build/utils/collect_sub_sheets_by_id.js +0 -150
  151. package/build/utils/constraints.d.ts +0 -11
  152. package/build/utils/constraints.d.ts.map +0 -1
  153. package/build/utils/constraints.js +0 -17
  154. package/build/utils/filter_null_undefined.d.ts +0 -2
  155. package/build/utils/filter_null_undefined.d.ts.map +0 -1
  156. package/build/utils/filter_null_undefined.js +0 -39
  157. package/build/utils/index.d.ts +0 -6
  158. package/build/utils/index.d.ts.map +0 -1
  159. package/build/utils/index.js +0 -5
  160. package/build/utils/string_formatter.d.ts +0 -14
  161. package/build/utils/string_formatter.d.ts.map +0 -1
  162. package/build/utils/string_formatter.js +0 -35
package/dist/index.mjs ADDED
@@ -0,0 +1,2936 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
5
+ var __typeError = (msg) => {
6
+ throw TypeError(msg);
7
+ };
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
+ var __decoratorStart = (base) => [, , , __create(base?.[__knownSymbol("metadata")] ?? null)];
11
+ var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
12
+ var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
13
+ var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
14
+ var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
15
+ var __runInitializers = (array, flags, self, value) => {
16
+ for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
17
+ return value;
18
+ };
19
+ var __decorateElement = (array, flags, name, decorators, target, extra) => {
20
+ var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
21
+ var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings[k + 5];
22
+ var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
23
+ var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc(k < 4 ? target : { get [name]() {
24
+ return __privateGet(this, extra);
25
+ }, set [name](x) {
26
+ return __privateSet(this, extra, x);
27
+ } }, name));
28
+ k ? p && k < 4 && __name(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name(target, name);
29
+ for (var i = decorators.length - 1; i >= 0; i--) {
30
+ ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
31
+ if (k) {
32
+ ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn(target, x) : (x) => name in x };
33
+ if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet : __privateMethod)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
34
+ if (k > 2) access.set = p ? (x, y) => __privateSet(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
35
+ }
36
+ it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
37
+ if (k ^ 4 || it === void 0) __expectFn(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
38
+ else if (typeof it !== "object" || it === null) __typeError("Object expected");
39
+ else __expectFn(fn = it.get) && (desc.get = fn), __expectFn(fn = it.set) && (desc.set = fn), __expectFn(fn = it.init) && initializers.unshift(fn);
40
+ }
41
+ return k || __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
42
+ };
43
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
44
+ var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use the "in" operator on this value') : member.has(obj);
45
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
46
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
47
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
48
+
49
+ // src/converter/kicad_sexpr/eeschema/drawing_sheet/index.ts
50
+ import { Base64 } from "js-base64";
51
+
52
+ // src/converter/kicad_sexpr/eeschema/drawing_sheet/sch_default_drawing_sheet.ts
53
+ var BASE_64_ENCODED_SCH_DEFAULT_DRAWING_SHEET = "KGtpY2FkX3drcwoJKHZlcnNpb24gMjAyMzExMTgpCgkoZ2VuZXJhdG9yICJwbF9lZGl0b3IiKQoJKGdlbmVyYXRvcl92ZXJzaW9uICI4LjAiKQoJKHNldHVwCgkJKHRleHRzaXplIDEuNSAxLjUpCgkJKGxpbmV3aWR0aCAwLjE1KQoJCSh0ZXh0bGluZXdpZHRoIDAuMTUpCgkJKGxlZnRfbWFyZ2luIDEwKQoJCShyaWdodF9tYXJnaW4gMTApCgkJKHRvcF9tYXJnaW4gMTApCgkJKGJvdHRvbV9tYXJnaW4gMTApCgkpCgkocmVjdAoJCShuYW1lICIiKQoJCShzdGFydCAxMzUuNjY5IDM0LjI3MjIpCgkJKGVuZCAyIDIuMDAwMikKCQkoY29tbWVudCAicmVjdCBhcm91bmQgdGhlIHRpdGxlIGJsb2NrIikKCSkKCShyZWN0CgkJKG5hbWUgIiIpCgkJKHN0YXJ0IDAgMCBsdGNvcm5lcikKCQkoZW5kIDAgMCkKCQkocmVwZWF0IDIpCgkJKGluY3J4IDIpCgkJKGluY3J5IDIpCgkpCgkobGluZQoJCShuYW1lICIiKQoJCShzdGFydCA1MCAyIGx0Y29ybmVyKQoJCShlbmQgNTAgMCBsdGNvcm5lcikKCQkocmVwZWF0IDMwKQoJCShpbmNyeCA1MCkKCSkKCSh0YnRleHQgIjEiCgkJKG5hbWUgIiIpCgkJKHBvcyAyNSAxIGx0Y29ybmVyKQoJCShmb250CgkJCShzaXplIDEuMyAxLjMpCgkJKQoJCShyZXBlYXQgMTAwKQoJCShpbmNyeCA1MCkKCSkKCShsaW5lCgkJKG5hbWUgIiIpCgkJKHN0YXJ0IDUwIDIgbGJjb3JuZXIpCgkJKGVuZCA1MCAwIGxiY29ybmVyKQoJCShyZXBlYXQgMzApCgkJKGluY3J4IDUwKQoJKQoJKHRidGV4dCAiMSIKCQkobmFtZSAiIikKCQkocG9zIDI1IDEgbGJjb3JuZXIpCgkJKGZvbnQKCQkJKHNpemUgMS4zIDEuMykKCQkpCgkJKHJlcGVhdCAxMDApCgkJKGluY3J4IDUwKQoJKQoJKGxpbmUKCQkobmFtZSAiIikKCQkoc3RhcnQgMCA1MCBsdGNvcm5lcikKCQkoZW5kIDIgNTAgbHRjb3JuZXIpCgkJKHJlcGVhdCAzMCkKCQkoaW5jcnkgNTApCgkpCgkodGJ0ZXh0ICJBIgoJCShuYW1lICIiKQoJCShwb3MgMSAyNSBsdGNvcm5lcikKCQkoZm9udAoJCQkoc2l6ZSAxLjMgMS4zKQoJCSkKCQkoanVzdGlmeSBjZW50ZXIpCgkJKHJlcGVhdCAxMDApCgkJKGluY3J5IDUwKQoJKQoJKGxpbmUKCQkobmFtZSAiIikKCQkoc3RhcnQgMCA1MCBydGNvcm5lcikKCQkoZW5kIDIgNTAgcnRjb3JuZXIpCgkJKHJlcGVhdCAzMCkKCQkoaW5jcnkgNTApCgkpCgkodGJ0ZXh0ICJBIgoJCShuYW1lICIiKQoJCShwb3MgMSAyNSBydGNvcm5lcikKCQkoZm9udAoJCQkoc2l6ZSAxLjMgMS4zKQoJCSkKCQkoanVzdGlmeSBjZW50ZXIpCgkJKHJlcGVhdCAxMDApCgkJKGluY3J5IDUwKQoJKQoJKGxpbmUKCQkobmFtZSAiIikKCQkoc3RhcnQgMTM1LjY2OSAyOS4xOTIpCgkJKGVuZCA0OS4zMDkgMjkuMTkyKQoJKQoJKGxpbmUKCQkobmFtZSAiIikKCQkoc3RhcnQgMTM1LjY2OSAyNC4xMTIpCgkJKGVuZCA0OS4zMDkgMjQuMTEyKQoJKQoJKGxpbmUKCQkobmFtZSAiIikKCQkoc3RhcnQgMTM1LjY2OSAxOS4wMzIpCgkJKGVuZCAyIDE5LjAzMikKCSkKCShsaW5lCgkJKG5hbWUgIiIpCgkJKHN0YXJ0IDQ5LjMwOSAzNC4yNzIyKQoJCShlbmQgNDkuMzA5IDE5LjAzMjIpCgkpCgkodGJ0ZXh0ICJEb2N1bWVudCBOYW1lOiIKCQkobmFtZSAiIikKCQkocG9zIDEzNC4zOTkgMzEuNzMyMikKCQkoZm9udAoJCQkoZmFjZSAiQXJpYWwiKSBib2xkKQoJKQoJKHRidGV4dCAiJHtUSVRMRX0iCgkJKG5hbWUgIiIpCgkJKHBvcyAxMTYuNjk5IDMxLjczMjIpCgkJKGZvbnQKCQkJKGZhY2UgIkFyaWFsIikKCQkpCgkpCgkodGJ0ZXh0ICJQcm9qZWN0IE5hbWU6IgoJCShuYW1lICIiKQoJCShwb3MgMTM0LjM5OSAyNi42NTIyKQoJCShmb250CgkJCShmYWNlICJBcmlhbCIpIGJvbGQpCgkpCgkodGJ0ZXh0ICIke0NPTU1FTlQzfSIKCQkobmFtZSAiIikKCQkocG9zIDExOS42OTkgMjYuNjUyMikKCQkoZm9udAoJCQkoZmFjZSAiQXJpYWwiKQoJCSkKCSkKCSh0YnRleHQgIlNoZWV0IE5hbWU6IgoJCShuYW1lICIiKQoJCShwb3MgMTM0LjM5OSAyMS41NzIyKQoJCShmb250CgkJCShmYWNlICJBcmlhbCIpIGJvbGQpCgkpCgkodGJ0ZXh0ICIke0ZJTEVOQU1FfSIKCQkobmFtZSAiIikKCQkocG9zIDEyMS4wOTkgMjEuNTcyMikKCQkoZm9udAoJCQkoZmFjZSAiQXJpYWwiKQoJCSkKCSkKCShsaW5lCgkJKG5hbWUgIiIpCgkJKHN0YXJ0IDEzNS42NjkgMTMuOTUyKQoJCShlbmQgMiAxMy45NTIpCgkpCgkodGJ0ZXh0ICJBdXRob3I6IgoJCShuYW1lICIiKQoJCShwb3MgMTM0LjM5OSAxNi40OTIyKQoJCShmb250CgkJCShmYWNlICJBcmlhbCIpIGJvbGQpCgkpCgkodGJ0ZXh0ICIke0NPTU1FTlQyfSIKCQkobmFtZSAiIikKCQkocG9zIDEyNi4xOTkgMTYuNDkyMikKCQkoZm9udAoJCQkoZmFjZSAiQXJpYWwiKQoJCSkKCSkKCShsaW5lCgkJKG5hbWUgIiIpCgkJKHN0YXJ0IDEzNS42NjkgOC44NzIpCgkJKGVuZCAyIDguODcyKQoJKQoJKHRidGV4dCAiRGF0ZToiCgkJKG5hbWUgIiIpCgkJKHBvcyA0OC4wMzkgMTEuNDEyMikKCQkoZm9udAoJCQkoZmFjZSAiQXJpYWwiKSBib2xkKQoJKQoJKHRidGV4dCAiJHtJU1NVRV9EQVRFfSIKCQkobmFtZSAiIikKCQkocG9zIDQyLjEzOSAxMS40MTIyKQoJCShmb250CgkJCShmYWNlICJBcmlhbCIpCgkJKQoJKQoJKHRidGV4dCAiU2hlZXQgTnVtYmVyOiIKCQkobmFtZSAiIikKCQkocG9zIDEzNC4zOTkgMTEuNDEyMikKCQkoZm9udAoJCQkoZmFjZSAiQXJpYWwiKSBib2xkKQoJKQoJKHRidGV4dCAiJHsjfSBvZiAkeyMjfSIKCQkobmFtZSAiIikKCQkocG9zIDExOC42OTkgMTEuNDEyMikKCQkoZm9udAoJCQkoZmFjZSAiQXJpYWwiKQoJCSkKCSkKCSh0YnRleHQgIlJldmlzaW9uOiIKCQkobmFtZSAiIikKCQkocG9zIDg3LjQwOSAxMS40MTIyKQoJCShmb250CgkJCShmYWNlICJBcmlhbCIpIGJvbGQpCgkpCgkodGJ0ZXh0ICIke1JFVklTSU9OfSIKCQkobmFtZSAiIikKCQkocG9zIDc3LjIwOSAxMS40MTIyKQoJCShmb250CgkJCShmYWNlICJBcmlhbCIpCgkJKQoJKQoJKGxpbmUKCQkobmFtZSAiIikKCQkoc3RhcnQgNDkuMzA5IDEzLjk1MjIpCgkJKGVuZCA0OS4zMDkgOC44NzIyKQoJKQoJKGxpbmUKCQkobmFtZSAiIikKCQkoc3RhcnQgODguNjc5IDEzLjk1MjIpCgkJKGVuZCA4OC42NzkgOC44NzIyKQoJKQoJKHRidGV4dCAiTW9kdWxhciBDaXJjdWl0IERlc2lnbiBTdHVkaW8gZGVzaWducyBhcmUgbWFjaGluZS1nZW5lcmF0ZWQgZHJhZnRzIGFuZCByZXF1aXJlIHZlcmlmaWNhdGlvbiBieSBxdWFsaWZpZWQgc3BlY2lhbGlzdHMuIFxuQnkgdXNpbmcgdGhlc2UgZGVzaWducywgeW91IGFncmVlIHRvIHRoZSBlZGEuY24gVGVybXMgb2YgVXNlOiAke0NPTU1FTlQxfSIKCQkobmFtZSAiIikKCQkocG9zIDEzNC4zOTkgNi4zMzIpCgkJKGZvbnQKCQkJKGZhY2UgIkFyaWFsIikKCQkpCgkpCgkoYml0bWFwCgkJKG5hbWUgIiIpCgkJKHBvcyAyNS40MDggMjYuOTA2KQoJCShzY2FsZSAwLjc1ODA2NDUxNjEpCgkJKGRhdGEgImlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFJNEFBQUF5Q0FZQUFBQ0s5ZU1HQUFBQUNYQklXWE1BQUE3REFBQU93d0hIYjZoa0FBQUEiCgkJCSJHWFJGV0hSVGIyWjBkMkZ5WlFCM2QzY3VhVzVyYzJOaGNHVXViM0pubSs0OEdnQUFFRUJKUkVGVWVKenRuWG1jVk5XVng3Ky9WKzlWIgoJCQkiSXlJRUJISDdtQmhsSERmOFJCcG5rb3hMM0dmVWNaMDJ4R1Zzc0xzS25lQVN0OEc0a01SdEpDUXFoSDdkOE1HNEQrNUxOSTY0eHkxMiIKCQkJImswR05ZK0lXTUFoK1JDR3lTSGRWdlROL3ZOZnQ2K3JhZXFOUitINCs5YUhlZmZlZWM2dnJjTis1NTU1N1MyWkdNVnFrbllEamdYOEIiCgkJCSJkZ1oyQUFZWGJkQzN0QUhMZ1NVR1R4bzhNTjdzZnplUWJpUnQ3Y0UzT3BYQitsYXpQK2JWRytuQjErTmxHVmhtWmg5dWdHNjI5eUVKIgoJCQkialBKZ2xNRzJCbHRtemU0dDE4NlZUbkJnWkx3c0EvZVoyWXF5T2dzWnppSnBod3hjTHBnSXVOMzREUDJLWUVFQUYxV2IvYUcvZFhuUyIKCQkJIkU4Q2hlY1dYWjh4K0dpOUlTdlVHZmw2OWFSbXpLMHZKbDdTbG1hMHQxdzlKUTEyWWFqRFVnU0VHV3dGRGdPSFJ2OXRFNytOOG1ESGIiCgkJCSJvWnhzVDJvR3huWFNCOVZ0WmkzbDJuWXhpb1hTa1FaM0NZYVZhN3loTVRoVThHcUxkT2s0cyt2NlM0OHJuYTQ4b3hGOGtJR2Y5MWEyIgoJCQkicENFdVhKQ0EweVh0Wm1hWk1rMkdBQmNMS1A1czJQQTQ4WXRtS1dYd0NCdWgwY1JJQU5jdWxHN3FEK0dTdGhaTXp5OFA0SHd6VzljTCIKCQkJInVYS2wwMTE0QjdoQ3NITWlkQU8rbEhRWXprTHBDTUZNd2k5bW84ZmdQMXFrYy9wU3BpVEhoVnVCVVhtM2ZwTTF1NmVuY2ozcFFCZCsiCgkJCSJML2cxTUxwREgwenBxY3dDL0E1NHdHQXU4S3VZN2g5NTBvZnRyNlIwYzRWOVBpemV6cE1XeHUrN0FDM1NTT0F1TmlKL3BrS210MGhQIgoJCQkialRON3ZTK0V1ZkFUNEovemlsZGs0Y3lleUt1U3hnWndEZUhrb2dzRzIwc2FabVovS3lIbU0rQWl3YWNCckJTc0JLWUIrOGNyWmN6MiIKCQkJIkw5ZzY5SW0yaStuY3VwSytHd3hTckYwKzdZWnlPZkMxU2dSdVpMakExY0F4dlJZa0hTK1ltbDl1a0RLejVkMlJaYkJUVXJyVjRBZmsiCgkJCSJ1UU1SYTRGcmN2QnpNMXRmVXBiWkd1RDZlSmtubmRlZC92UUg3dXZTY0NCVnBwNFpQTzdBVTBDcC94MTlob0VyMk5WZ0FyQnRpYXBIIgoJCQkidnlydE9UNXZtdHdkWE9rb3dSMkE4bTQ5bXpXN3I3dnlCTFZGSEZrVDNKT0JDODFzY2ZkN3V2SGd0c0xSZ21TSk9xc05UcWcyVzdEQiIKCQkJImVoWGpOZW15VE9oM0ZIVWtFM0FzMENQRGlZem1IbUJRZ2R1ZjlVUm1FWjRITG00emU2a1BaUTRZanVESVVoVUVadzJVMFFDTU5WdTciCgkJCSJPaHp5M3lwUjdmQ2V5RTVLWndydXA3RFJsRVRTSUZjNnpTQmRwdXFUd0VFWnN3TXlYeEdqZ2RCSDJLbkUvZVg3aGtQNGdIS1EyZnFXIgoJCQkiY1BvOXE5QjlLLzBadWlCcEt3OW1HNXpTelhZSkZ3NDBPTW1GNzlNMThCYm5NZUJuR2JNWHU2TWpuNlIwZGdCajQyVU9qTTEvRkNhbCIKCQkJIitlM3ZEZDdMbUYzU0c3M2xjSUh0Uzl4L0hiT2dQenRRS1FhTDhoMlFHRVc5LzN3a0RVbkFRb05kdTZOL2tEVEdoUmVBVVNYNkVlcUEiCgkJCSJ1amF6T2QyUlh3eURJNVRuL0JmeW53eitMWFpaTnZMYlcxeEtETk1HWFR6K0Z1a3lZTDhpOWQrcE5xdkk0MitXSmloOEJGVWt4NEgxIgoJCQkiSlNLbkZUOXF6R3hOVW1vdVlEaC9BbllyMWk2QW9YU043eFNyKzFHeGU0T2tYYkt3Yjd3c0J3K1pXV3Nsc3Z1WUxyNnRRVlVsRFhzUyIKCQkJInQ5a1BPTHJRRGNIQ1F1VkYySzJQNUhTYkRKem5odkdhWVFBR2pRN01NK2l1RC9JbThCZUt4R2tLa1lOVEZNWmgyc2tDVzNSVGI1OGciCgkJCSJHRmJnUCtOV2xiUXRGR1A0eW1ObXk2TXZiNDNCcVZtekZGQnV6YWlkVDZMbzdQNFpzejBGRDNaTE4reVlkLzJCbVdXTDFVL0ErWUpxIgoJCQkiUWJYQmFVV3FyVFNvYVg4QkZmazNGbzZpK1dVVkxUZDkyU0xGZlVZR2JxcUNoOWFidlZ0aC9hVXVISjZGcDB0OTBSRkZINTNLYzNRRiIKCQkJIjc1Y1N0TjdzbmZiM1NlbmJSUjdYbjJmTjdpN1RwODc5Q0JkYnV4aUo4bEpFaXJISkdrNzA1VmRrTkZIOTVZVDVRWlZ3blNmdFFXY2YiCgkJCSJNU0hZRy9pSFRuTERSMTJsRkZ0V1FOSWdEMzVnY0h3V1RqU3p0bEtDUE5qTHVnWThFZXhaU1VjMldjUHBLd0pZbS8vWFY1ajBkbVYrIgoJCQkiM1VLamhlRC9LdEVUTGNBZVZPVDIxaTU4WUZGU2xnZG5BSTJSL0llQmpxUXlnL2FJOWQ2RkJGazBJdVpna1JkYlVRakNaWklPTmh0TyIKCQkJIkw4bkJNeTZzcGtLbk1vL1dSQmlBTElzTEJ4SW1iUldpaXM2em9Vc2wzV3htYlZGU1ZxSHArY0ZGWkkyVk5OTE1saEFaWHlFMlNlZTQiCgkJCSJMekd6cFlTencyYkNHVklsdEFLTERHb3E5YkVpcDdjVXkySjFkNHBHbllKSXFyTGlNOEZFQW80bzE1L05JMDRQU0VxM0dld2VLL280IgoJCQkiWXphK3YvUkpjbDA0TVZhVW8ydmUxQnpnc3RqMTFQWlJKMTllWkJoZFpsUWQrdUE0NFBaU2ZlcHJ3OW1sUlhxNGtvcUN2K3RqM2IwaSIKCQkJIkE0dTl2Q3lCbUQ5QVh2bnVkQTdpTFN0VXI2OUloT3VKOGVEalM4QS94ZXNJSGpHb0pacnVHM3c5N3V2azFmMVJHWlhIU3RvaEdrMEwiCgkJCSIwdGVHTTR3aVFiMk5uU2l6ditnemZTQVJUSTVkZmdZOFI1N2hFSTVDYzRFclltV1g1bzg2bnZRZDRJQzh0bGs2MjRMbndpVEN4TGFDIgoJCQkiYkpLUHFxUTB6bnFYL0pXL05yYVZKMTNaQzNuUFpNeWVLWFJEMGpmY3poa01DeWdTck14Q2t3dVhFbjJ2Qm04QUk0akNDTkhNN1BvQyIKCQkJIlRYOUNPTnJHZDBiOFVOSU54YklUTjBuRElkd1Nja1haV3BVenBBL2tQVk9vMEEzVE5qb21NWUxmRk1zR01MT2xYdWdxRENYY3l0TnAiCgkJCSJaZDZES1FiZnlXdTJPZ3MzdWVEUjJVY2E2Y0tGd0k4TDZkbzhxOXFJVVppZEdjLzN5V1hnMFZKdHNuQjZ4dXpRZktPcGtzWWEvS3hBIgoJCQkia3lZelc1V0ZKc0xIWFp6ekpCV01KRzgybkkwWUY4Nmw4N0xBRStYeW42TWM1VTVJR3BtREI0QXQ4MjZ0eThJdm9uWWZDUEozZnc1MiIKCQkJIllaNmtMbmF5cVQ2cVd1aThRdDFkNnVuczU2eWhkNXYxbmlsVXFIQkJ0UU9EZWQwVkhLMUozVThZemM3bkNqUDdhL3VGQTFOellScHUiCgkJCSJQSmo0UFE5K0NOd1FiOWpYaHJPQ0NpT2hoSDdHdm1WcjlRTWxvcWtWNFVuSDBObHdWcGZiOHRzVDJzeHU5S1R0Q0ZlN2wwYWpSc1ZJIgoJCQkiMnRJTmx4enlaMkFBaTdKNXhyRGU3RjFQdXBIUXQrbkE0SHBQV2hSMzRQdmFjSmFNTTZ1dnBHS3pkS1VHeUhDK1RHUmhhaUxNT3Z4eiIKCQkJInVZWExPSkpHdVdIS3g3Y0xpUlhVRnRwK25JV3JYRGlkMk1aQlFzZDV2cVQ5ek93dnNObkgyZWd4TTh0Qk9sc2szN29RVmRKZUNYaUYiCgkJCSJ3a2FENEp5MklnYzNSTlB2TStpNkpqdktoZjlST0FKdU5wd3ZBMmFXcmVSa2kzWUNhRkJobndaZ2VwdlpyNHJjQXlCajlsdnlIbU1SIgoJCQkiWTF4NFF0S296WWJ6RmNRSm5mZENCeVRjbDRXTEs1R1JEZjJxUWltOG81S3d6V2JEK1FyU2F2YW00UHk4NG51emNJcFZ1R3ZGekZxeiIKCQkJImNJdzZyOWQ5NU1BaHJXWi8zR3c0WDFIYXpIeUZCMGtBM0ppRm1uTDcxUE14c3c4VnBsOThLdmdnQWZ1M21yMEJtMjRjcDdjOFJ5eXIiCgkJCSJUdkRKQnRiL082RFR3VktaQW1tdEdUakxnd1Z0Wm5ON3FxalY3TTJrZEZRQ1B2cmNyQ00vK2t0ak9EbFlxdkJrcXM4RW93MzJJY3dyIgoJCQkiMlZCbkVuYVFxWER2V0QvcVgwQzQyRmtTTTF0SnVHTGVLOXJNWHM0djY0bmgvTDdZRFF0UG02cVVQeEdlL2xXUm5QRmhxUDIvNG1VdCIKCQkJIjBqREJoUVlYZFVQdlp2cUNabmk3R2F6UTYxVjR6TXpZV0Y3eklmRWlqSGdhM0hqNXEvRGRnZTVic1ZjcWxUcTFQK1hYMTlkN0EvRzUiCgkJCSJISXM5cS9OUk4vZFg5eGV2U3VOYnBFZStDV3VUOE1sV3NLNUZlcnhaK2k1QXRka0xBOTNIWWxnL0huSUpJT25KZERxOVIzL3FLSVJUIgoJCQkiWmtQWXJzM1NRUnVxTTRWWUtKM3FoSnY5aitLTHhUY1BPRnp3YkxNMGFlQjZOL0FrazhuREdob2EzdXlOakZRcTVhVlNxVzRkR0twWCIKCQkJIjRmdUNPMHZVV1d4d2NMWFplNzNwWEU5b2tmWW0zRDFRNnVDbmpNRysxZEUwc1J3MU5UV0o0Y09IdjlEVzFuYmt2SG56VnRYWDEvOHIiCgkJCSJjR2hqWStNVWdQcjYranNrdlM5cGNVTkRRMk5OVFUxaXhJZ1JUNXZaSWI3dloxS3AxSm5BanBKMmIyaG9PQmtnblU3L01naUMrWTJOIgoJCQkialMvVzFkWHQ3RGpPTk4vM1R3ZElwVkxMQ0JPLzY4M3NOYy96VG1wcmF4dmpPTTRCdnU5ZkZlazhSOUkydnU5ZldsZFhOemFSU013MCIKCQkJInN6Rm05clNrZi9kOVAxTmZYejhldU1weG5CSEFUNE1nT0xLeHNYRnlLcFZxY2h6bmhpQUlqZzJDNExtbXBxYm5JNzBQQmtGd1ExTlQiCgkJCSIwMVB0bjcyK3Z2NElTVk9Cb1daMmUyTmo0L1IwT24yeW1jMG1uR1Fzek9WeUUrYk1tYk00bFVyZEd1bS9BRmdzNlJJenU1WXdwM21LIgoJCQkicS9BY2w4OHB2dkg5NjRLRnpkS3NCRHhsc0txU0w2aW5HS3dhOThXV2tZc3BiVFFBWHBSOFhWdUovUG56NStmUzZYUkxWVlhWaWNCYyIKCQkJIlNST0EvVk9wMUNXZTUyMGhhVmRKMXdWQjBBZzBEaDgrL0FBejIwZlNZY0NqWm5aS01wazhJNVBKUERWcDBxVHRYZGY5R0RndU90MzgiCgkJCSJSVWtuU29vblVXMExMSzJxcXRxeHRiWDEwbXcyZTBFaWtYald6RHF5K0tLRXJaSFIrMm96TzlmMy9ZV3BWR3FHbWRWTW1qVHBJZGQxIgoJCQkicHdNbkRoNDhlTzJhTld0dWNSeW5mVWxoZERhYnJYSWNaNmRFSXZHMW1Nd2RFb2xFUi81Tk9wM2VSOUpjNEVUUDg5N0paRExuMU5YViIKCQkJImpYVWM1MnJDck1BbFFGTWlrV2dFanBDMHU2VDMxcTFiTjM3dzRNRjNBVE9BWTRJZytNZEVJakhOR1dmMk4wRzVNNE9IQ2FZR3NNQ2ciCgkJCSJ1WjlmVjhYMEhsS0pNVkI4YzFsQmNybmNyV1kyb2JhMmRoQ3dsNlFHTXp1NnJhM3RXRE9iMzlEUXNFaFNWVHFkSGlQcEpFbG5tOW1FIgoJCQkidXJxNjBaSnM1c3laaTRFN1hkZXRrWFFJWWZaY2RTcVY4aVFkNjdwdWZCLzNDdC8zZjNIampUZCtGZ1RCL2NDWVVuM0xack1QU3pvbyIKCQkJIm5VNy8wc3kyQm5ieFBPOElTWS82dnI5aXhvd1puMHNxbWtSZWdsUE5iSjd2KzYvTW5EbnpFOS8zTDNjYzV6Qko5L20rLzVidisrc2MiCgkJCSJ4NWtPSERabHlwU2gwZC9wNWx0dXVXV3RtZjNXekY2TzZqeHZaanM3QUI1Y1M1aExzekVRWDJNcGRlSlZuTkhscTN4QlUxUFR5OEIyIgoJCQkibnVkTkJCN01ack8zU2pwWjBnbEJFTFIvNmJjR1FUQWhDSUl4RFEwTnQwbmExWEdjVXhXZGZDWHAxNFNuY3AwUUJNRWRoTmw1WndBciIKCQkJIlo4NmNHUThJeGxNaE1vUS9neEFRQzRXWVdRSmcyclJwanVkNVR3SnZPbzR6RzFnUlpkOGx6S3pjR1VEV0xpZTZjUE51dGtwYW5WZjIiCgkJCSJlUkFFUTlxdmM3bmNXaURudW00R0lBaUMxdWl6WnFLKzQvdCtCbkFjZ0wzTlZncE95UHVRQTRJNkc4c0hGVGI3YS9rcVhiaGQwaldTIgoJCQkiN3Bnelo4NWl3aFROcXVnOXJ1dmVMdWxjU1FzQXpPeCs0RDh0T2lpN29hSGhiU0F3c3gyYm1wcmVsM1M3cE9sbTl0OFRKMDRjTlhIaSIKCQkJInhGS0hNTDBMakt1dHJSMTA5dGxuYnl2cEpJQWxTNVpzQ1F6OTlOTlBueG85ZXZTN2tzWUFKQktKWjRIYSt2cjZBeWRQbnJ5Tm1SVTYiCgkJCSJHUHh0b29TdHVycTZnNEU5QU00Ly8vd3R6anJyckc4NmpuT1hwSnBVS2pXc3RyWjJVRHFkbmlicEVVa0hUWjQ4ZWE5VUtqVVl1TWpNIgoJCQkiWnMrWU1lUHpjbis4anJXcWZjMmVOemlMcmduTEc1cjQxTEtpakRmQlF6M1FjeHZ3UlB1TXhNem1FVXZObkRWcjFuTGdidGQxN3dSdyIKCQkJIlhmZE9NN3ZiOS8yT2tkbk1acG5aN1FDUm5NYzh6M3ZRODd5VFhOYzlEa0RTa3BqT2RjQzd2dSsvQmR5YlRDYmZ5MmF6VDVyWlRjQ1MiCgkJCSJ1WFBucmdadUdqNTgrRXZMbGkxN0dWaHRaaXVqdmt5VmRFY1FCSzlMaXVmU3ZBdXNjMTNYQi80K2xVb3RkeHpuUXVEcVhDNjNhdlhxIgoJCQkiMWRYWmJQYmMyYk5udnhFRXdTWEFYWjduTFFEVytiNi9STkpwWm5ZRDhJcmpPR3RXclZwMVh2VFpsaWFUeVN4QUVBUWZTNHFIYlY3ciIKCQkJIjh1c3g3VDhDd2dEK25vTURlMzdMN00wL1NLTUNlSTNTNXh4L0hNRFk4ZDA4eFByTHpLUkprN2IzUE8raGhvYUc2b0hxUTVmVjhYM0QiCgkJCSJKSjdkS2J4ZFlvTVFSSHVVdm1YMmNiUTV2dGhXMUk4TWp0NlVqR1pqb1dCYXhUaXpaZVBNNm9Nd2kyd0s4RGp3WndvbkIvVUhOZTJCIgoJCQkidmVpM3FmWTArSEYwUnQ5N3dNdUNLOXRnajJxem9tdG5YMVdHRFJ1Mk1ucnNEQmovRDJLVHp6ZGJvdlp5QUFBQUFFbEZUa1N1UW1DQyIKCQkpCgkpCikK";
54
+
55
+ // src/converter/kicad_sexpr/eeschema/drawing_sheet/index.ts
56
+ function get_sch_default_drawing_sheet() {
57
+ return Base64.decode(BASE_64_ENCODED_SCH_DEFAULT_DRAWING_SHEET);
58
+ }
59
+
60
+ // src/converter/kicad_sexpr/eeschema/printer.ts
61
+ import { READABLE_ELECTRICAL_PINTYPE } from "@modular-circuit/electronics-model";
62
+ import {
63
+ SHAPE_T
64
+ } from "@modular-circuit/ir";
65
+ import { gen_uuid } from "@modular-circuit/utils";
66
+
67
+ // src/utils/collect_sub_sheets.ts
68
+ import { KICAD_SHC_FILE_EXT, parse_module_name, remove_filename_path_prefix, unzipFile } from "@modular-circuit/utils";
69
+ async function collect_sub_sheets(dependencies, module_resolver) {
70
+ const sheets = {};
71
+ const module_main_sheet = {};
72
+ const modules = {};
73
+ for (const [k, v] of Object.entries(dependencies)) {
74
+ const zip_archive_url = await module_resolver.get_module_archive({
75
+ ...parse_module_name(k),
76
+ version: v
77
+ });
78
+ const module = await module_resolver.get_module_circuit({
79
+ ...parse_module_name(k),
80
+ version: v
81
+ });
82
+ if (!zip_archive_url || !module) {
83
+ console.error(`Module ${k}/${v} not found`);
84
+ continue;
85
+ }
86
+ if (!module.main) {
87
+ console.error(`Missing main entry in module ${k}/${v}`);
88
+ continue;
89
+ }
90
+ module_main_sheet[k] = module.main;
91
+ modules[k] = module;
92
+ const zip_archive = await fetch(zip_archive_url).then((res) => res.arrayBuffer());
93
+ const files = await unzipFile(zip_archive);
94
+ for (const [name, content] of Object.entries(files)) {
95
+ if (name.endsWith(KICAD_SHC_FILE_EXT)) {
96
+ const fileName = remove_filename_path_prefix(name);
97
+ if (fileName in sheets) {
98
+ console.error(`Duplicate sheet name: ${fileName}`);
99
+ continue;
100
+ }
101
+ sheets[fileName] = content;
102
+ }
103
+ }
104
+ }
105
+ return { sheets, module_main_sheet, modules };
106
+ }
107
+
108
+ // src/utils/constraints.ts
109
+ var PAPER_SIZE = {
110
+ A0: { width: 841, height: 1189 },
111
+ A1: { width: 594, height: 841 },
112
+ A2: { width: 420, height: 594 },
113
+ A3: { width: 297, height: 420 },
114
+ A4: { width: 210, height: 297 },
115
+ A5: { width: 148, height: 210 },
116
+ A6: { width: 105, height: 148 },
117
+ A7: { width: 74, height: 105 },
118
+ A8: { width: 52, height: 74 }
119
+ };
120
+ var DEFAULT_PAPER_SIZE = PAPER_SIZE.A4;
121
+ var GENERATOR_NAME = "modular_circuit";
122
+ var SCH_VERSION = 20231120;
123
+ var PAPER = "A4";
124
+ var GENERATOR_VERSION = "8.0";
125
+
126
+ // src/utils/filter_null_undefined.ts
127
+ function filterNullOrUndefined(originalMethod, _context) {
128
+ function replacementMethod(...args) {
129
+ if (args.length === 0 || args.length === 1 && (args[0] === void 0 || args[0] === null)) return "";
130
+ const result = originalMethod.call(this, ...args);
131
+ return result;
132
+ }
133
+ return replacementMethod;
134
+ }
135
+
136
+ // src/utils/string_formatter.ts
137
+ var tab = " ";
138
+ var StringFormatter = class {
139
+ constructor(intend = 0) {
140
+ this.intend = intend;
141
+ this.content = "";
142
+ }
143
+ toString() {
144
+ return this.content;
145
+ }
146
+ get intend_level() {
147
+ return this.intend;
148
+ }
149
+ enter_scope() {
150
+ this.intend += 1;
151
+ }
152
+ exit_scope() {
153
+ this.intend -= 1;
154
+ }
155
+ append(str) {
156
+ this.content += str;
157
+ }
158
+ append_line(str) {
159
+ this.content += `${tab.repeat(this.intend)}${str}`;
160
+ }
161
+ append_quote(str) {
162
+ this.append(`"${str}"`);
163
+ }
164
+ };
165
+
166
+ // src/utils/collect_sub_sheets_by_id.ts
167
+ import {
168
+ fmt_module_name,
169
+ KICAD_PCB_FILE_EXT,
170
+ KICAD_SHC_FILE_EXT as KICAD_SHC_FILE_EXT2,
171
+ remove_filename_path_prefix as remove_filename_path_prefix2,
172
+ unzipFile as unzipFile2
173
+ } from "@modular-circuit/utils";
174
+ async function collect_sub_sheets_by_id(module_ids, module_resolver) {
175
+ const sheets = {};
176
+ const boards = {};
177
+ const module_main_sheet = {};
178
+ const modules = {};
179
+ for (const id of module_ids) {
180
+ const zip_archive_url = await module_resolver.get_module_archive_by_id(id);
181
+ const module_circuit = await module_resolver.get_module_circuit_by_id(id);
182
+ if (!module_circuit) {
183
+ console.error(`Module ${id} not found`);
184
+ continue;
185
+ }
186
+ if (!zip_archive_url || !module_circuit) {
187
+ console.error(`Module ${module_circuit.author}/${module_circuit.name} not found`);
188
+ continue;
189
+ }
190
+ if (!module_circuit.main) {
191
+ console.error(`Missing main entry in module${module_circuit.author}/${module_circuit.name}`);
192
+ continue;
193
+ }
194
+ const k = fmt_module_name(module_circuit);
195
+ module_main_sheet[k] = module_circuit.main;
196
+ modules[k] = module_circuit;
197
+ const zip_archive = await fetch(zip_archive_url).then((res) => res.arrayBuffer());
198
+ const files = await unzipFile2(zip_archive);
199
+ for (const [name, content] of Object.entries(files)) {
200
+ if (name.endsWith(KICAD_SHC_FILE_EXT2)) {
201
+ const fileName = remove_filename_path_prefix2(name);
202
+ if (fileName in sheets) {
203
+ console.error(`Duplicate sheet name: ${fileName}`);
204
+ continue;
205
+ }
206
+ sheets[fileName] = content;
207
+ } else if (name.endsWith(KICAD_PCB_FILE_EXT)) {
208
+ const fileName = remove_filename_path_prefix2(name);
209
+ if (fileName in boards) {
210
+ console.error(`Duplicate module name: ${fileName}`);
211
+ continue;
212
+ }
213
+ boards[fileName] = content;
214
+ }
215
+ }
216
+ }
217
+ return { sheets, module_main_sheet, modules, boards };
218
+ }
219
+
220
+ // src/converter/kicad_sexpr/eeschema/printer.ts
221
+ var SCOPE_START = "\n ";
222
+ var SPACE = " ";
223
+ var SCOPE_END = "\n";
224
+ var IGNORE_BOOLEANS = /* @__PURE__ */ new Set(["power"]);
225
+ var _color_dec, _stroke_dec, _fill_dec, _fields_dec, _justify_dec, _lib_id_dec, _unit_dec, _pin_defs_dec, _drawings_dec, _lib_children_dec, _pin_display_opt_dec, _power_dec, _init;
226
+ _power_dec = [filterNullOrUndefined], _pin_display_opt_dec = [filterNullOrUndefined], _lib_children_dec = [filterNullOrUndefined], _drawings_dec = [filterNullOrUndefined], _pin_defs_dec = [filterNullOrUndefined], _unit_dec = [filterNullOrUndefined], _lib_id_dec = [filterNullOrUndefined], _justify_dec = [filterNullOrUndefined], _fields_dec = [filterNullOrUndefined], _fill_dec = [filterNullOrUndefined], _stroke_dec = [filterNullOrUndefined], _color_dec = [filterNullOrUndefined];
227
+ var SCHEMATIC_PRINTER = class {
228
+ constructor() {
229
+ __runInitializers(_init, 5, this);
230
+ }
231
+ schematic(sch) {
232
+ const lib_symbols = (() => {
233
+ if (!sch.lib_symbols?.symbols.length) return "";
234
+ return `${SCOPE_START}(lib_symbols ${sch.lib_symbols?.symbols.map((it) => this.lib_symbol(it)).join(`${SCOPE_END}`)} )`;
235
+ })();
236
+ const wires = (() => {
237
+ if (!sch.wires?.length) return "";
238
+ return `${SCOPE_START}${sch.wires.map((it) => this.wire(it)).join(`${SCOPE_END}`)} `;
239
+ })();
240
+ const labels = (() => {
241
+ if (!sch.labels?.length) return "";
242
+ return `${SCOPE_START}${sch.labels.map((it) => this.label(it)).join(`${SCOPE_END}`)}`;
243
+ })();
244
+ const sch_sheets = (() => {
245
+ if (!sch.sheets?.length) return "";
246
+ return `${SCOPE_START}${sch.sheets.map((it) => this.sch_sheet(it)).join(`${SCOPE_END}`)} `;
247
+ })();
248
+ const sch_symbols = (() => {
249
+ if (!sch.symbols?.length) return "";
250
+ return `${SCOPE_START}${sch.symbols.map((it) => this.sch_symbol(it)).join(`${SCOPE_END}`)} `;
251
+ })();
252
+ return `
253
+ (kicad_sch
254
+ (version ${SCH_VERSION})
255
+ (generator "${GENERATOR_NAME}")
256
+ (generator_version "${GENERATOR_VERSION}")
257
+ (uuid "${gen_uuid()}")
258
+ (paper "${PAPER}")
259
+ ${lib_symbols}
260
+ ${wires}
261
+ ${labels}
262
+ ${sch_symbols}
263
+ ${sch_sheets}
264
+ )
265
+ `;
266
+ }
267
+ power(power) {
268
+ return power ? "(power)" : "";
269
+ }
270
+ pin_display_opt(opt) {
271
+ if (!opt) return;
272
+ const offset = (off) => off ? `(offset ${off})` : "";
273
+ const hide = (h) => h ? "hide" : "";
274
+ const pin_numbers = `${opt.pin_numbers ? `(pin_numbers ${offset(opt.pin_numbers.offset)} ${hide(opt.pin_numbers.hide)})` : ""}`;
275
+ const pin_names = `${opt.pin_names ? `(pin_names ${offset(opt.pin_names.offset)} ${hide(opt.pin_names.hide)})` : ""}`;
276
+ return `${pin_numbers}
277
+ ${pin_names}
278
+ `;
279
+ }
280
+ lib_symbol(lib_symbol) {
281
+ return `
282
+ (symbol "${lib_symbol.name}" ${this.power(lib_symbol.power)}
283
+ ${this.pin_display_opt(lib_symbol)}
284
+ ${this.booleans(lib_symbol)}
285
+ ${this.fields(lib_symbol.properties)}
286
+ ${this.pin_defs(lib_symbol.pins)}
287
+ ${this.drawings(lib_symbol.drawings)}
288
+ ${this.lib_children(lib_symbol.children)}
289
+ )
290
+ `;
291
+ }
292
+ lib_children(libs) {
293
+ if (!libs) return "";
294
+ return libs.map((i) => this.lib_symbol(i)).join(SCOPE_END);
295
+ }
296
+ pts(points) {
297
+ return `(pts ${points.map((i) => `(xy ${i.x} ${i.y} )`).join(SPACE)})`;
298
+ }
299
+ drawings(draws) {
300
+ if (!draws) return;
301
+ return draws.map((i) => this.drawing(i)).join(SCOPE_END);
302
+ }
303
+ drawing(draw) {
304
+ if (!("shape" in draw)) throw new Error(`Unhandled drawing ${draw}`);
305
+ switch (draw.shape) {
306
+ case SHAPE_T.POLY:
307
+ return `(polyline
308
+ ${this.pts(draw.pts)}
309
+ ${this.stroke(draw.stroke)}
310
+ ${this.fill(draw.fill)}
311
+ )`;
312
+ }
313
+ throw new Error(`Unhandled drawing ${draw}`);
314
+ }
315
+ pin_defs(defs) {
316
+ if (!defs) return;
317
+ return defs.map((it) => this.pin_def(it)).join(SCOPE_END);
318
+ }
319
+ pin_def(def) {
320
+ return `(pin ${READABLE_ELECTRICAL_PINTYPE[def.type]} ${def.shape}
321
+ ${this.at(def.at)}
322
+ (length ${def.length})
323
+ (name "${def.name.text}"
324
+ ${this.effects(def.name.effects)}
325
+ )
326
+ (number "${def.number.text}"
327
+ ${this.effects(def.number.effects)}
328
+ )
329
+ )`;
330
+ }
331
+ label(label) {
332
+ return ` (${label.label_type} "${label.text}"
333
+ ${this.at(label.at)}
334
+ ${this.fields_autoplaced()}
335
+ ${this.effects(label.effects)}
336
+ ${this.uuid(label.uuid)}
337
+ )`;
338
+ }
339
+ unit(c) {
340
+ return `(unit ${c})`;
341
+ }
342
+ sch_symbol(sch_symbol) {
343
+ return `(symbol
344
+ ${this.lib_id(sch_symbol.lib_id)}
345
+ ${this.at(sch_symbol.at)}
346
+ ${this.unit(sch_symbol.unit)}
347
+ ${this.booleans(sch_symbol)}
348
+ ${this.fields(sch_symbol.properties)}
349
+ ${sch_symbol.pins.map((pin) => this.sch_symbol_pin(pin)).join(SCOPE_START)}
350
+ )`;
351
+ }
352
+ wire(w) {
353
+ return `(wire
354
+ ${this.pts([w.start, w.end])}
355
+ ${this.stroke(w.stroke)}
356
+ ${this.uuid(w.uuid)}
357
+ )`;
358
+ }
359
+ lib_id(id) {
360
+ if (!id) return;
361
+ return `(lib_id "${id}")`;
362
+ }
363
+ sch_symbol_pin(pin) {
364
+ return `(pin "${pin.number}" ${this.uuid(pin.uuid)})`;
365
+ }
366
+ sch_sheet(sheet) {
367
+ return `(sheet
368
+ ${this.at(sheet.at)}
369
+ ${this.size(sheet.size)}
370
+ ${this.fields_autoplaced()}
371
+ ${this.stroke(sheet.stroke)}
372
+ ${this.fill(sheet.fill)}
373
+ ${this.uuid(sheet.uuid)}
374
+ ${this.fields(sheet.fields)}
375
+ ${sheet.pins.map((sheet_pin) => this.sch_sheet_pin(sheet_pin)).join(SCOPE_START)}
376
+ )`;
377
+ }
378
+ sch_sheet_pin(sheet_pin) {
379
+ return `(pin "${sheet_pin.text}" ${sheet_pin.shape}
380
+ ${this.at(sheet_pin.at)}
381
+ ${this.effects(sheet_pin.effects)}
382
+ ${this.uuid(sheet_pin.uuid)}
383
+ )`;
384
+ }
385
+ at(pos) {
386
+ return `(at ${pos.position.x} ${pos.position.y} ${pos.rotation === void 0 ? "" : pos.rotation})`;
387
+ }
388
+ uuid(id) {
389
+ return `(uuid "${id}")`;
390
+ }
391
+ effects(e) {
392
+ return `(effects
393
+ (font
394
+ (size ${e.font.size.x} ${e.font.size.y})
395
+ )${this.justify(e.justify)}${e.hide ? "(hide yes)" : ""}
396
+ )`;
397
+ }
398
+ justify(justify) {
399
+ if (!justify) return;
400
+ return `(justify ${justify.horizontal} ${justify.vertical})`;
401
+ }
402
+ booleans(it) {
403
+ if (typeof it !== "object" || !it) return;
404
+ const res = [];
405
+ for (const [k, v] of Object.entries(it)) {
406
+ if (typeof v === "boolean" && !IGNORE_BOOLEANS.has(k)) res.push(`( ${k} ${v ? "yes" : "no"} )`);
407
+ }
408
+ return res.join(SCOPE_START);
409
+ }
410
+ fields(fields) {
411
+ if (!fields) return;
412
+ return fields.map((f) => this.field(f)).join(SCOPE_START);
413
+ }
414
+ field(field) {
415
+ return `(property "${field.name}" "${field.text}"
416
+ ${this.at(field.at)}
417
+ ${this.effects(field.effects)}
418
+ )`;
419
+ }
420
+ fill(f) {
421
+ if (!f) return;
422
+ return `(fill${f.type ? ` (type ${f.type})` : ""} ${this.color(f.color)})`;
423
+ }
424
+ size(s) {
425
+ return `(size ${s.x} ${s.y})`;
426
+ }
427
+ fields_autoplaced() {
428
+ return "(fields_autoplaced yes)";
429
+ }
430
+ stroke(s) {
431
+ if (!s) return;
432
+ return `(stroke
433
+ (width ${s.width})
434
+ (type ${s.type})
435
+ ${this.color(s.color)}
436
+ )`;
437
+ }
438
+ color(c) {
439
+ if (!c) return;
440
+ return `(color ${c.r} ${c.g} ${c.b} ${c.a})`;
441
+ }
442
+ };
443
+ _init = __decoratorStart(null);
444
+ __decorateElement(_init, 1, "power", _power_dec, SCHEMATIC_PRINTER);
445
+ __decorateElement(_init, 1, "pin_display_opt", _pin_display_opt_dec, SCHEMATIC_PRINTER);
446
+ __decorateElement(_init, 1, "lib_children", _lib_children_dec, SCHEMATIC_PRINTER);
447
+ __decorateElement(_init, 1, "drawings", _drawings_dec, SCHEMATIC_PRINTER);
448
+ __decorateElement(_init, 1, "pin_defs", _pin_defs_dec, SCHEMATIC_PRINTER);
449
+ __decorateElement(_init, 1, "unit", _unit_dec, SCHEMATIC_PRINTER);
450
+ __decorateElement(_init, 1, "lib_id", _lib_id_dec, SCHEMATIC_PRINTER);
451
+ __decorateElement(_init, 1, "justify", _justify_dec, SCHEMATIC_PRINTER);
452
+ __decorateElement(_init, 1, "fields", _fields_dec, SCHEMATIC_PRINTER);
453
+ __decorateElement(_init, 1, "fill", _fill_dec, SCHEMATIC_PRINTER);
454
+ __decorateElement(_init, 1, "stroke", _stroke_dec, SCHEMATIC_PRINTER);
455
+ __decorateElement(_init, 1, "color", _color_dec, SCHEMATIC_PRINTER);
456
+ __decoratorMetadata(_init, SCHEMATIC_PRINTER);
457
+
458
+ // src/converter/graph_to_netlist/graph_converter.ts
459
+ import {
460
+ ConnectionNodeType as ConnectionNodeType2
461
+ } from "@modular-circuit/electronics-model";
462
+
463
+ // src/converter/link_to_netlist/converter.ts
464
+ import {
465
+ ConnectionNodeType,
466
+ LinkType,
467
+ gen_link_map,
468
+ get_port_link_type
469
+ } from "@modular-circuit/electronics-model";
470
+
471
+ // src/converter/link_to_netlist/links/converters.ts
472
+ import {
473
+ PortType
474
+ } from "@modular-circuit/electronics-model";
475
+
476
+ // src/converter/link_to_netlist/links/converter_base.ts
477
+ var LinkConverterBase = class {
478
+ constructor(ctx, ports, net_pros) {
479
+ this.ctx = ctx;
480
+ this.ports = ports;
481
+ this.net_pros = net_pros;
482
+ }
483
+ convert() {
484
+ if (!this.init_link()) return;
485
+ this.do_convert();
486
+ }
487
+ get_net_code() {
488
+ return this.ctx.nl_netlist.nets.length + 1;
489
+ }
490
+ gen_net_name(signal_name) {
491
+ const base_net_name = signal_name ? `${this.net_pros.name}-${signal_name}` : `${this.net_pros.name}`;
492
+ if (this.net_pros.is_global_pwr)
493
+ return base_net_name;
494
+ if (!this.ctx.net_names_count.has(base_net_name)) {
495
+ this.ctx.net_names_count.set(base_net_name, 0);
496
+ return base_net_name;
497
+ }
498
+ const count = this.ctx.net_names_count.get(base_net_name);
499
+ this.ctx.net_names_count.set(base_net_name, count + 1);
500
+ return `${base_net_name}-${count}`;
501
+ }
502
+ };
503
+ var MetaPortConverter = class extends LinkConverterBase {
504
+ do_convert() {
505
+ const pins = [];
506
+ for (const p of this.ports) {
507
+ const p_id = this.ctx.port_map.get(p);
508
+ pins.push(...Object.values(this.ctx.pin_map[p_id]));
509
+ }
510
+ this.ctx.nl_netlist.nets.push({
511
+ code: this.get_net_code(),
512
+ name: this.gen_net_name(),
513
+ pins
514
+ });
515
+ }
516
+ init_link() {
517
+ return true;
518
+ }
519
+ };
520
+ var CompositePortLinkConverterBase = class extends LinkConverterBase {
521
+ do_convert() {
522
+ for (const signal of this.get_signals()) {
523
+ const pins = [];
524
+ for (const port of signal.ports) {
525
+ pins.push(
526
+ this.ctx.pin_map[this.ctx.port_map.get(port.parent)][port.meta_port.label_associated]
527
+ );
528
+ }
529
+ this.ctx.nl_netlist.nets.push({
530
+ code: this.get_net_code(),
531
+ name: this.gen_net_name(signal.name),
532
+ pins
533
+ });
534
+ }
535
+ }
536
+ };
537
+
538
+ // src/converter/link_to_netlist/links/converters.ts
539
+ var CanLogicLinkTester = class extends CompositePortLinkConverterBase {
540
+ get_signals() {
541
+ if (!this.link) return [];
542
+ return [
543
+ {
544
+ name: "txd",
545
+ ports: [
546
+ {
547
+ parent: this.link.controller,
548
+ meta_port: this.link.controller.txd
549
+ },
550
+ {
551
+ parent: this.link.transceiver,
552
+ meta_port: this.link.transceiver.rxd
553
+ },
554
+ ...this.link.passive.map((port) => {
555
+ return {
556
+ parent: port,
557
+ meta_port: port.rxd
558
+ };
559
+ })
560
+ ]
561
+ },
562
+ {
563
+ name: "rxd",
564
+ ports: [
565
+ {
566
+ parent: this.link.controller,
567
+ meta_port: this.link.controller.rxd
568
+ },
569
+ {
570
+ parent: this.link.transceiver,
571
+ meta_port: this.link.transceiver.txd
572
+ },
573
+ ...this.link.passive.map((port) => {
574
+ return {
575
+ parent: port,
576
+ meta_port: port.txd
577
+ };
578
+ })
579
+ ]
580
+ }
581
+ ];
582
+ }
583
+ init_link() {
584
+ const controllers = [];
585
+ const transceivers = [];
586
+ const passive = [];
587
+ for (const v of this.ports) {
588
+ switch (v.type) {
589
+ case PortType.CanControllerPort: {
590
+ controllers.push(v);
591
+ break;
592
+ }
593
+ case PortType.CanTransceiverPort: {
594
+ transceivers.push(v);
595
+ break;
596
+ }
597
+ case PortType.CanPassivePort: {
598
+ passive.push(v);
599
+ break;
600
+ }
601
+ }
602
+ }
603
+ if (controllers.length !== 1) {
604
+ return false;
605
+ }
606
+ if (transceivers.length !== 1) {
607
+ return false;
608
+ }
609
+ this.link = {
610
+ controller: controllers[0],
611
+ transceiver: transceivers[0],
612
+ passive
613
+ };
614
+ return true;
615
+ }
616
+ };
617
+ var CanDiffLinkTester = class extends CompositePortLinkConverterBase {
618
+ get_signals() {
619
+ if (!this.link) return [];
620
+ return [
621
+ {
622
+ name: "canh",
623
+ ports: [
624
+ ...this.link.nodes.map((port) => {
625
+ return {
626
+ parent: port,
627
+ meta_port: port.canh
628
+ };
629
+ })
630
+ ]
631
+ },
632
+ {
633
+ name: "canl",
634
+ ports: [
635
+ ...this.link.nodes.map((port) => {
636
+ return {
637
+ parent: port,
638
+ meta_port: port.canl
639
+ };
640
+ })
641
+ ]
642
+ }
643
+ ];
644
+ }
645
+ init_link() {
646
+ const nodes = [];
647
+ for (const v of this.ports) {
648
+ if (v.type === PortType.CanDiffPort) {
649
+ nodes.push(v);
650
+ }
651
+ }
652
+ if (nodes.length === 0) {
653
+ return false;
654
+ }
655
+ this.link = {
656
+ nodes
657
+ };
658
+ return true;
659
+ }
660
+ };
661
+ var CrystalLinkTester = class extends CompositePortLinkConverterBase {
662
+ get_signals() {
663
+ if (!this.link) return [];
664
+ const driver = this.link.driver;
665
+ const crystal = this.link.crystal;
666
+ return [
667
+ {
668
+ name: "xtal",
669
+ ports: [
670
+ {
671
+ parent: driver,
672
+ meta_port: driver.xtal_in
673
+ },
674
+ {
675
+ parent: crystal,
676
+ meta_port: crystal.xtal_out
677
+ }
678
+ ]
679
+ },
680
+ {
681
+ name: "xtal",
682
+ ports: [
683
+ {
684
+ parent: driver,
685
+ meta_port: driver.xtal_out
686
+ },
687
+ {
688
+ parent: crystal,
689
+ meta_port: crystal.xtal_in
690
+ }
691
+ ]
692
+ }
693
+ ];
694
+ }
695
+ init_link() {
696
+ const drivers = [];
697
+ const crystals = [];
698
+ for (const v of this.ports) {
699
+ switch (v.type) {
700
+ case PortType.CrystalDriver: {
701
+ drivers.push(v);
702
+ break;
703
+ }
704
+ case PortType.CrystalPort: {
705
+ crystals.push(v);
706
+ break;
707
+ }
708
+ }
709
+ }
710
+ if (drivers.length !== 1) {
711
+ return false;
712
+ }
713
+ if (crystals.length !== 1) {
714
+ return false;
715
+ }
716
+ this.link = {
717
+ driver: drivers[0],
718
+ crystal: crystals[0]
719
+ };
720
+ return true;
721
+ }
722
+ };
723
+ var SwdLinkTester = class extends CompositePortLinkConverterBase {
724
+ get_signals() {
725
+ if (!this.link) return [];
726
+ return [
727
+ {
728
+ name: "swdio",
729
+ ports: [
730
+ {
731
+ parent: this.link.host,
732
+ meta_port: this.link.host.swdio
733
+ },
734
+ {
735
+ parent: this.link.device,
736
+ meta_port: this.link.device.swdio
737
+ },
738
+ ...this.link.pull.map((port) => {
739
+ return {
740
+ parent: port,
741
+ meta_port: port.swdio
742
+ };
743
+ })
744
+ ]
745
+ },
746
+ {
747
+ name: "swclk",
748
+ ports: [
749
+ {
750
+ parent: this.link.host,
751
+ meta_port: this.link.host.swclk
752
+ },
753
+ {
754
+ parent: this.link.device,
755
+ meta_port: this.link.device.swclk
756
+ },
757
+ ...this.link.pull.map((port) => {
758
+ return {
759
+ parent: port,
760
+ meta_port: port.swclk
761
+ };
762
+ })
763
+ ]
764
+ }
765
+ ];
766
+ }
767
+ init_link() {
768
+ const hosts = [];
769
+ const devices = [];
770
+ const pull = [];
771
+ for (const v of this.ports) {
772
+ switch (v.type) {
773
+ case PortType.SwdHostPort: {
774
+ hosts.push(v);
775
+ break;
776
+ }
777
+ case PortType.SwdTargetPort: {
778
+ devices.push(v);
779
+ break;
780
+ }
781
+ case PortType.SwdPullPort: {
782
+ pull.push(v);
783
+ break;
784
+ }
785
+ }
786
+ }
787
+ if (hosts.length !== 1) {
788
+ return false;
789
+ }
790
+ if (devices.length !== 1) {
791
+ return false;
792
+ }
793
+ this.link = {
794
+ host: hosts[0],
795
+ device: devices[0],
796
+ pull
797
+ };
798
+ return true;
799
+ }
800
+ };
801
+ var I2cLinkTester = class extends CompositePortLinkConverterBase {
802
+ get_signals() {
803
+ if (!this.link) return [];
804
+ const scl = [
805
+ ...this.link.pull.map((device) => ({
806
+ parent: device,
807
+ meta_port: device.scl
808
+ })),
809
+ {
810
+ parent: this.link.controller,
811
+ meta_port: this.link.controller.scl
812
+ },
813
+ ...this.link.targets.map((device) => ({
814
+ parent: device,
815
+ meta_port: device.scl
816
+ }))
817
+ ];
818
+ const sda = [
819
+ ...this.link.pull.map((device) => ({
820
+ parent: device,
821
+ meta_port: device.sda
822
+ })),
823
+ {
824
+ parent: this.link.controller,
825
+ meta_port: this.link.controller.sda
826
+ },
827
+ ...this.link.targets.map((device) => ({
828
+ parent: device,
829
+ meta_port: device.sda
830
+ }))
831
+ ];
832
+ return [
833
+ {
834
+ name: "scl",
835
+ ports: scl
836
+ },
837
+ {
838
+ name: "sda",
839
+ ports: sda
840
+ }
841
+ ];
842
+ }
843
+ init_link() {
844
+ const pull = [];
845
+ const controllers = [];
846
+ const targets = [];
847
+ for (const v of this.ports) {
848
+ switch (v.type) {
849
+ case PortType.I2cPullupPort: {
850
+ pull.push(v);
851
+ break;
852
+ }
853
+ case PortType.I2cController: {
854
+ controllers.push(v);
855
+ break;
856
+ }
857
+ case PortType.I2cTarget: {
858
+ targets.push(v);
859
+ break;
860
+ }
861
+ }
862
+ }
863
+ if (controllers.length !== 1) {
864
+ return false;
865
+ }
866
+ if (targets.length === 0) {
867
+ return false;
868
+ }
869
+ this.link = {
870
+ pull,
871
+ controller: controllers[0],
872
+ targets
873
+ };
874
+ return true;
875
+ }
876
+ };
877
+ var I2sLinkTester = class extends CompositePortLinkConverterBase {
878
+ get_signals() {
879
+ if (!this.link) return [];
880
+ const controller = this.link.controller;
881
+ const target_receiver = this.link.target_receiver;
882
+ return [
883
+ {
884
+ name: "sck",
885
+ ports: [
886
+ {
887
+ parent: controller,
888
+ meta_port: controller.sck
889
+ },
890
+ {
891
+ parent: target_receiver,
892
+ meta_port: target_receiver.sck
893
+ }
894
+ ]
895
+ },
896
+ {
897
+ name: "ws",
898
+ ports: [
899
+ {
900
+ parent: controller,
901
+ meta_port: controller.ws
902
+ },
903
+ {
904
+ parent: target_receiver,
905
+ meta_port: target_receiver.ws
906
+ }
907
+ ]
908
+ },
909
+ {
910
+ name: "sd",
911
+ ports: [
912
+ {
913
+ parent: controller,
914
+ meta_port: controller.sd
915
+ },
916
+ {
917
+ parent: target_receiver,
918
+ meta_port: target_receiver.sd
919
+ }
920
+ ]
921
+ }
922
+ ];
923
+ }
924
+ init_link() {
925
+ const controllers = [];
926
+ const target_receivers = [];
927
+ for (const v of this.ports) {
928
+ switch (v.type) {
929
+ case PortType.I2sController: {
930
+ controllers.push(v);
931
+ break;
932
+ }
933
+ case PortType.I2sTargetReceiver: {
934
+ target_receivers.push(v);
935
+ break;
936
+ }
937
+ }
938
+ }
939
+ if (controllers.length !== 1) {
940
+ return false;
941
+ }
942
+ if (target_receivers.length !== 1) {
943
+ return false;
944
+ }
945
+ this.link = {
946
+ controller: controllers[0],
947
+ target_receiver: target_receivers[0]
948
+ };
949
+ return true;
950
+ }
951
+ };
952
+ var SpiLinkTester = class extends CompositePortLinkConverterBase {
953
+ get_signals() {
954
+ if (!this.link) return [];
955
+ const controller = this.link.controller;
956
+ const peripherals = this.link.peripherals;
957
+ return [
958
+ {
959
+ name: "sck",
960
+ ports: [
961
+ {
962
+ parent: controller,
963
+ meta_port: controller.sck
964
+ },
965
+ ...peripherals.map((device) => ({
966
+ parent: device,
967
+ meta_port: device.sck
968
+ }))
969
+ ]
970
+ },
971
+ {
972
+ name: "miso",
973
+ ports: [
974
+ {
975
+ parent: controller,
976
+ meta_port: controller.miso
977
+ },
978
+ ...peripherals.map((device) => ({
979
+ parent: device,
980
+ meta_port: device.miso
981
+ }))
982
+ ]
983
+ },
984
+ {
985
+ name: "mosi",
986
+ ports: [
987
+ {
988
+ parent: controller,
989
+ meta_port: controller.mosi
990
+ },
991
+ ...peripherals.map((device) => ({
992
+ parent: device,
993
+ meta_port: device.mosi
994
+ }))
995
+ ]
996
+ }
997
+ ];
998
+ }
999
+ init_link() {
1000
+ const controllers = [];
1001
+ const peripherals = [];
1002
+ for (const v of this.ports) {
1003
+ switch (v.type) {
1004
+ case PortType.SpiController: {
1005
+ controllers.push(v);
1006
+ break;
1007
+ }
1008
+ case PortType.SpiPeripheral: {
1009
+ peripherals.push(v);
1010
+ break;
1011
+ }
1012
+ }
1013
+ }
1014
+ if (controllers.length !== 1) {
1015
+ return false;
1016
+ }
1017
+ if (peripherals.length === 0) {
1018
+ return false;
1019
+ }
1020
+ this.link = {
1021
+ controller: controllers[0],
1022
+ peripherals
1023
+ };
1024
+ return true;
1025
+ }
1026
+ };
1027
+ var SpeakerLinkTester = class extends CompositePortLinkConverterBase {
1028
+ get_signals() {
1029
+ if (!this.link) return [];
1030
+ return [
1031
+ {
1032
+ name: "a",
1033
+ ports: [
1034
+ {
1035
+ parent: this.link.source,
1036
+ meta_port: this.link.source.a
1037
+ },
1038
+ {
1039
+ parent: this.link.sink,
1040
+ meta_port: this.link.sink.a
1041
+ }
1042
+ ]
1043
+ },
1044
+ {
1045
+ name: "b",
1046
+ ports: [
1047
+ {
1048
+ parent: this.link.source,
1049
+ meta_port: this.link.source.b
1050
+ },
1051
+ {
1052
+ parent: this.link.sink,
1053
+ meta_port: this.link.sink.b
1054
+ }
1055
+ ]
1056
+ }
1057
+ ];
1058
+ }
1059
+ init_link() {
1060
+ const sources = [];
1061
+ const sinks = [];
1062
+ for (const v of this.ports) {
1063
+ switch (v.type) {
1064
+ case PortType.SpeakerDriverPort: {
1065
+ sources.push(v);
1066
+ break;
1067
+ }
1068
+ case PortType.SpeakerPort: {
1069
+ sinks.push(v);
1070
+ break;
1071
+ }
1072
+ }
1073
+ }
1074
+ if (sources.length !== 1) {
1075
+ return false;
1076
+ }
1077
+ if (sinks.length !== 1) {
1078
+ return false;
1079
+ }
1080
+ this.link = {
1081
+ source: sources[0],
1082
+ sink: sinks[0]
1083
+ };
1084
+ return true;
1085
+ }
1086
+ };
1087
+ var UartLinkTester = class extends CompositePortLinkConverterBase {
1088
+ get_signals() {
1089
+ if (!this.link) return [];
1090
+ return [
1091
+ {
1092
+ name: "tx",
1093
+ ports: [
1094
+ {
1095
+ parent: this.link.a,
1096
+ meta_port: this.link.a.tx
1097
+ },
1098
+ {
1099
+ parent: this.link.b,
1100
+ meta_port: this.link.b.rx
1101
+ }
1102
+ ]
1103
+ },
1104
+ {
1105
+ name: "rx",
1106
+ ports: [
1107
+ {
1108
+ parent: this.link.b,
1109
+ meta_port: this.link.b.tx
1110
+ },
1111
+ {
1112
+ parent: this.link.a,
1113
+ meta_port: this.link.a.rx
1114
+ }
1115
+ ]
1116
+ }
1117
+ ];
1118
+ }
1119
+ init_link() {
1120
+ const ports = [];
1121
+ for (const v of this.ports) {
1122
+ if (v.type === PortType.UartPort) {
1123
+ ports.push(v);
1124
+ }
1125
+ }
1126
+ if (ports.length !== 2) {
1127
+ return false;
1128
+ }
1129
+ this.link = {
1130
+ a: ports[0],
1131
+ b: ports[1]
1132
+ };
1133
+ return true;
1134
+ }
1135
+ };
1136
+ var UsbLinkTester = class extends CompositePortLinkConverterBase {
1137
+ get_signals() {
1138
+ if (!this.link) return [];
1139
+ return [
1140
+ {
1141
+ name: "dp",
1142
+ ports: [
1143
+ {
1144
+ parent: this.link.host,
1145
+ meta_port: this.link.host.dp
1146
+ },
1147
+ {
1148
+ parent: this.link.device,
1149
+ meta_port: this.link.device.dp
1150
+ },
1151
+ ...this.link.passive.map((port) => ({
1152
+ parent: port,
1153
+ meta_port: port.dp
1154
+ }))
1155
+ ]
1156
+ },
1157
+ {
1158
+ name: "dm",
1159
+ ports: [
1160
+ {
1161
+ parent: this.link.host,
1162
+ meta_port: this.link.host.dm
1163
+ },
1164
+ {
1165
+ parent: this.link.device,
1166
+ meta_port: this.link.device.dm
1167
+ },
1168
+ ...this.link.passive.map((port) => ({
1169
+ parent: port,
1170
+ meta_port: port.dm
1171
+ }))
1172
+ ]
1173
+ }
1174
+ ];
1175
+ }
1176
+ init_link() {
1177
+ const hosts = [];
1178
+ const devices = [];
1179
+ const passive = [];
1180
+ for (const v of this.ports) {
1181
+ switch (v.type) {
1182
+ case PortType.UsbHostPort: {
1183
+ hosts.push(v);
1184
+ break;
1185
+ }
1186
+ case PortType.UsbDevicePort: {
1187
+ devices.push(v);
1188
+ break;
1189
+ }
1190
+ case PortType.UsbPassivePort: {
1191
+ passive.push(v);
1192
+ break;
1193
+ }
1194
+ }
1195
+ }
1196
+ if (hosts.length !== 1) {
1197
+ return false;
1198
+ }
1199
+ if (devices.length !== 1) {
1200
+ return false;
1201
+ }
1202
+ this.link = {
1203
+ host: hosts[0],
1204
+ device: devices[0],
1205
+ passive
1206
+ };
1207
+ return true;
1208
+ }
1209
+ };
1210
+ var UsbCcLinkTester = class extends CompositePortLinkConverterBase {
1211
+ get_signals() {
1212
+ if (!this.link) return [];
1213
+ return [
1214
+ {
1215
+ name: "cc1",
1216
+ ports: [
1217
+ {
1218
+ parent: this.link.a,
1219
+ meta_port: this.link.a.cc1
1220
+ },
1221
+ {
1222
+ parent: this.link.b,
1223
+ meta_port: this.link.b.cc1
1224
+ }
1225
+ ]
1226
+ },
1227
+ {
1228
+ name: "cc2",
1229
+ ports: [
1230
+ {
1231
+ parent: this.link.a,
1232
+ meta_port: this.link.a.cc2
1233
+ },
1234
+ {
1235
+ parent: this.link.b,
1236
+ meta_port: this.link.b.cc2
1237
+ }
1238
+ ]
1239
+ }
1240
+ ];
1241
+ }
1242
+ init_link() {
1243
+ const nodes = [];
1244
+ for (const v of this.ports) {
1245
+ if (v.type === PortType.UsbCcPort) {
1246
+ nodes.push(v);
1247
+ }
1248
+ }
1249
+ if (nodes.length !== 2) {
1250
+ return false;
1251
+ }
1252
+ this.link = {
1253
+ a: nodes[0],
1254
+ b: nodes[1]
1255
+ };
1256
+ return true;
1257
+ }
1258
+ };
1259
+ var Dvp8LinkTester = class extends CompositePortLinkConverterBase {
1260
+ get_signals() {
1261
+ if (!this.link) return [];
1262
+ const host = this.link.host;
1263
+ const cam = this.link.cam;
1264
+ return [
1265
+ {
1266
+ name: "xclk",
1267
+ ports: [
1268
+ {
1269
+ parent: host,
1270
+ meta_port: host.xclk
1271
+ },
1272
+ {
1273
+ parent: cam,
1274
+ meta_port: cam.xclk
1275
+ }
1276
+ ]
1277
+ },
1278
+ {
1279
+ name: "pclk",
1280
+ ports: [
1281
+ {
1282
+ parent: host,
1283
+ meta_port: host.pclk
1284
+ },
1285
+ {
1286
+ parent: cam,
1287
+ meta_port: cam.pclk
1288
+ }
1289
+ ]
1290
+ },
1291
+ {
1292
+ name: "href",
1293
+ ports: [
1294
+ {
1295
+ parent: host,
1296
+ meta_port: host.href
1297
+ },
1298
+ {
1299
+ parent: cam,
1300
+ meta_port: cam.href
1301
+ }
1302
+ ]
1303
+ },
1304
+ {
1305
+ name: "vsync",
1306
+ ports: [
1307
+ {
1308
+ parent: host,
1309
+ meta_port: host.vsync
1310
+ },
1311
+ {
1312
+ parent: cam,
1313
+ meta_port: cam.vsync
1314
+ }
1315
+ ]
1316
+ },
1317
+ {
1318
+ name: "y0",
1319
+ ports: [
1320
+ {
1321
+ parent: host,
1322
+ meta_port: host.y0
1323
+ },
1324
+ {
1325
+ parent: cam,
1326
+ meta_port: cam.y0
1327
+ }
1328
+ ]
1329
+ },
1330
+ {
1331
+ name: "y1",
1332
+ ports: [
1333
+ {
1334
+ parent: host,
1335
+ meta_port: host.y1
1336
+ }
1337
+ ]
1338
+ },
1339
+ {
1340
+ name: "y2",
1341
+ ports: [
1342
+ {
1343
+ parent: host,
1344
+ meta_port: host.y2
1345
+ },
1346
+ {
1347
+ parent: cam,
1348
+ meta_port: cam.y2
1349
+ }
1350
+ ]
1351
+ },
1352
+ {
1353
+ name: "y3",
1354
+ ports: [
1355
+ {
1356
+ parent: host,
1357
+ meta_port: host.y3
1358
+ },
1359
+ {
1360
+ parent: cam,
1361
+ meta_port: cam.y3
1362
+ }
1363
+ ]
1364
+ },
1365
+ {
1366
+ name: "y4",
1367
+ ports: [
1368
+ {
1369
+ parent: host,
1370
+ meta_port: host.y4
1371
+ }
1372
+ ]
1373
+ },
1374
+ {
1375
+ name: "y5",
1376
+ ports: [
1377
+ {
1378
+ parent: host,
1379
+ meta_port: host.y5
1380
+ },
1381
+ {
1382
+ parent: cam,
1383
+ meta_port: cam.y5
1384
+ }
1385
+ ]
1386
+ },
1387
+ {
1388
+ name: "y6",
1389
+ ports: [
1390
+ {
1391
+ parent: host,
1392
+ meta_port: host.y6
1393
+ },
1394
+ {
1395
+ parent: cam,
1396
+ meta_port: cam.y6
1397
+ }
1398
+ ]
1399
+ },
1400
+ {
1401
+ name: "y7",
1402
+ ports: [
1403
+ {
1404
+ parent: host,
1405
+ meta_port: host.y7
1406
+ },
1407
+ {
1408
+ parent: cam,
1409
+ meta_port: cam.y7
1410
+ }
1411
+ ]
1412
+ }
1413
+ ];
1414
+ }
1415
+ init_link() {
1416
+ const hosts = [];
1417
+ const cams = [];
1418
+ for (const v of this.ports) {
1419
+ switch (v.type) {
1420
+ case PortType.Dvp8Host: {
1421
+ hosts.push(v);
1422
+ break;
1423
+ }
1424
+ case PortType.Dvp8Camera: {
1425
+ cams.push(v);
1426
+ break;
1427
+ }
1428
+ }
1429
+ }
1430
+ if (hosts.length !== 1) {
1431
+ return false;
1432
+ }
1433
+ if (cams.length !== 1) {
1434
+ return false;
1435
+ }
1436
+ this.link = {
1437
+ host: hosts[0],
1438
+ cam: cams[0]
1439
+ };
1440
+ return true;
1441
+ }
1442
+ };
1443
+
1444
+ // src/converter/link_to_netlist/converter.ts
1445
+ var LINK_CONVERTER = class {
1446
+ constructor(ctx) {
1447
+ this.ctx = ctx;
1448
+ }
1449
+ port_is_composite_port(p) {
1450
+ return Object.values(this.ctx.pin_map[this.port_id.get(p)]).length > 1;
1451
+ }
1452
+ do_convert(CtorClass, ports, net_pros) {
1453
+ return new CtorClass(this.ctx, ports, net_pros).convert();
1454
+ }
1455
+ visit_cc(cc) {
1456
+ if (cc.is_isolated) {
1457
+ return;
1458
+ }
1459
+ this.link_map = gen_link_map();
1460
+ const ports = cc.nodes.filter((i) => i.type === ConnectionNodeType.Port);
1461
+ const meta_ports = [];
1462
+ this.port_id = /* @__PURE__ */ new Map();
1463
+ for (const p of ports) this.port_id.set(p.param, p.uuid);
1464
+ for (const v of ports) {
1465
+ const port = v.param;
1466
+ const arr = this.link_map[get_port_link_type(port)];
1467
+ if (this.port_is_composite_port(port)) {
1468
+ arr.push(port);
1469
+ } else {
1470
+ meta_ports.push(port);
1471
+ }
1472
+ }
1473
+ const meta_port_converter = new MetaPortConverter(this.ctx, meta_ports, cc);
1474
+ meta_port_converter.convert();
1475
+ for (const [k, v] of Object.entries(this.link_map)) {
1476
+ if (!v || !v.length) continue;
1477
+ switch (k) {
1478
+ case LinkType.CanLogicLink: {
1479
+ this.do_convert(CanLogicLinkTester, v, cc);
1480
+ break;
1481
+ }
1482
+ case LinkType.CanDiffLink: {
1483
+ this.do_convert(CanDiffLinkTester, v, cc);
1484
+ break;
1485
+ }
1486
+ case LinkType.CrystalLink: {
1487
+ this.do_convert(CrystalLinkTester, v, cc);
1488
+ break;
1489
+ }
1490
+ case LinkType.SwdLink: {
1491
+ this.do_convert(SwdLinkTester, v, cc);
1492
+ break;
1493
+ }
1494
+ case LinkType.I2cLink: {
1495
+ this.do_convert(I2cLinkTester, v, cc);
1496
+ break;
1497
+ }
1498
+ case LinkType.I2sLink: {
1499
+ this.do_convert(I2sLinkTester, v, cc);
1500
+ break;
1501
+ }
1502
+ case LinkType.SpiLink: {
1503
+ this.do_convert(SpiLinkTester, v, cc);
1504
+ break;
1505
+ }
1506
+ case LinkType.SpeakerLink: {
1507
+ this.do_convert(SpeakerLinkTester, v, cc);
1508
+ break;
1509
+ }
1510
+ case LinkType.UartLink: {
1511
+ this.do_convert(UartLinkTester, v, cc);
1512
+ break;
1513
+ }
1514
+ case LinkType.UsbLink: {
1515
+ this.do_convert(UsbLinkTester, v, cc);
1516
+ break;
1517
+ }
1518
+ case LinkType.UsbCcLink: {
1519
+ this.do_convert(UsbCcLinkTester, v, cc);
1520
+ break;
1521
+ }
1522
+ case LinkType.Dvp8Link: {
1523
+ this.do_convert(Dvp8LinkTester, v, cc);
1524
+ break;
1525
+ }
1526
+ default: {
1527
+ throw new Error(`Unhandled link type: ${k}`);
1528
+ }
1529
+ }
1530
+ }
1531
+ }
1532
+ };
1533
+
1534
+ // src/converter/graph_to_netlist/graph_converter.ts
1535
+ var GraphConverter = class {
1536
+ constructor(ctx) {
1537
+ this.ctx = ctx;
1538
+ }
1539
+ convert_to_netlist() {
1540
+ let pin_count = 0;
1541
+ const nl_netlist = {
1542
+ nets: [],
1543
+ schematics: {}
1544
+ };
1545
+ const pin_map = {};
1546
+ const port_map = /* @__PURE__ */ new Map();
1547
+ const pin_shapes = {};
1548
+ for (const sub of this.ctx.connection_graph.subgraphs) {
1549
+ for (const node of sub.nodes) {
1550
+ if (node.type === ConnectionNodeType2.Port) {
1551
+ const port_id = node.uuid;
1552
+ port_map.set(node.param, port_id);
1553
+ for (const [label_name, shape] of Object.entries(node.label_shapes)) {
1554
+ const pin_id = `pin-${++pin_count}`;
1555
+ pin_shapes[pin_id] = shape;
1556
+ if (!(port_id in pin_map)) {
1557
+ pin_map[port_id] = {};
1558
+ }
1559
+ pin_map[port_id][label_name] = pin_id;
1560
+ }
1561
+ }
1562
+ }
1563
+ }
1564
+ for (const [filename, sch] of Object.entries(this.ctx.cg_schematics)) {
1565
+ const { uuid, powers, sheets } = sch;
1566
+ const sheet_symbols = [];
1567
+ for (const sheet of sheets) {
1568
+ const pins = [];
1569
+ for (const port_id of sheet.ports) {
1570
+ if (!(port_id in pin_map)) {
1571
+ console.error(`Port ${port_id} not found in pin_map`);
1572
+ continue;
1573
+ }
1574
+ for (const [label_name, pin_id] of Object.entries(pin_map[port_id])) {
1575
+ pins.push({
1576
+ uuid: pin_id,
1577
+ name: label_name,
1578
+ shape: pin_shapes[pin_id]
1579
+ });
1580
+ }
1581
+ }
1582
+ sheet_symbols.push({ ...sheet, pins });
1583
+ }
1584
+ nl_netlist.schematics[filename] = {
1585
+ uuid,
1586
+ filename,
1587
+ powers,
1588
+ sheet_symbols,
1589
+ hiera_labels: []
1590
+ };
1591
+ }
1592
+ const link_converter = new LINK_CONVERTER({
1593
+ pin_map,
1594
+ nl_netlist,
1595
+ port_map,
1596
+ net_names_count: /* @__PURE__ */ new Map()
1597
+ });
1598
+ for (const sub of this.ctx.connection_graph.subgraphs) {
1599
+ link_converter.visit_cc(sub);
1600
+ }
1601
+ return nl_netlist;
1602
+ }
1603
+ };
1604
+
1605
+ // src/converter/netlist_to_kicad/layout.ts
1606
+ import ELK from "elkjs/lib/elk.bundled.js";
1607
+ var MIL_TO_MM = 0.0254;
1608
+ var GRID_SIZE = 50 * MIL_TO_MM;
1609
+ var FONT_SIZE = GRID_SIZE;
1610
+ var POWER_START_Y = 30 * GRID_SIZE;
1611
+ var POWER_START_X = (PAPER_SIZE.A4.height - 30) * GRID_SIZE;
1612
+ var POWER_Y_STEP = 16 * GRID_SIZE;
1613
+ var BLOCK_V_SPACE = 8 * GRID_SIZE;
1614
+ var BLOCK_H_SPACE = 14 * GRID_SIZE - BLOCK_V_SPACE;
1615
+ var PADDING = 10 * GRID_SIZE;
1616
+ var PADDING_TOP = 21 * GRID_SIZE;
1617
+ function get_power_pos(pwr_number) {
1618
+ return { x: POWER_START_X, y: POWER_START_Y + POWER_Y_STEP * pwr_number };
1619
+ }
1620
+ var BLOCK_PIN_GAP = 4 * GRID_SIZE;
1621
+ var BLOCK_PIN_TB_MARGIN = 2 * GRID_SIZE;
1622
+ var MIN_BLOCK_WIDTH = 8 * GRID_SIZE;
1623
+ var INTERNAL_LABEL_MARGIN = 8 * FONT_SIZE;
1624
+ var WIRE_PADDING = GRID_SIZE;
1625
+ var SIDE_MARGIN = WIRE_PADDING * 2 + BLOCK_H_SPACE / 2;
1626
+ var Layout = class {
1627
+ constructor() {
1628
+ this.block_geo = {};
1629
+ this.elk = new ELK();
1630
+ }
1631
+ add_block(id, factor) {
1632
+ this.block_geo[id] = this.calc_block_size(factor);
1633
+ }
1634
+ async finalize() {
1635
+ const bbox = {};
1636
+ const graph = {
1637
+ id: "root",
1638
+ layoutOptions: {
1639
+ "elk.algorithm": "rectpacking",
1640
+ "elk.contentAlignment": "V_TOP | H_LEFT",
1641
+ "elk.rectpacking.orderBySize": "true",
1642
+ "elk.nodeSize.fixedGraphSize": "true",
1643
+ "org.eclipse.elk.rectpacking.packing.compaction.rowHeightReevaluation": "true",
1644
+ "elk.rectpacking.widthApproximation.optimizationGoal": "ASPECT_RATIO_DRIVEN",
1645
+ "org.eclipse.elk.rectpacking.packing.compaction.iterations": "5",
1646
+ "org.eclipse.elk.aspectRatio": "1.414",
1647
+ "elk.spacing.nodeNode": `${BLOCK_V_SPACE}`,
1648
+ "elk.padding": `[top=${PADDING_TOP},left=${PADDING},bottom=${PADDING},right=${PADDING}]`,
1649
+ "elk.childAreaWidth": `${PAPER_SIZE.A4.height}`,
1650
+ "elk.childAreaHeight": `${PAPER_SIZE.A4.width}`
1651
+ },
1652
+ children: [],
1653
+ edges: []
1654
+ };
1655
+ for (const [id, geo] of Object.entries(this.block_geo)) {
1656
+ const bounding_size = geo.bounding_size;
1657
+ graph.children.push({
1658
+ id,
1659
+ width: bounding_size.x,
1660
+ height: bounding_size.y
1661
+ });
1662
+ }
1663
+ const res = await this.elk.layout(graph);
1664
+ if (res.children) {
1665
+ for (const child of res.children) {
1666
+ const geo = this.block_geo[child.id];
1667
+ const pos = {
1668
+ x: (child.x ?? 0) + geo.l_margin,
1669
+ y: child.y ?? 0
1670
+ };
1671
+ bbox[child.id] = {
1672
+ pos,
1673
+ size: geo.size
1674
+ };
1675
+ }
1676
+ }
1677
+ return bbox;
1678
+ }
1679
+ calc_block_size(factor) {
1680
+ const block_height = Math.floor(factor.total_pin_num / 2) * BLOCK_PIN_GAP + 2 * BLOCK_PIN_TB_MARGIN;
1681
+ const block_width = Math.max(
1682
+ MIN_BLOCK_WIDTH,
1683
+ factor.internal.l_side + factor.internal.r_side + INTERNAL_LABEL_MARGIN
1684
+ );
1685
+ const l_margin = factor.outer.l_side + SIDE_MARGIN;
1686
+ const r_margin = factor.outer.r_side + SIDE_MARGIN;
1687
+ const block_bounding_width = block_width + l_margin + r_margin;
1688
+ const size = {
1689
+ x: block_width,
1690
+ y: block_height
1691
+ };
1692
+ const bounding_size = {
1693
+ x: block_bounding_width,
1694
+ y: block_height
1695
+ };
1696
+ return {
1697
+ size,
1698
+ bounding_size,
1699
+ l_margin,
1700
+ r_margin,
1701
+ factor
1702
+ };
1703
+ }
1704
+ };
1705
+
1706
+ // src/converter/netlist_to_kicad/netlist_converter.ts
1707
+ import { PowerShape } from "@modular-circuit/electronics-model";
1708
+ import {
1709
+ MODULAR_CIRCUIT_SCH_EXT
1710
+ } from "@modular-circuit/ir";
1711
+ import { replaceAll } from "@modular-circuit/utils";
1712
+
1713
+ // src/kicad/label/net_label.ts
1714
+ import { gen_uuid as gen_uuid2 } from "@modular-circuit/utils";
1715
+
1716
+ // src/kicad/constraints/index.ts
1717
+ var DEFAULT_FONT_SIZE = {
1718
+ x: 1.27,
1719
+ y: 1.27
1720
+ };
1721
+
1722
+ // src/kicad/label/net_label.ts
1723
+ var gen_net_label = (name, at, justify) => ({
1724
+ label_type: "label",
1725
+ text: name,
1726
+ fields: [],
1727
+ fields_autoplaced: true,
1728
+ at: { position: at, rotation: 0 },
1729
+ effects: {
1730
+ font: { size: DEFAULT_FONT_SIZE },
1731
+ justify
1732
+ },
1733
+ uuid: gen_uuid2()
1734
+ });
1735
+
1736
+ // src/kicad/label/sheet_pin.ts
1737
+ import { gen_uuid as gen_uuid3 } from "@modular-circuit/utils";
1738
+ var gen_base_hierarchical_label = (text, at, justify, rotation, shape) => ({
1739
+ shape,
1740
+ effects: {
1741
+ font: { size: DEFAULT_FONT_SIZE },
1742
+ justify
1743
+ },
1744
+ text,
1745
+ at: { position: at, rotation },
1746
+ uuid: gen_uuid3()
1747
+ });
1748
+ var gen_sheet_pin = (text, at, justify, rotation, shape) => ({
1749
+ label_type: "hierarchical_label",
1750
+ ...gen_base_hierarchical_label(text, at, justify, rotation, shape)
1751
+ });
1752
+ var gen_hierarchical_label = gen_sheet_pin;
1753
+
1754
+ // src/kicad/sheet/sheet.ts
1755
+ import { gen_uuid as gen_uuid4 } from "@modular-circuit/utils";
1756
+ var TEXT_MARGIN = 0.7116;
1757
+ var gen_sch_sheet = (rect, pins, fields) => ({
1758
+ // NOTE no rotation in the sheet
1759
+ at: { position: rect.pos },
1760
+ size: rect.size,
1761
+ pins,
1762
+ fields: [
1763
+ {
1764
+ name: "Sheetname",
1765
+ text: fields.Sheetname,
1766
+ at: { position: { x: rect.pos.x, y: rect.pos.y - TEXT_MARGIN }, rotation: 0 },
1767
+ effects: {
1768
+ font: { size: DEFAULT_FONT_SIZE },
1769
+ justify: {
1770
+ vertical: "bottom",
1771
+ horizontal: "left"
1772
+ }
1773
+ }
1774
+ },
1775
+ {
1776
+ name: "Sheetfile",
1777
+ text: fields.Sheetfile,
1778
+ at: { position: { x: rect.pos.x, y: rect.pos.y + rect.size.y + TEXT_MARGIN }, rotation: 0 },
1779
+ effects: {
1780
+ font: { size: DEFAULT_FONT_SIZE },
1781
+ justify: {
1782
+ vertical: "top",
1783
+ horizontal: "left"
1784
+ }
1785
+ }
1786
+ }
1787
+ ],
1788
+ fields_autoplaced: true,
1789
+ stroke: {
1790
+ width: 0.1524,
1791
+ type: "solid"
1792
+ },
1793
+ fill: {
1794
+ color: { r: 0, g: 0, b: 0, a: 0 }
1795
+ },
1796
+ uuid: gen_uuid4()
1797
+ });
1798
+
1799
+ // src/kicad/symbols/lib_symbol/gnd.ts
1800
+ import { ELECTRICAL_PINTYPE, GRAPHIC_PINSHAPE } from "@modular-circuit/electronics-model";
1801
+ import { SHAPE_T as SHAPE_T2 } from "@modular-circuit/ir";
1802
+ var gen_lib_gnd = (value) => ({
1803
+ name: `power:${value}`,
1804
+ pin_numbers: {
1805
+ offset: 0,
1806
+ hide: true
1807
+ },
1808
+ pin_names: {
1809
+ offset: 0,
1810
+ hide: true
1811
+ },
1812
+ in_bom: true,
1813
+ on_board: true,
1814
+ exclude_from_sim: false,
1815
+ properties: [
1816
+ {
1817
+ name: "Reference",
1818
+ text: "#PWR",
1819
+ at: { position: { x: 0, y: -6.35 }, rotation: 0 },
1820
+ effects: {
1821
+ font: { size: DEFAULT_FONT_SIZE },
1822
+ hide: true
1823
+ }
1824
+ },
1825
+ {
1826
+ name: "Value",
1827
+ text: `${value}`,
1828
+ at: { position: { x: 0, y: -3.81 }, rotation: 0 },
1829
+ effects: {
1830
+ font: { size: DEFAULT_FONT_SIZE }
1831
+ }
1832
+ },
1833
+ {
1834
+ name: "Footprint",
1835
+ text: "",
1836
+ at: { position: { x: 0, y: 0 }, rotation: 0 },
1837
+ effects: {
1838
+ font: { size: DEFAULT_FONT_SIZE },
1839
+ hide: true
1840
+ }
1841
+ },
1842
+ {
1843
+ name: "Datasheet",
1844
+ text: "",
1845
+ at: { position: { x: 0, y: 0 }, rotation: 0 },
1846
+ effects: {
1847
+ font: { size: DEFAULT_FONT_SIZE },
1848
+ hide: true
1849
+ }
1850
+ },
1851
+ {
1852
+ name: "Description",
1853
+ text: 'Power symbol creates a global label with name \\"GND\\" , ground',
1854
+ at: { position: { x: 0, y: 0 }, rotation: 0 },
1855
+ effects: {
1856
+ font: { size: DEFAULT_FONT_SIZE },
1857
+ hide: true
1858
+ }
1859
+ },
1860
+ {
1861
+ name: "ki_keywords",
1862
+ text: "global power",
1863
+ at: { position: { x: 0, y: 0 }, rotation: 0 },
1864
+ effects: {
1865
+ font: { size: DEFAULT_FONT_SIZE },
1866
+ hide: true
1867
+ }
1868
+ }
1869
+ ],
1870
+ children: [
1871
+ {
1872
+ name: `${value}_0_1`,
1873
+ drawings: [
1874
+ {
1875
+ shape: SHAPE_T2.POLY,
1876
+ pts: [
1877
+ { x: 0, y: 0 },
1878
+ { x: 0, y: -1.27 },
1879
+ { x: 1.27, y: -1.27 },
1880
+ { x: 0, y: -2.54 },
1881
+ { x: -1.27, y: -1.27 },
1882
+ { x: 0, y: -1.27 }
1883
+ ],
1884
+ stroke: {
1885
+ width: 0,
1886
+ type: "default"
1887
+ },
1888
+ fill: {
1889
+ type: "none"
1890
+ }
1891
+ }
1892
+ ]
1893
+ },
1894
+ {
1895
+ name: `${value}_0_1`,
1896
+ pins: [
1897
+ {
1898
+ type: ELECTRICAL_PINTYPE.PT_POWER_IN,
1899
+ shape: GRAPHIC_PINSHAPE.LINE,
1900
+ hide: false,
1901
+ at: { position: { x: 0, y: 0 }, rotation: 270 },
1902
+ length: 0,
1903
+ name: {
1904
+ text: "~",
1905
+ effects: {
1906
+ font: { size: DEFAULT_FONT_SIZE }
1907
+ }
1908
+ },
1909
+ number: {
1910
+ text: "1",
1911
+ effects: {
1912
+ font: { size: DEFAULT_FONT_SIZE }
1913
+ }
1914
+ }
1915
+ }
1916
+ ]
1917
+ }
1918
+ ]
1919
+ });
1920
+
1921
+ // src/kicad/symbols/lib_symbol/vcc.ts
1922
+ import { ELECTRICAL_PINTYPE as ELECTRICAL_PINTYPE2, GRAPHIC_PINSHAPE as GRAPHIC_PINSHAPE2 } from "@modular-circuit/electronics-model";
1923
+ import { SHAPE_T as SHAPE_T3 } from "@modular-circuit/ir";
1924
+ var gen_lib_vcc = (value) => ({
1925
+ name: `power:${value}`,
1926
+ power: true,
1927
+ pin_numbers: {
1928
+ offset: 0,
1929
+ hide: true
1930
+ },
1931
+ pin_names: {
1932
+ offset: 0,
1933
+ hide: true
1934
+ },
1935
+ in_bom: true,
1936
+ on_board: true,
1937
+ exclude_from_sim: false,
1938
+ properties: [
1939
+ {
1940
+ name: "Reference",
1941
+ text: "#PWR",
1942
+ at: { position: { x: 0, y: -3.81 }, rotation: 0 },
1943
+ effects: {
1944
+ font: { size: DEFAULT_FONT_SIZE },
1945
+ hide: true
1946
+ }
1947
+ },
1948
+ {
1949
+ name: "Value",
1950
+ text: `${value}`,
1951
+ at: { position: { x: 0, y: 3.556 }, rotation: 0 },
1952
+ effects: {
1953
+ font: { size: DEFAULT_FONT_SIZE }
1954
+ }
1955
+ },
1956
+ {
1957
+ name: "Footprint",
1958
+ text: "",
1959
+ at: { position: { x: 0, y: 0 }, rotation: 0 },
1960
+ effects: {
1961
+ font: { size: DEFAULT_FONT_SIZE },
1962
+ hide: true
1963
+ }
1964
+ },
1965
+ {
1966
+ name: "Datasheet",
1967
+ text: "",
1968
+ at: { position: { x: 0, y: 0 }, rotation: 0 },
1969
+ effects: {
1970
+ font: { size: DEFAULT_FONT_SIZE },
1971
+ hide: true
1972
+ }
1973
+ },
1974
+ {
1975
+ name: "Description",
1976
+ text: `Power symbol creates a global label with name \\"${value}\\"`,
1977
+ at: { position: { x: 0, y: 0 }, rotation: 0 },
1978
+ effects: {
1979
+ font: { size: DEFAULT_FONT_SIZE },
1980
+ hide: true
1981
+ }
1982
+ },
1983
+ {
1984
+ name: "ki_keywords",
1985
+ text: "global power",
1986
+ at: { position: { x: 0, y: 0 }, rotation: 0 },
1987
+ effects: {
1988
+ font: { size: DEFAULT_FONT_SIZE },
1989
+ hide: true
1990
+ }
1991
+ }
1992
+ ],
1993
+ children: [
1994
+ {
1995
+ name: `${value}_0_1`,
1996
+ drawings: [
1997
+ {
1998
+ shape: SHAPE_T3.POLY,
1999
+ pts: [
2000
+ { x: -0.762, y: 1.27 },
2001
+ { x: 0, y: 2.54 },
2002
+ { x: 0.762, y: 1.27 }
2003
+ ],
2004
+ stroke: {
2005
+ width: 0,
2006
+ type: "default"
2007
+ },
2008
+ fill: {
2009
+ type: "none"
2010
+ }
2011
+ }
2012
+ ]
2013
+ },
2014
+ {
2015
+ name: `${value}_1_1`,
2016
+ pins: [
2017
+ {
2018
+ type: ELECTRICAL_PINTYPE2.PT_POWER_IN,
2019
+ shape: GRAPHIC_PINSHAPE2.LINE,
2020
+ hide: false,
2021
+ at: { position: { x: 0, y: 0 }, rotation: 90 },
2022
+ length: 0,
2023
+ name: {
2024
+ text: "~",
2025
+ effects: {
2026
+ font: { size: DEFAULT_FONT_SIZE }
2027
+ }
2028
+ },
2029
+ number: {
2030
+ text: "1",
2031
+ effects: {
2032
+ font: { size: DEFAULT_FONT_SIZE }
2033
+ }
2034
+ }
2035
+ }
2036
+ ]
2037
+ }
2038
+ ]
2039
+ });
2040
+
2041
+ // src/kicad/symbols/sch_symbol/gnd.ts
2042
+ import { gen_uuid as gen_uuid5 } from "@modular-circuit/utils";
2043
+
2044
+ // src/kicad/symbols/symbol_utils.ts
2045
+ var gen_pwr_ref = (pwr_num) => `#PWR${pwr_num}`;
2046
+
2047
+ // src/kicad/symbols/sch_symbol/gnd.ts
2048
+ var gen_sch_gnd = (value, pwr_number, port_id, position) => ({
2049
+ lib_id: `power:${value}`,
2050
+ at: { position, rotation: 0 },
2051
+ unit: 1,
2052
+ exclude_from_sim: false,
2053
+ in_bom: true,
2054
+ on_board: true,
2055
+ dnp: false,
2056
+ fields_autoplaced: true,
2057
+ uuid: gen_uuid5(),
2058
+ properties: [
2059
+ {
2060
+ name: "Reference",
2061
+ text: gen_pwr_ref(pwr_number),
2062
+ at: { position: { x: position.x, y: position.y + 6.35 }, rotation: 0 },
2063
+ effects: {
2064
+ font: { size: DEFAULT_FONT_SIZE },
2065
+ hide: true
2066
+ }
2067
+ },
2068
+ {
2069
+ name: "Value",
2070
+ text: `${value}`,
2071
+ at: { position: { x: position.x, y: position.y + 5.08 }, rotation: 0 },
2072
+ effects: {
2073
+ font: { size: DEFAULT_FONT_SIZE }
2074
+ }
2075
+ },
2076
+ {
2077
+ name: "Footprint",
2078
+ text: "",
2079
+ at: { position, rotation: 0 },
2080
+ effects: {
2081
+ font: { size: DEFAULT_FONT_SIZE },
2082
+ hide: true
2083
+ }
2084
+ },
2085
+ {
2086
+ name: "Datasheet",
2087
+ text: "",
2088
+ at: { position, rotation: 0 },
2089
+ effects: {
2090
+ font: { size: DEFAULT_FONT_SIZE },
2091
+ hide: true
2092
+ }
2093
+ },
2094
+ {
2095
+ name: "Description",
2096
+ text: `Power symbol creates a global label with name \\"${value}\\" , ground`,
2097
+ at: { position, rotation: 0 },
2098
+ effects: {
2099
+ font: { size: DEFAULT_FONT_SIZE },
2100
+ hide: true
2101
+ }
2102
+ }
2103
+ ],
2104
+ pins: [
2105
+ {
2106
+ uuid: port_id,
2107
+ number: "1"
2108
+ }
2109
+ ]
2110
+ });
2111
+
2112
+ // src/kicad/symbols/sch_symbol/vcc.ts
2113
+ import { gen_uuid as gen_uuid6 } from "@modular-circuit/utils";
2114
+ var gen_sch_vcc = (value, pwr_number, port_id, position) => ({
2115
+ lib_id: `power:${value}`,
2116
+ at: { position, rotation: 0 },
2117
+ unit: 1,
2118
+ exclude_from_sim: false,
2119
+ in_bom: true,
2120
+ on_board: true,
2121
+ dnp: false,
2122
+ fields_autoplaced: true,
2123
+ uuid: gen_uuid6(),
2124
+ properties: [
2125
+ {
2126
+ name: "Reference",
2127
+ text: gen_pwr_ref(pwr_number),
2128
+ at: { position: { x: position.x, y: position.y + 3.81 }, rotation: 0 },
2129
+ effects: {
2130
+ font: { size: DEFAULT_FONT_SIZE },
2131
+ hide: true
2132
+ }
2133
+ },
2134
+ {
2135
+ name: "Value",
2136
+ text: `${value}`,
2137
+ at: { position: { x: position.x, y: position.y - 5.08 }, rotation: 0 },
2138
+ effects: {
2139
+ font: { size: DEFAULT_FONT_SIZE }
2140
+ }
2141
+ },
2142
+ {
2143
+ name: "Footprint",
2144
+ text: "",
2145
+ at: { position, rotation: 0 },
2146
+ effects: {
2147
+ font: { size: DEFAULT_FONT_SIZE },
2148
+ hide: true
2149
+ }
2150
+ },
2151
+ {
2152
+ name: "Datasheet",
2153
+ text: "",
2154
+ at: { position, rotation: 0 },
2155
+ effects: {
2156
+ font: { size: DEFAULT_FONT_SIZE },
2157
+ hide: true
2158
+ }
2159
+ },
2160
+ {
2161
+ name: "Description",
2162
+ text: `Power symbol creates a global label with name \\"${value}\\"`,
2163
+ at: { position, rotation: 0 },
2164
+ effects: {
2165
+ font: { size: DEFAULT_FONT_SIZE },
2166
+ hide: true
2167
+ }
2168
+ }
2169
+ ],
2170
+ pins: [
2171
+ {
2172
+ number: "1",
2173
+ uuid: port_id
2174
+ }
2175
+ ]
2176
+ });
2177
+
2178
+ // src/kicad/wire/gen_wire.ts
2179
+ import { GS_SCH_ITEM_TYPE } from "@modular-circuit/electronics-model";
2180
+ import { gen_uuid as gen_uuid7 } from "@modular-circuit/utils";
2181
+ var gen_wire = (start, end) => ({
2182
+ stroke: {
2183
+ type: "default",
2184
+ width: 0
2185
+ },
2186
+ start,
2187
+ end,
2188
+ uuid: gen_uuid7(),
2189
+ type: GS_SCH_ITEM_TYPE.LINE
2190
+ });
2191
+
2192
+ // src/converter/netlist_to_kicad/netlist_converter.ts
2193
+ var H_LABEL_FACTOR = {
2194
+ internal: { l_side: 0, r_side: 0 },
2195
+ outer: { l_side: 0, r_side: 0 },
2196
+ total_pin_num: 1
2197
+ };
2198
+ var NetListConverter = class {
2199
+ constructor(ctx) {
2200
+ this.ctx = ctx;
2201
+ this.sheet_pwr_count = 0;
2202
+ this.net_name = {};
2203
+ this.wires = [];
2204
+ for (const net of this.ctx.netlist.nets) {
2205
+ for (const it of net.pins) {
2206
+ this.net_name[it] = net.name;
2207
+ }
2208
+ }
2209
+ }
2210
+ pin_is_connected(id) {
2211
+ return this.net_name[id] !== void 0;
2212
+ }
2213
+ get_pin_net_name(id) {
2214
+ return this.net_name[id];
2215
+ }
2216
+ async convert_to_kicad() {
2217
+ const all_sch = {};
2218
+ for (const [k, v] of Object.entries(this.ctx.netlist.schematics)) {
2219
+ this.sheet_pwr_count = 0;
2220
+ this.block_calc = new Layout();
2221
+ all_sch[k] = await this.convert_sch(k, v);
2222
+ }
2223
+ return all_sch;
2224
+ }
2225
+ /**
2226
+ * Convert a schematic to a kicad schematic
2227
+ * @param name The name of the graph ,also the file name of the converted schematic
2228
+ * @param schematic For net label , it will be reflected by the net name,
2229
+ * no need to handle them before the other types of label are introduced, e.g. global or hierarchical
2230
+ * @returns
2231
+ */
2232
+ async convert_sch(name, schematic) {
2233
+ const powers = /* @__PURE__ */ new Set();
2234
+ this.wires = [];
2235
+ const sch = {
2236
+ version: SCH_VERSION,
2237
+ generator: GENERATOR_NAME,
2238
+ generator_version: GENERATOR_VERSION,
2239
+ paper: {
2240
+ size: "A4"
2241
+ },
2242
+ title_block: {
2243
+ title: name.replace(`.${MODULAR_CIRCUIT_SCH_EXT}`, ""),
2244
+ date: replaceAll((/* @__PURE__ */ new Date()).toISOString().slice(0, 10), "-", "/"),
2245
+ rev: "1.0",
2246
+ comment: {
2247
+ 1: "https://www.eda.cn",
2248
+ 2: this.ctx.project.author,
2249
+ 3: this.ctx.project.name
2250
+ }
2251
+ },
2252
+ lib_symbols: {
2253
+ symbols: []
2254
+ },
2255
+ uuid: schematic.uuid,
2256
+ symbols: [],
2257
+ labels: [],
2258
+ sheets: []
2259
+ };
2260
+ for (const it of schematic.powers) {
2261
+ if (!powers.has(it.value)) {
2262
+ switch (it.shape) {
2263
+ case PowerShape.VCC:
2264
+ sch.lib_symbols?.symbols.push(gen_lib_vcc(it.value));
2265
+ break;
2266
+ case PowerShape.GND:
2267
+ sch.lib_symbols?.symbols.push(gen_lib_gnd(it.value));
2268
+ break;
2269
+ }
2270
+ powers.add(it.value);
2271
+ this.convert_pwr_symbol(it, get_power_pos(this.sheet_pwr_count++), sch);
2272
+ }
2273
+ }
2274
+ const sheet_names_count = /* @__PURE__ */ new Map();
2275
+ const ordered_sheets = schematic.sheet_symbols.sort((a, b) => {
2276
+ return b.pins.length - a.pins.length;
2277
+ });
2278
+ for (const it of ordered_sheets) {
2279
+ const sheet_padding = this.get_sheet_symbol_lb_padding(it);
2280
+ this.block_calc.add_block(it.uuid, sheet_padding);
2281
+ }
2282
+ for (const it of schematic.hiera_labels) {
2283
+ this.block_calc.add_block(it.uuid, H_LABEL_FACTOR);
2284
+ }
2285
+ const res = await this.block_calc.finalize();
2286
+ for (const it of ordered_sheets) {
2287
+ this.convert_sheet_symbol(it, res[it.uuid], sch, sheet_names_count);
2288
+ }
2289
+ for (const it of schematic.hiera_labels) {
2290
+ this.convert_hierarchical_label(it, res[it.uuid], sch);
2291
+ }
2292
+ sch.wires = this.wires;
2293
+ return sch;
2294
+ }
2295
+ convert_hierarchical_label(pin, bbox, sch) {
2296
+ sch.labels?.push(
2297
+ gen_hierarchical_label(pin.name, bbox.pos, { horizontal: "left", vertical: "bottom" }, 0, pin.shape)
2298
+ );
2299
+ }
2300
+ convert_pwr_symbol(pwr, at, sch) {
2301
+ const pin_id = pwr.uuid;
2302
+ const sch_pwr_symbol = pwr.shape === PowerShape.VCC ? gen_sch_vcc(pwr.value, this.sheet_pwr_count, pin_id, at) : gen_sch_gnd(pwr.value, this.sheet_pwr_count, pin_id, at);
2303
+ sch.symbols.push(sch_pwr_symbol);
2304
+ this.convert_net_label(pwr.value, at, sch);
2305
+ }
2306
+ get_sheet_symbol_lb_padding(sheet_sym) {
2307
+ const factor = {
2308
+ internal: {
2309
+ l_side: 0,
2310
+ r_side: 0
2311
+ },
2312
+ outer: {
2313
+ l_side: 0,
2314
+ r_side: 0
2315
+ },
2316
+ total_pin_num: sheet_sym.pins.length
2317
+ };
2318
+ const port_count = sheet_sym.pins.length;
2319
+ const h_count = Math.ceil(port_count / 2);
2320
+ for (let i = 0; i < port_count; i++) {
2321
+ const is_left = i < h_count;
2322
+ const cur_pin = sheet_sym.pins[i];
2323
+ if (is_left) {
2324
+ factor.internal.l_side = Math.max(factor.internal.l_side, cur_pin.name.length);
2325
+ } else {
2326
+ factor.internal.r_side = Math.max(factor.internal.r_side, cur_pin.name.length);
2327
+ }
2328
+ if (this.pin_is_connected(cur_pin.uuid)) {
2329
+ const net_name = this.get_pin_net_name(cur_pin.uuid);
2330
+ if (is_left) {
2331
+ factor.outer.l_side = Math.max(factor.outer.l_side, net_name.length);
2332
+ } else {
2333
+ factor.outer.r_side = Math.max(factor.outer.r_side, net_name.length);
2334
+ }
2335
+ }
2336
+ }
2337
+ return {
2338
+ internal: {
2339
+ l_side: factor.internal.l_side * FONT_SIZE,
2340
+ r_side: factor.internal.r_side * FONT_SIZE
2341
+ },
2342
+ outer: {
2343
+ l_side: factor.outer.l_side * FONT_SIZE,
2344
+ r_side: factor.outer.r_side * FONT_SIZE
2345
+ },
2346
+ total_pin_num: sheet_sym.pins.length
2347
+ };
2348
+ }
2349
+ convert_sheet_symbol(sheet_sym, rect, sch, sheet_names_count) {
2350
+ const port_count = sheet_sym.pins.length;
2351
+ const pins = [];
2352
+ const h_count = Math.floor(port_count / 2);
2353
+ for (let i = 0; i < port_count; i++) {
2354
+ const is_left = i < h_count;
2355
+ const x = is_left ? rect.pos.x : rect.pos.x + rect.size.x;
2356
+ const y = rect.pos.y + BLOCK_PIN_GAP * Math.abs(i < h_count ? i : i - h_count) + BLOCK_PIN_TB_MARGIN;
2357
+ const justify = is_left ? "left" : "right";
2358
+ const rotation = is_left ? 180 : 0;
2359
+ pins.push(this.convert_sheet_pin(sheet_sym.pins[i], { x, y }, sch, justify, rotation, is_left));
2360
+ }
2361
+ let sheet_name = sheet_sym.sheet_name;
2362
+ if (sheet_names_count.has(sheet_name)) {
2363
+ const count = sheet_names_count.get(sheet_name);
2364
+ sheet_name += `_${count}`;
2365
+ sheet_names_count.set(sheet_name, count + 1);
2366
+ } else {
2367
+ sheet_names_count.set(sheet_name, 1);
2368
+ }
2369
+ sch.sheets.push(
2370
+ gen_sch_sheet(rect, pins, {
2371
+ Sheetfile: sheet_sym.sheet_file_name,
2372
+ Sheetname: sheet_name
2373
+ })
2374
+ );
2375
+ }
2376
+ convert_sheet_pin(pin, pin_pos, sch, horizontal, rotation, is_left) {
2377
+ if (this.pin_is_connected(pin.uuid)) {
2378
+ const nt_name = this.get_pin_net_name(pin.uuid);
2379
+ this.convert_net_label(
2380
+ nt_name,
2381
+ {
2382
+ x: pin_pos.x + (is_left ? -WIRE_PADDING : WIRE_PADDING),
2383
+ y: pin_pos.y
2384
+ },
2385
+ sch,
2386
+ horizontal === "left" ? "right" : "left"
2387
+ );
2388
+ const lb_txt_len = nt_name.length * FONT_SIZE;
2389
+ const wire_padding = lb_txt_len + 2 * WIRE_PADDING;
2390
+ this.wires.push(
2391
+ gen_wire(pin_pos, {
2392
+ x: pin_pos.x + (is_left ? -wire_padding : wire_padding),
2393
+ y: pin_pos.y
2394
+ })
2395
+ );
2396
+ }
2397
+ return gen_sheet_pin(pin.name, pin_pos, { horizontal, vertical: "bottom" }, rotation, pin.shape);
2398
+ }
2399
+ convert_net_label(net_name, pin_pos, sch, horizontal = "right") {
2400
+ sch.labels.push(gen_net_label(net_name, pin_pos, { horizontal, vertical: "bottom" }));
2401
+ }
2402
+ };
2403
+
2404
+ // src/builder/graph_to_kicad/index.ts
2405
+ import { build_connection_graph } from "@modular-circuit/perc";
2406
+
2407
+ // src/builder/graph_to_kicad/do_convert_graph_to_kicad_project.ts
2408
+ import { MODULAR_CIRCUIT_SCH_EXT as MODULAR_CIRCUIT_SCH_EXT2 } from "@modular-circuit/ir";
2409
+
2410
+ // src/kicad/project/wildcards_and_files_ext.ts
2411
+ var KiCadSymbolLibFileExtension = "kicad_sym";
2412
+ var SchematicSymbolFileExtension = "sym";
2413
+ var LegacySymbolLibFileExtension = "lib";
2414
+ var LegacySymbolDocumentFileExtension = "dcm";
2415
+ var VrmlFileExtension = "wrl";
2416
+ var ProjectFileExtension = "kicad_pro";
2417
+ var LegacyProjectFileExtension = "pro";
2418
+ var ProjectLocalSettingsFileExtension = "kicad_prl";
2419
+ var LegacySchematicFileExtension = "sch";
2420
+ var CadstarSchematicFileExtension = "csa";
2421
+ var CadstarPartsLibraryFileExtension = "lib";
2422
+ var KiCadSchematicFileExtension = "kicad_sch";
2423
+ var SpiceFileExtension = "cir";
2424
+ var CadstarNetlistFileExtension = "frp";
2425
+ var OrCadPcb2NetlistFileExtension = "net";
2426
+ var NetlistFileExtension = "net";
2427
+ var AllegroNetlistFileExtension = "txt";
2428
+ var FootprintAssignmentFileExtension = "cmp";
2429
+ var GerberFileExtension = "gbr";
2430
+ var GerberJobFileExtension = "gbrjob";
2431
+ var HtmlFileExtension = "html";
2432
+ var EquFileExtension = "equ";
2433
+ var HotkeyFileExtension = "hotkeys";
2434
+ var DatabaseLibraryFileExtension = "kicad_dbl";
2435
+ var HTTPLibraryFileExtension = "kicad_httplib";
2436
+ var ArchiveFileExtension = "zip";
2437
+ var LegacyPcbFileExtension = "brd";
2438
+ var EaglePcbFileExtension = "brd";
2439
+ var CadstarPcbFileExtension = "cpa";
2440
+ var KiCadPcbFileExtension = "kicad_pcb";
2441
+ var DrawingSheetFileExtension = "kicad_wks";
2442
+ var DesignRulesFileExtension = "kicad_dru";
2443
+ var PdfFileExtension = "pdf";
2444
+ var MacrosFileExtension = "mcr";
2445
+ var DrillFileExtension = "drl";
2446
+ var SVGFileExtension = "svg";
2447
+ var ReportFileExtension = "rpt";
2448
+ var FootprintPlaceFileExtension = "pos";
2449
+ var KiCadFootprintLibPathExtension = "pretty";
2450
+ var LegacyFootprintLibPathExtension = "mod";
2451
+ var AltiumFootprintLibPathExtension = "PcbLib";
2452
+ var CadstarFootprintLibPathExtension = "cpa";
2453
+ var EagleFootprintLibPathExtension = "lbr";
2454
+ var GedaPcbFootprintLibFileExtension = "fp";
2455
+ var KiCadFootprintFileExtension = "kicad_mod";
2456
+ var SpecctraDsnFileExtension = "dsn";
2457
+ var SpecctraSessionFileExtension = "ses";
2458
+ var IpcD356FileExtension = "d356";
2459
+ var Ipc2581FileExtension = "xml";
2460
+ var WorkbookFileExtension = "wbk";
2461
+ var PngFileExtension = "png";
2462
+ var JpegFileExtension = "jpg";
2463
+ var TextFileExtension = "txt";
2464
+ var MarkdownFileExtension = "md";
2465
+ var CsvFileExtension = "csv";
2466
+ var XmlFileExtension = "xml";
2467
+ var JsonFileExtension = "json";
2468
+ var StepFileExtension = "step";
2469
+ var StepFileAbrvExtension = "stp";
2470
+ var GltfBinaryFileExtension = "glb";
2471
+ var GerberFileExtensionsRegex = /(gbr|gko|pho|(g[tb][alops])|(gm?\\d\\d*)|(gp[tb]))/;
2472
+
2473
+ // src/kicad/project/kicad_project_archive.ts
2474
+ import { zipFiles } from "@modular-circuit/utils";
2475
+
2476
+ // src/kicad/project/kicad_prl.ts
2477
+ var kicad_prl = (prj_name) => ({
2478
+ board: {
2479
+ active_layer: 0,
2480
+ active_layer_preset: "",
2481
+ auto_track_width: true,
2482
+ hidden_netclasses: [],
2483
+ hidden_nets: [],
2484
+ high_contrast_mode: 0,
2485
+ net_color_mode: 1,
2486
+ opacity: {
2487
+ images: 0.6,
2488
+ pads: 1,
2489
+ tracks: 1,
2490
+ vias: 1,
2491
+ zones: 0.6
2492
+ },
2493
+ selection_filter: {
2494
+ dimensions: true,
2495
+ footprints: true,
2496
+ graphics: true,
2497
+ keepouts: true,
2498
+ lockedItems: false,
2499
+ otherItems: true,
2500
+ pads: true,
2501
+ text: true,
2502
+ tracks: true,
2503
+ vias: true,
2504
+ zones: true
2505
+ },
2506
+ visible_items: [
2507
+ 0,
2508
+ 1,
2509
+ 2,
2510
+ 3,
2511
+ 4,
2512
+ 5,
2513
+ 8,
2514
+ 9,
2515
+ 10,
2516
+ 11,
2517
+ 12,
2518
+ 13,
2519
+ 15,
2520
+ 16,
2521
+ 17,
2522
+ 18,
2523
+ 19,
2524
+ 20,
2525
+ 21,
2526
+ 22,
2527
+ 23,
2528
+ 24,
2529
+ 25,
2530
+ 26,
2531
+ 27,
2532
+ 28,
2533
+ 29,
2534
+ 30,
2535
+ 32,
2536
+ 33,
2537
+ 34,
2538
+ 35,
2539
+ 36,
2540
+ 39,
2541
+ 40
2542
+ ],
2543
+ visible_layers: "fffffff_ffffffff",
2544
+ zone_display_mode: 0
2545
+ },
2546
+ git: {
2547
+ repo_password: "",
2548
+ repo_type: "",
2549
+ repo_username: "",
2550
+ ssh_key: ""
2551
+ },
2552
+ meta: {
2553
+ filename: `${prj_name}.kicad_prl`,
2554
+ version: 3
2555
+ },
2556
+ project: {
2557
+ files: []
2558
+ }
2559
+ });
2560
+
2561
+ // src/kicad/project/kicad_pro.ts
2562
+ var kicad_pro = (project_name) => ({
2563
+ board: {
2564
+ "3dviewports": [],
2565
+ ipc2581: {
2566
+ dist: "",
2567
+ distpn: "",
2568
+ internal_id: "",
2569
+ mfg: "",
2570
+ mpn: ""
2571
+ },
2572
+ layer_presets: [],
2573
+ viewports: []
2574
+ },
2575
+ boards: [],
2576
+ cvpcb: {
2577
+ equivalence_files: []
2578
+ },
2579
+ erc: {
2580
+ erc_exclusions: [],
2581
+ meta: {
2582
+ version: 0
2583
+ },
2584
+ pin_map: [
2585
+ [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2],
2586
+ [0, 2, 0, 1, 0, 0, 1, 0, 2, 2, 2, 2],
2587
+ [0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 2],
2588
+ [0, 1, 0, 0, 0, 0, 1, 1, 2, 1, 1, 2],
2589
+ [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2],
2590
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2],
2591
+ [1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 2],
2592
+ [0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 2],
2593
+ [0, 2, 1, 2, 0, 0, 1, 0, 2, 2, 2, 2],
2594
+ [0, 2, 0, 1, 0, 0, 1, 0, 2, 0, 0, 2],
2595
+ [0, 2, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2],
2596
+ [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
2597
+ ],
2598
+ rule_severities: {
2599
+ bus_definition_conflict: "error",
2600
+ bus_entry_needed: "error",
2601
+ bus_to_bus_conflict: "error",
2602
+ bus_to_net_conflict: "error",
2603
+ conflicting_netclasses: "error",
2604
+ different_unit_footprint: "error",
2605
+ different_unit_net: "error",
2606
+ duplicate_reference: "error",
2607
+ duplicate_sheet_names: "error",
2608
+ endpoint_off_grid: "warning",
2609
+ extra_units: "error",
2610
+ global_label_dangling: "warning",
2611
+ hier_label_mismatch: "error",
2612
+ label_dangling: "error",
2613
+ lib_symbol_issues: "warning",
2614
+ missing_bidi_pin: "warning",
2615
+ missing_input_pin: "warning",
2616
+ missing_power_pin: "error",
2617
+ missing_unit: "warning",
2618
+ multiple_net_names: "warning",
2619
+ net_not_bus_member: "warning",
2620
+ no_connect_connected: "warning",
2621
+ no_connect_dangling: "warning",
2622
+ pin_not_connected: "error",
2623
+ pin_not_driven: "error",
2624
+ pin_to_pin: "warning",
2625
+ power_pin_not_driven: "error",
2626
+ similar_labels: "warning",
2627
+ simulation_model_issue: "ignore",
2628
+ unannotated: "error",
2629
+ unit_value_mismatch: "error",
2630
+ unresolved_variable: "error",
2631
+ wire_dangling: "error"
2632
+ }
2633
+ },
2634
+ libraries: {
2635
+ pinned_footprint_libs: [],
2636
+ pinned_symbol_libs: []
2637
+ },
2638
+ meta: {
2639
+ filename: `${project_name}.kicad_pro`,
2640
+ version: 1
2641
+ },
2642
+ net_settings: {
2643
+ classes: [
2644
+ {
2645
+ bus_width: 12,
2646
+ clearance: 0.2,
2647
+ diff_pair_gap: 0.25,
2648
+ diff_pair_via_gap: 0.25,
2649
+ diff_pair_width: 0.2,
2650
+ line_style: 0,
2651
+ microvia_diameter: 0.3,
2652
+ microvia_drill: 0.1,
2653
+ name: "Default",
2654
+ pcb_color: "rgba(0, 0, 0, 0.000)",
2655
+ schematic_color: "rgba(0, 0, 0, 0.000)",
2656
+ track_width: 0.2,
2657
+ via_diameter: 0.6,
2658
+ via_drill: 0.3,
2659
+ wire_width: 6
2660
+ }
2661
+ ],
2662
+ meta: {
2663
+ version: 3
2664
+ },
2665
+ net_colors: null,
2666
+ netclass_assignments: null,
2667
+ netclass_patterns: []
2668
+ },
2669
+ pcbnew: {
2670
+ last_paths: {
2671
+ gencad: "",
2672
+ idf: "",
2673
+ netlist: "",
2674
+ plot: "",
2675
+ pos_files: "",
2676
+ specctra_dsn: "",
2677
+ step: "",
2678
+ svg: "",
2679
+ vrml: ""
2680
+ }
2681
+ // page_layout_descr_file: 'layout_frame.kicad_wks',
2682
+ },
2683
+ schematic: {
2684
+ annotate_start_num: 0,
2685
+ bom_export_filename: "",
2686
+ bom_fmt_presets: [],
2687
+ bom_fmt_settings: {
2688
+ field_delimiter: ",",
2689
+ keep_line_breaks: false,
2690
+ keep_tabs: false,
2691
+ name: "CSV",
2692
+ ref_delimiter: ",",
2693
+ ref_range_delimiter: "",
2694
+ string_delimiter: '"'
2695
+ },
2696
+ bom_presets: [],
2697
+ bom_settings: {
2698
+ exclude_dnp: false,
2699
+ fields_ordered: [
2700
+ {
2701
+ group_by: false,
2702
+ label: "Reference",
2703
+ name: "Reference",
2704
+ show: true
2705
+ },
2706
+ {
2707
+ group_by: true,
2708
+ label: "Value",
2709
+ name: "Value",
2710
+ show: true
2711
+ },
2712
+ {
2713
+ group_by: false,
2714
+ label: "Datasheet",
2715
+ name: "Datasheet",
2716
+ show: true
2717
+ },
2718
+ {
2719
+ group_by: false,
2720
+ label: "Footprint",
2721
+ name: "Footprint",
2722
+ show: true
2723
+ },
2724
+ {
2725
+ group_by: false,
2726
+ label: "Qty",
2727
+ name: "${QUANTITY}",
2728
+ show: true
2729
+ },
2730
+ {
2731
+ group_by: true,
2732
+ label: "DNP",
2733
+ name: "${DNP}",
2734
+ show: true
2735
+ }
2736
+ ],
2737
+ filter_string: "",
2738
+ group_symbols: true,
2739
+ name: "Grouped By Value",
2740
+ sort_asc: true,
2741
+ sort_field: "Reference"
2742
+ },
2743
+ connection_grid_size: 50,
2744
+ drawing: {
2745
+ dashed_lines_dash_length_ratio: 12,
2746
+ dashed_lines_gap_length_ratio: 3,
2747
+ default_line_thickness: 6,
2748
+ default_text_size: 50,
2749
+ field_names: [],
2750
+ intersheets_ref_own_page: false,
2751
+ intersheets_ref_prefix: "",
2752
+ intersheets_ref_short: false,
2753
+ intersheets_ref_show: false,
2754
+ intersheets_ref_suffix: "",
2755
+ junction_size_choice: 3,
2756
+ label_size_ratio: 0.375,
2757
+ operating_point_overlay_i_precision: 3,
2758
+ operating_point_overlay_i_range: "~A",
2759
+ operating_point_overlay_v_precision: 3,
2760
+ operating_point_overlay_v_range: "~V",
2761
+ overbar_offset_ratio: 1.23,
2762
+ pin_symbol_size: 25,
2763
+ text_offset_ratio: 0.15
2764
+ },
2765
+ legacy_lib_dir: "",
2766
+ legacy_lib_list: [],
2767
+ meta: {
2768
+ version: 1
2769
+ },
2770
+ net_format_name: "",
2771
+ page_layout_descr_file: `${project_name}.${DrawingSheetFileExtension}`,
2772
+ plot_directory: "",
2773
+ spice_current_sheet_as_root: false,
2774
+ spice_external_command: 'spice "%I"',
2775
+ spice_model_current_sheet_as_root: true,
2776
+ spice_save_all_currents: false,
2777
+ spice_save_all_dissipations: false,
2778
+ spice_save_all_voltages: false,
2779
+ subpart_first_id: 65,
2780
+ subpart_id_separator: 0
2781
+ },
2782
+ sheets: [],
2783
+ text_variables: {}
2784
+ });
2785
+
2786
+ // src/kicad/project/kicad_project_archive.ts
2787
+ var KICAD_SCH_FRAME = get_sch_default_drawing_sheet();
2788
+ var KiCadProjectArchive = class {
2789
+ constructor(project_name, sheets) {
2790
+ this.project_name = project_name;
2791
+ this.sheets = sheets;
2792
+ }
2793
+ get sch_frame() {
2794
+ return KICAD_SCH_FRAME;
2795
+ }
2796
+ get kicad_prl() {
2797
+ return kicad_prl(this.project_name);
2798
+ }
2799
+ get kicad_pro() {
2800
+ return kicad_pro(this.project_name);
2801
+ }
2802
+ get_project_directive_file_name(ext) {
2803
+ return `${this.project_name}.${ext}`;
2804
+ }
2805
+ toZip() {
2806
+ return zipFiles({
2807
+ [this.get_project_directive_file_name(ProjectLocalSettingsFileExtension)]: JSON.stringify(this.kicad_prl),
2808
+ [this.get_project_directive_file_name(ProjectFileExtension)]: JSON.stringify(this.kicad_pro),
2809
+ [this.get_project_directive_file_name(DrawingSheetFileExtension)]: this.sch_frame,
2810
+ ...this.sheets
2811
+ });
2812
+ }
2813
+ };
2814
+
2815
+ // src/builder/graph_to_kicad/do_convert_graph_to_kicad_project.ts
2816
+ async function do_convert_graph_to_kicad_project(ctx) {
2817
+ const { sheets } = await collect_sub_sheets(ctx.project.dependencies, ctx.module_resolver);
2818
+ const netlist = new GraphConverter({
2819
+ ...ctx
2820
+ }).convert_to_netlist();
2821
+ const converted_sheets = await new NetListConverter({
2822
+ ...ctx,
2823
+ netlist
2824
+ }).convert_to_kicad();
2825
+ const sexpr_printer = new SCHEMATIC_PRINTER();
2826
+ for (const [k, v] of Object.entries(converted_sheets)) {
2827
+ if (k in sheets) {
2828
+ console.error(`Duplicated sheet file name found ${k}`);
2829
+ }
2830
+ sheets[k.replace(MODULAR_CIRCUIT_SCH_EXT2, KiCadSchematicFileExtension)] = sexpr_printer.schematic(v);
2831
+ }
2832
+ const kicad_project = new KiCadProjectArchive(ctx.project.name, {
2833
+ ...sheets
2834
+ });
2835
+ return kicad_project.toZip();
2836
+ }
2837
+
2838
+ // src/builder/graph_to_kicad/index.ts
2839
+ async function convert_graph_to_kicad_project(ctx) {
2840
+ return do_convert_graph_to_kicad_project({
2841
+ ...ctx,
2842
+ ...await build_connection_graph({ ...ctx, dependencies: ctx.project.dependencies })
2843
+ });
2844
+ }
2845
+ export {
2846
+ AllegroNetlistFileExtension,
2847
+ AltiumFootprintLibPathExtension,
2848
+ ArchiveFileExtension,
2849
+ BLOCK_PIN_GAP,
2850
+ BLOCK_PIN_TB_MARGIN,
2851
+ CadstarFootprintLibPathExtension,
2852
+ CadstarNetlistFileExtension,
2853
+ CadstarPartsLibraryFileExtension,
2854
+ CadstarPcbFileExtension,
2855
+ CadstarSchematicFileExtension,
2856
+ CsvFileExtension,
2857
+ DEFAULT_PAPER_SIZE,
2858
+ DatabaseLibraryFileExtension,
2859
+ DesignRulesFileExtension,
2860
+ DrawingSheetFileExtension,
2861
+ DrillFileExtension,
2862
+ EagleFootprintLibPathExtension,
2863
+ EaglePcbFileExtension,
2864
+ EquFileExtension,
2865
+ FONT_SIZE,
2866
+ FootprintAssignmentFileExtension,
2867
+ FootprintPlaceFileExtension,
2868
+ GENERATOR_NAME,
2869
+ GENERATOR_VERSION,
2870
+ GRID_SIZE,
2871
+ GedaPcbFootprintLibFileExtension,
2872
+ GerberFileExtension,
2873
+ GerberFileExtensionsRegex,
2874
+ GerberJobFileExtension,
2875
+ GltfBinaryFileExtension,
2876
+ GraphConverter,
2877
+ HTTPLibraryFileExtension,
2878
+ HotkeyFileExtension,
2879
+ HtmlFileExtension,
2880
+ Ipc2581FileExtension,
2881
+ IpcD356FileExtension,
2882
+ JpegFileExtension,
2883
+ JsonFileExtension,
2884
+ KICAD_SCH_FRAME,
2885
+ KiCadFootprintFileExtension,
2886
+ KiCadFootprintLibPathExtension,
2887
+ KiCadPcbFileExtension,
2888
+ KiCadProjectArchive,
2889
+ KiCadSchematicFileExtension,
2890
+ KiCadSymbolLibFileExtension,
2891
+ Layout,
2892
+ LegacyFootprintLibPathExtension,
2893
+ LegacyPcbFileExtension,
2894
+ LegacyProjectFileExtension,
2895
+ LegacySchematicFileExtension,
2896
+ LegacySymbolDocumentFileExtension,
2897
+ LegacySymbolLibFileExtension,
2898
+ MacrosFileExtension,
2899
+ MarkdownFileExtension,
2900
+ NetListConverter,
2901
+ NetlistFileExtension,
2902
+ OrCadPcb2NetlistFileExtension,
2903
+ PAPER,
2904
+ PAPER_SIZE,
2905
+ PdfFileExtension,
2906
+ PngFileExtension,
2907
+ ProjectFileExtension,
2908
+ ProjectLocalSettingsFileExtension,
2909
+ ReportFileExtension,
2910
+ SCHEMATIC_PRINTER,
2911
+ SCH_VERSION,
2912
+ SVGFileExtension,
2913
+ SchematicSymbolFileExtension,
2914
+ SpecctraDsnFileExtension,
2915
+ SpecctraSessionFileExtension,
2916
+ SpiceFileExtension,
2917
+ StepFileAbrvExtension,
2918
+ StepFileExtension,
2919
+ StringFormatter,
2920
+ TextFileExtension,
2921
+ VrmlFileExtension,
2922
+ WIRE_PADDING,
2923
+ WorkbookFileExtension,
2924
+ XmlFileExtension,
2925
+ collect_sub_sheets,
2926
+ collect_sub_sheets_by_id,
2927
+ convert_graph_to_kicad_project,
2928
+ filterNullOrUndefined,
2929
+ gen_lib_gnd,
2930
+ gen_lib_vcc,
2931
+ gen_sch_gnd,
2932
+ gen_sch_vcc,
2933
+ get_power_pos,
2934
+ get_sch_default_drawing_sheet,
2935
+ tab
2936
+ };