@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,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for Cadence .pstxnet.dat files
|
|
3
|
+
* Extracts net connections in the format: { netName: { refdes: [pinNumbers] } }
|
|
4
|
+
*/
|
|
5
|
+
import { readFile } from 'fs/promises';
|
|
6
|
+
/**
|
|
7
|
+
* Parse a .pstxnet.dat file and extract net connections.
|
|
8
|
+
* Pure function that reads from disk and returns parsed data.
|
|
9
|
+
*/
|
|
10
|
+
export const parsePstxnet = async (filePath) => {
|
|
11
|
+
const content = await readFile(filePath, 'utf-8');
|
|
12
|
+
return parsePstxnetContent(content);
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Parse pstxnet file content (pure function for testing).
|
|
16
|
+
*/
|
|
17
|
+
export const parsePstxnetContent = (content) => {
|
|
18
|
+
const lines = content.split('\n').map((line) => line.trim());
|
|
19
|
+
const netConnections = {};
|
|
20
|
+
let currentNet = null;
|
|
21
|
+
let currentPins = [];
|
|
22
|
+
const saveCurrentNet = () => {
|
|
23
|
+
if (currentNet !== null) {
|
|
24
|
+
const netDict = {};
|
|
25
|
+
for (const [refdes, pinNumber] of currentPins) {
|
|
26
|
+
if (!netDict[refdes]) {
|
|
27
|
+
netDict[refdes] = [];
|
|
28
|
+
}
|
|
29
|
+
netDict[refdes].push(pinNumber);
|
|
30
|
+
}
|
|
31
|
+
netConnections[currentNet] = netDict;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
for (const line of lines) {
|
|
35
|
+
if (line === 'NET_NAME') {
|
|
36
|
+
saveCurrentNet();
|
|
37
|
+
currentNet = null;
|
|
38
|
+
currentPins = [];
|
|
39
|
+
}
|
|
40
|
+
else if (currentNet === null && line.startsWith("'") && line.endsWith("'")) {
|
|
41
|
+
currentNet = line.slice(1, -1);
|
|
42
|
+
}
|
|
43
|
+
else if (line.startsWith('NODE_NAME')) {
|
|
44
|
+
const parts = line.split(/\s+/);
|
|
45
|
+
if (parts.length >= 3) {
|
|
46
|
+
const refdes = parts[1];
|
|
47
|
+
const pinNumber = parts[2];
|
|
48
|
+
currentPins.push([refdes, pinNumber]);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
saveCurrentNet();
|
|
53
|
+
return netConnections;
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=pstxnet-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pstxnet-parser.js","sourceRoot":"","sources":["../../../src/parsers/cadence/pstxnet-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,QAAgB,EAA2B,EAAE;IAC9E,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAkB,EAAE;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAE7D,MAAM,cAAc,GAAmB,EAAE,CAAC;IAC1C,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,WAAW,GAA4B,EAAE,CAAC;IAE9C,MAAM,cAAc,GAAG,GAAS,EAAE;QAChC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,OAAO,GAAmC,EAAE,CAAC;YACnD,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBACrB,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBACvB,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;YACD,cAAc,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;QACvC,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,cAAc,EAAE,CAAC;YACjB,UAAU,GAAG,IAAI,CAAC;YAClB,WAAW,GAAG,EAAE,CAAC;QACnB,CAAC;aAAM,IAAI,UAAU,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7E,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACxB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC3B,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,cAAc,EAAE,CAAC;IAEjB,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for Cadence .pstxprt.dat files
|
|
3
|
+
* Extracts component details (MPN, description)
|
|
4
|
+
*/
|
|
5
|
+
import type { ComponentDetails } from '../../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Result from parsing pstxprt.dat
|
|
8
|
+
* - components: Component details (mpn, description, pins)
|
|
9
|
+
* - partNames: Map of refdes to Cadence part name (for cross-referencing with pstchip.dat)
|
|
10
|
+
*/
|
|
11
|
+
export interface PstxprtResult {
|
|
12
|
+
components: ComponentDetails;
|
|
13
|
+
partNames: Map<string, string>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Parse a .pstxprt.dat file and extract component information.
|
|
17
|
+
* Returns both components and a partNames map for cross-referencing.
|
|
18
|
+
*/
|
|
19
|
+
export declare const parsePstxprt: (filePath: string) => Promise<PstxprtResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Parse pstxprt file content (pure function for testing).
|
|
22
|
+
*/
|
|
23
|
+
export declare const parsePstxprtContent: (content: string) => PstxprtResult;
|
|
24
|
+
//# sourceMappingURL=pstxprt-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pstxprt-parser.d.ts","sourceRoot":"","sources":["../../../src/parsers/cadence/pstxprt-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,aAAa,CAG1E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,KAAG,aA+DrD,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for Cadence .pstxprt.dat files
|
|
3
|
+
* Extracts component details (MPN, description)
|
|
4
|
+
*/
|
|
5
|
+
import { readFile } from 'fs/promises';
|
|
6
|
+
/**
|
|
7
|
+
* Parse a .pstxprt.dat file and extract component information.
|
|
8
|
+
* Returns both components and a partNames map for cross-referencing.
|
|
9
|
+
*/
|
|
10
|
+
export const parsePstxprt = async (filePath) => {
|
|
11
|
+
const content = await readFile(filePath, 'utf-8');
|
|
12
|
+
return parsePstxprtContent(content);
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Parse pstxprt file content (pure function for testing).
|
|
16
|
+
*/
|
|
17
|
+
export const parsePstxprtContent = (content) => {
|
|
18
|
+
const lines = content.split('\n').map((line) => line.trim());
|
|
19
|
+
const componentDetails = {};
|
|
20
|
+
const partNames = new Map();
|
|
21
|
+
let currentRefdes = null;
|
|
22
|
+
let currentPartName = null;
|
|
23
|
+
let currentProperties = {};
|
|
24
|
+
const saveCurrentComponent = () => {
|
|
25
|
+
if (currentRefdes !== null) {
|
|
26
|
+
const component = { pins: {} };
|
|
27
|
+
// MPN: use MFGR_PN if available, otherwise fall back to part name string
|
|
28
|
+
const mpn = currentProperties['MFGR_PN'] || currentPartName || null;
|
|
29
|
+
component.mpn = mpn;
|
|
30
|
+
const description = currentProperties['DESCR'];
|
|
31
|
+
if (description) {
|
|
32
|
+
component.description = description;
|
|
33
|
+
}
|
|
34
|
+
componentDetails[currentRefdes] = component;
|
|
35
|
+
// Store part name separately for cross-referencing with pstchip.dat
|
|
36
|
+
if (currentPartName) {
|
|
37
|
+
partNames.set(currentRefdes, currentPartName);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
for (const line of lines) {
|
|
42
|
+
// PART_NAME alone is a section header; PART_NAME='...' is a property
|
|
43
|
+
if (line === 'PART_NAME') {
|
|
44
|
+
saveCurrentComponent();
|
|
45
|
+
currentRefdes = null;
|
|
46
|
+
currentPartName = null;
|
|
47
|
+
currentProperties = {};
|
|
48
|
+
}
|
|
49
|
+
else if (currentRefdes === null && line) {
|
|
50
|
+
// Component line ends with ':' or ':;'
|
|
51
|
+
if (line.includes(' ') && (line.endsWith(':') || line.endsWith(':;'))) {
|
|
52
|
+
const match = line.match(/^(\S+)\s+'([^']+)'/);
|
|
53
|
+
if (match) {
|
|
54
|
+
currentRefdes = match[1];
|
|
55
|
+
currentPartName = match[2];
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
const [refdes] = line.split(' ', 1);
|
|
59
|
+
currentRefdes = refdes;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else if (line.includes('=')) {
|
|
64
|
+
const [key, ...valueParts] = line.split('=');
|
|
65
|
+
const value = valueParts
|
|
66
|
+
.join('=')
|
|
67
|
+
.trim()
|
|
68
|
+
.replace(/^['"]|['";,]+$/g, '');
|
|
69
|
+
currentProperties[key.trim()] = value;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
saveCurrentComponent();
|
|
73
|
+
return { components: componentDetails, partNames };
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=pstxprt-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pstxprt-parser.js","sourceRoot":"","sources":["../../../src/parsers/cadence/pstxprt-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EDA Project Format Registry
|
|
3
|
+
*
|
|
4
|
+
* Unified discovery and parsing across all supported EDA tools.
|
|
5
|
+
* To add a new format (e.g., KiCad):
|
|
6
|
+
* 1. Create parsers/kicad/ folder with discovery.ts and index.ts
|
|
7
|
+
* 2. Implement EDAProjectFormatHandler in index.ts
|
|
8
|
+
* 3. Import and register the handler here
|
|
9
|
+
*/
|
|
10
|
+
import type { DiscoveredDesign, ParsedNetlist, EDAProjectFormatHandler } from '../types.js';
|
|
11
|
+
export { cadenceHandler } from './cadence/index.js';
|
|
12
|
+
export { altiumHandler } from './altium/index.js';
|
|
13
|
+
/**
|
|
14
|
+
* Find a handler that can process the given file path.
|
|
15
|
+
*/
|
|
16
|
+
export declare const findHandler: (filePath: string) => EDAProjectFormatHandler | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Discover all designs of all supported formats in a directory.
|
|
19
|
+
*/
|
|
20
|
+
export declare const discoverDesigns: (rootDir: string) => Promise<DiscoveredDesign[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Parse a design file using the appropriate handler.
|
|
23
|
+
*/
|
|
24
|
+
export declare const parseDesign: (designPath: string) => Promise<ParsedNetlist>;
|
|
25
|
+
/**
|
|
26
|
+
* Get all registered handlers.
|
|
27
|
+
*/
|
|
28
|
+
export declare const getHandlers: () => readonly EDAProjectFormatHandler[];
|
|
29
|
+
/**
|
|
30
|
+
* Get all supported file extensions across all handlers.
|
|
31
|
+
*/
|
|
32
|
+
export declare const getSupportedExtensions: () => string[];
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAK5F,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAQlD;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,UAAU,MAAM,KAAG,uBAAuB,GAAG,SAC5B,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,eAAe,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,gBAAgB,EAAE,CAGjF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,GAAU,YAAY,MAAM,KAAG,OAAO,CAAC,aAAa,CAM3E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,QAAO,SAAS,uBAAuB,EAAc,CAAC;AAE9E;;GAEG;AACH,eAAO,MAAM,sBAAsB,QAAO,MAAM,EACJ,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EDA Project Format Registry
|
|
3
|
+
*
|
|
4
|
+
* Unified discovery and parsing across all supported EDA tools.
|
|
5
|
+
* To add a new format (e.g., KiCad):
|
|
6
|
+
* 1. Create parsers/kicad/ folder with discovery.ts and index.ts
|
|
7
|
+
* 2. Implement EDAProjectFormatHandler in index.ts
|
|
8
|
+
* 3. Import and register the handler here
|
|
9
|
+
*/
|
|
10
|
+
import { cadenceHandler } from './cadence/index.js';
|
|
11
|
+
import { altiumHandler } from './altium/index.js';
|
|
12
|
+
// Re-export handlers for direct access
|
|
13
|
+
export { cadenceHandler } from './cadence/index.js';
|
|
14
|
+
export { altiumHandler } from './altium/index.js';
|
|
15
|
+
/**
|
|
16
|
+
* Registry of all supported EDA project format handlers.
|
|
17
|
+
* Add new handlers here to support additional EDA tools.
|
|
18
|
+
*/
|
|
19
|
+
const handlers = [cadenceHandler, altiumHandler];
|
|
20
|
+
/**
|
|
21
|
+
* Find a handler that can process the given file path.
|
|
22
|
+
*/
|
|
23
|
+
export const findHandler = (filePath) => handlers.find((h) => h.canHandle(filePath));
|
|
24
|
+
/**
|
|
25
|
+
* Discover all designs of all supported formats in a directory.
|
|
26
|
+
*/
|
|
27
|
+
export const discoverDesigns = async (rootDir) => {
|
|
28
|
+
const results = await Promise.all(handlers.map((h) => h.discoverDesigns(rootDir)));
|
|
29
|
+
return results.flat().sort((a, b) => a.name.localeCompare(b.name));
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Parse a design file using the appropriate handler.
|
|
33
|
+
*/
|
|
34
|
+
export const parseDesign = async (designPath) => {
|
|
35
|
+
const handler = findHandler(designPath);
|
|
36
|
+
if (!handler) {
|
|
37
|
+
throw new Error(`Unsupported design format: ${designPath}`);
|
|
38
|
+
}
|
|
39
|
+
return handler.parse(designPath);
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Get all registered handlers.
|
|
43
|
+
*/
|
|
44
|
+
export const getHandlers = () => handlers;
|
|
45
|
+
/**
|
|
46
|
+
* Get all supported file extensions across all handlers.
|
|
47
|
+
*/
|
|
48
|
+
export const getSupportedExtensions = () => handlers.flatMap((h) => [...h.extensions]);
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,uCAAuC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;GAGG;AACH,MAAM,QAAQ,GAA8B,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;AAE5E;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAuC,EAAE,CACnF,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,OAAe,EAA+B,EAAE;IACpF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACnF,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrE,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,UAAkB,EAA0B,EAAE;IAC9E,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAuC,EAAE,CAAC,QAAQ,CAAC;AAE9E;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAa,EAAE,CACnD,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Netlist MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Model Context Protocol server for querying EDA netlists.
|
|
5
|
+
* Supports Cadence (CIS, HDL) and Altium Designer formats.
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
|
+
/**
|
|
9
|
+
* Create and configure the MCP server.
|
|
10
|
+
*/
|
|
11
|
+
export declare const createServer: () => McpServer;
|
|
12
|
+
/**
|
|
13
|
+
* Run the MCP server with stdio transport.
|
|
14
|
+
*/
|
|
15
|
+
export declare const runServer: () => Promise<void>;
|
|
16
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8EpE;;GAEG;AACH,eAAO,MAAM,YAAY,QAAO,SAyR/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,QAAa,OAAO,CAAC,IAAI,CAI9C,CAAC"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Netlist MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Model Context Protocol server for querying EDA netlists.
|
|
5
|
+
* Supports Cadence (CIS, HDL) and Altium Designer formats.
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { VERSION } from "./version.js";
|
|
11
|
+
import { listDesigns, listComponents, listNets, searchNets, searchComponentsByRefdes, searchComponentsByMpn, searchComponentsByDescription, queryComponent, queryXnetByNetName, queryXnetByPinName, exportCadenceNetlist, } from "./service.js";
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// Server Instructions
|
|
14
|
+
// =============================================================================
|
|
15
|
+
const SERVER_INSTRUCTIONS = `
|
|
16
|
+
# Netlist MCP Server
|
|
17
|
+
|
|
18
|
+
This server provides tools to query EDA (Electronic Design Automation) netlists for circuit design review.
|
|
19
|
+
Supports Cadence (CIS, HDL) and Altium Designer formats.
|
|
20
|
+
|
|
21
|
+
## Workflow Guidance
|
|
22
|
+
|
|
23
|
+
1. Use \`list_designs\` first to discover available projects in a directory
|
|
24
|
+
2. Use \`search_nets\` with regex patterns before querying specific nets
|
|
25
|
+
3. Use \`search_components_by_*\` to find components by refdes, MPN, or description
|
|
26
|
+
4. Use \`query_xnet_by_net_name\` or \`query_xnet_by_pin_name\` to trace signal paths
|
|
27
|
+
5. For token optimization, use \`skip_types=['C','L']\` to skip series passives on power rails
|
|
28
|
+
|
|
29
|
+
## Tool Usage Tips
|
|
30
|
+
|
|
31
|
+
- Pin names use REFDES.PIN format (e.g., U1.A5, R10.1)
|
|
32
|
+
- DNS (Do Not Stuff) components are excluded by default; use \`include_dns=true\` to include them
|
|
33
|
+
- \`query_xnet_*\` traces through series components; \`circuit_hash\` identifies unique topologies
|
|
34
|
+
- \`query_xnet_*\` stops traversal at power/ground nets; use \`skip_types\` to reduce noise on rails
|
|
35
|
+
- All design paths should be absolute paths
|
|
36
|
+
|
|
37
|
+
## Error Handling
|
|
38
|
+
|
|
39
|
+
Results with an \`error\` field indicate a problem:
|
|
40
|
+
- Design not found: Check available designs with \`list_designs\`
|
|
41
|
+
- Net not found: Use \`search_nets\` to find available nets
|
|
42
|
+
- Component not found: Use \`search_components_by_refdes\` to find available components
|
|
43
|
+
- Missing netlist files: Run \`export_cadence_netlist\` to generate .dat files
|
|
44
|
+
|
|
45
|
+
## Netlist Export (Windows Only)
|
|
46
|
+
|
|
47
|
+
Use \`export_cadence_netlist\` to generate Allegro-compatible netlist files from Cadence schematics.
|
|
48
|
+
- Requires Cadence SPB installation (auto-detected from C:/Cadence)
|
|
49
|
+
- Uses the latest installed version by default
|
|
50
|
+
- Output directory: \`{schematic_dir}/Allegro/\`
|
|
51
|
+
- Returns error on non-Windows platforms
|
|
52
|
+
`.trim();
|
|
53
|
+
// =============================================================================
|
|
54
|
+
// Helper Functions
|
|
55
|
+
// =============================================================================
|
|
56
|
+
/**
|
|
57
|
+
* Format a result as MCP tool response content.
|
|
58
|
+
*/
|
|
59
|
+
const formatResult = (result) => ({
|
|
60
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
61
|
+
});
|
|
62
|
+
// =============================================================================
|
|
63
|
+
// Server Setup
|
|
64
|
+
// =============================================================================
|
|
65
|
+
/**
|
|
66
|
+
* Create and configure the MCP server.
|
|
67
|
+
*/
|
|
68
|
+
export const createServer = () => {
|
|
69
|
+
const server = new McpServer({
|
|
70
|
+
name: "netlist-mcp-server",
|
|
71
|
+
version: VERSION,
|
|
72
|
+
}, {
|
|
73
|
+
capabilities: {
|
|
74
|
+
tools: {},
|
|
75
|
+
},
|
|
76
|
+
instructions: SERVER_INSTRUCTIONS,
|
|
77
|
+
});
|
|
78
|
+
// -------------------------------------------------------------------------
|
|
79
|
+
// Tool: list_designs
|
|
80
|
+
// -------------------------------------------------------------------------
|
|
81
|
+
server.registerTool("list_designs", {
|
|
82
|
+
description: "List all design projects in the given directory",
|
|
83
|
+
inputSchema: {
|
|
84
|
+
path: z
|
|
85
|
+
.string()
|
|
86
|
+
.optional()
|
|
87
|
+
.describe("Absolute path to directory to search for designs"),
|
|
88
|
+
pattern: z
|
|
89
|
+
.string()
|
|
90
|
+
.optional()
|
|
91
|
+
.describe("Regex pattern to filter design names"),
|
|
92
|
+
},
|
|
93
|
+
}, async ({ path, pattern }) => {
|
|
94
|
+
const result = await listDesigns(path, pattern);
|
|
95
|
+
return formatResult(result);
|
|
96
|
+
});
|
|
97
|
+
// -------------------------------------------------------------------------
|
|
98
|
+
// Tool: list_components
|
|
99
|
+
// -------------------------------------------------------------------------
|
|
100
|
+
server.registerTool("list_components", {
|
|
101
|
+
description: "List components of a specific type in a design",
|
|
102
|
+
inputSchema: {
|
|
103
|
+
design: z
|
|
104
|
+
.string()
|
|
105
|
+
.describe("Absolute path to design file (e.g., /path/to/Design.PrjPcb)"),
|
|
106
|
+
type: z.string().describe("Component prefix: U, C, R, L, etc."),
|
|
107
|
+
include_dns: z
|
|
108
|
+
.boolean()
|
|
109
|
+
.optional()
|
|
110
|
+
.default(false)
|
|
111
|
+
.describe("Include DNS (Do Not Stuff) components"),
|
|
112
|
+
},
|
|
113
|
+
}, async ({ design, type, include_dns }) => {
|
|
114
|
+
const result = await listComponents(design, type, include_dns);
|
|
115
|
+
return formatResult(result);
|
|
116
|
+
});
|
|
117
|
+
// -------------------------------------------------------------------------
|
|
118
|
+
// Tool: list_nets
|
|
119
|
+
// -------------------------------------------------------------------------
|
|
120
|
+
server.registerTool("list_nets", {
|
|
121
|
+
description: "List all net names in a design",
|
|
122
|
+
inputSchema: {
|
|
123
|
+
design: z.string().describe("Absolute path to design file"),
|
|
124
|
+
},
|
|
125
|
+
}, async ({ design }) => {
|
|
126
|
+
const result = await listNets(design);
|
|
127
|
+
return formatResult(result);
|
|
128
|
+
});
|
|
129
|
+
// -------------------------------------------------------------------------
|
|
130
|
+
// Tool: search_nets
|
|
131
|
+
// -------------------------------------------------------------------------
|
|
132
|
+
server.registerTool("search_nets", {
|
|
133
|
+
description: "Search for nets matching a regex pattern",
|
|
134
|
+
inputSchema: {
|
|
135
|
+
pattern: z.string().describe("Regex pattern"),
|
|
136
|
+
design: z.string().describe("Absolute path to design file"),
|
|
137
|
+
},
|
|
138
|
+
}, async ({ pattern, design }) => {
|
|
139
|
+
const result = await searchNets(pattern, design);
|
|
140
|
+
return formatResult(result);
|
|
141
|
+
});
|
|
142
|
+
// -------------------------------------------------------------------------
|
|
143
|
+
// Tool: search_components_by_refdes
|
|
144
|
+
// -------------------------------------------------------------------------
|
|
145
|
+
server.registerTool("search_components_by_refdes", {
|
|
146
|
+
description: "Search for components by refdes pattern",
|
|
147
|
+
inputSchema: {
|
|
148
|
+
pattern: z.string().describe("Regex pattern for refdes"),
|
|
149
|
+
design: z.string().describe("Absolute path to design file"),
|
|
150
|
+
include_dns: z
|
|
151
|
+
.boolean()
|
|
152
|
+
.optional()
|
|
153
|
+
.default(false)
|
|
154
|
+
.describe("Include DNS components"),
|
|
155
|
+
},
|
|
156
|
+
}, async ({ pattern, design, include_dns }) => {
|
|
157
|
+
const result = await searchComponentsByRefdes(pattern, design, include_dns);
|
|
158
|
+
return formatResult(result);
|
|
159
|
+
});
|
|
160
|
+
// -------------------------------------------------------------------------
|
|
161
|
+
// Tool: search_components_by_mpn
|
|
162
|
+
// -------------------------------------------------------------------------
|
|
163
|
+
server.registerTool("search_components_by_mpn", {
|
|
164
|
+
description: "Search for components by MPN (Manufacturer Part Number) pattern",
|
|
165
|
+
inputSchema: {
|
|
166
|
+
pattern: z.string().describe("Regex pattern for MPN"),
|
|
167
|
+
design: z.string().describe("Absolute path to design file"),
|
|
168
|
+
include_dns: z
|
|
169
|
+
.boolean()
|
|
170
|
+
.optional()
|
|
171
|
+
.default(false)
|
|
172
|
+
.describe("Include DNS components"),
|
|
173
|
+
},
|
|
174
|
+
}, async ({ pattern, design, include_dns }) => {
|
|
175
|
+
const result = await searchComponentsByMpn(pattern, design, include_dns);
|
|
176
|
+
return formatResult(result);
|
|
177
|
+
});
|
|
178
|
+
// -------------------------------------------------------------------------
|
|
179
|
+
// Tool: search_components_by_description
|
|
180
|
+
// -------------------------------------------------------------------------
|
|
181
|
+
server.registerTool("search_components_by_description", {
|
|
182
|
+
description: "Search for components by description pattern",
|
|
183
|
+
inputSchema: {
|
|
184
|
+
pattern: z.string().describe("Regex pattern for description"),
|
|
185
|
+
design: z.string().describe("Absolute path to design file"),
|
|
186
|
+
include_dns: z
|
|
187
|
+
.boolean()
|
|
188
|
+
.optional()
|
|
189
|
+
.default(false)
|
|
190
|
+
.describe("Include DNS components"),
|
|
191
|
+
},
|
|
192
|
+
}, async ({ pattern, design, include_dns }) => {
|
|
193
|
+
const result = await searchComponentsByDescription(pattern, design, include_dns);
|
|
194
|
+
return formatResult(result);
|
|
195
|
+
});
|
|
196
|
+
// -------------------------------------------------------------------------
|
|
197
|
+
// Tool: query_xnet_by_net_name
|
|
198
|
+
// -------------------------------------------------------------------------
|
|
199
|
+
server.registerTool("query_xnet_by_net_name", {
|
|
200
|
+
description: "Get full XNET (Extended Net) connectivity for a net",
|
|
201
|
+
inputSchema: {
|
|
202
|
+
design: z.string().describe("Absolute path to design file"),
|
|
203
|
+
net_name: z.string().describe("Exact net name"),
|
|
204
|
+
skip_types: z
|
|
205
|
+
.array(z.string())
|
|
206
|
+
.optional()
|
|
207
|
+
.describe("Component prefixes to exclude (e.g., ['C', 'L'])"),
|
|
208
|
+
include_dns: z
|
|
209
|
+
.boolean()
|
|
210
|
+
.optional()
|
|
211
|
+
.default(false)
|
|
212
|
+
.describe("Include DNS components"),
|
|
213
|
+
},
|
|
214
|
+
}, async ({ design, net_name, skip_types, include_dns }) => {
|
|
215
|
+
const result = await queryXnetByNetName(design, net_name, skip_types, include_dns);
|
|
216
|
+
return formatResult(result);
|
|
217
|
+
});
|
|
218
|
+
// -------------------------------------------------------------------------
|
|
219
|
+
// Tool: query_xnet_by_pin_name
|
|
220
|
+
// -------------------------------------------------------------------------
|
|
221
|
+
server.registerTool("query_xnet_by_pin_name", {
|
|
222
|
+
description: "Get full XNET connectivity starting from a component pin",
|
|
223
|
+
inputSchema: {
|
|
224
|
+
design: z.string().describe("Absolute path to design file"),
|
|
225
|
+
pin_name: z
|
|
226
|
+
.string()
|
|
227
|
+
.describe("Pin spec: REFDES.PIN (e.g., U2.10, U1.A5)"),
|
|
228
|
+
skip_types: z
|
|
229
|
+
.array(z.string())
|
|
230
|
+
.optional()
|
|
231
|
+
.describe("Component prefixes to exclude"),
|
|
232
|
+
include_dns: z
|
|
233
|
+
.boolean()
|
|
234
|
+
.optional()
|
|
235
|
+
.default(false)
|
|
236
|
+
.describe("Include DNS components"),
|
|
237
|
+
},
|
|
238
|
+
}, async ({ design, pin_name, skip_types, include_dns }) => {
|
|
239
|
+
const result = await queryXnetByPinName(design, pin_name, skip_types, include_dns);
|
|
240
|
+
return formatResult(result);
|
|
241
|
+
});
|
|
242
|
+
// -------------------------------------------------------------------------
|
|
243
|
+
// Tool: query_component
|
|
244
|
+
// -------------------------------------------------------------------------
|
|
245
|
+
server.registerTool("query_component", {
|
|
246
|
+
description: "Get full component details including all pin connections",
|
|
247
|
+
inputSchema: {
|
|
248
|
+
design: z.string().describe("Absolute path to design file"),
|
|
249
|
+
refdes: z.string().describe("Component reference designator"),
|
|
250
|
+
},
|
|
251
|
+
}, async ({ design, refdes }) => {
|
|
252
|
+
const result = await queryComponent(design, refdes);
|
|
253
|
+
return formatResult(result);
|
|
254
|
+
});
|
|
255
|
+
// -------------------------------------------------------------------------
|
|
256
|
+
// Tool: export_cadence_netlist
|
|
257
|
+
// -------------------------------------------------------------------------
|
|
258
|
+
server.registerTool("export_cadence_netlist", {
|
|
259
|
+
description: "Export Cadence schematic netlist to Allegro PCB format. Windows only. Requires Cadence SPB installation.",
|
|
260
|
+
inputSchema: {
|
|
261
|
+
design: z.string().describe("Absolute path to .DSN schematic file"),
|
|
262
|
+
},
|
|
263
|
+
}, async ({ design }) => {
|
|
264
|
+
const result = await exportCadenceNetlist(design);
|
|
265
|
+
return formatResult(result);
|
|
266
|
+
});
|
|
267
|
+
return server;
|
|
268
|
+
};
|
|
269
|
+
/**
|
|
270
|
+
* Run the MCP server with stdio transport.
|
|
271
|
+
*/
|
|
272
|
+
export const runServer = async () => {
|
|
273
|
+
const server = createServer();
|
|
274
|
+
const transport = new StdioServerTransport();
|
|
275
|
+
await server.connect(transport);
|
|
276
|
+
};
|
|
277
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|