@celox-sim/celox 0.0.1 → 0.1.3
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/dist/dut.d.ts +35 -0
- package/dist/dut.d.ts.map +1 -0
- package/dist/dut.js +342 -0
- package/dist/dut.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/napi-bridge.d.ts +7 -0
- package/dist/napi-bridge.d.ts.map +1 -0
- package/dist/napi-bridge.js +7 -0
- package/dist/napi-bridge.js.map +1 -0
- package/dist/napi-helpers.d.ts +104 -0
- package/dist/napi-helpers.d.ts.map +1 -0
- package/dist/napi-helpers.js +207 -0
- package/dist/napi-helpers.js.map +1 -0
- package/dist/simulation.d.ts +111 -0
- package/dist/simulation.d.ts.map +1 -0
- package/dist/simulation.js +187 -0
- package/dist/simulation.js.map +1 -0
- package/dist/simulator.d.ts +92 -0
- package/dist/simulator.d.ts.map +1 -0
- package/dist/simulator.js +171 -0
- package/dist/simulator.js.map +1 -0
- package/dist/types.d.ts +117 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +23 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -7
- package/src/dut.test.ts +534 -0
- package/src/dut.ts +449 -0
- package/src/e2e.bench.ts +240 -0
- package/src/e2e.test.ts +965 -0
- package/src/index.ts +57 -0
- package/src/matchers.ts +154 -0
- package/src/napi-bridge.ts +13 -0
- package/src/napi-helpers.ts +326 -0
- package/src/simulation.test.ts +185 -0
- package/src/simulation.ts +273 -0
- package/src/simulator.test.ts +191 -0
- package/src/simulator.ts +266 -0
- package/src/types.ts +164 -0
- package/README.md +0 -45
package/dist/dut.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DUT (Device Under Test) accessor factory.
|
|
3
|
+
*
|
|
4
|
+
* Builds a plain object with Object.defineProperty getter/setters that
|
|
5
|
+
* read and write directly via DataView on a SharedArrayBuffer.
|
|
6
|
+
* No Proxy is used — every port becomes a concrete property whose
|
|
7
|
+
* accessors are fully visible to V8 inline caches.
|
|
8
|
+
*/
|
|
9
|
+
import type { NativeHandle, PortInfo, SignalLayout } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Mutable state shared between the DUT accessor and its owning
|
|
12
|
+
* Simulator/Simulation instance. The Simulator clears `dirty` after
|
|
13
|
+
* tick()/runUntil(); the DUT sets it on any input write and checks it
|
|
14
|
+
* before any output read.
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export interface DirtyState {
|
|
18
|
+
dirty: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create a DUT accessor object with defineProperty-based getters/setters.
|
|
22
|
+
*
|
|
23
|
+
* @param buffer SharedArrayBuffer from NAPI create()
|
|
24
|
+
* @param layout Per-signal byte layout within the buffer
|
|
25
|
+
* @param portDefs Port metadata from the ModuleDefinition
|
|
26
|
+
* @param handle Native handle (for evalComb calls)
|
|
27
|
+
* @param state Shared dirty-tracking state
|
|
28
|
+
*/
|
|
29
|
+
export declare function createDut<P>(buffer: ArrayBuffer | SharedArrayBuffer, layout: Record<string, SignalLayout>, portDefs: Record<string, PortInfo>, handle: NativeHandle, state: DirtyState): P;
|
|
30
|
+
/**
|
|
31
|
+
* Read the raw 4-state (value, mask) pair for a signal.
|
|
32
|
+
* Mask bits set to 1 indicate X/Z.
|
|
33
|
+
*/
|
|
34
|
+
export declare function readFourState(buffer: ArrayBuffer | SharedArrayBuffer, sig: SignalLayout): [value: number | bigint, mask: number | bigint];
|
|
35
|
+
//# sourceMappingURL=dut.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dut.d.ts","sourceRoot":"","sources":["../src/dut.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,QAAQ,EACR,YAAY,EAEb,MAAM,YAAY,CAAC;AAOpB;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,CAAC;CAChB;AAwJD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,MAAM,EAAE,WAAW,GAAG,iBAAiB,EACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAClC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,UAAU,GAChB,CAAC,CAiDH;AAoLD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,WAAW,GAAG,iBAAiB,EACvC,GAAG,EAAE,YAAY,GAChB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,CAejD"}
|
package/dist/dut.js
ADDED
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DUT (Device Under Test) accessor factory.
|
|
3
|
+
*
|
|
4
|
+
* Builds a plain object with Object.defineProperty getter/setters that
|
|
5
|
+
* read and write directly via DataView on a SharedArrayBuffer.
|
|
6
|
+
* No Proxy is used — every port becomes a concrete property whose
|
|
7
|
+
* accessors are fully visible to V8 inline caches.
|
|
8
|
+
*/
|
|
9
|
+
import { isFourStateValue } from "./types.js";
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// DataView helpers
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
/** Read an unsigned integer of the given byte-size (little-endian), masked to width. */
|
|
14
|
+
function readNumber(view, offset, width) {
|
|
15
|
+
if (width <= 8) {
|
|
16
|
+
const raw = view.getUint8(offset);
|
|
17
|
+
return width === 8 ? raw : raw & ((1 << width) - 1);
|
|
18
|
+
}
|
|
19
|
+
if (width <= 16) {
|
|
20
|
+
const raw = view.getUint16(offset, true);
|
|
21
|
+
return width === 16 ? raw : raw & ((1 << width) - 1);
|
|
22
|
+
}
|
|
23
|
+
if (width <= 32) {
|
|
24
|
+
const raw = view.getUint32(offset, true);
|
|
25
|
+
return width === 32 ? raw : (raw & ((1 << width) - 1)) >>> 0;
|
|
26
|
+
}
|
|
27
|
+
// 33..53 bits — fits safely in a JS number
|
|
28
|
+
const lo = view.getUint32(offset, true);
|
|
29
|
+
const hi = view.getUint32(offset + 4, true) & ((1 << (width - 32)) - 1);
|
|
30
|
+
return lo + hi * 0x1_0000_0000;
|
|
31
|
+
}
|
|
32
|
+
/** Write an unsigned integer of the given byte-size (little-endian). */
|
|
33
|
+
function writeNumber(view, offset, width, value) {
|
|
34
|
+
if (width <= 8) {
|
|
35
|
+
view.setUint8(offset, value & ((1 << width) - 1));
|
|
36
|
+
}
|
|
37
|
+
else if (width <= 16) {
|
|
38
|
+
view.setUint16(offset, value & ((1 << width) - 1), true);
|
|
39
|
+
}
|
|
40
|
+
else if (width <= 32) {
|
|
41
|
+
view.setUint32(offset, value >>> 0, true);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// 33..53 bits
|
|
45
|
+
view.setUint32(offset, value >>> 0, true);
|
|
46
|
+
view.setUint32(offset + 4, Math.floor(value / 0x1_0000_0000) >>> 0, true);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** Read a wide value (≥ 54 bits) as BigInt, little-endian. */
|
|
50
|
+
function readBigInt(view, offset, byteSize) {
|
|
51
|
+
let result = 0n;
|
|
52
|
+
// Read 8 bytes at a time, then remaining bytes
|
|
53
|
+
const fullWords = Math.floor(byteSize / 8);
|
|
54
|
+
for (let i = 0; i < fullWords; i++) {
|
|
55
|
+
const word = view.getBigUint64(offset + i * 8, true);
|
|
56
|
+
result |= word << BigInt(i * 64);
|
|
57
|
+
}
|
|
58
|
+
const remaining = byteSize % 8;
|
|
59
|
+
if (remaining > 0) {
|
|
60
|
+
const base = offset + fullWords * 8;
|
|
61
|
+
for (let i = 0; i < remaining; i++) {
|
|
62
|
+
result |= BigInt(view.getUint8(base + i)) << BigInt(fullWords * 64 + i * 8);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
/** Write a wide value (≥ 54 bits) as BigInt, little-endian. */
|
|
68
|
+
function writeBigInt(view, offset, byteSize, value) {
|
|
69
|
+
const fullWords = Math.floor(byteSize / 8);
|
|
70
|
+
for (let i = 0; i < fullWords; i++) {
|
|
71
|
+
view.setBigUint64(offset + i * 8, value & 0xffffffffffffffffn, true);
|
|
72
|
+
value >>= 64n;
|
|
73
|
+
}
|
|
74
|
+
const remaining = byteSize % 8;
|
|
75
|
+
if (remaining > 0) {
|
|
76
|
+
const base = offset + fullWords * 8;
|
|
77
|
+
for (let i = 0; i < remaining; i++) {
|
|
78
|
+
view.setUint8(base + i, Number(value & 0xffn));
|
|
79
|
+
value >>= 8n;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Read a signal value from the DataView. Returns number or bigint. */
|
|
84
|
+
function readSignal(view, sig) {
|
|
85
|
+
if (sig.width <= 53) {
|
|
86
|
+
return readNumber(view, sig.offset, sig.width);
|
|
87
|
+
}
|
|
88
|
+
return readBigInt(view, sig.offset, sig.byteSize);
|
|
89
|
+
}
|
|
90
|
+
/** Write a signal value to the DataView. Accepts number or bigint. */
|
|
91
|
+
function writeSignal(view, sig, value) {
|
|
92
|
+
if (sig.width <= 53 && typeof value === "number") {
|
|
93
|
+
writeNumber(view, sig.offset, sig.width, value);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const bigVal = typeof value === "bigint" ? value : BigInt(value);
|
|
97
|
+
writeBigInt(view, sig.offset, sig.byteSize, bigVal);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** Write a 4-state value (value + mask) to the DataView. */
|
|
101
|
+
function writeFourState(view, sig, fsv) {
|
|
102
|
+
writeSignal(view, sig, fsv.value);
|
|
103
|
+
// Mask is stored immediately after the value bytes
|
|
104
|
+
const maskLayout = {
|
|
105
|
+
offset: sig.offset + sig.byteSize,
|
|
106
|
+
width: sig.width,
|
|
107
|
+
byteSize: sig.byteSize,
|
|
108
|
+
is4state: false,
|
|
109
|
+
direction: sig.direction,
|
|
110
|
+
};
|
|
111
|
+
writeSignal(view, maskLayout, fsv.mask);
|
|
112
|
+
}
|
|
113
|
+
/** Write all-X mask for a signal. */
|
|
114
|
+
function writeAllX(view, sig) {
|
|
115
|
+
// Value = 0, mask = all 1s
|
|
116
|
+
writeSignal(view, sig, sig.width <= 53 ? 0 : 0n);
|
|
117
|
+
const allOnes = sig.width <= 53
|
|
118
|
+
? (sig.width === 53 ? Number.MAX_SAFE_INTEGER : (1 << sig.width) - 1)
|
|
119
|
+
: (1n << BigInt(sig.width)) - 1n;
|
|
120
|
+
const maskLayout = {
|
|
121
|
+
offset: sig.offset + sig.byteSize,
|
|
122
|
+
width: sig.width,
|
|
123
|
+
byteSize: sig.byteSize,
|
|
124
|
+
is4state: false,
|
|
125
|
+
direction: sig.direction,
|
|
126
|
+
};
|
|
127
|
+
writeSignal(view, maskLayout, allOnes);
|
|
128
|
+
}
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
// DUT factory
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
/**
|
|
133
|
+
* Create a DUT accessor object with defineProperty-based getters/setters.
|
|
134
|
+
*
|
|
135
|
+
* @param buffer SharedArrayBuffer from NAPI create()
|
|
136
|
+
* @param layout Per-signal byte layout within the buffer
|
|
137
|
+
* @param portDefs Port metadata from the ModuleDefinition
|
|
138
|
+
* @param handle Native handle (for evalComb calls)
|
|
139
|
+
* @param state Shared dirty-tracking state
|
|
140
|
+
*/
|
|
141
|
+
export function createDut(buffer, layout, portDefs, handle, state) {
|
|
142
|
+
const view = new DataView(buffer);
|
|
143
|
+
const obj = Object.create(null);
|
|
144
|
+
// Iterate portDefs (not layout) so that interface ports are discovered
|
|
145
|
+
// even though their individual members are the ones that appear in layout.
|
|
146
|
+
for (const [name, port] of Object.entries(portDefs)) {
|
|
147
|
+
// Skip clock ports — they are controlled via tick()/addClock()
|
|
148
|
+
if (port.type === "clock")
|
|
149
|
+
continue;
|
|
150
|
+
// Check for nested interface
|
|
151
|
+
if (port.interface) {
|
|
152
|
+
const nestedObj = createNestedDut(view, layout, port.interface, name, handle, state);
|
|
153
|
+
Object.defineProperty(obj, name, {
|
|
154
|
+
value: nestedObj,
|
|
155
|
+
enumerable: true,
|
|
156
|
+
configurable: false,
|
|
157
|
+
writable: false,
|
|
158
|
+
});
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
const sig = layout[name];
|
|
162
|
+
if (!sig)
|
|
163
|
+
continue;
|
|
164
|
+
// Check for array port
|
|
165
|
+
if (port.arrayDims && port.arrayDims.length > 0) {
|
|
166
|
+
const arrayObj = createArrayDut(view, sig, port, handle, state);
|
|
167
|
+
Object.defineProperty(obj, name, {
|
|
168
|
+
value: arrayObj,
|
|
169
|
+
enumerable: true,
|
|
170
|
+
configurable: false,
|
|
171
|
+
writable: false,
|
|
172
|
+
});
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
// Scalar port — define getter/setter
|
|
176
|
+
defineSignalProperty(obj, name, view, sig, port, handle, state);
|
|
177
|
+
}
|
|
178
|
+
return obj;
|
|
179
|
+
}
|
|
180
|
+
/** Define a single scalar signal property on the target object. */
|
|
181
|
+
function defineSignalProperty(target, name, view, sig, port, handle, state) {
|
|
182
|
+
const isOutput = port?.direction === "output";
|
|
183
|
+
const isInput = port?.direction === "input";
|
|
184
|
+
Object.defineProperty(target, name, {
|
|
185
|
+
get() {
|
|
186
|
+
// Output reads: lazy evalComb if dirty
|
|
187
|
+
if (state.dirty && !isInput) {
|
|
188
|
+
handle.evalComb();
|
|
189
|
+
state.dirty = false;
|
|
190
|
+
}
|
|
191
|
+
return readSignal(view, sig);
|
|
192
|
+
},
|
|
193
|
+
set(value) {
|
|
194
|
+
if (isOutput) {
|
|
195
|
+
throw new Error(`Cannot write to output port '${name}'`);
|
|
196
|
+
}
|
|
197
|
+
if (value === Symbol.for("veryl:X")) {
|
|
198
|
+
if (!sig.is4state) {
|
|
199
|
+
throw new Error(`Port '${name}' is not 4-state; cannot assign X`);
|
|
200
|
+
}
|
|
201
|
+
writeAllX(view, sig);
|
|
202
|
+
}
|
|
203
|
+
else if (isFourStateValue(value)) {
|
|
204
|
+
if (!sig.is4state) {
|
|
205
|
+
throw new Error(`Port '${name}' is not 4-state; cannot assign FourState`);
|
|
206
|
+
}
|
|
207
|
+
writeFourState(view, sig, value);
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
writeSignal(view, sig, value);
|
|
211
|
+
// Clear mask when writing a defined value to a 4-state signal
|
|
212
|
+
if (sig.is4state) {
|
|
213
|
+
const maskLayout = {
|
|
214
|
+
offset: sig.offset + sig.byteSize,
|
|
215
|
+
width: sig.width,
|
|
216
|
+
byteSize: sig.byteSize,
|
|
217
|
+
is4state: false,
|
|
218
|
+
direction: sig.direction,
|
|
219
|
+
};
|
|
220
|
+
writeSignal(view, maskLayout, sig.width <= 53 ? 0 : 0n);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
state.dirty = true;
|
|
224
|
+
},
|
|
225
|
+
enumerable: true,
|
|
226
|
+
configurable: false,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
// ---------------------------------------------------------------------------
|
|
230
|
+
// Nested interface accessor
|
|
231
|
+
// ---------------------------------------------------------------------------
|
|
232
|
+
function createNestedDut(view, layout, members, prefix, handle, state) {
|
|
233
|
+
const obj = Object.create(null);
|
|
234
|
+
for (const [memberName, memberPort] of Object.entries(members)) {
|
|
235
|
+
const qualifiedName = `${prefix}.${memberName}`;
|
|
236
|
+
const sig = layout[qualifiedName];
|
|
237
|
+
if (!sig)
|
|
238
|
+
continue;
|
|
239
|
+
if (memberPort.interface) {
|
|
240
|
+
const nested = createNestedDut(view, layout, memberPort.interface, qualifiedName, handle, state);
|
|
241
|
+
Object.defineProperty(obj, memberName, {
|
|
242
|
+
value: nested,
|
|
243
|
+
enumerable: true,
|
|
244
|
+
configurable: false,
|
|
245
|
+
writable: false,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
defineSignalProperty(obj, memberName, view, sig, memberPort, handle, state);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return obj;
|
|
253
|
+
}
|
|
254
|
+
// ---------------------------------------------------------------------------
|
|
255
|
+
// Array port accessor
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
function createArrayDut(view, baseSig, port, handle, state) {
|
|
258
|
+
const dims = port.arrayDims;
|
|
259
|
+
const elementWidth = port.width;
|
|
260
|
+
const elementByteSize = Math.ceil(elementWidth / 8);
|
|
261
|
+
const totalElements = dims.reduce((a, b) => a * b, 1);
|
|
262
|
+
const isOutput = port.direction === "output";
|
|
263
|
+
const isInput = port.direction === "input";
|
|
264
|
+
const baseOffset = baseSig.offset;
|
|
265
|
+
const is4state = baseSig.is4state;
|
|
266
|
+
return {
|
|
267
|
+
length: totalElements,
|
|
268
|
+
at(i) {
|
|
269
|
+
if (state.dirty && !isInput) {
|
|
270
|
+
handle.evalComb();
|
|
271
|
+
state.dirty = false;
|
|
272
|
+
}
|
|
273
|
+
const offset = baseOffset + i * elementByteSize;
|
|
274
|
+
if (elementWidth <= 53) {
|
|
275
|
+
return readNumber(view, offset, elementWidth);
|
|
276
|
+
}
|
|
277
|
+
return readBigInt(view, offset, elementByteSize);
|
|
278
|
+
},
|
|
279
|
+
set(i, value) {
|
|
280
|
+
if (isOutput) {
|
|
281
|
+
throw new Error("Cannot write to output array port");
|
|
282
|
+
}
|
|
283
|
+
const offset = baseOffset + i * elementByteSize;
|
|
284
|
+
if (value === Symbol.for("veryl:X")) {
|
|
285
|
+
if (!is4state) {
|
|
286
|
+
throw new Error("Array port is not 4-state; cannot assign X");
|
|
287
|
+
}
|
|
288
|
+
const elemSig = {
|
|
289
|
+
offset, width: elementWidth, byteSize: elementByteSize,
|
|
290
|
+
is4state, direction: baseSig.direction,
|
|
291
|
+
};
|
|
292
|
+
writeAllX(view, elemSig);
|
|
293
|
+
}
|
|
294
|
+
else if (isFourStateValue(value)) {
|
|
295
|
+
if (!is4state) {
|
|
296
|
+
throw new Error("Array port is not 4-state; cannot assign FourState");
|
|
297
|
+
}
|
|
298
|
+
const elemSig = {
|
|
299
|
+
offset, width: elementWidth, byteSize: elementByteSize,
|
|
300
|
+
is4state, direction: baseSig.direction,
|
|
301
|
+
};
|
|
302
|
+
writeFourState(view, elemSig, value);
|
|
303
|
+
}
|
|
304
|
+
else if (elementWidth <= 53 && typeof value === "number") {
|
|
305
|
+
writeNumber(view, offset, elementWidth, value);
|
|
306
|
+
if (is4state)
|
|
307
|
+
writeNumber(view, offset + elementByteSize, elementWidth, 0);
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
const bigVal = typeof value === "bigint" ? value : BigInt(value);
|
|
311
|
+
writeBigInt(view, offset, elementByteSize, bigVal);
|
|
312
|
+
if (is4state)
|
|
313
|
+
writeBigInt(view, offset + elementByteSize, elementByteSize, 0n);
|
|
314
|
+
}
|
|
315
|
+
state.dirty = true;
|
|
316
|
+
},
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
// ---------------------------------------------------------------------------
|
|
320
|
+
// 4-state read helper (exported for advanced use)
|
|
321
|
+
// ---------------------------------------------------------------------------
|
|
322
|
+
/**
|
|
323
|
+
* Read the raw 4-state (value, mask) pair for a signal.
|
|
324
|
+
* Mask bits set to 1 indicate X/Z.
|
|
325
|
+
*/
|
|
326
|
+
export function readFourState(buffer, sig) {
|
|
327
|
+
if (!sig.is4state) {
|
|
328
|
+
throw new Error("Signal is not 4-state");
|
|
329
|
+
}
|
|
330
|
+
const view = new DataView(buffer);
|
|
331
|
+
const value = readSignal(view, sig);
|
|
332
|
+
const maskSig = {
|
|
333
|
+
offset: sig.offset + sig.byteSize,
|
|
334
|
+
width: sig.width,
|
|
335
|
+
byteSize: sig.byteSize,
|
|
336
|
+
is4state: false,
|
|
337
|
+
direction: sig.direction,
|
|
338
|
+
};
|
|
339
|
+
const mask = readSignal(view, maskSig);
|
|
340
|
+
return [value, mask];
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=dut.js.map
|
package/dist/dut.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dut.js","sourceRoot":"","sources":["../src/dut.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @celox-sim/celox
|
|
3
|
+
*
|
|
4
|
+
* TypeScript runtime for Celox HDL simulation.
|
|
5
|
+
* Provides zero-FFI signal I/O via SharedArrayBuffer + DataView,
|
|
6
|
+
* with NAPI calls only for control operations (tick, runUntil, etc.).
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
export type { ModuleDefinition, PortInfo, SimulatorOptions, EventHandle, FourStateValue, } from "./types.js";
|
|
11
|
+
/** @internal */
|
|
12
|
+
export type { SignalLayout, CreateResult, NativeHandle, NativeSimulatorHandle, NativeSimulationHandle, } from "./types.js";
|
|
13
|
+
export { X, FourState, isFourStateValue } from "./types.js";
|
|
14
|
+
export { Simulator } from "./simulator.js";
|
|
15
|
+
export { Simulation } from "./simulation.js";
|
|
16
|
+
/** @internal */
|
|
17
|
+
export { createDut, readFourState } from "./dut.js";
|
|
18
|
+
/** @internal */
|
|
19
|
+
export type { DirtyState } from "./dut.js";
|
|
20
|
+
/** @internal */
|
|
21
|
+
export { loadNativeAddon, parseNapiLayout, buildPortsFromLayout, wrapDirectSimulatorHandle, wrapDirectSimulationHandle, createSimulatorBridge, createSimulationBridge, } from "./napi-helpers.js";
|
|
22
|
+
/** @internal */
|
|
23
|
+
export type { RawNapiAddon, RawNapiSimulatorHandle, RawNapiSimulationHandle } from "./napi-helpers.js";
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,YAAY,EACV,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,EAChB,WAAW,EACX,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,gBAAgB;AAChB,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG5D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACpD,gBAAgB;AAChB,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,gBAAgB;AAChB,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,gBAAgB;AAChB,YAAY,EAAE,YAAY,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @celox-sim/celox
|
|
3
|
+
*
|
|
4
|
+
* TypeScript runtime for Celox HDL simulation.
|
|
5
|
+
* Provides zero-FFI signal I/O via SharedArrayBuffer + DataView,
|
|
6
|
+
* with NAPI calls only for control operations (tick, runUntil, etc.).
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
// 4-state helpers
|
|
11
|
+
export { X, FourState, isFourStateValue } from "./types.js";
|
|
12
|
+
// Simulator (event-based)
|
|
13
|
+
export { Simulator } from "./simulator.js";
|
|
14
|
+
// Simulation (time-based)
|
|
15
|
+
export { Simulation } from "./simulation.js";
|
|
16
|
+
/** @internal */
|
|
17
|
+
export { createDut, readFourState } from "./dut.js";
|
|
18
|
+
/** @internal */
|
|
19
|
+
export { loadNativeAddon, parseNapiLayout, buildPortsFromLayout, wrapDirectSimulatorHandle, wrapDirectSimulationHandle, createSimulatorBridge, createSimulationBridge, } from "./napi-helpers.js";
|
|
20
|
+
// NAPI bridge (backward compat — re-exports from napi-helpers)
|
|
21
|
+
// Consumers that import from "./napi-bridge.js" still work.
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH,kBAAkB;AAClB,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE5D,0BAA0B;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,0BAA0B;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIpD,gBAAgB;AAChB,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAI3B,+DAA+D;AAC/D,4DAA4D"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backward-compatibility re-exports from napi-helpers.ts.
|
|
3
|
+
*
|
|
4
|
+
* New code should import from "./napi-helpers.js" directly.
|
|
5
|
+
*/
|
|
6
|
+
export { createSimulatorBridge, createSimulationBridge, type RawNapiAddon, type RawNapiSimulatorHandle, type RawNapiSimulationHandle, } from "./napi-helpers.js";
|
|
7
|
+
//# sourceMappingURL=napi-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"napi-bridge.d.ts","sourceRoot":"","sources":["../src/napi-bridge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"napi-bridge.js","sourceRoot":"","sources":["../src/napi-bridge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAIvB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NAPI helper utilities for the @celox-sim/celox TypeScript runtime.
|
|
3
|
+
*
|
|
4
|
+
* Provides reusable functions for:
|
|
5
|
+
* - Loading the native addon
|
|
6
|
+
* - Parsing NAPI layout JSON into SignalLayout
|
|
7
|
+
* - Building PortInfo from NAPI layout (auto-detect ports)
|
|
8
|
+
* - Wrapping NAPI handles with zero-copy direct operations
|
|
9
|
+
* - Creating bridge functions for Simulator.create() / Simulation.create()
|
|
10
|
+
*/
|
|
11
|
+
import type { NativeSimulatorHandle, NativeSimulationHandle, PortInfo, SignalLayout } from "./types.js";
|
|
12
|
+
import type { NativeCreateFn } from "./simulator.js";
|
|
13
|
+
import type { NativeCreateSimulationFn } from "./simulation.js";
|
|
14
|
+
export interface RawNapiSimulatorHandle {
|
|
15
|
+
readonly layoutJson: string;
|
|
16
|
+
readonly eventsJson: string;
|
|
17
|
+
readonly stableSize: number;
|
|
18
|
+
readonly totalSize: number;
|
|
19
|
+
tick(eventId: number): void;
|
|
20
|
+
tickN(eventId: number, count: number): void;
|
|
21
|
+
evalComb(): void;
|
|
22
|
+
dump(timestamp: number): void;
|
|
23
|
+
sharedMemory(): Uint8Array;
|
|
24
|
+
dispose(): void;
|
|
25
|
+
}
|
|
26
|
+
export interface RawNapiSimulationHandle {
|
|
27
|
+
readonly layoutJson: string;
|
|
28
|
+
readonly eventsJson: string;
|
|
29
|
+
readonly stableSize: number;
|
|
30
|
+
readonly totalSize: number;
|
|
31
|
+
addClock(eventId: number, period: number, initialDelay: number): void;
|
|
32
|
+
schedule(eventId: number, time: number, value: number): void;
|
|
33
|
+
runUntil(endTime: number): void;
|
|
34
|
+
step(): number | null;
|
|
35
|
+
time(): number;
|
|
36
|
+
evalComb(): void;
|
|
37
|
+
dump(timestamp: number): void;
|
|
38
|
+
sharedMemory(): Uint8Array;
|
|
39
|
+
dispose(): void;
|
|
40
|
+
}
|
|
41
|
+
export interface NapiOptions {
|
|
42
|
+
fourState?: boolean;
|
|
43
|
+
}
|
|
44
|
+
export interface RawNapiAddon {
|
|
45
|
+
NativeSimulatorHandle: {
|
|
46
|
+
new (code: string, top: string, options?: NapiOptions): RawNapiSimulatorHandle;
|
|
47
|
+
fromProject(projectPath: string, top: string, options?: NapiOptions): RawNapiSimulatorHandle;
|
|
48
|
+
};
|
|
49
|
+
NativeSimulationHandle: {
|
|
50
|
+
new (code: string, top: string, options?: NapiOptions): RawNapiSimulationHandle;
|
|
51
|
+
fromProject(projectPath: string, top: string, options?: NapiOptions): RawNapiSimulationHandle;
|
|
52
|
+
};
|
|
53
|
+
genTs(projectPath: string): string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Load the native NAPI addon.
|
|
57
|
+
*
|
|
58
|
+
* Resolution: `@celox-sim/celox-napi` package (works both in workspace dev
|
|
59
|
+
* and when installed from npm — napi-rs generated index.js handles platform
|
|
60
|
+
* detection). An explicit path can override this.
|
|
61
|
+
*
|
|
62
|
+
* @param addonPath Explicit path to the `.node` file (overrides auto-detection).
|
|
63
|
+
*/
|
|
64
|
+
export declare function loadNativeAddon(addonPath?: string): RawNapiAddon;
|
|
65
|
+
/**
|
|
66
|
+
* Parse the NAPI layout JSON into SignalLayout records.
|
|
67
|
+
* Returns both the full layout (with type_kind for port detection) and
|
|
68
|
+
* the DUT-compatible layout (without type_kind).
|
|
69
|
+
*/
|
|
70
|
+
export declare function parseNapiLayout(json: string): {
|
|
71
|
+
signals: Record<string, SignalLayout & {
|
|
72
|
+
typeKind: string;
|
|
73
|
+
arrayDims?: number[];
|
|
74
|
+
}>;
|
|
75
|
+
forDut: Record<string, SignalLayout>;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Build PortInfo records from the NAPI layout signals.
|
|
79
|
+
* This auto-detects port metadata so users don't need to hand-write ModuleDefinition.
|
|
80
|
+
*/
|
|
81
|
+
export declare function buildPortsFromLayout(signals: Record<string, SignalLayout & {
|
|
82
|
+
typeKind: string;
|
|
83
|
+
arrayDims?: number[];
|
|
84
|
+
}>, _events: Record<string, number>): Record<string, PortInfo>;
|
|
85
|
+
/**
|
|
86
|
+
* Wrap a raw NAPI simulator handle with direct (zero-copy) operations.
|
|
87
|
+
* The buffer is shared between JS and Rust — no copies per tick.
|
|
88
|
+
*/
|
|
89
|
+
export declare function wrapDirectSimulatorHandle(raw: RawNapiSimulatorHandle): NativeSimulatorHandle;
|
|
90
|
+
/**
|
|
91
|
+
* Wrap a raw NAPI simulation handle with direct (zero-copy) operations.
|
|
92
|
+
*/
|
|
93
|
+
export declare function wrapDirectSimulationHandle(raw: RawNapiSimulationHandle): NativeSimulationHandle;
|
|
94
|
+
/**
|
|
95
|
+
* Create a `NativeCreateFn` from a raw NAPI addon, suitable for
|
|
96
|
+
* `Simulator.create(module, { __nativeCreate: ... })`.
|
|
97
|
+
*/
|
|
98
|
+
export declare function createSimulatorBridge(addon: RawNapiAddon): NativeCreateFn;
|
|
99
|
+
/**
|
|
100
|
+
* Create a `NativeCreateSimulationFn` from a raw NAPI addon, suitable for
|
|
101
|
+
* `Simulation.create(module, { __nativeCreate: ... })`.
|
|
102
|
+
*/
|
|
103
|
+
export declare function createSimulationBridge(addon: RawNapiAddon): NativeCreateSimulationFn;
|
|
104
|
+
//# sourceMappingURL=napi-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"napi-helpers.d.ts","sourceRoot":"","sources":["../src/napi-helpers.ts"],"names":[],"mappings":"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"}
|