@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.
- package/CHANGELOG.md +121 -0
- package/LICENSE +190 -0
- package/NOTICE +4 -0
- package/README.md +246 -0
- package/dist/circuit-traversal.d.ts +73 -0
- package/dist/circuit-traversal.d.ts.map +1 -0
- package/dist/circuit-traversal.js +299 -0
- package/dist/circuit-traversal.js.map +1 -0
- package/dist/cli/commands.d.ts +23 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +140 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/prompts.d.ts +10 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +22 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/shell.d.ts +15 -0
- package/dist/cli/shell.d.ts.map +1 -0
- package/dist/cli/shell.js +66 -0
- package/dist/cli/shell.js.map +1 -0
- package/dist/cli/updater.d.ts +46 -0
- package/dist/cli/updater.d.ts.map +1 -0
- package/dist/cli/updater.js +319 -0
- package/dist/cli/updater.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/altium/connectivity.d.ts +32 -0
- package/dist/parsers/altium/connectivity.d.ts.map +1 -0
- package/dist/parsers/altium/connectivity.js +308 -0
- package/dist/parsers/altium/connectivity.js.map +1 -0
- package/dist/parsers/altium/discovery.d.ts +30 -0
- package/dist/parsers/altium/discovery.d.ts.map +1 -0
- package/dist/parsers/altium/discovery.js +174 -0
- package/dist/parsers/altium/discovery.js.map +1 -0
- package/dist/parsers/altium/hierarchy.d.ts +29 -0
- package/dist/parsers/altium/hierarchy.d.ts.map +1 -0
- package/dist/parsers/altium/hierarchy.js +94 -0
- package/dist/parsers/altium/hierarchy.js.map +1 -0
- package/dist/parsers/altium/index.d.ts +53 -0
- package/dist/parsers/altium/index.d.ts.map +1 -0
- package/dist/parsers/altium/index.js +404 -0
- package/dist/parsers/altium/index.js.map +1 -0
- package/dist/parsers/altium/net-extractor.d.ts +24 -0
- package/dist/parsers/altium/net-extractor.d.ts.map +1 -0
- package/dist/parsers/altium/net-extractor.js +295 -0
- package/dist/parsers/altium/net-extractor.js.map +1 -0
- package/dist/parsers/altium/ole-reader.d.ts +91 -0
- package/dist/parsers/altium/ole-reader.d.ts.map +1 -0
- package/dist/parsers/altium/ole-reader.js +304 -0
- package/dist/parsers/altium/ole-reader.js.map +1 -0
- package/dist/parsers/altium/record-parser.d.ts +21 -0
- package/dist/parsers/altium/record-parser.d.ts.map +1 -0
- package/dist/parsers/altium/record-parser.js +117 -0
- package/dist/parsers/altium/record-parser.js.map +1 -0
- package/dist/parsers/altium/schemas.d.ts +277 -0
- package/dist/parsers/altium/schemas.d.ts.map +1 -0
- package/dist/parsers/altium/schemas.js +246 -0
- package/dist/parsers/altium/schemas.js.map +1 -0
- package/dist/parsers/altium/types.d.ts +213 -0
- package/dist/parsers/altium/types.d.ts.map +1 -0
- package/dist/parsers/altium/types.js +180 -0
- package/dist/parsers/altium/types.js.map +1 -0
- package/dist/parsers/cadence/discovery.d.ts +45 -0
- package/dist/parsers/cadence/discovery.d.ts.map +1 -0
- package/dist/parsers/cadence/discovery.js +277 -0
- package/dist/parsers/cadence/discovery.js.map +1 -0
- package/dist/parsers/cadence/index.d.ts +41 -0
- package/dist/parsers/cadence/index.d.ts.map +1 -0
- package/dist/parsers/cadence/index.js +139 -0
- package/dist/parsers/cadence/index.js.map +1 -0
- package/dist/parsers/cadence/pstchip-parser.d.ts +23 -0
- package/dist/parsers/cadence/pstchip-parser.d.ts.map +1 -0
- package/dist/parsers/cadence/pstchip-parser.js +82 -0
- package/dist/parsers/cadence/pstchip-parser.js.map +1 -0
- package/dist/parsers/cadence/pstxnet-parser.d.ts +15 -0
- package/dist/parsers/cadence/pstxnet-parser.d.ts.map +1 -0
- package/dist/parsers/cadence/pstxnet-parser.js +55 -0
- package/dist/parsers/cadence/pstxnet-parser.js.map +1 -0
- package/dist/parsers/cadence/pstxprt-parser.d.ts +24 -0
- package/dist/parsers/cadence/pstxprt-parser.d.ts.map +1 -0
- package/dist/parsers/cadence/pstxprt-parser.js +75 -0
- package/dist/parsers/cadence/pstxprt-parser.js.map +1 -0
- package/dist/parsers/index.d.ts +33 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +49 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/server.d.ts +16 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +277 -0
- package/dist/server.js.map +1 -0
- package/dist/service.d.ts +129 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +759 -0
- package/dist/service.js.map +1 -0
- package/dist/types.d.ts +242 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +27 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +10 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +25 -0
- package/dist/version.js.map +1 -0
- 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"}
|