@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,277 @@
1
+ /**
2
+ * Cadence design discovery module.
3
+ * Finds Cadence CIS (.dsn) and HDL (.cpm) designs with their .dat netlist files.
4
+ *
5
+ * Uses subtree-scoped matching: .dat files are matched to the design whose directory
6
+ * contains them (same directory or any subdirectory). This handles arbitrary folder
7
+ * structures since users can export netlists to any directory they choose.
8
+ */
9
+ import { readdir } from "fs/promises";
10
+ import path from "path";
11
+ const CADENCE_EXTENSIONS = [".dsn", ".cpm"];
12
+ /** Required .dat files for a complete netlist export */
13
+ const REQUIRED_DAT_FILES = [
14
+ "pstxnet.dat",
15
+ "pstxprt.dat",
16
+ "pstchip.dat",
17
+ ];
18
+ /**
19
+ * Walk directory tree to find Cadence design files and complete .dat file sets.
20
+ */
21
+ const walkForCadenceFiles = async (rootDir) => {
22
+ const designFiles = [];
23
+ const datFilesByDir = new Map();
24
+ const walk = async (currentDir) => {
25
+ let entries;
26
+ try {
27
+ entries = await readdir(currentDir, { withFileTypes: true });
28
+ }
29
+ catch (error) {
30
+ if (!(error instanceof Error) ||
31
+ !("code" in error) ||
32
+ error.code !== "EACCES") {
33
+ throw error;
34
+ }
35
+ return;
36
+ }
37
+ for (const entry of entries) {
38
+ const fullPath = path.join(currentDir, entry.name);
39
+ if (entry.isDirectory()) {
40
+ await walk(fullPath);
41
+ continue;
42
+ }
43
+ if (!entry.isFile())
44
+ continue;
45
+ const ext = path.extname(entry.name).toLowerCase();
46
+ const baseName = entry.name.toLowerCase();
47
+ // Collect design files
48
+ if (CADENCE_EXTENSIONS.includes(ext)) {
49
+ designFiles.push(fullPath);
50
+ }
51
+ // Collect .dat files grouped by directory
52
+ if (ext === ".dat" &&
53
+ REQUIRED_DAT_FILES.includes(baseName)) {
54
+ if (!datFilesByDir.has(currentDir)) {
55
+ datFilesByDir.set(currentDir, new Map());
56
+ }
57
+ datFilesByDir.get(currentDir).set(baseName, fullPath);
58
+ }
59
+ }
60
+ };
61
+ await walk(rootDir);
62
+ // Convert to complete DatFileSets (only directories with all 3 required files)
63
+ const datSets = [];
64
+ for (const [dir, files] of datFilesByDir) {
65
+ if (files.size === REQUIRED_DAT_FILES.length) {
66
+ datSets.push({
67
+ directory: dir,
68
+ pstxnet: files.get("pstxnet.dat"),
69
+ pstxprt: files.get("pstxprt.dat"),
70
+ pstchip: files.get("pstchip.dat"),
71
+ });
72
+ }
73
+ }
74
+ return { designFiles, datSets };
75
+ };
76
+ /**
77
+ * Normalize a path for comparison.
78
+ * - Converts to native separators (handles both / and \ regardless of platform)
79
+ * - Lowercases on Windows (case-insensitive filesystem)
80
+ */
81
+ const normalizeForComparison = (p) => {
82
+ // On Windows, path.normalize converts / to \
83
+ // On Unix, we must manually convert \ to / since path.normalize doesn't
84
+ const normalized = process.platform === "win32"
85
+ ? path.normalize(p)
86
+ : path.normalize(p.replace(/\\/g, "/"));
87
+ // Windows is case-insensitive, Unix is case-sensitive
88
+ return process.platform === "win32" ? normalized.toLowerCase() : normalized;
89
+ };
90
+ /**
91
+ * Check if a directory is a descendant of (or equal to) another directory.
92
+ * Uses proper path boundary checking to avoid false matches like "test_design_1" matching "test_design_1_v2".
93
+ * Case-insensitive on Windows.
94
+ */
95
+ const isDescendantOrEqual = (childDir, parentDir) => {
96
+ const normalizedChild = normalizeForComparison(childDir);
97
+ const normalizedParent = normalizeForComparison(parentDir);
98
+ if (normalizedChild === normalizedParent)
99
+ return true;
100
+ // Ensure path boundary: parent must end with separator or child must start with parent + separator
101
+ const parentWithSep = normalizedParent.endsWith(path.sep)
102
+ ? normalizedParent
103
+ : normalizedParent + path.sep;
104
+ return normalizedChild.startsWith(parentWithSep);
105
+ };
106
+ /**
107
+ * Check if design name appears as an exact directory component in a relative path.
108
+ * Case-insensitive matching.
109
+ */
110
+ const designNameInRelativePath = (relPath, designName) => {
111
+ if (relPath === "" || relPath === ".")
112
+ return false;
113
+ const components = relPath.split(path.sep);
114
+ const lowerName = designName.toLowerCase();
115
+ return components.some((c) => c.toLowerCase() === lowerName);
116
+ };
117
+ /**
118
+ * Score a dat set candidate for a design. Higher score = better match.
119
+ */
120
+ const scoreDatSetMatch = (designDir, designName, datSet) => {
121
+ let score = 0;
122
+ // Get relative path from design directory to dat set
123
+ const relPath = path.relative(designDir, datSet.directory);
124
+ const depth = relPath === "" ? 0 : relPath.split(path.sep).length;
125
+ // Bonus for design name appearing as a path component in the RELATIVE path
126
+ // (not the absolute path, which might contain project folder names)
127
+ if (designNameInRelativePath(relPath, designName)) {
128
+ score += 1000;
129
+ }
130
+ // Prefer closer paths (fewer directory levels between design and dat)
131
+ score -= depth;
132
+ return score;
133
+ };
134
+ /**
135
+ * Match dat sets to designs using global score-based assignment.
136
+ * This ensures deterministic results regardless of readdir order.
137
+ *
138
+ * Algorithm:
139
+ * 1. Build all valid (design, datSet, score) pairs
140
+ * 2. Sort globally by score (desc), then by paths for determinism
141
+ * 3. Assign greedily from highest score, skipping already-assigned pairs
142
+ */
143
+ const matchDatSetsToDesigns = (designFiles, datSets) => {
144
+ const assignments = new Map();
145
+ // Initialize all designs with null
146
+ for (const designPath of designFiles) {
147
+ assignments.set(designPath, null);
148
+ }
149
+ // Build all valid candidate pairings
150
+ const candidates = [];
151
+ for (const designPath of designFiles) {
152
+ const designDir = path.dirname(designPath);
153
+ const designName = path.basename(designPath, path.extname(designPath));
154
+ for (const datSet of datSets) {
155
+ if (isDescendantOrEqual(datSet.directory, designDir)) {
156
+ candidates.push({
157
+ designPath,
158
+ datSet,
159
+ score: scoreDatSetMatch(designDir, designName, datSet),
160
+ });
161
+ }
162
+ }
163
+ }
164
+ // Sort by score (descending), then by paths for determinism
165
+ candidates.sort((a, b) => {
166
+ if (b.score !== a.score)
167
+ return b.score - a.score;
168
+ // Tiebreaker: sort by design path, then dat directory
169
+ if (a.designPath !== b.designPath) {
170
+ return a.designPath.localeCompare(b.designPath);
171
+ }
172
+ return a.datSet.directory.localeCompare(b.datSet.directory);
173
+ });
174
+ // Assign greedily from highest score
175
+ const usedDatSets = new Set();
176
+ const assignedDesigns = new Set();
177
+ for (const candidate of candidates) {
178
+ if (assignedDesigns.has(candidate.designPath) ||
179
+ usedDatSets.has(candidate.datSet.directory)) {
180
+ continue;
181
+ }
182
+ assignments.set(candidate.designPath, candidate.datSet);
183
+ assignedDesigns.add(candidate.designPath);
184
+ usedDatSets.add(candidate.datSet.directory);
185
+ }
186
+ return assignments;
187
+ };
188
+ /**
189
+ * Normalize path separators to native format.
190
+ * On Unix, converts backslashes to forward slashes before normalizing.
191
+ */
192
+ const normalizeSeparators = (p) => {
193
+ if (process.platform === "win32") {
194
+ return path.normalize(p);
195
+ }
196
+ return path.normalize(p.replace(/\\/g, "/"));
197
+ };
198
+ /**
199
+ * Discover Cadence designs in a directory.
200
+ * Uses subtree-scoped matching to associate .dat files with designs.
201
+ */
202
+ export const discoverCadenceDesigns = async (rootDir) => {
203
+ // Normalize separators before resolving to handle cross-platform paths
204
+ const absoluteRootDir = path.resolve(normalizeSeparators(rootDir));
205
+ const { designFiles, datSets } = await walkForCadenceFiles(absoluteRootDir);
206
+ // Match dat sets to designs
207
+ const assignments = matchDatSetsToDesigns(designFiles, datSets);
208
+ const designs = [];
209
+ for (const designPath of designFiles) {
210
+ const rawExt = path.extname(designPath);
211
+ const ext = rawExt.toLowerCase();
212
+ const name = path.basename(designPath, rawExt);
213
+ const format = ext === ".dsn" ? "cadence-cis" : "cadence-hdl";
214
+ const matchedDatSet = assignments.get(designPath);
215
+ const datFiles = matchedDatSet
216
+ ? {
217
+ pstxnet: matchedDatSet.pstxnet,
218
+ pstxprt: matchedDatSet.pstxprt,
219
+ pstchip: matchedDatSet.pstchip,
220
+ }
221
+ : { pstxnet: null, pstxprt: null, pstchip: null };
222
+ const design = {
223
+ name,
224
+ format,
225
+ sourcePath: designPath,
226
+ datFiles,
227
+ };
228
+ if (!matchedDatSet) {
229
+ design.error =
230
+ "Netlist files not exported. Run export_cadence_netlist to generate them.";
231
+ }
232
+ designs.push(design);
233
+ }
234
+ return designs;
235
+ };
236
+ /**
237
+ * Find Cadence .dat files for a specific design file.
238
+ * Searches in the design's directory and all subdirectories.
239
+ */
240
+ export const findCadenceDatFiles = async (designFilePath) => {
241
+ // Normalize separators before processing to handle cross-platform paths
242
+ const normalizedPath = normalizeSeparators(designFilePath);
243
+ const designDir = path.dirname(normalizedPath);
244
+ const designName = path.basename(normalizedPath, path.extname(normalizedPath));
245
+ const { datSets } = await walkForCadenceFiles(designDir);
246
+ // Find dat sets in this design's subtree
247
+ const candidates = datSets.filter((ds) => isDescendantOrEqual(ds.directory, designDir));
248
+ if (candidates.length === 0) {
249
+ return { pstxnet: null, pstxprt: null, pstchip: null };
250
+ }
251
+ // If multiple candidates, pick best by score
252
+ if (candidates.length === 1) {
253
+ const ds = candidates[0];
254
+ return { pstxnet: ds.pstxnet, pstxprt: ds.pstxprt, pstchip: ds.pstchip };
255
+ }
256
+ const scored = candidates.map((ds) => ({
257
+ datSet: ds,
258
+ score: scoreDatSetMatch(designDir, designName, ds),
259
+ }));
260
+ scored.sort((a, b) => b.score - a.score);
261
+ const best = scored[0].datSet;
262
+ return {
263
+ pstxnet: best.pstxnet,
264
+ pstxprt: best.pstxprt,
265
+ pstchip: best.pstchip,
266
+ };
267
+ };
268
+ /**
269
+ * Check if a file path is a Cadence design file.
270
+ */
271
+ export const isCadenceFile = (filePath) => {
272
+ const ext = path.extname(filePath).toLowerCase();
273
+ return CADENCE_EXTENSIONS.includes(ext);
274
+ };
275
+ /** Cadence file extensions */
276
+ export { CADENCE_EXTENSIONS };
277
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/parsers/cadence/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Cadence Parser
3
+ * Functions to parse Cadence netlist files to unified schema
4
+ */
5
+ import type { ChipPart } from "./pstchip-parser.js";
6
+ import { type ParsedNetlist, type ComponentDetails, type EDAProjectFormatHandler } from "../../types.js";
7
+ export { discoverCadenceDesigns, findCadenceDatFiles, isCadenceFile, } from "./discovery.js";
8
+ export { parsePstxnet, parsePstxnetContent } from "./pstxnet-parser.js";
9
+ export { parsePstxprt, parsePstxprtContent } from "./pstxprt-parser.js";
10
+ export { parsePstchip, parsePstchipContent, type ChipPart, } from "./pstchip-parser.js";
11
+ export interface CadenceFilePaths {
12
+ pstxnetPath: string;
13
+ pstxprtPath: string;
14
+ pstchipPath?: string;
15
+ }
16
+ /**
17
+ * Internal Cadence-specific parsed result before post-processing.
18
+ * Contains chips and partNames for cross-referencing during pin mapping.
19
+ */
20
+ export interface CadenceRawNetlist extends ParsedNetlist {
21
+ chips: ChipPart[];
22
+ partNames: Map<string, string>;
23
+ }
24
+ /**
25
+ * Build pin mappings for Cadence netlists.
26
+ * Uses partNames map for cross-referencing with pstchip.dat.
27
+ * Also extracts VALUE from pstchip.dat and sets it on components.
28
+ */
29
+ export declare const buildCadencePinMap: (nets: ParsedNetlist["nets"], components: ComponentDetails, chips: ChipPart[], partNames: Map<string, string>) => void;
30
+ /**
31
+ * Parse Cadence netlist files into internal CadenceRawNetlist schema.
32
+ * Takes absolute paths to the .dat files.
33
+ * Returns partNames for use in post-processing (pin mapping, value extraction).
34
+ */
35
+ export declare const parseCadence: (paths: CadenceFilePaths) => Promise<CadenceRawNetlist>;
36
+ /**
37
+ * Cadence EDA project format handler.
38
+ * Supports Cadence CIS (.dsn) and HDL (.cpm) designs.
39
+ */
40
+ export declare const cadenceHandler: EDAProjectFormatHandler;
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/parsers/cadence/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAQpD,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC7B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,KAAK,QAAQ,GACd,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AA4CD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,aAAa,CAAC,MAAM,CAAC,EAC3B,YAAY,gBAAgB,EAC5B,OAAO,QAAQ,EAAE,EACjB,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC7B,IAiCF,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GACvB,OAAO,gBAAgB,KACtB,OAAO,CAAC,iBAAiB,CAe3B,CAAC;AAiCF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,uBAS5B,CAAC"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Cadence Parser
3
+ * Functions to parse Cadence netlist files to unified schema
4
+ */
5
+ import path from "path";
6
+ import { parsePstxnet } from "./pstxnet-parser.js";
7
+ import { parsePstxprt } from "./pstxprt-parser.js";
8
+ import { parsePstchip } from "./pstchip-parser.js";
9
+ import { discoverCadenceDesigns, findCadenceDatFiles, isCadenceFile, CADENCE_EXTENSIONS, } from "./discovery.js";
10
+ import { isValidRefdes } from "../../circuit-traversal.js";
11
+ import { createPinEntry, } from "../../types.js";
12
+ export { discoverCadenceDesigns, findCadenceDatFiles, isCadenceFile, } from "./discovery.js";
13
+ export { parsePstxnet, parsePstxnetContent } from "./pstxnet-parser.js";
14
+ export { parsePstxprt, parsePstxprtContent } from "./pstxprt-parser.js";
15
+ export { parsePstchip, parsePstchipContent, } from "./pstchip-parser.js";
16
+ // =============================================================================
17
+ // Pin Mapping (Cadence-specific post-processing)
18
+ // =============================================================================
19
+ /**
20
+ * Build a lookup of part name -> pin number -> pin name from pstchip data.
21
+ */
22
+ const buildPinNameMaps = (chips) => {
23
+ const pinNameMaps = new Map();
24
+ for (const chip of chips) {
25
+ const pinMap = new Map();
26
+ for (const [pinName, pinNumber] of Object.entries(chip.pins)) {
27
+ if (!pinNumber) {
28
+ continue;
29
+ }
30
+ pinMap.set(String(pinNumber), String(pinName));
31
+ }
32
+ pinNameMaps.set(chip.part_name, pinMap);
33
+ }
34
+ return pinNameMaps;
35
+ };
36
+ /**
37
+ * Build a lookup of part name -> VALUE from pstchip data.
38
+ */
39
+ const buildValueMap = (chips) => {
40
+ const valueMap = new Map();
41
+ for (const chip of chips) {
42
+ const value = chip.body_properties?.["VALUE"];
43
+ if (value) {
44
+ valueMap.set(chip.part_name, value);
45
+ }
46
+ }
47
+ return valueMap;
48
+ };
49
+ /**
50
+ * Build pin mappings for Cadence netlists.
51
+ * Uses partNames map for cross-referencing with pstchip.dat.
52
+ * Also extracts VALUE from pstchip.dat and sets it on components.
53
+ */
54
+ export const buildCadencePinMap = (nets, components, chips, partNames) => {
55
+ const pinNameMaps = buildPinNameMaps(chips);
56
+ const valueMap = buildValueMap(chips);
57
+ for (const [netName, netConnections] of Object.entries(nets)) {
58
+ for (const [refdes, pins] of Object.entries(netConnections)) {
59
+ // Skip garbage Cadence instance paths (e.g., @DESIGN.SHEET:INS123@PART)
60
+ if (!isValidRefdes(refdes)) {
61
+ continue;
62
+ }
63
+ if (!components[refdes]) {
64
+ components[refdes] = { pins: {} };
65
+ }
66
+ const component = components[refdes];
67
+ const partName = partNames.get(refdes);
68
+ // Set value from pstchip.dat if not already set
69
+ if (partName && !component.value) {
70
+ const value = valueMap.get(partName);
71
+ if (value) {
72
+ component.value = value;
73
+ }
74
+ }
75
+ const pinNameMap = partName ? pinNameMaps.get(partName) : undefined;
76
+ const pinArray = Array.isArray(pins) ? pins : [pins];
77
+ for (const pin of pinArray) {
78
+ const pinName = pinNameMap?.get(pin);
79
+ component.pins[pin] = createPinEntry(pin, pinName, netName);
80
+ }
81
+ }
82
+ }
83
+ };
84
+ // =============================================================================
85
+ // Parsing
86
+ // =============================================================================
87
+ /**
88
+ * Parse Cadence netlist files into internal CadenceRawNetlist schema.
89
+ * Takes absolute paths to the .dat files.
90
+ * Returns partNames for use in post-processing (pin mapping, value extraction).
91
+ */
92
+ export const parseCadence = async (paths) => {
93
+ const nets = await parsePstxnet(paths.pstxnetPath);
94
+ const { components, partNames } = await parsePstxprt(paths.pstxprtPath);
95
+ let chips = [];
96
+ if (paths.pstchipPath) {
97
+ chips = await parsePstchip(paths.pstchipPath);
98
+ }
99
+ return {
100
+ nets,
101
+ components,
102
+ chips,
103
+ partNames,
104
+ };
105
+ };
106
+ /**
107
+ * Parse a Cadence design file by finding its .dat files and parsing them.
108
+ * Includes all Cadence-specific post-processing (pin mapping, value extraction).
109
+ */
110
+ const parseCadenceDesign = async (designPath) => {
111
+ const datFiles = await findCadenceDatFiles(designPath);
112
+ if (!datFiles.pstxnet || !datFiles.pstxprt || !datFiles.pstchip) {
113
+ throw new Error(`Missing netlist files for ${path.basename(designPath)}. Run export_cadence_netlist to generate them.`);
114
+ }
115
+ const raw = await parseCadence({
116
+ pstxnetPath: datFiles.pstxnet,
117
+ pstxprtPath: datFiles.pstxprt,
118
+ pstchipPath: datFiles.pstchip,
119
+ });
120
+ // Apply Cadence-specific pin mapping with names from pstchip.dat
121
+ buildCadencePinMap(raw.nets, raw.components, raw.chips, raw.partNames);
122
+ // Return clean ParsedNetlist without internal chips/partNames
123
+ return {
124
+ nets: raw.nets,
125
+ components: raw.components,
126
+ };
127
+ };
128
+ /**
129
+ * Cadence EDA project format handler.
130
+ * Supports Cadence CIS (.dsn) and HDL (.cpm) designs.
131
+ */
132
+ export const cadenceHandler = {
133
+ name: "cadence",
134
+ extensions: CADENCE_EXTENSIONS,
135
+ canHandle: isCadenceFile,
136
+ discoverDesigns: discoverCadenceDesigns,
137
+ parse: parseCadenceDesign,
138
+ };
139
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/parsers/cadence/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Parser for Cadence .pstchip.dat files
3
+ * Extracts part and pin information
4
+ */
5
+ /**
6
+ * Part information from Cadence pstchip.dat.
7
+ * Used for pin name mapping and value extraction.
8
+ */
9
+ export interface ChipPart {
10
+ part_name: string;
11
+ pins: Record<string, string>;
12
+ body_properties: Record<string, string>;
13
+ }
14
+ /**
15
+ * Parse a .pstchip.dat file and extract part information.
16
+ * Pure function that reads from disk and returns parsed data.
17
+ */
18
+ export declare const parsePstchip: (filePath: string) => Promise<ChipPart[]>;
19
+ /**
20
+ * Parse pstchip file content (pure function for testing).
21
+ */
22
+ export declare const parsePstchipContent: (content: string) => ChipPart[];
23
+ //# sourceMappingURL=pstchip-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pstchip-parser.d.ts","sourceRoot":"","sources":["../../../src/parsers/cadence/pstchip-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,QAAQ,EAAE,CAGvE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,KAAG,QAAQ,EAgE7D,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Parser for Cadence .pstchip.dat files
3
+ * Extracts part and pin information
4
+ */
5
+ import { readFile } from "fs/promises";
6
+ /**
7
+ * Parse a .pstchip.dat file and extract part information.
8
+ * Pure function that reads from disk and returns parsed data.
9
+ */
10
+ export const parsePstchip = async (filePath) => {
11
+ const content = await readFile(filePath, "utf-8");
12
+ return parsePstchipContent(content);
13
+ };
14
+ /**
15
+ * Parse pstchip file content (pure function for testing).
16
+ */
17
+ export const parsePstchipContent = (content) => {
18
+ const lines = content.split("\n").map((line) => line.trim());
19
+ const parts = [];
20
+ let currentPartName = null;
21
+ let currentPins = {};
22
+ let currentBody = {};
23
+ let inPin = false;
24
+ let inBody = false;
25
+ let currentPinName = null;
26
+ const saveCurrentPart = () => {
27
+ if (currentPartName !== null) {
28
+ parts.push({
29
+ part_name: currentPartName,
30
+ pins: currentPins,
31
+ body_properties: currentBody,
32
+ });
33
+ }
34
+ };
35
+ for (const line of lines) {
36
+ if (line.startsWith("primitive ")) {
37
+ saveCurrentPart();
38
+ const match = line.match(/primitive\s+'([^']+)'/);
39
+ currentPartName = match ? match[1] : null;
40
+ currentPins = {};
41
+ currentBody = {};
42
+ inPin = false;
43
+ inBody = false;
44
+ }
45
+ else if (line === "pin") {
46
+ inPin = true;
47
+ inBody = false;
48
+ }
49
+ else if (line === "end_pin;") {
50
+ inPin = false;
51
+ currentPinName = null;
52
+ }
53
+ else if (line === "body") {
54
+ inBody = true;
55
+ inPin = false;
56
+ }
57
+ else if (inPin && line.startsWith("'") && line.includes(":")) {
58
+ const match = line.match(/'([^']+)':/);
59
+ if (match) {
60
+ currentPinName = match[1];
61
+ }
62
+ }
63
+ else if (inPin && line.includes("PIN_NUMBER") && currentPinName) {
64
+ const parts = line.split("=", 2);
65
+ if (parts.length === 2) {
66
+ const value = parts[1].trim().replace(/^['";()]+|['";()]+$/g, "");
67
+ currentPins[currentPinName] = value;
68
+ }
69
+ }
70
+ else if (inBody && line.includes("=")) {
71
+ const [key, ...valueParts] = line.split("=");
72
+ const value = valueParts
73
+ .join("=")
74
+ .trim()
75
+ .replace(/^['"]|['";]+$/g, "");
76
+ currentBody[key.trim()] = value;
77
+ }
78
+ }
79
+ saveCurrentPart();
80
+ return parts;
81
+ };
82
+ //# sourceMappingURL=pstchip-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pstchip-parser.js","sourceRoot":"","sources":["../../../src/parsers/cadence/pstchip-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Parser for Cadence .pstxnet.dat files
3
+ * Extracts net connections in the format: { netName: { refdes: [pinNumbers] } }
4
+ */
5
+ import type { NetConnections } from '../../types.js';
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 declare const parsePstxnet: (filePath: string) => Promise<NetConnections>;
11
+ /**
12
+ * Parse pstxnet file content (pure function for testing).
13
+ */
14
+ export declare const parsePstxnetContent: (content: string) => NetConnections;
15
+ //# sourceMappingURL=pstxnet-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pstxnet-parser.d.ts","sourceRoot":"","sources":["../../../src/parsers/cadence/pstxnet-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,cAAc,CAG3E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,KAAG,cAwCrD,CAAC"}