@modular-circuit/transpiler 0.0.109 → 0.1.0

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