@intelligentelectron/universal-netlist 0.0.12

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 (105) hide show
  1. package/CHANGELOG.md +121 -0
  2. package/LICENSE +190 -0
  3. package/NOTICE +4 -0
  4. package/README.md +246 -0
  5. package/dist/circuit-traversal.d.ts +73 -0
  6. package/dist/circuit-traversal.d.ts.map +1 -0
  7. package/dist/circuit-traversal.js +299 -0
  8. package/dist/circuit-traversal.js.map +1 -0
  9. package/dist/cli/commands.d.ts +23 -0
  10. package/dist/cli/commands.d.ts.map +1 -0
  11. package/dist/cli/commands.js +140 -0
  12. package/dist/cli/commands.js.map +1 -0
  13. package/dist/cli/prompts.d.ts +10 -0
  14. package/dist/cli/prompts.d.ts.map +1 -0
  15. package/dist/cli/prompts.js +22 -0
  16. package/dist/cli/prompts.js.map +1 -0
  17. package/dist/cli/shell.d.ts +15 -0
  18. package/dist/cli/shell.d.ts.map +1 -0
  19. package/dist/cli/shell.js +66 -0
  20. package/dist/cli/shell.js.map +1 -0
  21. package/dist/cli/updater.d.ts +46 -0
  22. package/dist/cli/updater.d.ts.map +1 -0
  23. package/dist/cli/updater.js +319 -0
  24. package/dist/cli/updater.js.map +1 -0
  25. package/dist/index.d.ts +16 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +63 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/parsers/altium/connectivity.d.ts +32 -0
  30. package/dist/parsers/altium/connectivity.d.ts.map +1 -0
  31. package/dist/parsers/altium/connectivity.js +308 -0
  32. package/dist/parsers/altium/connectivity.js.map +1 -0
  33. package/dist/parsers/altium/discovery.d.ts +30 -0
  34. package/dist/parsers/altium/discovery.d.ts.map +1 -0
  35. package/dist/parsers/altium/discovery.js +174 -0
  36. package/dist/parsers/altium/discovery.js.map +1 -0
  37. package/dist/parsers/altium/hierarchy.d.ts +29 -0
  38. package/dist/parsers/altium/hierarchy.d.ts.map +1 -0
  39. package/dist/parsers/altium/hierarchy.js +94 -0
  40. package/dist/parsers/altium/hierarchy.js.map +1 -0
  41. package/dist/parsers/altium/index.d.ts +53 -0
  42. package/dist/parsers/altium/index.d.ts.map +1 -0
  43. package/dist/parsers/altium/index.js +404 -0
  44. package/dist/parsers/altium/index.js.map +1 -0
  45. package/dist/parsers/altium/net-extractor.d.ts +24 -0
  46. package/dist/parsers/altium/net-extractor.d.ts.map +1 -0
  47. package/dist/parsers/altium/net-extractor.js +295 -0
  48. package/dist/parsers/altium/net-extractor.js.map +1 -0
  49. package/dist/parsers/altium/ole-reader.d.ts +91 -0
  50. package/dist/parsers/altium/ole-reader.d.ts.map +1 -0
  51. package/dist/parsers/altium/ole-reader.js +304 -0
  52. package/dist/parsers/altium/ole-reader.js.map +1 -0
  53. package/dist/parsers/altium/record-parser.d.ts +21 -0
  54. package/dist/parsers/altium/record-parser.d.ts.map +1 -0
  55. package/dist/parsers/altium/record-parser.js +117 -0
  56. package/dist/parsers/altium/record-parser.js.map +1 -0
  57. package/dist/parsers/altium/schemas.d.ts +277 -0
  58. package/dist/parsers/altium/schemas.d.ts.map +1 -0
  59. package/dist/parsers/altium/schemas.js +246 -0
  60. package/dist/parsers/altium/schemas.js.map +1 -0
  61. package/dist/parsers/altium/types.d.ts +213 -0
  62. package/dist/parsers/altium/types.d.ts.map +1 -0
  63. package/dist/parsers/altium/types.js +180 -0
  64. package/dist/parsers/altium/types.js.map +1 -0
  65. package/dist/parsers/cadence/discovery.d.ts +45 -0
  66. package/dist/parsers/cadence/discovery.d.ts.map +1 -0
  67. package/dist/parsers/cadence/discovery.js +277 -0
  68. package/dist/parsers/cadence/discovery.js.map +1 -0
  69. package/dist/parsers/cadence/index.d.ts +41 -0
  70. package/dist/parsers/cadence/index.d.ts.map +1 -0
  71. package/dist/parsers/cadence/index.js +139 -0
  72. package/dist/parsers/cadence/index.js.map +1 -0
  73. package/dist/parsers/cadence/pstchip-parser.d.ts +23 -0
  74. package/dist/parsers/cadence/pstchip-parser.d.ts.map +1 -0
  75. package/dist/parsers/cadence/pstchip-parser.js +82 -0
  76. package/dist/parsers/cadence/pstchip-parser.js.map +1 -0
  77. package/dist/parsers/cadence/pstxnet-parser.d.ts +15 -0
  78. package/dist/parsers/cadence/pstxnet-parser.d.ts.map +1 -0
  79. package/dist/parsers/cadence/pstxnet-parser.js +55 -0
  80. package/dist/parsers/cadence/pstxnet-parser.js.map +1 -0
  81. package/dist/parsers/cadence/pstxprt-parser.d.ts +24 -0
  82. package/dist/parsers/cadence/pstxprt-parser.d.ts.map +1 -0
  83. package/dist/parsers/cadence/pstxprt-parser.js +75 -0
  84. package/dist/parsers/cadence/pstxprt-parser.js.map +1 -0
  85. package/dist/parsers/index.d.ts +33 -0
  86. package/dist/parsers/index.d.ts.map +1 -0
  87. package/dist/parsers/index.js +49 -0
  88. package/dist/parsers/index.js.map +1 -0
  89. package/dist/server.d.ts +16 -0
  90. package/dist/server.d.ts.map +1 -0
  91. package/dist/server.js +277 -0
  92. package/dist/server.js.map +1 -0
  93. package/dist/service.d.ts +129 -0
  94. package/dist/service.d.ts.map +1 -0
  95. package/dist/service.js +759 -0
  96. package/dist/service.js.map +1 -0
  97. package/dist/types.d.ts +242 -0
  98. package/dist/types.d.ts.map +1 -0
  99. package/dist/types.js +27 -0
  100. package/dist/types.js.map +1 -0
  101. package/dist/version.d.ts +10 -0
  102. package/dist/version.d.ts.map +1 -0
  103. package/dist/version.js +25 -0
  104. package/dist/version.js.map +1 -0
  105. package/package.json +74 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../../../src/parsers/altium/hierarchy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Altium Schematic Parser
3
+ *
4
+ * Parses Altium Designer .SchDoc files into the unified ParsedNetlist format.
5
+ * Port of the Python Altium-Schematic-Parser library:
6
+ * https://github.com/a3ng7n/Altium-Schematic-Parser
7
+ *
8
+ * Supports output formats:
9
+ * - all-list: All records in a flattened list
10
+ * - all-hierarchy: All records in owner/child hierarchy
11
+ * - parts-list: Components/parts only
12
+ * - net-list: Nets with connected devices
13
+ */
14
+ import type { ParsedNetlist, ComponentDetails } from "../../types.js";
15
+ import type { AltiumSchematic, AltiumNet, AltiumRecord, OutputFormat } from "./types.js";
16
+ import { RECORD_TYPES, RECORD_TYPE_NAMES, PIN_ELECTRICAL_TYPES, POWER_PORT_STYLES } from "./types.js";
17
+ import { OleReader } from "./ole-reader.js";
18
+ import { parseRecords, findRecords } from "./record-parser.js";
19
+ import { buildHierarchy, getPartsList, flattenHierarchy } from "./hierarchy.js";
20
+ import { extractNets, determineNetList } from "./net-extractor.js";
21
+ export type { AltiumSchematic, AltiumNet, AltiumRecord, OutputFormat };
22
+ export { RECORD_TYPES, RECORD_TYPE_NAMES, PIN_ELECTRICAL_TYPES, POWER_PORT_STYLES, };
23
+ export { OleReader };
24
+ export { parseRecords, findRecords };
25
+ export { buildHierarchy, getPartsList, flattenHierarchy };
26
+ export { extractNets, determineNetList };
27
+ export * from "./schemas.js";
28
+ /**
29
+ * Extract component details from a hierarchical schematic.
30
+ */
31
+ export declare const extractComponents: (schematic: AltiumSchematic) => ComponentDetails;
32
+ /**
33
+ * Parse Altium .SchDoc file into unified ParsedNetlist schema.
34
+ *
35
+ * This is the main entry point for integration with NetlistService.
36
+ */
37
+ export declare const parseAltium: (schdocPath: string) => Promise<ParsedNetlist>;
38
+ /**
39
+ * Parse Altium file with a specific output format (matching Python API).
40
+ */
41
+ export declare const parse: (schdocPath: string, format?: OutputFormat) => AltiumSchematic | {
42
+ records: AltiumRecord[];
43
+ } | (AltiumSchematic & {
44
+ nets: AltiumNet[];
45
+ });
46
+ import type { EDAProjectFormatHandler } from "../../types.js";
47
+ export { discoverAltiumDesigns, findAltiumSchDocs, isAltiumFile, } from "./discovery.js";
48
+ /**
49
+ * Altium EDA project format handler.
50
+ * Supports Altium Designer projects (.PrjPcb).
51
+ */
52
+ export declare const altiumHandler: EDAProjectFormatHandler;
53
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/parsers/altium/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,aAAa,EAEb,gBAAgB,EAEjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAiB,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EACL,cAAc,EACd,YAAY,EACZ,gBAAgB,EAEjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGnE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AACvE,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,GAClB,CAAC;AACF,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;AAGzC,cAAc,cAAc,CAAC;AA4N7B;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAC5B,WAAW,eAAe,KACzB,gBAkIF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,YAAY,MAAM,KACjB,OAAO,CAAC,aAAa,CAwBvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,KAAK,GAChB,YAAY,MAAM,EAClB,SAAQ,YAA8B,KAEpC,eAAe,GACf;IAAE,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,GAC3B,CAAC,eAAe,GAAG;IAAE,IAAI,EAAE,SAAS,EAAE,CAAA;CAAE,CAuB3C,CAAC;AASF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAE9D,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,GACb,MAAM,gBAAgB,CAAC;AAsDxB;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,uBAS3B,CAAC"}
@@ -0,0 +1,404 @@
1
+ /**
2
+ * Altium Schematic Parser
3
+ *
4
+ * Parses Altium Designer .SchDoc files into the unified ParsedNetlist format.
5
+ * Port of the Python Altium-Schematic-Parser library:
6
+ * https://github.com/a3ng7n/Altium-Schematic-Parser
7
+ *
8
+ * Supports output formats:
9
+ * - all-list: All records in a flattened list
10
+ * - all-hierarchy: All records in owner/child hierarchy
11
+ * - parts-list: Components/parts only
12
+ * - net-list: Nets with connected devices
13
+ */
14
+ import { createPinEntry } from "../../types.js";
15
+ import { RECORD_TYPES, RECORD_TYPE_NAMES, PIN_ELECTRICAL_TYPES, POWER_PORT_STYLES, } from "./types.js";
16
+ import { OleReader, readOleStream } from "./ole-reader.js";
17
+ import { parseRecords, findRecords } from "./record-parser.js";
18
+ import { buildHierarchy, getPartsList, flattenHierarchy, findRecordByIndex, } from "./hierarchy.js";
19
+ import { extractNets, determineNetList } from "./net-extractor.js";
20
+ export { RECORD_TYPES, RECORD_TYPE_NAMES, PIN_ELECTRICAL_TYPES, POWER_PORT_STYLES, };
21
+ export { OleReader };
22
+ export { parseRecords, findRecords };
23
+ export { buildHierarchy, getPartsList, flattenHierarchy };
24
+ export { extractNets, determineNetList };
25
+ // Re-export schemas for validation
26
+ export * from "./schemas.js";
27
+ /**
28
+ * Get component designator from a pin's parent.
29
+ */
30
+ const getDesignatorFromPin = (pin, schematic) => {
31
+ // Look up the parent component using OwnerIndex
32
+ const ownerIndexValue = pin.OwnerIndex ?? pin.OWNERINDEX;
33
+ if (ownerIndexValue !== undefined &&
34
+ ownerIndexValue !== null &&
35
+ ownerIndexValue !== "") {
36
+ const ownerIndex = parseInt(String(ownerIndexValue), 10);
37
+ const parent = findRecordByIndex(schematic, ownerIndex);
38
+ if (parent?.children) {
39
+ // Find the designator child (RECORD=34 with Text field)
40
+ const designatorChild = parent.children.find((c) => c.RECORD === RECORD_TYPES.DESIGNATOR);
41
+ const designatorText = designatorChild?.Text ??
42
+ designatorChild?.TEXT ??
43
+ designatorChild?.Name ??
44
+ designatorChild?.NAME;
45
+ if (designatorText !== undefined &&
46
+ designatorText !== null &&
47
+ designatorText !== "") {
48
+ return String(designatorText);
49
+ }
50
+ }
51
+ }
52
+ return null;
53
+ };
54
+ /**
55
+ * Get pin number from a pin record.
56
+ *
57
+ * Altium uses camelCase: Designator is the pin number (1, 2, 3...)
58
+ * and Name is the pin function (VBAT, VCC, GND...)
59
+ */
60
+ const getPinNumber = (pin) => {
61
+ // Try Designator first (pin number)
62
+ if (pin.Designator !== undefined &&
63
+ pin.Designator !== null &&
64
+ pin.Designator !== "") {
65
+ return String(pin.Designator);
66
+ }
67
+ if (pin.DESIGNATOR !== undefined &&
68
+ pin.DESIGNATOR !== null &&
69
+ pin.DESIGNATOR !== "") {
70
+ return String(pin.DESIGNATOR);
71
+ }
72
+ // Fallback to Name (pin function name)
73
+ if (pin.Name !== undefined && pin.Name !== null && pin.Name !== "") {
74
+ return String(pin.Name);
75
+ }
76
+ if (pin.NAME !== undefined && pin.NAME !== null && pin.NAME !== "") {
77
+ return String(pin.NAME);
78
+ }
79
+ return null;
80
+ };
81
+ /**
82
+ * Convert Altium nets to ParsedNetlist NetConnections format.
83
+ *
84
+ * Transform: AltiumNet[] -> { netName: { refdes: [pinNumbers] } }
85
+ */
86
+ const convertNets = (nets, schematic) => {
87
+ const result = {};
88
+ let unnamedNetCounter = 1;
89
+ for (const net of nets) {
90
+ const pinDevices = net.devices.filter((device) => device.RECORD === RECORD_TYPES.PIN);
91
+ const hasNonPinDevices = net.devices.some((device) => device.RECORD !== RECORD_TYPES.PIN);
92
+ if (pinDevices.length === 1 && !hasNonPinDevices) {
93
+ continue;
94
+ }
95
+ // Generate name if not assigned
96
+ const netName = net.name ?? `UnnamedNet${unnamedNetCounter++}`;
97
+ // Group pins by their component (refdes)
98
+ const pinsByComponent = {};
99
+ for (const device of net.devices) {
100
+ if (device.RECORD === RECORD_TYPES.PIN) {
101
+ // Find the component refdes from parent
102
+ const designator = getDesignatorFromPin(device, schematic);
103
+ const pinNumber = getPinNumber(device);
104
+ if (designator && pinNumber) {
105
+ if (!pinsByComponent[designator]) {
106
+ pinsByComponent[designator] = [];
107
+ }
108
+ if (!pinsByComponent[designator].includes(pinNumber)) {
109
+ pinsByComponent[designator].push(pinNumber);
110
+ }
111
+ }
112
+ }
113
+ }
114
+ // Only add net if it has pin connections
115
+ if (Object.keys(pinsByComponent).length > 0) {
116
+ result[netName] = pinsByComponent;
117
+ }
118
+ }
119
+ return result;
120
+ };
121
+ /**
122
+ * Populate component pin-to-net mappings from the nets data.
123
+ *
124
+ * The nets structure is: { netName: { refdes: [pinNumbers] } }
125
+ * We need to reverse this to populate: components[refdes].pins[pin] = netName
126
+ */
127
+ const populatePinNets = (components, nets) => {
128
+ for (const [netName, connections] of Object.entries(nets)) {
129
+ for (const [refdes, pins] of Object.entries(connections)) {
130
+ const component = components[refdes];
131
+ if (!component) {
132
+ continue;
133
+ }
134
+ for (const pin of pins) {
135
+ const entry = component.pins[pin];
136
+ if (typeof entry === "string") {
137
+ component.pins[pin] = netName;
138
+ }
139
+ else if (entry) {
140
+ entry.net = netName;
141
+ }
142
+ else {
143
+ component.pins[pin] = netName;
144
+ }
145
+ }
146
+ }
147
+ }
148
+ };
149
+ const resolveComment = (comment, parameters) => {
150
+ if (!comment) {
151
+ return undefined;
152
+ }
153
+ const trimmed = comment.trim();
154
+ if (!trimmed) {
155
+ return undefined;
156
+ }
157
+ if (trimmed.startsWith("=")) {
158
+ const reference = trimmed.slice(1).trim();
159
+ if (!reference) {
160
+ return undefined;
161
+ }
162
+ const resolved = parameters[reference.toLowerCase()];
163
+ if (resolved && resolved.trim()) {
164
+ return resolved.trim();
165
+ }
166
+ return undefined;
167
+ }
168
+ return trimmed;
169
+ };
170
+ const pinMatchesCurrentPart = (pin, part) => {
171
+ const partId = part.CURRENTPARTID ?? part.CurrentPartId ?? part.CurrentPartID;
172
+ const pinPartId = pin.OwnerPartId ?? pin.OWNERPARTID;
173
+ if (partId === undefined ||
174
+ partId === null ||
175
+ partId === "" ||
176
+ pinPartId === undefined ||
177
+ pinPartId === null ||
178
+ pinPartId === "") {
179
+ return true;
180
+ }
181
+ return String(partId) === String(pinPartId);
182
+ };
183
+ const getPinName = (pin) => {
184
+ const name = pin.Name ?? pin.NAME;
185
+ if (name !== undefined && name !== null && name !== "") {
186
+ return String(name);
187
+ }
188
+ return undefined;
189
+ };
190
+ /**
191
+ * Extract component details from a hierarchical schematic.
192
+ */
193
+ export const extractComponents = (schematic) => {
194
+ const components = {};
195
+ // Get all parts (RECORD=1)
196
+ const parts = getPartsList(schematic);
197
+ for (const part of parts) {
198
+ // Designator is in a child record with RECORD=34 and Text field
199
+ let refdes;
200
+ if (part.children) {
201
+ const designatorChild = part.children.find((c) => c.RECORD === RECORD_TYPES.DESIGNATOR);
202
+ const designatorText = designatorChild?.Text ??
203
+ designatorChild?.TEXT ??
204
+ designatorChild?.Name ??
205
+ designatorChild?.NAME;
206
+ if (designatorText !== undefined &&
207
+ designatorText !== null &&
208
+ designatorText !== "") {
209
+ refdes = String(designatorText);
210
+ }
211
+ }
212
+ if (!refdes)
213
+ continue;
214
+ // Extract component properties from child RECORD=41 (parameter) records
215
+ // Altium stores MPN in a parameter child with Name="Manufacturer Part Number"
216
+ let mpn;
217
+ let comment;
218
+ const parameters = {};
219
+ if (part.children) {
220
+ for (const child of part.children) {
221
+ if (child.RECORD === RECORD_TYPES.PARAMETER) {
222
+ const nameValue = child.Name ?? child.NAME;
223
+ const textValue = child.Text ?? child.TEXT;
224
+ if (nameValue === undefined ||
225
+ nameValue === null ||
226
+ nameValue === "" ||
227
+ textValue === undefined ||
228
+ textValue === null ||
229
+ textValue === "") {
230
+ continue;
231
+ }
232
+ const name = String(nameValue).trim();
233
+ const text = String(textValue).trim();
234
+ if (name) {
235
+ parameters[name.toLowerCase()] = text;
236
+ }
237
+ if (name === "Manufacturer Part Number") {
238
+ mpn = text;
239
+ }
240
+ else if (name === "Comment") {
241
+ comment = text;
242
+ }
243
+ }
244
+ }
245
+ }
246
+ comment = resolveComment(comment, parameters);
247
+ const rawValue = parameters["value"];
248
+ const value = rawValue?.trim() || undefined;
249
+ if (comment && value && comment === value) {
250
+ comment = undefined;
251
+ }
252
+ // Fallback MPN sources from component-level fields
253
+ // Note: LibReference is NOT an MPN - it's a library symbol reference (e.g., "22u" or a hash)
254
+ if (!mpn) {
255
+ mpn =
256
+ part.PartNumber ||
257
+ part.Mpn ||
258
+ part.PARTNUMBER ||
259
+ part["MPN"] ||
260
+ undefined;
261
+ }
262
+ // Description from component record or parameters (try both camelCase and UPPERCASE variants)
263
+ const extractedDescription = part.ComponentDescription ||
264
+ part.Description ||
265
+ // Legacy UPPERCASE fallbacks
266
+ part.DESCRIPTION ||
267
+ undefined;
268
+ // Build pin mapping from children
269
+ const pins = {};
270
+ if (part.children) {
271
+ for (const child of part.children) {
272
+ if (child.RECORD === RECORD_TYPES.PIN) {
273
+ if (!pinMatchesCurrentPart(child, part)) {
274
+ continue;
275
+ }
276
+ const pinNum = getPinNumber(child);
277
+ const pinName = getPinName(child);
278
+ if (pinNum) {
279
+ // Initialize with empty string or name placeholder; will be populated by populatePinNets()
280
+ pins[pinNum] = createPinEntry(pinNum, pinName, "");
281
+ }
282
+ }
283
+ }
284
+ }
285
+ const component = {
286
+ mpn,
287
+ description: extractedDescription,
288
+ pins,
289
+ };
290
+ if (comment !== undefined) {
291
+ component.comment = comment;
292
+ }
293
+ if (value !== undefined) {
294
+ component.value = value;
295
+ }
296
+ components[refdes] = component;
297
+ }
298
+ return components;
299
+ };
300
+ /**
301
+ * Parse Altium .SchDoc file into unified ParsedNetlist schema.
302
+ *
303
+ * This is the main entry point for integration with NetlistService.
304
+ */
305
+ export const parseAltium = async (schdocPath) => {
306
+ // 1. Read OLE file and extract FileHeader stream
307
+ const buffer = readOleStream(schdocPath);
308
+ // 2. Parse binary stream into records
309
+ const schematic = parseRecords(buffer);
310
+ // 3. Build hierarchy from flat records
311
+ const hierarchical = buildHierarchy(schematic);
312
+ // 4. Extract nets
313
+ const nets = extractNets(hierarchical);
314
+ // 5. Convert to ParsedNetlist format
315
+ const parsedNets = convertNets(nets, hierarchical);
316
+ const components = extractComponents(hierarchical);
317
+ // 6. Populate component pin-to-net mappings from the nets data
318
+ populatePinNets(components, parsedNets);
319
+ return {
320
+ nets: parsedNets,
321
+ components,
322
+ };
323
+ };
324
+ /**
325
+ * Parse Altium file with a specific output format (matching Python API).
326
+ */
327
+ export const parse = (schdocPath, format = "all-hierarchy") => {
328
+ // Read and parse the file
329
+ const buffer = readOleStream(schdocPath);
330
+ const schematic = parseRecords(buffer);
331
+ switch (format) {
332
+ case "all-list":
333
+ return schematic;
334
+ case "all-hierarchy":
335
+ return buildHierarchy(schematic);
336
+ case "parts-list":
337
+ return {
338
+ records: getPartsList(buildHierarchy(schematic)),
339
+ };
340
+ case "net-list":
341
+ return determineNetList(buildHierarchy(schematic));
342
+ default:
343
+ return buildHierarchy(schematic);
344
+ }
345
+ };
346
+ // Import discovery functions and handler interface
347
+ import { discoverAltiumDesigns, findAltiumSchDocs, isAltiumFile, ALTIUM_EXTENSIONS, } from "./discovery.js";
348
+ export { discoverAltiumDesigns, findAltiumSchDocs, isAltiumFile, } from "./discovery.js";
349
+ /**
350
+ * Parse an Altium project by parsing all its SchDoc files and merging the results.
351
+ */
352
+ const parseAltiumProject = async (projectPath) => {
353
+ const schdocPaths = await findAltiumSchDocs(projectPath);
354
+ if (schdocPaths.length === 0) {
355
+ throw new Error(`No schematic documents found for project ${projectPath}`);
356
+ }
357
+ // Parse all SchDoc files and merge results
358
+ const allNets = {};
359
+ const allComponents = {};
360
+ for (const schdocPath of schdocPaths) {
361
+ const result = await parseAltium(schdocPath);
362
+ // Merge nets
363
+ for (const [netName, connections] of Object.entries(result.nets)) {
364
+ if (!allNets[netName]) {
365
+ allNets[netName] = {};
366
+ }
367
+ for (const [refdes, pins] of Object.entries(connections)) {
368
+ if (!allNets[netName][refdes]) {
369
+ allNets[netName][refdes] = pins;
370
+ }
371
+ else {
372
+ const existing = allNets[netName][refdes];
373
+ const existingArray = Array.isArray(existing) ? existing : [existing];
374
+ const newPins = Array.isArray(pins) ? pins : [pins];
375
+ allNets[netName][refdes] = [
376
+ ...new Set([...existingArray, ...newPins]),
377
+ ];
378
+ }
379
+ }
380
+ }
381
+ // Merge components
382
+ for (const [refdes, component] of Object.entries(result.components)) {
383
+ if (!allComponents[refdes]) {
384
+ allComponents[refdes] = component;
385
+ }
386
+ }
387
+ }
388
+ return {
389
+ nets: allNets,
390
+ components: allComponents,
391
+ };
392
+ };
393
+ /**
394
+ * Altium EDA project format handler.
395
+ * Supports Altium Designer projects (.PrjPcb).
396
+ */
397
+ export const altiumHandler = {
398
+ name: "altium",
399
+ extensions: ALTIUM_EXTENSIONS,
400
+ canHandle: isAltiumFile,
401
+ discoverDesigns: discoverAltiumDesigns,
402
+ parse: parseAltiumProject,
403
+ };
404
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/parsers/altium/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Altium Net Extractor
3
+ *
4
+ * Extracts net information from Altium schematics by analyzing
5
+ * wires, pins, power ports, and net labels.
6
+ */
7
+ import type { AltiumSchematic, AltiumNet } from './types.js';
8
+ /**
9
+ * Extract all nets from the schematic.
10
+ *
11
+ * This function:
12
+ * 1. Finds all connectable devices (wires, pins, labels, power ports)
13
+ * 2. Calculates coordinates for each device
14
+ * 3. Groups connected devices into nets
15
+ * 4. Assigns names to nets based on power ports, labels, or pin names
16
+ */
17
+ export declare const extractNets: (schematic: AltiumSchematic) => AltiumNet[];
18
+ /**
19
+ * Get net list with schematic (for compatibility with Python API).
20
+ */
21
+ export declare const determineNetList: (schematic: AltiumSchematic) => AltiumSchematic & {
22
+ nets: AltiumNet[];
23
+ };
24
+ //# sourceMappingURL=net-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"net-extractor.d.ts","sourceRoot":"","sources":["../../../src/parsers/altium/net-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAgB,eAAe,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA8S3E;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GAAI,WAAW,eAAe,KAAG,SAAS,EAgCjE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,WAAW,eAAe,KACzB,eAAe,GAAG;IAAE,IAAI,EAAE,SAAS,EAAE,CAAA;CAMvC,CAAC"}