easyeda-mcp-pro 0.3.2 → 0.5.2
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/README.md +369 -52
- package/dist/bom-quality/adapter.d.ts +90 -0
- package/dist/bom-quality/adapter.js +295 -0
- package/dist/bom-quality/adapter.js.map +1 -0
- package/dist/bom-quality/index.d.ts +10 -0
- package/dist/bom-quality/index.js +9 -0
- package/dist/bom-quality/index.js.map +1 -0
- package/dist/bom-quality/quality.d.ts +28 -0
- package/dist/bom-quality/quality.js +179 -0
- package/dist/bom-quality/quality.js.map +1 -0
- package/dist/bom-quality/types.d.ts +94 -0
- package/dist/bom-quality/types.js +12 -0
- package/dist/bom-quality/types.js.map +1 -0
- package/dist/bridge/manager.d.ts +41 -0
- package/dist/bridge/manager.js +334 -47
- package/dist/bridge/manager.js.map +1 -1
- package/dist/bridge/protocol.d.ts +48 -1
- package/dist/bridge/protocol.js +43 -1
- package/dist/bridge/protocol.js.map +1 -1
- package/dist/bridge/types.d.ts +6 -0
- package/dist/bridge/types.js +6 -0
- package/dist/bridge/types.js.map +1 -1
- package/dist/catalog/errors.d.ts +49 -0
- package/dist/catalog/errors.js +60 -0
- package/dist/catalog/errors.js.map +1 -0
- package/dist/catalog/index.d.ts +15 -0
- package/dist/catalog/index.js +17 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/schema.d.ts +268 -0
- package/dist/catalog/schema.js +245 -0
- package/dist/catalog/schema.js.map +1 -0
- package/dist/catalog/starter.d.ts +159 -0
- package/dist/catalog/starter.js +579 -0
- package/dist/catalog/starter.js.map +1 -0
- package/dist/catalog/validation.d.ts +48 -0
- package/dist/catalog/validation.js +263 -0
- package/dist/catalog/validation.js.map +1 -0
- package/dist/circuit/circuit-ir.d.ts +460 -0
- package/dist/circuit/circuit-ir.js +292 -0
- package/dist/circuit/circuit-ir.js.map +1 -0
- package/dist/circuit/compiler.d.ts +55 -0
- package/dist/circuit/compiler.js +197 -0
- package/dist/circuit/compiler.js.map +1 -0
- package/dist/circuit/design-intent.d.ts +94 -0
- package/dist/circuit/design-intent.js +118 -0
- package/dist/circuit/design-intent.js.map +1 -0
- package/dist/circuit/errors.d.ts +50 -0
- package/dist/circuit/errors.js +61 -0
- package/dist/circuit/errors.js.map +1 -0
- package/dist/circuit/index.d.ts +17 -0
- package/dist/circuit/index.js +18 -0
- package/dist/circuit/index.js.map +1 -0
- package/dist/circuit/types.d.ts +186 -0
- package/dist/circuit/types.js +123 -0
- package/dist/circuit/types.js.map +1 -0
- package/dist/cli/auto-setup.d.ts +5 -0
- package/dist/cli/auto-setup.js +355 -0
- package/dist/cli/auto-setup.js.map +1 -0
- package/dist/cli/client-definitions.d.ts +34 -0
- package/dist/cli/client-definitions.js +194 -0
- package/dist/cli/client-definitions.js.map +1 -0
- package/dist/cli/local-setup.d.ts +5 -1
- package/dist/cli/local-setup.js +40 -6
- package/dist/cli/local-setup.js.map +1 -1
- package/dist/config/env.d.ts +6 -1
- package/dist/config/env.js +93 -5
- package/dist/config/env.js.map +1 -1
- package/dist/config/profiles.js +4 -4
- package/dist/config/version.d.ts +1 -1
- package/dist/config/version.js +1 -1
- package/dist/export-manifest/errors.d.ts +55 -0
- package/dist/export-manifest/errors.js +69 -0
- package/dist/export-manifest/errors.js.map +1 -0
- package/dist/export-manifest/index.d.ts +10 -0
- package/dist/export-manifest/index.js +9 -0
- package/dist/export-manifest/index.js.map +1 -0
- package/dist/export-manifest/types.d.ts +170 -0
- package/dist/export-manifest/types.js +36 -0
- package/dist/export-manifest/types.js.map +1 -0
- package/dist/export-manifest/validation.d.ts +39 -0
- package/dist/export-manifest/validation.js +298 -0
- package/dist/export-manifest/validation.js.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -1
- package/dist/net-validation/errors.d.ts +89 -0
- package/dist/net-validation/errors.js +69 -0
- package/dist/net-validation/errors.js.map +1 -0
- package/dist/net-validation/fixtures.d.ts +38 -0
- package/dist/net-validation/fixtures.js +215 -0
- package/dist/net-validation/fixtures.js.map +1 -0
- package/dist/net-validation/index.d.ts +10 -0
- package/dist/net-validation/index.js +9 -0
- package/dist/net-validation/index.js.map +1 -0
- package/dist/net-validation/schema.d.ts +118 -0
- package/dist/net-validation/schema.js +140 -0
- package/dist/net-validation/schema.js.map +1 -0
- package/dist/net-validation/validation.d.ts +45 -0
- package/dist/net-validation/validation.js +369 -0
- package/dist/net-validation/validation.js.map +1 -0
- package/dist/pcb-constraints/errors.d.ts +39 -0
- package/dist/pcb-constraints/errors.js +133 -0
- package/dist/pcb-constraints/errors.js.map +1 -0
- package/dist/pcb-constraints/index.d.ts +9 -0
- package/dist/pcb-constraints/index.js +9 -0
- package/dist/pcb-constraints/index.js.map +1 -0
- package/dist/pcb-constraints/types.d.ts +102 -0
- package/dist/pcb-constraints/types.js +7 -0
- package/dist/pcb-constraints/types.js.map +1 -0
- package/dist/pcb-constraints/validation.d.ts +70 -0
- package/dist/pcb-constraints/validation.js +309 -0
- package/dist/pcb-constraints/validation.js.map +1 -0
- package/dist/server/factory.js +2 -0
- package/dist/server/factory.js.map +1 -1
- package/dist/server/transports/http.d.ts +20 -1
- package/dist/server/transports/http.js +156 -34
- package/dist/server/transports/http.js.map +1 -1
- package/dist/storage/database.d.ts +25 -0
- package/dist/storage/database.js +126 -51
- package/dist/storage/database.js.map +1 -1
- package/dist/tools/{L0_diagnostics.d.ts → L0_diagnostics_api.d.ts} +2 -2
- package/dist/tools/L0_diagnostics_api.js +152 -0
- package/dist/tools/L0_diagnostics_api.js.map +1 -0
- package/dist/tools/L0_diagnostics_core.d.ts +6 -0
- package/dist/tools/{L0_diagnostics.js → L0_diagnostics_core.js} +50 -124
- package/dist/tools/L0_diagnostics_core.js.map +1 -0
- package/dist/tools/L1_board.js +20 -4
- package/dist/tools/L1_board.js.map +1 -1
- package/dist/tools/{L1_bom.d.ts → L1_bom_core.d.ts} +2 -2
- package/dist/tools/{L1_bom.js → L1_bom_core.js} +21 -101
- package/dist/tools/L1_bom_core.js.map +1 -0
- package/dist/tools/{L1_schematic.d.ts → L1_bom_sourcing.d.ts} +2 -2
- package/dist/tools/L1_bom_sourcing.js +265 -0
- package/dist/tools/L1_bom_sourcing.js.map +1 -0
- package/dist/tools/L1_drc_erc.js +15 -3
- package/dist/tools/L1_drc_erc.js.map +1 -1
- package/dist/tools/L1_export.js +20 -4
- package/dist/tools/L1_export.js.map +1 -1
- package/dist/tools/L1_pcb_constraints.d.ts +6 -0
- package/dist/tools/L1_pcb_constraints.js +234 -0
- package/dist/tools/L1_pcb_constraints.js.map +1 -0
- package/dist/tools/L1_pcb_write.js +26 -12
- package/dist/tools/L1_pcb_write.js.map +1 -1
- package/dist/tools/L1_schematic_read.d.ts +6 -0
- package/dist/tools/{L1_schematic.js → L1_schematic_read.js} +125 -190
- package/dist/tools/L1_schematic_read.js.map +1 -0
- package/dist/tools/L1_schematic_write.d.ts +6 -0
- package/dist/tools/L1_schematic_write.js +516 -0
- package/dist/tools/L1_schematic_write.js.map +1 -0
- package/dist/tools/register.js +15 -7
- package/dist/tools/register.js.map +1 -1
- package/dist/tools/registry.d.ts +41 -7
- package/dist/tools/registry.js +111 -12
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/types.d.ts +16 -0
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/vendors/base-http-client.d.ts +48 -0
- package/dist/vendors/base-http-client.js +75 -0
- package/dist/vendors/base-http-client.js.map +1 -0
- package/dist/vendors/digikey/client.js +10 -19
- package/dist/vendors/digikey/client.js.map +1 -1
- package/dist/vendors/jlcpcb/client.js +41 -70
- package/dist/vendors/jlcpcb/client.js.map +1 -1
- package/dist/vendors/lcsc/client.js +5 -18
- package/dist/vendors/lcsc/client.js.map +1 -1
- package/dist/vendors/mouser/client.js +4 -12
- package/dist/vendors/mouser/client.js.map +1 -1
- package/easyeda-bridge-extension.eext +0 -0
- package/package.json +41 -26
- package/dist/tools/L0_diagnostics.js.map +0 -1
- package/dist/tools/L1_bom.js.map +0 -1
- package/dist/tools/L1_schematic.js.map +0 -1
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CircuitIR — versioned, validated, machine-readable circuit model.
|
|
3
|
+
*
|
|
4
|
+
* CircuitIR is the **source of truth** for downstream EasyEDA operations.
|
|
5
|
+
* It is produced by compiling a DesignIntent, but can also be authored or
|
|
6
|
+
* edited directly for advanced use cases.
|
|
7
|
+
*
|
|
8
|
+
* Every significant node (Block, Device, Net, Rail) carries a `designIntentRef`
|
|
9
|
+
* array for traceability back to the originating DesignIntent requirements.
|
|
10
|
+
*
|
|
11
|
+
* @schema circuit-ir/v1
|
|
12
|
+
*/
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import { ValidationStatus, NetType, ConstraintSeverity, ConstraintType, BoardLayerType, KeepoutRestriction, PlacementSide, PlacementZoneType, MountingHoleType, } from './types.js';
|
|
15
|
+
import { CircuitError, CircuitErrorCode, fromZodError } from './errors.js';
|
|
16
|
+
// ── Schema constants ──────────────────────────────────────────────────────
|
|
17
|
+
const MAX_STRING_LENGTH = 1024;
|
|
18
|
+
const MAX_DESCRIPTION_LENGTH = 2048;
|
|
19
|
+
// Field length constraints
|
|
20
|
+
const MAX_ID_LENGTH = 64;
|
|
21
|
+
const MAX_NAME_LENGTH = 128;
|
|
22
|
+
const MAX_TYPE_LENGTH = 64;
|
|
23
|
+
const MAX_REF_LENGTH = 32;
|
|
24
|
+
const MAX_LCSC_LENGTH = 32;
|
|
25
|
+
const MAX_SCOPE_LENGTH = 256;
|
|
26
|
+
const MAX_NOTE_LENGTH = 512;
|
|
27
|
+
const MAX_DESIGN_DESC_LENGTH = 256;
|
|
28
|
+
// ── Schema version ────────────────────────────────────────────────────────
|
|
29
|
+
export const CIRCUIT_IR_SCHEMA_VERSION = 'circuit-ir/v1';
|
|
30
|
+
// ── Sub-schemas ───────────────────────────────────────────────────────────
|
|
31
|
+
const designIntentRefSchema = z.object({
|
|
32
|
+
requirementId: z.string().min(1),
|
|
33
|
+
note: z.string().max(MAX_NOTE_LENGTH).optional(),
|
|
34
|
+
});
|
|
35
|
+
const metadataSchema = z.object({
|
|
36
|
+
version: z.literal('1.0.0').default('1.0.0'),
|
|
37
|
+
createdAt: z.string().datetime().optional(),
|
|
38
|
+
designIntentRef: z.string().optional(),
|
|
39
|
+
validationStatus: z.nativeEnum(ValidationStatus).default(ValidationStatus.Draft),
|
|
40
|
+
});
|
|
41
|
+
// ── Block ─────────────────────────────────────────────────────────────────
|
|
42
|
+
export const BlockSchema = z.object({
|
|
43
|
+
id: z.string().min(1).max(MAX_ID_LENGTH),
|
|
44
|
+
name: z.string().min(1).max(MAX_NAME_LENGTH),
|
|
45
|
+
type: z.string().min(1).max(MAX_TYPE_LENGTH),
|
|
46
|
+
description: z.string().max(MAX_STRING_LENGTH).optional(),
|
|
47
|
+
designIntentRef: z.array(designIntentRefSchema).default([]),
|
|
48
|
+
children: z.array(z.string()).default([]),
|
|
49
|
+
});
|
|
50
|
+
// ── Device ────────────────────────────────────────────────────────────────
|
|
51
|
+
export const DeviceSchema = z.object({
|
|
52
|
+
id: z.string().min(1).max(MAX_ID_LENGTH),
|
|
53
|
+
ref: z.string().min(1).max(MAX_REF_LENGTH),
|
|
54
|
+
mpn: z.string().max(MAX_NAME_LENGTH).optional(),
|
|
55
|
+
manufacturer: z.string().max(MAX_NAME_LENGTH).optional(),
|
|
56
|
+
package: z.string().max(MAX_NAME_LENGTH).optional(),
|
|
57
|
+
datasheet: z.string().url().optional().or(z.literal('')),
|
|
58
|
+
lcsc: z.string().max(MAX_LCSC_LENGTH).optional(),
|
|
59
|
+
blockRef: z.string().max(MAX_ID_LENGTH).optional(),
|
|
60
|
+
designIntentRef: z.array(designIntentRefSchema).default([]),
|
|
61
|
+
metadata: z.array(z.object({ key: z.string(), value: z.string() })).default([]),
|
|
62
|
+
});
|
|
63
|
+
// ── Net ───────────────────────────────────────────────────────────────────
|
|
64
|
+
export const NetNodeSchema = z.object({
|
|
65
|
+
deviceRef: z.string().min(1),
|
|
66
|
+
pin: z.string().min(1),
|
|
67
|
+
});
|
|
68
|
+
export const NetSchema = z.object({
|
|
69
|
+
id: z.string().min(1).max(MAX_ID_LENGTH),
|
|
70
|
+
name: z.string().min(1).max(MAX_NAME_LENGTH),
|
|
71
|
+
type: z.nativeEnum(NetType).default(NetType.Signal),
|
|
72
|
+
nodes: z.array(NetNodeSchema).default([]),
|
|
73
|
+
blockRef: z.string().max(MAX_ID_LENGTH).optional(),
|
|
74
|
+
designIntentRef: z.array(designIntentRefSchema).default([]),
|
|
75
|
+
metadata: z.array(z.object({ key: z.string(), value: z.string() })).default([]),
|
|
76
|
+
});
|
|
77
|
+
// ── Power Rail ────────────────────────────────────────────────────────────
|
|
78
|
+
export const PowerRailSchema = z.object({
|
|
79
|
+
id: z.string().min(1).max(MAX_ID_LENGTH),
|
|
80
|
+
name: z.string().min(1).max(MAX_ID_LENGTH),
|
|
81
|
+
voltage: z.number(),
|
|
82
|
+
tolerance: z.number().min(0).max(100).default(5),
|
|
83
|
+
maxCurrentAmps: z.number().nonnegative().optional(),
|
|
84
|
+
sourceBlockRef: z.string().max(MAX_ID_LENGTH).optional(),
|
|
85
|
+
sinkBlockRefs: z.array(z.string()).default([]),
|
|
86
|
+
designIntentRef: z.array(designIntentRefSchema).default([]),
|
|
87
|
+
metadata: z.array(z.object({ key: z.string(), value: z.string() })).default([]),
|
|
88
|
+
});
|
|
89
|
+
// ── Interface ─────────────────────────────────────────────────────────────
|
|
90
|
+
export const InterfacePinSchema = z.object({
|
|
91
|
+
pin: z.string().min(1),
|
|
92
|
+
signal: z.string().min(1),
|
|
93
|
+
type: z.enum(['input', 'output', 'bidirectional', 'power', 'ground']).optional(),
|
|
94
|
+
});
|
|
95
|
+
export const InterfaceSchema = z.object({
|
|
96
|
+
id: z.string().min(1).max(MAX_ID_LENGTH),
|
|
97
|
+
name: z.string().min(1).max(MAX_NAME_LENGTH),
|
|
98
|
+
type: z.string().min(1).max(MAX_TYPE_LENGTH),
|
|
99
|
+
pinout: z.array(InterfacePinSchema).default([]),
|
|
100
|
+
blockRef: z.string().max(MAX_ID_LENGTH).optional(),
|
|
101
|
+
designIntentRef: z.array(designIntentRefSchema).default([]),
|
|
102
|
+
});
|
|
103
|
+
// ── Constraint ────────────────────────────────────────────────────────────
|
|
104
|
+
export const ConstraintSchema = z.object({
|
|
105
|
+
id: z.string().min(1).max(MAX_ID_LENGTH),
|
|
106
|
+
type: z.nativeEnum(ConstraintType),
|
|
107
|
+
severity: z.nativeEnum(ConstraintSeverity).default(ConstraintSeverity.Required),
|
|
108
|
+
description: z.string().min(1).max(MAX_DESCRIPTION_LENGTH),
|
|
109
|
+
scope: z.string().max(MAX_SCOPE_LENGTH).optional(),
|
|
110
|
+
designIntentRef: z.array(designIntentRefSchema).default([]),
|
|
111
|
+
});
|
|
112
|
+
// ── BOM Intent ────────────────────────────────────────────────────────────
|
|
113
|
+
export const BomIntentSchema = z.object({
|
|
114
|
+
excludeRefs: z.array(z.string()).default([]),
|
|
115
|
+
preferredVendors: z.array(z.string()).default([]),
|
|
116
|
+
costTargetUsd: z.number().nonnegative().optional(),
|
|
117
|
+
notes: z.string().max(MAX_STRING_LENGTH).optional(),
|
|
118
|
+
});
|
|
119
|
+
// ── PCB Intent ────────────────────────────────────────────────────────────
|
|
120
|
+
/** Board outline polygon (mm). */
|
|
121
|
+
const point2DSchema = z.object({
|
|
122
|
+
x: z.number(),
|
|
123
|
+
y: z.number(),
|
|
124
|
+
});
|
|
125
|
+
const boardOutlineSchema = z.object({
|
|
126
|
+
shape: z.array(point2DSchema).min(3, { message: 'Board outline must have at least 3 points' }),
|
|
127
|
+
cutouts: z.array(z.array(point2DSchema)).optional(),
|
|
128
|
+
});
|
|
129
|
+
/** One layer in the PCB stackup. */
|
|
130
|
+
const layerStackEntrySchema = z.object({
|
|
131
|
+
name: z.string().min(1).max(MAX_ID_LENGTH),
|
|
132
|
+
type: z.nativeEnum(BoardLayerType),
|
|
133
|
+
thicknessMm: z.number().positive(),
|
|
134
|
+
material: z.string().min(1).max(MAX_ID_LENGTH),
|
|
135
|
+
copperWeightOz: z.number().nonnegative().optional(),
|
|
136
|
+
dielectricConstant: z.number().nonnegative().optional(),
|
|
137
|
+
order: z.number().int().nonnegative(),
|
|
138
|
+
});
|
|
139
|
+
/** A net class with routing rules. */
|
|
140
|
+
const netClassRuleSchema = z.object({
|
|
141
|
+
name: z.string().min(1).max(MAX_ID_LENGTH),
|
|
142
|
+
traceWidthMm: z.number().positive(),
|
|
143
|
+
clearanceMm: z.number().nonnegative(),
|
|
144
|
+
viaDiameterMm: z.number().positive().optional(),
|
|
145
|
+
viaHoleMm: z.number().positive().optional(),
|
|
146
|
+
priority: z.number().int().nonnegative().optional(),
|
|
147
|
+
netNames: z.array(z.string()).optional(),
|
|
148
|
+
});
|
|
149
|
+
/** Clearance rule between two net classes. */
|
|
150
|
+
const clearanceRuleSchema = z.object({
|
|
151
|
+
netClassA: z.string().min(1),
|
|
152
|
+
netClassB: z.string().min(1),
|
|
153
|
+
clearanceMm: z.number().nonnegative(),
|
|
154
|
+
layer: z.string().optional(),
|
|
155
|
+
});
|
|
156
|
+
/** A restricted area on the board. */
|
|
157
|
+
const keepoutAreaSchema = z.object({
|
|
158
|
+
outline: z.array(point2DSchema).min(3),
|
|
159
|
+
layer: z.string().min(1),
|
|
160
|
+
restriction: z.nativeEnum(KeepoutRestriction),
|
|
161
|
+
description: z.string().max(MAX_DESIGN_DESC_LENGTH).optional(),
|
|
162
|
+
});
|
|
163
|
+
/** A placement zone for grouping components. */
|
|
164
|
+
const placementZoneSchema = z.object({
|
|
165
|
+
outline: z.array(point2DSchema).min(3),
|
|
166
|
+
layer: z.nativeEnum(PlacementSide),
|
|
167
|
+
zoneType: z.nativeEnum(PlacementZoneType),
|
|
168
|
+
name: z.string().min(1).max(MAX_ID_LENGTH),
|
|
169
|
+
allowedRefs: z.array(z.string()).optional(),
|
|
170
|
+
description: z.string().max(MAX_DESIGN_DESC_LENGTH).optional(),
|
|
171
|
+
});
|
|
172
|
+
/** A mounting hole specification. */
|
|
173
|
+
const mountingHoleSchema = z.object({
|
|
174
|
+
x: z.number(),
|
|
175
|
+
y: z.number(),
|
|
176
|
+
diameterMm: z.number().positive(),
|
|
177
|
+
type: z.nativeEnum(MountingHoleType).default(MountingHoleType.Unplated),
|
|
178
|
+
plated: z.boolean().default(false),
|
|
179
|
+
});
|
|
180
|
+
/** A fiducial mark. */
|
|
181
|
+
const fiducialSchema = z.object({
|
|
182
|
+
x: z.number(),
|
|
183
|
+
y: z.number(),
|
|
184
|
+
type: z.enum(['global', 'local']),
|
|
185
|
+
top: z.boolean(),
|
|
186
|
+
bottom: z.boolean().optional(),
|
|
187
|
+
});
|
|
188
|
+
/** A test pad specification. */
|
|
189
|
+
const testPadSchema = z.object({
|
|
190
|
+
x: z.number(),
|
|
191
|
+
y: z.number(),
|
|
192
|
+
netName: z.string().min(1),
|
|
193
|
+
diameterMm: z.number().positive(),
|
|
194
|
+
layer: z.nativeEnum(PlacementSide),
|
|
195
|
+
label: z.string().max(MAX_ID_LENGTH).optional(),
|
|
196
|
+
});
|
|
197
|
+
export const PcbIntentSchema = z.object({
|
|
198
|
+
// ── Board outline & dimensions ─────────────────────────────────────────
|
|
199
|
+
layerCount: z.number().int().positive().max(MAX_ID_LENGTH).optional(),
|
|
200
|
+
stackup: z.string().max(MAX_SCOPE_LENGTH).optional(),
|
|
201
|
+
widthMm: z.number().positive().optional(),
|
|
202
|
+
heightMm: z.number().positive().optional(),
|
|
203
|
+
material: z.string().max(MAX_NAME_LENGTH).optional(),
|
|
204
|
+
notes: z.string().max(MAX_STRING_LENGTH).optional(),
|
|
205
|
+
// ── PCB constraint fields ──────────────────────────────────────────────
|
|
206
|
+
boardOutline: boardOutlineSchema.optional(),
|
|
207
|
+
layerStack: z.array(layerStackEntrySchema).optional(),
|
|
208
|
+
netClasses: z.array(netClassRuleSchema).optional(),
|
|
209
|
+
clearanceRules: z.array(clearanceRuleSchema).optional(),
|
|
210
|
+
keepoutAreas: z.array(keepoutAreaSchema).optional(),
|
|
211
|
+
placementZones: z.array(placementZoneSchema).optional(),
|
|
212
|
+
mountingHoles: z.array(mountingHoleSchema).optional(),
|
|
213
|
+
fiducials: z.array(fiducialSchema).optional(),
|
|
214
|
+
testPads: z.array(testPadSchema).optional(),
|
|
215
|
+
});
|
|
216
|
+
// ── Manufacturing Intent ──────────────────────────────────────────────────
|
|
217
|
+
export const ManufacturingIntentSchema = z.object({
|
|
218
|
+
quantity: z.number().int().positive().optional(),
|
|
219
|
+
process: z.enum(['lead-free', 'lead-based', 'mixed']).optional(),
|
|
220
|
+
timelineWeeks: z.number().int().positive().optional(),
|
|
221
|
+
notes: z.string().max(MAX_STRING_LENGTH).optional(),
|
|
222
|
+
});
|
|
223
|
+
// ── CircuitIR ─────────────────────────────────────────────────────────────
|
|
224
|
+
export const CircuitIRSchema = z
|
|
225
|
+
.object({
|
|
226
|
+
$schema: z.literal(CIRCUIT_IR_SCHEMA_VERSION).default(CIRCUIT_IR_SCHEMA_VERSION),
|
|
227
|
+
metadata: metadataSchema,
|
|
228
|
+
blocks: z.array(BlockSchema).default([]),
|
|
229
|
+
devices: z.array(DeviceSchema).default([]),
|
|
230
|
+
nets: z.array(NetSchema).default([]),
|
|
231
|
+
rails: z.array(PowerRailSchema).default([]),
|
|
232
|
+
interfaces: z.array(InterfaceSchema).default([]),
|
|
233
|
+
constraints: z.array(ConstraintSchema).default([]),
|
|
234
|
+
bom: BomIntentSchema.default({ excludeRefs: [], preferredVendors: [] }),
|
|
235
|
+
pcb: PcbIntentSchema.default({}),
|
|
236
|
+
manufacturing: ManufacturingIntentSchema.default({}),
|
|
237
|
+
})
|
|
238
|
+
.strict()
|
|
239
|
+
.refine((data) => {
|
|
240
|
+
// All device refs and net node refs must reference valid devices
|
|
241
|
+
const deviceIds = new Set(data.devices.map((d) => d.id));
|
|
242
|
+
for (const net of data.nets) {
|
|
243
|
+
for (const node of net.nodes) {
|
|
244
|
+
if (!deviceIds.has(node.deviceRef)) {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return true;
|
|
250
|
+
}, {
|
|
251
|
+
message: 'All net node deviceRefs must reference a valid device ID',
|
|
252
|
+
path: ['nets'],
|
|
253
|
+
})
|
|
254
|
+
.refine((data) => {
|
|
255
|
+
// All blockRefs must reference valid blocks
|
|
256
|
+
const blockIds = new Set(data.blocks.map((b) => b.id));
|
|
257
|
+
for (const device of data.devices) {
|
|
258
|
+
if (device.blockRef && !blockIds.has(device.blockRef)) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return true;
|
|
263
|
+
}, {
|
|
264
|
+
message: 'All device blockRefs must reference a valid block ID',
|
|
265
|
+
path: ['devices'],
|
|
266
|
+
});
|
|
267
|
+
// ── Validation helper ─────────────────────────────────────────────────────
|
|
268
|
+
/**
|
|
269
|
+
* Parse and validate an unknown input as a CircuitIR.
|
|
270
|
+
*
|
|
271
|
+
* Returns the validated CircuitIR on success.
|
|
272
|
+
* Throws `CircuitError` with structured errors on failure.
|
|
273
|
+
*/
|
|
274
|
+
export function validateCircuitIR(input) {
|
|
275
|
+
const result = CircuitIRSchema.safeParse(input);
|
|
276
|
+
if (!result.success) {
|
|
277
|
+
const errors = fromZodError(result.error, 'circuitIR');
|
|
278
|
+
throw new CircuitError({
|
|
279
|
+
code: CircuitErrorCode.CIRCUIT_IR_INVALID,
|
|
280
|
+
message: 'CircuitIR validation failed',
|
|
281
|
+
errors,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
return result.data;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Type guard: check whether an unknown value is a valid CircuitIR.
|
|
288
|
+
*/
|
|
289
|
+
export function isCircuitIR(value) {
|
|
290
|
+
return CircuitIRSchema.safeParse(value).success;
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=circuit-ir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-ir.js","sourceRoot":"","sources":["../../src/circuit/circuit-ir.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DesignIntent → CircuitIR compiler.
|
|
3
|
+
*
|
|
4
|
+
* This module provides the compile boundary: a validated DesignIntent is
|
|
5
|
+
* compiled into a draft CircuitIR. The CircuitIR must then pass a review
|
|
6
|
+
* gate (human or automated) before it is marked as "validated" and consumed
|
|
7
|
+
* by downstream EasyEDA tools.
|
|
8
|
+
*
|
|
9
|
+
* The compiler:
|
|
10
|
+
* 1. Validates the input DesignIntent.
|
|
11
|
+
* 2. Transforms functional block requirements into Blocks.
|
|
12
|
+
* 3. Creates power Rails from the DesignIntent's rail requirements.
|
|
13
|
+
* 4. Creates empty Device slots with traceability refs.
|
|
14
|
+
* 5. Generates placeholder Nets for each power rail.
|
|
15
|
+
* 6. Copies manufacturing, mechanical, and safety intent into CircuitIR fields.
|
|
16
|
+
* 7. Preserves all traceability IDs.
|
|
17
|
+
*
|
|
18
|
+
* @module
|
|
19
|
+
*/
|
|
20
|
+
import { DesignIntent } from './design-intent.js';
|
|
21
|
+
import { CircuitIR } from './circuit-ir.js';
|
|
22
|
+
import { ValidationStatus } from './types.js';
|
|
23
|
+
export interface CompileOptions {
|
|
24
|
+
/** If true, skip DesignIntent validation (assumes pre-validated input). */
|
|
25
|
+
skipValidation?: boolean;
|
|
26
|
+
/** Optional override for the CircuitIR validation status after compile. */
|
|
27
|
+
initialStatus?: ValidationStatus;
|
|
28
|
+
}
|
|
29
|
+
export interface CompileResult {
|
|
30
|
+
/** The compiled CircuitIR (draft — must pass review gate). */
|
|
31
|
+
circuitIR: CircuitIR;
|
|
32
|
+
/** The original DesignIntent, preserved for traceability. */
|
|
33
|
+
designIntent: DesignIntent;
|
|
34
|
+
/** Compile warnings (non-fatal issues the compiler wants to flag). */
|
|
35
|
+
warnings: string[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Compile a validated DesignIntent into a draft CircuitIR.
|
|
39
|
+
*
|
|
40
|
+
* Throws `CircuitError` if:
|
|
41
|
+
* - The input fails DesignIntent validation (unless `skipValidation`).
|
|
42
|
+
* - The board type is not supported by the compiler.
|
|
43
|
+
*/
|
|
44
|
+
export declare function compile(input: unknown, options?: CompileOptions): CompileResult;
|
|
45
|
+
/**
|
|
46
|
+
* Transition a CircuitIR from "draft" to "validated" or "rejected".
|
|
47
|
+
*
|
|
48
|
+
* Downstream EasyEDA tools MUST check that the CircuitIR they consume
|
|
49
|
+
* is in "validated" status before proceeding with mutations.
|
|
50
|
+
*/
|
|
51
|
+
export declare function setValidationStatus(circuitIR: CircuitIR, status: ValidationStatus.Validated | ValidationStatus.Rejected, _reason?: string): CircuitIR;
|
|
52
|
+
/**
|
|
53
|
+
* Check whether a CircuitIR is validated and ready for EasyEDA operations.
|
|
54
|
+
*/
|
|
55
|
+
export declare function isReadyForEasyEDA(circuitIR: CircuitIR): boolean;
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DesignIntent → CircuitIR compiler.
|
|
3
|
+
*
|
|
4
|
+
* This module provides the compile boundary: a validated DesignIntent is
|
|
5
|
+
* compiled into a draft CircuitIR. The CircuitIR must then pass a review
|
|
6
|
+
* gate (human or automated) before it is marked as "validated" and consumed
|
|
7
|
+
* by downstream EasyEDA tools.
|
|
8
|
+
*
|
|
9
|
+
* The compiler:
|
|
10
|
+
* 1. Validates the input DesignIntent.
|
|
11
|
+
* 2. Transforms functional block requirements into Blocks.
|
|
12
|
+
* 3. Creates power Rails from the DesignIntent's rail requirements.
|
|
13
|
+
* 4. Creates empty Device slots with traceability refs.
|
|
14
|
+
* 5. Generates placeholder Nets for each power rail.
|
|
15
|
+
* 6. Copies manufacturing, mechanical, and safety intent into CircuitIR fields.
|
|
16
|
+
* 7. Preserves all traceability IDs.
|
|
17
|
+
*
|
|
18
|
+
* @module
|
|
19
|
+
*/
|
|
20
|
+
import { DesignIntentSchema } from './design-intent.js';
|
|
21
|
+
import { CircuitIRSchema, CIRCUIT_IR_SCHEMA_VERSION, } from './circuit-ir.js';
|
|
22
|
+
import { ValidationStatus, NetType } from './types.js';
|
|
23
|
+
import { CircuitError, CircuitErrorCode, fromZodError } from './errors.js';
|
|
24
|
+
// ── Defaults ──────────────────────────────────────────────────────────────
|
|
25
|
+
const DEFAULT_OPTIONS = {
|
|
26
|
+
skipValidation: false,
|
|
27
|
+
initialStatus: ValidationStatus.Draft,
|
|
28
|
+
};
|
|
29
|
+
// ── Compile helpers ───────────────────────────────────────────────────────
|
|
30
|
+
function compileBlocks(designIntent) {
|
|
31
|
+
return designIntent.requirements.functionalBlocks.map((fb) => ({
|
|
32
|
+
id: `block-${fb.id}`,
|
|
33
|
+
name: fb.name,
|
|
34
|
+
type: fb.type,
|
|
35
|
+
description: fb.purpose,
|
|
36
|
+
designIntentRef: [{ requirementId: fb.id, note: fb.purpose }],
|
|
37
|
+
children: [],
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
function compilePowerRails(designIntent, blocks) {
|
|
41
|
+
return designIntent.requirements.power.rails.map((r) => {
|
|
42
|
+
// Find which block this rail belongs to by matching the description / context
|
|
43
|
+
const sourceBlock = blocks.find((b) => r.description && b.description?.toLowerCase().includes(r.description.toLowerCase()));
|
|
44
|
+
return {
|
|
45
|
+
id: `rail-${r.id}`,
|
|
46
|
+
name: r.id,
|
|
47
|
+
voltage: r.voltage,
|
|
48
|
+
tolerance: r.tolerance,
|
|
49
|
+
maxCurrentAmps: r.maxCurrentAmps,
|
|
50
|
+
sourceBlockRef: sourceBlock?.id,
|
|
51
|
+
sinkBlockRefs: [],
|
|
52
|
+
designIntentRef: [{ requirementId: r.id }],
|
|
53
|
+
metadata: [],
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function compileDeviceStubs(blocks) {
|
|
58
|
+
// We create one stub Device per block as a placeholder. The user fills
|
|
59
|
+
// in actual MPNs during the planning step.
|
|
60
|
+
return blocks.map((block) => ({
|
|
61
|
+
id: `dev-${block.id}`,
|
|
62
|
+
ref: `U?`,
|
|
63
|
+
mpn: undefined,
|
|
64
|
+
manufacturer: undefined,
|
|
65
|
+
package: undefined,
|
|
66
|
+
datasheet: '',
|
|
67
|
+
lcsc: undefined,
|
|
68
|
+
blockRef: block.id,
|
|
69
|
+
designIntentRef: block.designIntentRef,
|
|
70
|
+
metadata: [],
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
function compilePowerNets(rails) {
|
|
74
|
+
return rails.map((rail) => ({
|
|
75
|
+
id: `net-${rail.id}`,
|
|
76
|
+
name: rail.name,
|
|
77
|
+
type: NetType.Power,
|
|
78
|
+
nodes: [],
|
|
79
|
+
blockRef: rail.sourceBlockRef,
|
|
80
|
+
designIntentRef: rail.designIntentRef,
|
|
81
|
+
metadata: [],
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
function buildCircuitIR(designIntent, blocks, rails, devices, nets, opts) {
|
|
85
|
+
return {
|
|
86
|
+
$schema: CIRCUIT_IR_SCHEMA_VERSION,
|
|
87
|
+
metadata: {
|
|
88
|
+
version: '1.0.0',
|
|
89
|
+
createdAt: new Date().toISOString(),
|
|
90
|
+
designIntentRef: designIntent.project.name,
|
|
91
|
+
validationStatus: opts.initialStatus ?? ValidationStatus.Draft,
|
|
92
|
+
},
|
|
93
|
+
blocks,
|
|
94
|
+
devices,
|
|
95
|
+
nets,
|
|
96
|
+
rails,
|
|
97
|
+
interfaces: [],
|
|
98
|
+
constraints: [],
|
|
99
|
+
bom: { excludeRefs: [], preferredVendors: [] },
|
|
100
|
+
pcb: {
|
|
101
|
+
layerCount: designIntent.requirements.mechanical.layers,
|
|
102
|
+
widthMm: designIntent.requirements.mechanical.widthMm,
|
|
103
|
+
heightMm: designIntent.requirements.mechanical.heightMm,
|
|
104
|
+
boardOutline: undefined,
|
|
105
|
+
layerStack: undefined,
|
|
106
|
+
netClasses: undefined,
|
|
107
|
+
clearanceRules: undefined,
|
|
108
|
+
keepoutAreas: undefined,
|
|
109
|
+
placementZones: undefined,
|
|
110
|
+
mountingHoles: undefined,
|
|
111
|
+
fiducials: undefined,
|
|
112
|
+
testPads: undefined,
|
|
113
|
+
},
|
|
114
|
+
manufacturing: {
|
|
115
|
+
quantity: undefined,
|
|
116
|
+
process: designIntent.requirements.manufacturing.process,
|
|
117
|
+
timelineWeeks: designIntent.requirements.manufacturing.timelineWeeks,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
// ── Compiler ──────────────────────────────────────────────────────────────
|
|
122
|
+
/**
|
|
123
|
+
* Compile a validated DesignIntent into a draft CircuitIR.
|
|
124
|
+
*
|
|
125
|
+
* Throws `CircuitError` if:
|
|
126
|
+
* - The input fails DesignIntent validation (unless `skipValidation`).
|
|
127
|
+
* - The board type is not supported by the compiler.
|
|
128
|
+
*/
|
|
129
|
+
export function compile(input, options) {
|
|
130
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
131
|
+
let designIntent;
|
|
132
|
+
// ── 1. Validate DesignIntent ────────────────────────────────────────────
|
|
133
|
+
if (!opts.skipValidation) {
|
|
134
|
+
const parsed = DesignIntentSchema.safeParse(input);
|
|
135
|
+
if (!parsed.success) {
|
|
136
|
+
const errors = fromZodError(parsed.error, 'compile.input');
|
|
137
|
+
throw new CircuitError({
|
|
138
|
+
code: CircuitErrorCode.DESIGN_INTENT_INVALID,
|
|
139
|
+
message: 'Cannot compile: DesignIntent validation failed',
|
|
140
|
+
errors,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
designIntent = parsed.data;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
designIntent = input;
|
|
147
|
+
}
|
|
148
|
+
const warnings = [];
|
|
149
|
+
// ── 2. Compile Blocks ─────────────────────────────────────────────────
|
|
150
|
+
const blocks = compileBlocks(designIntent);
|
|
151
|
+
// ── 3. Compile Power Rails ──────────────────────────────────────────────
|
|
152
|
+
const rails = compilePowerRails(designIntent, blocks);
|
|
153
|
+
// ── 4. Create Device stubs ──────────────────────────────────────────────
|
|
154
|
+
const devices = compileDeviceStubs(blocks);
|
|
155
|
+
// ── 5. Create power nets ───────────────────────────────────────────────
|
|
156
|
+
const nets = compilePowerNets(rails);
|
|
157
|
+
// ── 6. Build CircuitIR ──────────────────────────────────────────────────
|
|
158
|
+
const circuitIR = buildCircuitIR(designIntent, blocks, rails, devices, nets, opts);
|
|
159
|
+
// ── 7. Validate output CircuitIR ────────────────────────────────────────
|
|
160
|
+
const parsed = CircuitIRSchema.safeParse(circuitIR);
|
|
161
|
+
if (!parsed.success) {
|
|
162
|
+
const errors = fromZodError(parsed.error, 'compile.output');
|
|
163
|
+
throw new CircuitError({
|
|
164
|
+
code: CircuitErrorCode.COMPILE_FAILED,
|
|
165
|
+
message: 'Compilation produced invalid CircuitIR',
|
|
166
|
+
errors,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
circuitIR: parsed.data,
|
|
171
|
+
designIntent,
|
|
172
|
+
warnings,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
// ── Review gate ───────────────────────────────────────────────────────────
|
|
176
|
+
/**
|
|
177
|
+
* Transition a CircuitIR from "draft" to "validated" or "rejected".
|
|
178
|
+
*
|
|
179
|
+
* Downstream EasyEDA tools MUST check that the CircuitIR they consume
|
|
180
|
+
* is in "validated" status before proceeding with mutations.
|
|
181
|
+
*/
|
|
182
|
+
export function setValidationStatus(circuitIR, status, _reason) {
|
|
183
|
+
return {
|
|
184
|
+
...circuitIR,
|
|
185
|
+
metadata: {
|
|
186
|
+
...circuitIR.metadata,
|
|
187
|
+
validationStatus: status,
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Check whether a CircuitIR is validated and ready for EasyEDA operations.
|
|
193
|
+
*/
|
|
194
|
+
export function isReadyForEasyEDA(circuitIR) {
|
|
195
|
+
return circuitIR.metadata.validationStatus === ValidationStatus.Validated;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/circuit/compiler.ts"],"names":[],"mappings":"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"}
|