@circuit-forge/eda-core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +50 -0
- package/dist/erc/checker.d.ts +15 -0
- package/dist/erc/checker.d.ts.map +1 -0
- package/dist/erc/checker.js +267 -0
- package/dist/erc/checker.js.map +1 -0
- package/dist/erc/codes.d.ts +15 -0
- package/dist/erc/codes.d.ts.map +1 -0
- package/dist/erc/codes.js +48 -0
- package/dist/erc/codes.js.map +1 -0
- package/dist/erc/index.d.ts +7 -0
- package/dist/erc/index.d.ts.map +1 -0
- package/dist/erc/index.js +14 -0
- package/dist/erc/index.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/netlist/generator.d.ts +32 -0
- package/dist/netlist/generator.d.ts.map +1 -0
- package/dist/netlist/generator.js +183 -0
- package/dist/netlist/generator.js.map +1 -0
- package/dist/netlist/index.d.ts +6 -0
- package/dist/netlist/index.d.ts.map +1 -0
- package/dist/netlist/index.js +20 -0
- package/dist/netlist/index.js.map +1 -0
- package/dist/netlist/sanitizer.d.ts +45 -0
- package/dist/netlist/sanitizer.d.ts.map +1 -0
- package/dist/netlist/sanitizer.js +145 -0
- package/dist/netlist/sanitizer.js.map +1 -0
- package/dist/parser/csv-parser.d.ts +27 -0
- package/dist/parser/csv-parser.d.ts.map +1 -0
- package/dist/parser/csv-parser.js +198 -0
- package/dist/parser/csv-parser.js.map +1 -0
- package/dist/parser/index.d.ts +6 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +15 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/netlist-parser.d.ts +25 -0
- package/dist/parser/netlist-parser.d.ts.map +1 -0
- package/dist/parser/netlist-parser.js +260 -0
- package/dist/parser/netlist-parser.js.map +1 -0
- package/dist/schemas/analysis.schema.d.ts +298 -0
- package/dist/schemas/analysis.schema.d.ts.map +1 -0
- package/dist/schemas/analysis.schema.js +91 -0
- package/dist/schemas/analysis.schema.js.map +1 -0
- package/dist/schemas/circuit.schema.d.ts +405 -0
- package/dist/schemas/circuit.schema.d.ts.map +1 -0
- package/dist/schemas/circuit.schema.js +121 -0
- package/dist/schemas/circuit.schema.js.map +1 -0
- package/dist/types/analysis.d.ts +61 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +119 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/circuit.d.ts +94 -0
- package/dist/types/circuit.d.ts.map +1 -0
- package/dist/types/circuit.js +32 -0
- package/dist/types/circuit.js.map +1 -0
- package/dist/types/erc.d.ts +68 -0
- package/dist/types/erc.d.ts.map +1 -0
- package/dist/types/erc.js +33 -0
- package/dist/types/erc.js.map +1 -0
- package/dist/types/simulation.d.ts +61 -0
- package/dist/types/simulation.d.ts.map +1 -0
- package/dist/types/simulation.js +43 -0
- package/dist/types/simulation.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +14 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/unit-parser.d.ts +47 -0
- package/dist/utils/unit-parser.d.ts.map +1 -0
- package/dist/utils/unit-parser.js +229 -0
- package/dist/utils/unit-parser.js.map +1 -0
- package/package.json +58 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Abdulberk
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# @circuit-forge/eda-core
|
|
2
|
+
|
|
3
|
+
Circuit manipulation, netlist generation, and SPICE parsing for the **Circuit Forge** EDA
|
|
4
|
+
platform. This package is the **single source of truth** for the `CircuitJson` schema shared
|
|
5
|
+
between the backend, the simulation worker, and the web frontend — reuse it instead of
|
|
6
|
+
re-declaring circuit types.
|
|
7
|
+
|
|
8
|
+
Pure TypeScript, browser-safe (only runtime dependency is [Zod](https://zod.dev) v3).
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install @circuit-forge/eda-core
|
|
14
|
+
# or: pnpm add @circuit-forge/eda-core
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## What's inside
|
|
18
|
+
|
|
19
|
+
- **Types** — `CircuitJson`, `Component`, `Net`, `PinConnection`, `UiJson`, `AnalysisConfig`,
|
|
20
|
+
`SimulationResult`, `DataSeries`, `DataPoint`, `ErcResult`, and the constants
|
|
21
|
+
`COMPONENT_PINS` / `SPICE_PREFIXES`.
|
|
22
|
+
- **Validation (Zod)** — `CircuitJsonSchema`, `UiJsonSchema`, `AnalysisConfigSchema`,
|
|
23
|
+
`SpiceValueSchema`, `ProbeSchema`, plus `validate*` (throwing) and `safeValidate*`
|
|
24
|
+
(result-returning) helpers.
|
|
25
|
+
- **Netlist** — `generateNetlist(circuit, analysisConfig, opts)` and `parseNetlist(text)`.
|
|
26
|
+
- **ERC** — `runErc(circuit)` returns `ErcIssue[]` (e.g. `NO_GROUND`, `MISSING_VALUE`).
|
|
27
|
+
- **SPICE values** — `parseSpiceValue`, `parseTimeValue`, `parseFrequencyValue`
|
|
28
|
+
(remember: `M`/`m` = milli, `MEG` = mega).
|
|
29
|
+
|
|
30
|
+
## Example
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import { safeValidateCircuitJson, generateNetlist, runErc } from '@circuit-forge/eda-core';
|
|
34
|
+
|
|
35
|
+
const result = safeValidateCircuitJson(circuitJsonFromApi);
|
|
36
|
+
if (!result.success) throw new Error('Invalid circuit');
|
|
37
|
+
|
|
38
|
+
const issues = runErc(result.data); // electrical-rule check
|
|
39
|
+
const netlist = generateNetlist(result.data, { type: 'tran', stopTime: '5m', stepTime: '50u' });
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Notes
|
|
43
|
+
|
|
44
|
+
- Component `designator` must match `^[A-Z][A-Z0-9]*[0-9]+$` (must end in a digit, e.g. `R1`, `GND1`).
|
|
45
|
+
- Connectivity lives only in `Component.pins[].netId` → `Net.id`; there is no flat node list.
|
|
46
|
+
- Diodes should omit `model` — a built-in default (`DDEFAULT`) is supplied during netlist generation.
|
|
47
|
+
|
|
48
|
+
## License
|
|
49
|
+
|
|
50
|
+
MIT
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ERC (Electrical Rule Check) Checker
|
|
3
|
+
* Validates circuits for common electrical issues
|
|
4
|
+
*/
|
|
5
|
+
import type { CircuitJson } from '../types/circuit';
|
|
6
|
+
import { ErcResult } from '../types/erc';
|
|
7
|
+
/**
|
|
8
|
+
* Run all ERC checks on a circuit
|
|
9
|
+
*/
|
|
10
|
+
export declare function runErc(circuit: CircuitJson): ErcResult;
|
|
11
|
+
/**
|
|
12
|
+
* Quick check - returns true if circuit passes basic ERC
|
|
13
|
+
*/
|
|
14
|
+
export declare function quickCheck(circuit: CircuitJson): boolean;
|
|
15
|
+
//# sourceMappingURL=checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../../src/erc/checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAwB,SAAS,EAAY,MAAM,cAAc,CAAC;AAqBzE;;GAEG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CA2BtD;AAgTD;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAGxD"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runErc = runErc;
|
|
4
|
+
exports.quickCheck = quickCheck;
|
|
5
|
+
const erc_1 = require("../types/erc");
|
|
6
|
+
const codes_1 = require("./codes");
|
|
7
|
+
/**
|
|
8
|
+
* Expected pin counts for each component type
|
|
9
|
+
*/
|
|
10
|
+
const EXPECTED_PIN_COUNTS = {
|
|
11
|
+
resistor: 2,
|
|
12
|
+
capacitor: 2,
|
|
13
|
+
inductor: 2,
|
|
14
|
+
voltage_source: 2,
|
|
15
|
+
current_source: 2,
|
|
16
|
+
diode: 2,
|
|
17
|
+
ground: 1,
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Components that are considered active sources
|
|
21
|
+
*/
|
|
22
|
+
const ACTIVE_SOURCES = ['voltage_source', 'current_source'];
|
|
23
|
+
/**
|
|
24
|
+
* Run all ERC checks on a circuit
|
|
25
|
+
*/
|
|
26
|
+
function runErc(circuit) {
|
|
27
|
+
const issues = [];
|
|
28
|
+
// Run all checks
|
|
29
|
+
issues.push(...checkEmptyCircuit(circuit));
|
|
30
|
+
issues.push(...checkGround(circuit));
|
|
31
|
+
issues.push(...checkFloatingNodes(circuit));
|
|
32
|
+
issues.push(...checkPinCounts(circuit));
|
|
33
|
+
issues.push(...checkComponentValues(circuit));
|
|
34
|
+
issues.push(...checkVoltageSourceShorts(circuit));
|
|
35
|
+
issues.push(...checkNetConnections(circuit));
|
|
36
|
+
issues.push(...checkActiveSources(circuit));
|
|
37
|
+
// Categorize by severity
|
|
38
|
+
const errors = issues.filter((i) => i.severity === 'error');
|
|
39
|
+
const warnings = issues.filter((i) => i.severity === 'warning');
|
|
40
|
+
const infos = issues.filter((i) => i.severity === 'info');
|
|
41
|
+
return {
|
|
42
|
+
passed: errors.length === 0,
|
|
43
|
+
issues,
|
|
44
|
+
summary: {
|
|
45
|
+
errors: errors.length,
|
|
46
|
+
warnings: warnings.length,
|
|
47
|
+
infos: infos.length,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create an ERC issue
|
|
53
|
+
*/
|
|
54
|
+
function createIssue(code, relatedIds, details, severityOverride) {
|
|
55
|
+
return {
|
|
56
|
+
code,
|
|
57
|
+
severity: severityOverride || codes_1.ERC_SEVERITIES[code],
|
|
58
|
+
message: details ? `${codes_1.ERC_DESCRIPTIONS[code]}: ${details}` : codes_1.ERC_DESCRIPTIONS[code],
|
|
59
|
+
relatedIds,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if circuit is empty
|
|
64
|
+
*/
|
|
65
|
+
function checkEmptyCircuit(circuit) {
|
|
66
|
+
const issues = [];
|
|
67
|
+
// Filter out ground components for this check
|
|
68
|
+
const nonGroundComponents = circuit.components.filter((c) => c.type !== 'ground');
|
|
69
|
+
if (nonGroundComponents.length === 0) {
|
|
70
|
+
issues.push(createIssue(erc_1.ErcCode.EMPTY_CIRCUIT, []));
|
|
71
|
+
}
|
|
72
|
+
return issues;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Check for ground reference
|
|
76
|
+
*/
|
|
77
|
+
function checkGround(circuit) {
|
|
78
|
+
const issues = [];
|
|
79
|
+
// Find ground components
|
|
80
|
+
const groundComponents = circuit.components.filter((c) => c.type === 'ground');
|
|
81
|
+
// Find nets marked as ground
|
|
82
|
+
const groundNets = circuit.nets.filter((n) => n.isGround);
|
|
83
|
+
// Check if there's at least one ground reference
|
|
84
|
+
const hasNodeZero = circuit.nets.some((n) => n.id === '0' || n.name === '0');
|
|
85
|
+
const hasGround = groundComponents.length > 0 || groundNets.length > 0 || hasNodeZero;
|
|
86
|
+
if (!hasGround) {
|
|
87
|
+
issues.push(createIssue(erc_1.ErcCode.NO_GROUND, []));
|
|
88
|
+
}
|
|
89
|
+
// Check for multiple grounds on different nets
|
|
90
|
+
if (groundComponents.length > 1) {
|
|
91
|
+
const groundNetIds = new Set();
|
|
92
|
+
for (const gnd of groundComponents) {
|
|
93
|
+
const pin = gnd.pins[0];
|
|
94
|
+
if (pin?.netId) {
|
|
95
|
+
groundNetIds.add(pin.netId);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (groundNetIds.size > 1) {
|
|
99
|
+
issues.push(createIssue(erc_1.ErcCode.MULTIPLE_GROUNDS, groundComponents.map((c) => c.id), `Found on nets: ${Array.from(groundNetIds).join(', ')}`));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return issues;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Check for floating nodes
|
|
106
|
+
*/
|
|
107
|
+
function checkFloatingNodes(circuit) {
|
|
108
|
+
const issues = [];
|
|
109
|
+
// Build net connection map
|
|
110
|
+
const netPinCount = new Map();
|
|
111
|
+
const netComponents = new Map();
|
|
112
|
+
for (const component of circuit.components) {
|
|
113
|
+
for (const pin of component.pins) {
|
|
114
|
+
if (pin.netId) {
|
|
115
|
+
netPinCount.set(pin.netId, (netPinCount.get(pin.netId) || 0) + 1);
|
|
116
|
+
const components = netComponents.get(pin.netId) || [];
|
|
117
|
+
components.push(component.id);
|
|
118
|
+
netComponents.set(pin.netId, components);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Check each net
|
|
123
|
+
for (const net of circuit.nets) {
|
|
124
|
+
const pinCount = netPinCount.get(net.id) || 0;
|
|
125
|
+
const connectedComponents = netComponents.get(net.id) || [];
|
|
126
|
+
// Skip ground nets
|
|
127
|
+
if (net.isGround || net.id === '0' || net.name === '0') {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (pinCount === 0) {
|
|
131
|
+
issues.push(createIssue(erc_1.ErcCode.UNCONNECTED_NET, [net.id], `Net "${net.name || net.id}"`));
|
|
132
|
+
}
|
|
133
|
+
else if (pinCount === 1) {
|
|
134
|
+
issues.push(createIssue(erc_1.ErcCode.NET_HAS_SINGLE_PIN, [net.id, ...connectedComponents], `Net "${net.name || net.id}" connected to only ${connectedComponents.join(', ')}`));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return issues;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Check component pin counts
|
|
141
|
+
*/
|
|
142
|
+
function checkPinCounts(circuit) {
|
|
143
|
+
const issues = [];
|
|
144
|
+
for (const component of circuit.components) {
|
|
145
|
+
const expected = EXPECTED_PIN_COUNTS[component.type];
|
|
146
|
+
if (expected !== undefined && component.pins.length !== expected) {
|
|
147
|
+
issues.push(createIssue(erc_1.ErcCode.PIN_COUNT_MISMATCH, [component.id], `${component.designator || component.id}: expected ${expected} pins, got ${component.pins.length}`));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return issues;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Check component values
|
|
154
|
+
*/
|
|
155
|
+
function checkComponentValues(circuit) {
|
|
156
|
+
const issues = [];
|
|
157
|
+
// Components that require values
|
|
158
|
+
const requiresValue = ['resistor', 'capacitor', 'inductor', 'voltage_source', 'current_source'];
|
|
159
|
+
// Components that require models
|
|
160
|
+
const requiresModel = ['diode'];
|
|
161
|
+
for (const component of circuit.components) {
|
|
162
|
+
// Check for missing values
|
|
163
|
+
if (requiresValue.includes(component.type) && !component.value) {
|
|
164
|
+
issues.push(createIssue(erc_1.ErcCode.MISSING_VALUE, [component.id], `${component.designator || component.id} (${component.type})`));
|
|
165
|
+
}
|
|
166
|
+
// Check for missing models (warning level)
|
|
167
|
+
if (requiresModel.includes(component.type) && !component.model) {
|
|
168
|
+
issues.push(createIssue(erc_1.ErcCode.MISSING_MODEL, [component.id], `${component.designator || component.id} will use default model`));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return issues;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Check for voltage source shorts
|
|
175
|
+
*/
|
|
176
|
+
function checkVoltageSourceShorts(circuit) {
|
|
177
|
+
const issues = [];
|
|
178
|
+
// Find all voltage sources
|
|
179
|
+
const voltageSources = circuit.components.filter((c) => c.type === 'voltage_source');
|
|
180
|
+
// Find ground net ids
|
|
181
|
+
const groundNetIds = new Set();
|
|
182
|
+
groundNetIds.add('0');
|
|
183
|
+
for (const net of circuit.nets) {
|
|
184
|
+
if (net.isGround) {
|
|
185
|
+
groundNetIds.add(net.id);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
for (const gnd of circuit.components.filter((c) => c.type === 'ground')) {
|
|
189
|
+
const pin = gnd.pins[0];
|
|
190
|
+
if (pin?.netId) {
|
|
191
|
+
groundNetIds.add(pin.netId);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
for (const vs of voltageSources) {
|
|
195
|
+
const posPin = vs.pins.find((p) => p.pinId === '+');
|
|
196
|
+
const negPin = vs.pins.find((p) => p.pinId === '-');
|
|
197
|
+
// Check for short (both pins on same net)
|
|
198
|
+
if (posPin?.netId && posPin.netId === negPin?.netId) {
|
|
199
|
+
issues.push(createIssue(erc_1.ErcCode.VOLTAGE_SOURCE_SHORT, [vs.id], `${vs.designator || vs.id} has both terminals on same net`));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Check for parallel voltage sources with different values
|
|
203
|
+
const netVoltages = new Map();
|
|
204
|
+
for (const vs of voltageSources) {
|
|
205
|
+
const posPin = vs.pins.find((p) => p.pinId === '+');
|
|
206
|
+
const negPin = vs.pins.find((p) => p.pinId === '-');
|
|
207
|
+
// Only check DC sources
|
|
208
|
+
if (vs.value && posPin?.netId && negPin?.netId) {
|
|
209
|
+
const key = `${posPin.netId}:${negPin.netId}`;
|
|
210
|
+
const reverseKey = `${negPin.netId}:${posPin.netId}`;
|
|
211
|
+
const existing = netVoltages.get(key) || netVoltages.get(reverseKey) || [];
|
|
212
|
+
existing.push({ source: vs, value: vs.value });
|
|
213
|
+
netVoltages.set(key, existing);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
for (const [, sources] of netVoltages) {
|
|
217
|
+
if (sources.length > 1) {
|
|
218
|
+
const values = sources.map((s) => s.value);
|
|
219
|
+
const uniqueValues = new Set(values);
|
|
220
|
+
if (uniqueValues.size > 1) {
|
|
221
|
+
issues.push(createIssue(erc_1.ErcCode.PARALLEL_VOLTAGE_SOURCES, sources.map((s) => s.source.id), `Conflicting values: ${values.join(', ')}`));
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return issues;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Check net connections
|
|
229
|
+
*/
|
|
230
|
+
function checkNetConnections(circuit) {
|
|
231
|
+
const issues = [];
|
|
232
|
+
// Build set of nets referenced by components
|
|
233
|
+
const referencedNets = new Set();
|
|
234
|
+
for (const component of circuit.components) {
|
|
235
|
+
for (const pin of component.pins) {
|
|
236
|
+
if (pin.netId) {
|
|
237
|
+
referencedNets.add(pin.netId);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Check for defined but unreferenced nets
|
|
242
|
+
for (const net of circuit.nets) {
|
|
243
|
+
if (!referencedNets.has(net.id) && !net.isGround && net.id !== '0') {
|
|
244
|
+
issues.push(createIssue(erc_1.ErcCode.UNCONNECTED_NET, [net.id], `Net "${net.name || net.id}"`));
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return issues;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Check for active sources
|
|
251
|
+
*/
|
|
252
|
+
function checkActiveSources(circuit) {
|
|
253
|
+
const issues = [];
|
|
254
|
+
const hasActiveSources = circuit.components.some((c) => ACTIVE_SOURCES.includes(c.type));
|
|
255
|
+
if (!hasActiveSources && circuit.components.length > 0) {
|
|
256
|
+
issues.push(createIssue(erc_1.ErcCode.NO_ACTIVE_COMPONENTS, []));
|
|
257
|
+
}
|
|
258
|
+
return issues;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Quick check - returns true if circuit passes basic ERC
|
|
262
|
+
*/
|
|
263
|
+
function quickCheck(circuit) {
|
|
264
|
+
const result = runErc(circuit);
|
|
265
|
+
return result.passed;
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checker.js","sourceRoot":"","sources":["../../src/erc/checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ERC (Electrical Rule Check) Error Codes
|
|
3
|
+
* Re-exports from types and provides descriptions
|
|
4
|
+
*/
|
|
5
|
+
import { ErcCode, ErcSeverity } from '../types/erc';
|
|
6
|
+
export { ErcCode, ErcSeverity };
|
|
7
|
+
/**
|
|
8
|
+
* ERC code descriptions for user-friendly messages
|
|
9
|
+
*/
|
|
10
|
+
export declare const ERC_DESCRIPTIONS: Record<ErcCode, string>;
|
|
11
|
+
/**
|
|
12
|
+
* Default severities for each ERC code
|
|
13
|
+
*/
|
|
14
|
+
export declare const ERC_SEVERITIES: Record<ErcCode, ErcSeverity>;
|
|
15
|
+
//# sourceMappingURL=codes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codes.d.ts","sourceRoot":"","sources":["../../src/erc/codes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAEhC;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAepD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,CAevD,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ERC_SEVERITIES = exports.ERC_DESCRIPTIONS = exports.ErcCode = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* ERC (Electrical Rule Check) Error Codes
|
|
6
|
+
* Re-exports from types and provides descriptions
|
|
7
|
+
*/
|
|
8
|
+
const erc_1 = require("../types/erc");
|
|
9
|
+
Object.defineProperty(exports, "ErcCode", { enumerable: true, get: function () { return erc_1.ErcCode; } });
|
|
10
|
+
/**
|
|
11
|
+
* ERC code descriptions for user-friendly messages
|
|
12
|
+
*/
|
|
13
|
+
exports.ERC_DESCRIPTIONS = {
|
|
14
|
+
[erc_1.ErcCode.NO_GROUND]: 'Circuit has no ground reference (node 0)',
|
|
15
|
+
[erc_1.ErcCode.MULTIPLE_GROUNDS]: 'Circuit has multiple ground components on different nets',
|
|
16
|
+
[erc_1.ErcCode.FLOATING_NODE]: 'Node is not connected to any power or ground path',
|
|
17
|
+
[erc_1.ErcCode.FLOATING_INPUT]: 'Component input pin is floating',
|
|
18
|
+
[erc_1.ErcCode.VOLTAGE_SOURCE_SHORT]: 'Voltage source output is shorted to ground',
|
|
19
|
+
[erc_1.ErcCode.PARALLEL_VOLTAGE_SOURCES]: 'Parallel voltage sources with different values',
|
|
20
|
+
[erc_1.ErcCode.MISSING_VALUE]: 'Component is missing required value',
|
|
21
|
+
[erc_1.ErcCode.INVALID_VALUE]: 'Component has invalid or unparseable value',
|
|
22
|
+
[erc_1.ErcCode.PIN_COUNT_MISMATCH]: 'Component has incorrect number of pins for its type',
|
|
23
|
+
[erc_1.ErcCode.MISSING_MODEL]: 'Component requires a model but none specified',
|
|
24
|
+
[erc_1.ErcCode.UNCONNECTED_NET]: 'Net defined but not connected to any components',
|
|
25
|
+
[erc_1.ErcCode.NET_HAS_SINGLE_PIN]: 'Net has only one pin connection (dead end)',
|
|
26
|
+
[erc_1.ErcCode.EMPTY_CIRCUIT]: 'Circuit contains no components',
|
|
27
|
+
[erc_1.ErcCode.NO_ACTIVE_COMPONENTS]: 'Circuit has no active sources or inputs',
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Default severities for each ERC code
|
|
31
|
+
*/
|
|
32
|
+
exports.ERC_SEVERITIES = {
|
|
33
|
+
[erc_1.ErcCode.NO_GROUND]: 'error',
|
|
34
|
+
[erc_1.ErcCode.MULTIPLE_GROUNDS]: 'warning',
|
|
35
|
+
[erc_1.ErcCode.FLOATING_NODE]: 'warning',
|
|
36
|
+
[erc_1.ErcCode.FLOATING_INPUT]: 'warning',
|
|
37
|
+
[erc_1.ErcCode.VOLTAGE_SOURCE_SHORT]: 'error',
|
|
38
|
+
[erc_1.ErcCode.PARALLEL_VOLTAGE_SOURCES]: 'error',
|
|
39
|
+
[erc_1.ErcCode.MISSING_VALUE]: 'error',
|
|
40
|
+
[erc_1.ErcCode.INVALID_VALUE]: 'error',
|
|
41
|
+
[erc_1.ErcCode.PIN_COUNT_MISMATCH]: 'error',
|
|
42
|
+
[erc_1.ErcCode.MISSING_MODEL]: 'warning',
|
|
43
|
+
[erc_1.ErcCode.UNCONNECTED_NET]: 'info',
|
|
44
|
+
[erc_1.ErcCode.NET_HAS_SINGLE_PIN]: 'warning',
|
|
45
|
+
[erc_1.ErcCode.EMPTY_CIRCUIT]: 'error',
|
|
46
|
+
[erc_1.ErcCode.NO_ACTIVE_COMPONENTS]: 'warning',
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=codes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codes.js","sourceRoot":"","sources":["../../src/erc/codes.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,sCAAoD;AAG3C,wFAHA,aAAO,OAGA;AAEhB;;GAEG;AACU,QAAA,gBAAgB,GAA4B;IACrD,CAAC,aAAO,CAAC,SAAS,CAAC,EAAE,0CAA0C;IAC/D,CAAC,aAAO,CAAC,gBAAgB,CAAC,EAAE,0DAA0D;IACtF,CAAC,aAAO,CAAC,aAAa,CAAC,EAAE,mDAAmD;IAC5E,CAAC,aAAO,CAAC,cAAc,CAAC,EAAE,iCAAiC;IAC3D,CAAC,aAAO,CAAC,oBAAoB,CAAC,EAAE,4CAA4C;IAC5E,CAAC,aAAO,CAAC,wBAAwB,CAAC,EAAE,gDAAgD;IACpF,CAAC,aAAO,CAAC,aAAa,CAAC,EAAE,qCAAqC;IAC9D,CAAC,aAAO,CAAC,aAAa,CAAC,EAAE,4CAA4C;IACrE,CAAC,aAAO,CAAC,kBAAkB,CAAC,EAAE,qDAAqD;IACnF,CAAC,aAAO,CAAC,aAAa,CAAC,EAAE,+CAA+C;IACxE,CAAC,aAAO,CAAC,eAAe,CAAC,EAAE,iDAAiD;IAC5E,CAAC,aAAO,CAAC,kBAAkB,CAAC,EAAE,4CAA4C;IAC1E,CAAC,aAAO,CAAC,aAAa,CAAC,EAAE,gCAAgC;IACzD,CAAC,aAAO,CAAC,oBAAoB,CAAC,EAAE,yCAAyC;CAC5E,CAAC;AAEF;;GAEG;AACU,QAAA,cAAc,GAAiC;IACxD,CAAC,aAAO,CAAC,SAAS,CAAC,EAAE,OAAO;IAC5B,CAAC,aAAO,CAAC,gBAAgB,CAAC,EAAE,SAAS;IACrC,CAAC,aAAO,CAAC,aAAa,CAAC,EAAE,SAAS;IAClC,CAAC,aAAO,CAAC,cAAc,CAAC,EAAE,SAAS;IACnC,CAAC,aAAO,CAAC,oBAAoB,CAAC,EAAE,OAAO;IACvC,CAAC,aAAO,CAAC,wBAAwB,CAAC,EAAE,OAAO;IAC3C,CAAC,aAAO,CAAC,aAAa,CAAC,EAAE,OAAO;IAChC,CAAC,aAAO,CAAC,aAAa,CAAC,EAAE,OAAO;IAChC,CAAC,aAAO,CAAC,kBAAkB,CAAC,EAAE,OAAO;IACrC,CAAC,aAAO,CAAC,aAAa,CAAC,EAAE,SAAS;IAClC,CAAC,aAAO,CAAC,eAAe,CAAC,EAAE,MAAM;IACjC,CAAC,aAAO,CAAC,kBAAkB,CAAC,EAAE,SAAS;IACvC,CAAC,aAAO,CAAC,aAAa,CAAC,EAAE,OAAO;IAChC,CAAC,aAAO,CAAC,oBAAoB,CAAC,EAAE,SAAS;CAC5C,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ERC Module Exports
|
|
3
|
+
*/
|
|
4
|
+
export { runErc, quickCheck } from './checker';
|
|
5
|
+
export { ErcCode, ErcSeverity, ERC_DESCRIPTIONS, ERC_SEVERITIES } from './codes';
|
|
6
|
+
export type { ErcResult, ErcIssue, ErcConfig } from '../types/erc';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/erc/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACjF,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ERC_SEVERITIES = exports.ERC_DESCRIPTIONS = exports.ErcCode = exports.quickCheck = exports.runErc = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* ERC Module Exports
|
|
6
|
+
*/
|
|
7
|
+
var checker_1 = require("./checker");
|
|
8
|
+
Object.defineProperty(exports, "runErc", { enumerable: true, get: function () { return checker_1.runErc; } });
|
|
9
|
+
Object.defineProperty(exports, "quickCheck", { enumerable: true, get: function () { return checker_1.quickCheck; } });
|
|
10
|
+
var codes_1 = require("./codes");
|
|
11
|
+
Object.defineProperty(exports, "ErcCode", { enumerable: true, get: function () { return codes_1.ErcCode; } });
|
|
12
|
+
Object.defineProperty(exports, "ERC_DESCRIPTIONS", { enumerable: true, get: function () { return codes_1.ERC_DESCRIPTIONS; } });
|
|
13
|
+
Object.defineProperty(exports, "ERC_SEVERITIES", { enumerable: true, get: function () { return codes_1.ERC_SEVERITIES; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/erc/index.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,qCAA+C;AAAtC,iGAAA,MAAM,OAAA;AAAE,qGAAA,UAAU,OAAA;AAC3B,iCAAiF;AAAxE,gGAAA,OAAO,OAAA;AAAe,yGAAA,gBAAgB,OAAA;AAAE,uGAAA,cAAc,OAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EDA-Core Library
|
|
3
|
+
* Core EDA functionality for circuit manipulation, netlist generation, and simulation output parsing
|
|
4
|
+
*/
|
|
5
|
+
export type { CircuitJson, Component, Net, PinConnection, ComponentType, CircuitMetadata, UiJson, Viewport, Position, Wire, } from './types/circuit';
|
|
6
|
+
export { COMPONENT_PINS, SPICE_PREFIXES } from './types/circuit';
|
|
7
|
+
export type { AnalysisConfig, TranAnalysis, AcAnalysis, DcAnalysis, OpAnalysis, } from './types/analysis';
|
|
8
|
+
export type { SimulationResult, DataSeries, DataPoint, ResultMeta, } from './types/simulation';
|
|
9
|
+
export type { ErcResult, ErcIssue, ErcConfig, } from './types/erc';
|
|
10
|
+
export { ErcCode } from './types/erc';
|
|
11
|
+
export type { ErcSeverity } from './types/erc';
|
|
12
|
+
export { CircuitJsonSchema, ComponentSchema, NetSchema, ComponentTypeSchema, PinConnectionSchema, CircuitMetadataSchema, ViewportSchema, PositionSchema, WireSchema, UiJsonSchema, validateCircuitJson, safeValidateCircuitJson, validateUiJson, type CircuitJsonInput, type CircuitJsonOutput, type ComponentInput, type NetInput, type UiJsonInput, } from './schemas/circuit.schema';
|
|
13
|
+
export { AnalysisConfigSchema, TranAnalysisSchema, AcAnalysisSchema, DcAnalysisSchema, OpAnalysisSchema, SpiceValueSchema, ProbeSchema, SimulationRequestSchema, validateAnalysisConfig, safeValidateAnalysisConfig, validateSimulationRequest, type AnalysisConfigInput, type AnalysisConfigOutput, type SimulationRequestInput, } from './schemas/analysis.schema';
|
|
14
|
+
export { generateNetlist, getNodeNames, validateNetlist, type NetlistOptions, } from './netlist';
|
|
15
|
+
export { sanitizeNodeName, validateIncludePaths, validateIncludePath, sanitizeNetlist, sanitizeValue, validateDesignator, hasShellMetacharacters, SecurityError, } from './netlist';
|
|
16
|
+
export { parseCsv, parseRawAscii, detectOutputFormat, parseSimulationOutput, } from './parser';
|
|
17
|
+
export { parseNetlist, extractProbes, type NetlistParseResult, } from './parser';
|
|
18
|
+
export { runErc, quickCheck, ERC_DESCRIPTIONS, ERC_SEVERITIES, } from './erc';
|
|
19
|
+
export { parseSpiceValue, formatSpiceValue, normalizeValue, valuesEqual, parseTimeValue, parseFrequencyValue, type ParsedValue, } from './utils';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACR,WAAW,EACX,SAAS,EACT,GAAG,EACH,aAAa,EACb,aAAa,EACb,eAAe,EACf,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,IAAI,GACP,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjE,YAAY,EACR,cAAc,EACd,YAAY,EACZ,UAAU,EACV,UAAU,EACV,UAAU,GACb,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACR,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,UAAU,GACb,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACR,SAAS,EACT,QAAQ,EACR,SAAS,GACZ,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EACH,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,UAAU,EACV,YAAY,EACZ,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,WAAW,GACnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACH,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,uBAAuB,EACvB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EACzB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC9B,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACH,eAAe,EACf,YAAY,EACZ,eAAe,EACf,KAAK,cAAc,GACtB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACH,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,GAChB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACH,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,qBAAqB,GACxB,MAAM,UAAU,CAAC;AAElB,OAAO,EACH,YAAY,EACZ,aAAa,EACb,KAAK,kBAAkB,GAC1B,MAAM,UAAU,CAAC;AAGlB,OAAO,EACH,MAAM,EACN,UAAU,EACV,gBAAgB,EAChB,cAAc,GACjB,MAAM,OAAO,CAAC;AAGf,OAAO,EACH,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,KAAK,WAAW,GACnB,MAAM,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* EDA-Core Library
|
|
4
|
+
* Core EDA functionality for circuit manipulation, netlist generation, and simulation output parsing
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.formatSpiceValue = exports.parseSpiceValue = exports.ERC_SEVERITIES = exports.ERC_DESCRIPTIONS = exports.quickCheck = exports.runErc = exports.extractProbes = exports.parseNetlist = exports.parseSimulationOutput = exports.detectOutputFormat = exports.parseRawAscii = exports.parseCsv = exports.SecurityError = exports.hasShellMetacharacters = exports.validateDesignator = exports.sanitizeValue = exports.sanitizeNetlist = exports.validateIncludePath = exports.validateIncludePaths = exports.sanitizeNodeName = exports.validateNetlist = exports.getNodeNames = exports.generateNetlist = exports.validateSimulationRequest = exports.safeValidateAnalysisConfig = exports.validateAnalysisConfig = exports.SimulationRequestSchema = exports.ProbeSchema = exports.SpiceValueSchema = exports.OpAnalysisSchema = exports.DcAnalysisSchema = exports.AcAnalysisSchema = exports.TranAnalysisSchema = exports.AnalysisConfigSchema = exports.validateUiJson = exports.safeValidateCircuitJson = exports.validateCircuitJson = exports.UiJsonSchema = exports.WireSchema = exports.PositionSchema = exports.ViewportSchema = exports.CircuitMetadataSchema = exports.PinConnectionSchema = exports.ComponentTypeSchema = exports.NetSchema = exports.ComponentSchema = exports.CircuitJsonSchema = exports.ErcCode = exports.SPICE_PREFIXES = exports.COMPONENT_PINS = void 0;
|
|
8
|
+
exports.parseFrequencyValue = exports.parseTimeValue = exports.valuesEqual = exports.normalizeValue = void 0;
|
|
9
|
+
var circuit_1 = require("./types/circuit");
|
|
10
|
+
Object.defineProperty(exports, "COMPONENT_PINS", { enumerable: true, get: function () { return circuit_1.COMPONENT_PINS; } });
|
|
11
|
+
Object.defineProperty(exports, "SPICE_PREFIXES", { enumerable: true, get: function () { return circuit_1.SPICE_PREFIXES; } });
|
|
12
|
+
var erc_1 = require("./types/erc");
|
|
13
|
+
Object.defineProperty(exports, "ErcCode", { enumerable: true, get: function () { return erc_1.ErcCode; } });
|
|
14
|
+
// Schemas
|
|
15
|
+
var circuit_schema_1 = require("./schemas/circuit.schema");
|
|
16
|
+
Object.defineProperty(exports, "CircuitJsonSchema", { enumerable: true, get: function () { return circuit_schema_1.CircuitJsonSchema; } });
|
|
17
|
+
Object.defineProperty(exports, "ComponentSchema", { enumerable: true, get: function () { return circuit_schema_1.ComponentSchema; } });
|
|
18
|
+
Object.defineProperty(exports, "NetSchema", { enumerable: true, get: function () { return circuit_schema_1.NetSchema; } });
|
|
19
|
+
Object.defineProperty(exports, "ComponentTypeSchema", { enumerable: true, get: function () { return circuit_schema_1.ComponentTypeSchema; } });
|
|
20
|
+
Object.defineProperty(exports, "PinConnectionSchema", { enumerable: true, get: function () { return circuit_schema_1.PinConnectionSchema; } });
|
|
21
|
+
Object.defineProperty(exports, "CircuitMetadataSchema", { enumerable: true, get: function () { return circuit_schema_1.CircuitMetadataSchema; } });
|
|
22
|
+
Object.defineProperty(exports, "ViewportSchema", { enumerable: true, get: function () { return circuit_schema_1.ViewportSchema; } });
|
|
23
|
+
Object.defineProperty(exports, "PositionSchema", { enumerable: true, get: function () { return circuit_schema_1.PositionSchema; } });
|
|
24
|
+
Object.defineProperty(exports, "WireSchema", { enumerable: true, get: function () { return circuit_schema_1.WireSchema; } });
|
|
25
|
+
Object.defineProperty(exports, "UiJsonSchema", { enumerable: true, get: function () { return circuit_schema_1.UiJsonSchema; } });
|
|
26
|
+
Object.defineProperty(exports, "validateCircuitJson", { enumerable: true, get: function () { return circuit_schema_1.validateCircuitJson; } });
|
|
27
|
+
Object.defineProperty(exports, "safeValidateCircuitJson", { enumerable: true, get: function () { return circuit_schema_1.safeValidateCircuitJson; } });
|
|
28
|
+
Object.defineProperty(exports, "validateUiJson", { enumerable: true, get: function () { return circuit_schema_1.validateUiJson; } });
|
|
29
|
+
var analysis_schema_1 = require("./schemas/analysis.schema");
|
|
30
|
+
Object.defineProperty(exports, "AnalysisConfigSchema", { enumerable: true, get: function () { return analysis_schema_1.AnalysisConfigSchema; } });
|
|
31
|
+
Object.defineProperty(exports, "TranAnalysisSchema", { enumerable: true, get: function () { return analysis_schema_1.TranAnalysisSchema; } });
|
|
32
|
+
Object.defineProperty(exports, "AcAnalysisSchema", { enumerable: true, get: function () { return analysis_schema_1.AcAnalysisSchema; } });
|
|
33
|
+
Object.defineProperty(exports, "DcAnalysisSchema", { enumerable: true, get: function () { return analysis_schema_1.DcAnalysisSchema; } });
|
|
34
|
+
Object.defineProperty(exports, "OpAnalysisSchema", { enumerable: true, get: function () { return analysis_schema_1.OpAnalysisSchema; } });
|
|
35
|
+
Object.defineProperty(exports, "SpiceValueSchema", { enumerable: true, get: function () { return analysis_schema_1.SpiceValueSchema; } });
|
|
36
|
+
Object.defineProperty(exports, "ProbeSchema", { enumerable: true, get: function () { return analysis_schema_1.ProbeSchema; } });
|
|
37
|
+
Object.defineProperty(exports, "SimulationRequestSchema", { enumerable: true, get: function () { return analysis_schema_1.SimulationRequestSchema; } });
|
|
38
|
+
Object.defineProperty(exports, "validateAnalysisConfig", { enumerable: true, get: function () { return analysis_schema_1.validateAnalysisConfig; } });
|
|
39
|
+
Object.defineProperty(exports, "safeValidateAnalysisConfig", { enumerable: true, get: function () { return analysis_schema_1.safeValidateAnalysisConfig; } });
|
|
40
|
+
Object.defineProperty(exports, "validateSimulationRequest", { enumerable: true, get: function () { return analysis_schema_1.validateSimulationRequest; } });
|
|
41
|
+
// Netlist generation
|
|
42
|
+
var netlist_1 = require("./netlist");
|
|
43
|
+
Object.defineProperty(exports, "generateNetlist", { enumerable: true, get: function () { return netlist_1.generateNetlist; } });
|
|
44
|
+
Object.defineProperty(exports, "getNodeNames", { enumerable: true, get: function () { return netlist_1.getNodeNames; } });
|
|
45
|
+
Object.defineProperty(exports, "validateNetlist", { enumerable: true, get: function () { return netlist_1.validateNetlist; } });
|
|
46
|
+
// Netlist sanitization
|
|
47
|
+
var netlist_2 = require("./netlist");
|
|
48
|
+
Object.defineProperty(exports, "sanitizeNodeName", { enumerable: true, get: function () { return netlist_2.sanitizeNodeName; } });
|
|
49
|
+
Object.defineProperty(exports, "validateIncludePaths", { enumerable: true, get: function () { return netlist_2.validateIncludePaths; } });
|
|
50
|
+
Object.defineProperty(exports, "validateIncludePath", { enumerable: true, get: function () { return netlist_2.validateIncludePath; } });
|
|
51
|
+
Object.defineProperty(exports, "sanitizeNetlist", { enumerable: true, get: function () { return netlist_2.sanitizeNetlist; } });
|
|
52
|
+
Object.defineProperty(exports, "sanitizeValue", { enumerable: true, get: function () { return netlist_2.sanitizeValue; } });
|
|
53
|
+
Object.defineProperty(exports, "validateDesignator", { enumerable: true, get: function () { return netlist_2.validateDesignator; } });
|
|
54
|
+
Object.defineProperty(exports, "hasShellMetacharacters", { enumerable: true, get: function () { return netlist_2.hasShellMetacharacters; } });
|
|
55
|
+
Object.defineProperty(exports, "SecurityError", { enumerable: true, get: function () { return netlist_2.SecurityError; } });
|
|
56
|
+
// Parsing
|
|
57
|
+
var parser_1 = require("./parser");
|
|
58
|
+
Object.defineProperty(exports, "parseCsv", { enumerable: true, get: function () { return parser_1.parseCsv; } });
|
|
59
|
+
Object.defineProperty(exports, "parseRawAscii", { enumerable: true, get: function () { return parser_1.parseRawAscii; } });
|
|
60
|
+
Object.defineProperty(exports, "detectOutputFormat", { enumerable: true, get: function () { return parser_1.detectOutputFormat; } });
|
|
61
|
+
Object.defineProperty(exports, "parseSimulationOutput", { enumerable: true, get: function () { return parser_1.parseSimulationOutput; } });
|
|
62
|
+
var parser_2 = require("./parser");
|
|
63
|
+
Object.defineProperty(exports, "parseNetlist", { enumerable: true, get: function () { return parser_2.parseNetlist; } });
|
|
64
|
+
Object.defineProperty(exports, "extractProbes", { enumerable: true, get: function () { return parser_2.extractProbes; } });
|
|
65
|
+
// ERC
|
|
66
|
+
var erc_2 = require("./erc");
|
|
67
|
+
Object.defineProperty(exports, "runErc", { enumerable: true, get: function () { return erc_2.runErc; } });
|
|
68
|
+
Object.defineProperty(exports, "quickCheck", { enumerable: true, get: function () { return erc_2.quickCheck; } });
|
|
69
|
+
Object.defineProperty(exports, "ERC_DESCRIPTIONS", { enumerable: true, get: function () { return erc_2.ERC_DESCRIPTIONS; } });
|
|
70
|
+
Object.defineProperty(exports, "ERC_SEVERITIES", { enumerable: true, get: function () { return erc_2.ERC_SEVERITIES; } });
|
|
71
|
+
// Utilities
|
|
72
|
+
var utils_1 = require("./utils");
|
|
73
|
+
Object.defineProperty(exports, "parseSpiceValue", { enumerable: true, get: function () { return utils_1.parseSpiceValue; } });
|
|
74
|
+
Object.defineProperty(exports, "formatSpiceValue", { enumerable: true, get: function () { return utils_1.formatSpiceValue; } });
|
|
75
|
+
Object.defineProperty(exports, "normalizeValue", { enumerable: true, get: function () { return utils_1.normalizeValue; } });
|
|
76
|
+
Object.defineProperty(exports, "valuesEqual", { enumerable: true, get: function () { return utils_1.valuesEqual; } });
|
|
77
|
+
Object.defineProperty(exports, "parseTimeValue", { enumerable: true, get: function () { return utils_1.parseTimeValue; } });
|
|
78
|
+
Object.defineProperty(exports, "parseFrequencyValue", { enumerable: true, get: function () { return utils_1.parseFrequencyValue; } });
|
|
79
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;AAgBH,2CAAiE;AAAxD,yGAAA,cAAc,OAAA;AAAE,yGAAA,cAAc,OAAA;AAuBvC,mCAAsC;AAA7B,8FAAA,OAAO,OAAA;AAGhB,UAAU;AACV,2DAmBkC;AAlB9B,mHAAA,iBAAiB,OAAA;AACjB,iHAAA,eAAe,OAAA;AACf,2GAAA,SAAS,OAAA;AACT,qHAAA,mBAAmB,OAAA;AACnB,qHAAA,mBAAmB,OAAA;AACnB,uHAAA,qBAAqB,OAAA;AACrB,gHAAA,cAAc,OAAA;AACd,gHAAA,cAAc,OAAA;AACd,4GAAA,UAAU,OAAA;AACV,8GAAA,YAAY,OAAA;AACZ,qHAAA,mBAAmB,OAAA;AACnB,yHAAA,uBAAuB,OAAA;AACvB,gHAAA,cAAc,OAAA;AAQlB,6DAemC;AAd/B,uHAAA,oBAAoB,OAAA;AACpB,qHAAA,kBAAkB,OAAA;AAClB,mHAAA,gBAAgB,OAAA;AAChB,mHAAA,gBAAgB,OAAA;AAChB,mHAAA,gBAAgB,OAAA;AAChB,mHAAA,gBAAgB,OAAA;AAChB,8GAAA,WAAW,OAAA;AACX,0HAAA,uBAAuB,OAAA;AACvB,yHAAA,sBAAsB,OAAA;AACtB,6HAAA,0BAA0B,OAAA;AAC1B,4HAAA,yBAAyB,OAAA;AAM7B,qBAAqB;AACrB,qCAKmB;AAJf,0GAAA,eAAe,OAAA;AACf,uGAAA,YAAY,OAAA;AACZ,0GAAA,eAAe,OAAA;AAInB,uBAAuB;AACvB,qCASmB;AARf,2GAAA,gBAAgB,OAAA;AAChB,+GAAA,oBAAoB,OAAA;AACpB,8GAAA,mBAAmB,OAAA;AACnB,0GAAA,eAAe,OAAA;AACf,wGAAA,aAAa,OAAA;AACb,6GAAA,kBAAkB,OAAA;AAClB,iHAAA,sBAAsB,OAAA;AACtB,wGAAA,aAAa,OAAA;AAGjB,UAAU;AACV,mCAKkB;AAJd,kGAAA,QAAQ,OAAA;AACR,uGAAA,aAAa,OAAA;AACb,4GAAA,kBAAkB,OAAA;AAClB,+GAAA,qBAAqB,OAAA;AAGzB,mCAIkB;AAHd,sGAAA,YAAY,OAAA;AACZ,uGAAA,aAAa,OAAA;AAIjB,MAAM;AACN,6BAKe;AAJX,6FAAA,MAAM,OAAA;AACN,iGAAA,UAAU,OAAA;AACV,uGAAA,gBAAgB,OAAA;AAChB,qGAAA,cAAc,OAAA;AAGlB,YAAY;AACZ,iCAQiB;AAPb,wGAAA,eAAe,OAAA;AACf,yGAAA,gBAAgB,OAAA;AAChB,uGAAA,cAAc,OAAA;AACd,oGAAA,WAAW,OAAA;AACX,uGAAA,cAAc,OAAA;AACd,4GAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SPICE Netlist Generator
|
|
3
|
+
* Converts CircuitJson to ngspice-compatible netlist format
|
|
4
|
+
*/
|
|
5
|
+
import type { CircuitJson } from '../types/circuit';
|
|
6
|
+
import type { AnalysisConfig } from '../types/analysis';
|
|
7
|
+
/**
|
|
8
|
+
* Netlist generation options
|
|
9
|
+
*/
|
|
10
|
+
export interface NetlistOptions {
|
|
11
|
+
title?: string;
|
|
12
|
+
probes?: string[];
|
|
13
|
+
includeFiles?: string[];
|
|
14
|
+
outputFormat?: 'csv' | 'raw';
|
|
15
|
+
jobDir?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Generate a complete SPICE netlist from circuit JSON
|
|
19
|
+
*/
|
|
20
|
+
export declare function generateNetlist(circuit: CircuitJson, analysis: AnalysisConfig, options?: NetlistOptions): string;
|
|
21
|
+
/**
|
|
22
|
+
* Get all unique node names from a circuit
|
|
23
|
+
*/
|
|
24
|
+
export declare function getNodeNames(circuit: CircuitJson): string[];
|
|
25
|
+
/**
|
|
26
|
+
* Validate that a netlist is syntactically correct (basic check)
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateNetlist(netlist: string): {
|
|
29
|
+
valid: boolean;
|
|
30
|
+
errors: string[];
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/netlist/generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKxD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAOD;;GAEG;AACH,wBAAgB,eAAe,CAC3B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,cAAmB,GAC7B,MAAM,CAoER;AAuFD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,EAAE,CAG3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAyCrF"}
|