schematex 0.6.0 → 0.6.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/dist/ai/ai-sdk.cjs +9 -9
- package/dist/ai/ai-sdk.d.cts +1 -1
- package/dist/ai/ai-sdk.d.ts +1 -1
- package/dist/ai/ai-sdk.js +4 -4
- package/dist/ai/index.cjs +15 -15
- package/dist/ai/index.js +4 -4
- package/dist/browser.cjs +10 -10
- package/dist/browser.js +4 -4
- package/dist/{chunk-ST5YRTTV.cjs → chunk-2F45Y2ON.cjs} +44 -5
- package/dist/chunk-2F45Y2ON.cjs.map +1 -0
- package/dist/{chunk-V4RO5KYY.cjs → chunk-3JAI3OVG.cjs} +81 -47
- package/dist/chunk-3JAI3OVG.cjs.map +1 -0
- package/dist/{chunk-P63S7P6N.js → chunk-ITUPR7G5.js} +263 -48
- package/dist/chunk-ITUPR7G5.js.map +1 -0
- package/dist/{chunk-7AFW2J6J.js → chunk-IZWKJVIC.js} +125 -15
- package/dist/chunk-IZWKJVIC.js.map +1 -0
- package/dist/{chunk-UWA5MWCI.js → chunk-JVAJ6ZLO.js} +81 -47
- package/dist/chunk-JVAJ6ZLO.js.map +1 -0
- package/dist/{chunk-25ZON47K.cjs → chunk-KSNUMQGS.cjs} +127 -17
- package/dist/chunk-KSNUMQGS.cjs.map +1 -0
- package/dist/{chunk-6URNSB6G.js → chunk-P26FCZP3.js} +44 -5
- package/dist/chunk-P26FCZP3.js.map +1 -0
- package/dist/{chunk-YVDUEUFV.cjs → chunk-SD6VDTQR.cjs} +265 -50
- package/dist/chunk-SD6VDTQR.cjs.map +1 -0
- package/dist/diagrams/circuit/index.cjs +7 -7
- package/dist/diagrams/circuit/index.js +1 -1
- package/dist/diagrams/timing/index.cjs +4 -4
- package/dist/diagrams/timing/index.js +1 -1
- package/dist/index.cjs +26 -26
- package/dist/index.js +5 -5
- package/dist/react.cjs +4 -4
- package/dist/react.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-25ZON47K.cjs.map +0 -1
- package/dist/chunk-6URNSB6G.js.map +0 -1
- package/dist/chunk-7AFW2J6J.js.map +0 -1
- package/dist/chunk-P63S7P6N.js.map +0 -1
- package/dist/chunk-ST5YRTTV.cjs.map +0 -1
- package/dist/chunk-UWA5MWCI.js.map +0 -1
- package/dist/chunk-V4RO5KYY.cjs.map +0 -1
- package/dist/chunk-YVDUEUFV.cjs.map +0 -1
package/dist/ai/ai-sdk.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
3
|
+
var chunkSD6VDTQR_cjs = require('../chunk-SD6VDTQR.cjs');
|
|
4
|
+
require('../chunk-KSNUMQGS.cjs');
|
|
5
5
|
require('../chunk-FKJBXGWP.cjs');
|
|
6
|
-
require('../chunk-
|
|
6
|
+
require('../chunk-3JAI3OVG.cjs');
|
|
7
7
|
require('../chunk-SUIDD2C5.cjs');
|
|
8
8
|
require('../chunk-2L4YXZAZ.cjs');
|
|
9
9
|
require('../chunk-ECD5XHBM.cjs');
|
|
@@ -19,7 +19,7 @@ require('../chunk-3KRL2EGN.cjs');
|
|
|
19
19
|
require('../chunk-4UFR2LB6.cjs');
|
|
20
20
|
require('../chunk-WQDIZH2Z.cjs');
|
|
21
21
|
require('../chunk-5UCXMYE7.cjs');
|
|
22
|
-
require('../chunk-
|
|
22
|
+
require('../chunk-2F45Y2ON.cjs');
|
|
23
23
|
require('../chunk-R66QG3XT.cjs');
|
|
24
24
|
require('../chunk-L7POWM5B.cjs');
|
|
25
25
|
require('../chunk-NAGUZFXX.cjs');
|
|
@@ -31,7 +31,7 @@ var schematexTools = {
|
|
|
31
31
|
listDiagrams: ai.tool({
|
|
32
32
|
description: "List every Schematex diagram type with a tagline, 'use when' hint, domain cluster, and authoritative standard. Call this first to discover what's available.",
|
|
33
33
|
inputSchema: zod.z.object({}),
|
|
34
|
-
execute: async () =>
|
|
34
|
+
execute: async () => chunkSD6VDTQR_cjs.listDiagrams()
|
|
35
35
|
}),
|
|
36
36
|
getSyntax: ai.tool({
|
|
37
37
|
description: "Return syntax for one diagram type. Default `detail: canonical` is the compact first-shot generation path: canonical header, preferred forms, rules, and repair checks. Request `detail: reference` only for advanced forms or imported adapters after choosing a type.",
|
|
@@ -46,7 +46,7 @@ var schematexTools = {
|
|
|
46
46
|
execute: async ({
|
|
47
47
|
type,
|
|
48
48
|
detail
|
|
49
|
-
}) =>
|
|
49
|
+
}) => chunkSD6VDTQR_cjs.getSyntax(type, { detail })
|
|
50
50
|
}),
|
|
51
51
|
getExamples: ai.tool({
|
|
52
52
|
description: "Return curated real-world DSL examples for a diagram type, each with scenario notes and tags. Use as few-shot context before generating DSL.",
|
|
@@ -56,7 +56,7 @@ var schematexTools = {
|
|
|
56
56
|
preferFeatured: zod.z.boolean().optional().describe("Rank featured examples first."),
|
|
57
57
|
maxComplexity: zod.z.number().int().min(1).max(5).optional().describe("Only return examples with complexity <= this value (1=simplest).")
|
|
58
58
|
}),
|
|
59
|
-
execute: async (args) =>
|
|
59
|
+
execute: async (args) => chunkSD6VDTQR_cjs.getExamples(args.type, {
|
|
60
60
|
limit: args.limit,
|
|
61
61
|
preferFeatured: args.preferFeatured,
|
|
62
62
|
maxComplexity: args.maxComplexity
|
|
@@ -70,7 +70,7 @@ var schematexTools = {
|
|
|
70
70
|
),
|
|
71
71
|
dsl: zod.z.string().describe("The DSL source text to validate.")
|
|
72
72
|
}),
|
|
73
|
-
execute: async ({ type, dsl }) =>
|
|
73
|
+
execute: async ({ type, dsl }) => chunkSD6VDTQR_cjs.validateDsl(type, dsl)
|
|
74
74
|
}),
|
|
75
75
|
renderDsl: ai.tool({
|
|
76
76
|
description: "Render Schematex DSL to an SVG string. Returns { ok: true, svg } or { ok: false, errors }. Use when the caller needs the actual diagram output, not just validation.",
|
|
@@ -85,7 +85,7 @@ var schematexTools = {
|
|
|
85
85
|
dsl,
|
|
86
86
|
theme,
|
|
87
87
|
padding
|
|
88
|
-
}) =>
|
|
88
|
+
}) => chunkSD6VDTQR_cjs.renderDsl(type, dsl, { theme, padding })
|
|
89
89
|
})
|
|
90
90
|
};
|
|
91
91
|
|
package/dist/ai/ai-sdk.d.cts
CHANGED
|
@@ -7,7 +7,7 @@ declare const schematexTools: {
|
|
|
7
7
|
readonly listDiagrams: ai.Tool<{}, DiagramListItem[]>;
|
|
8
8
|
readonly getSyntax: ai.Tool<{
|
|
9
9
|
type: string;
|
|
10
|
-
detail?: "
|
|
10
|
+
detail?: "reference" | "canonical" | undefined;
|
|
11
11
|
}, GetSyntaxResult>;
|
|
12
12
|
readonly getExamples: ai.Tool<{
|
|
13
13
|
type: string;
|
package/dist/ai/ai-sdk.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ declare const schematexTools: {
|
|
|
7
7
|
readonly listDiagrams: ai.Tool<{}, DiagramListItem[]>;
|
|
8
8
|
readonly getSyntax: ai.Tool<{
|
|
9
9
|
type: string;
|
|
10
|
-
detail?: "
|
|
10
|
+
detail?: "reference" | "canonical" | undefined;
|
|
11
11
|
}, GetSyntaxResult>;
|
|
12
12
|
readonly getExamples: ai.Tool<{
|
|
13
13
|
type: string;
|
package/dist/ai/ai-sdk.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { renderDsl, validateDsl, getExamples, getSyntax, listDiagrams } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
import { renderDsl, validateDsl, getExamples, getSyntax, listDiagrams } from '../chunk-ITUPR7G5.js';
|
|
2
|
+
import '../chunk-IZWKJVIC.js';
|
|
3
3
|
import '../chunk-RJMCWT7Z.js';
|
|
4
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-JVAJ6ZLO.js';
|
|
5
5
|
import '../chunk-EPKIJEH7.js';
|
|
6
6
|
import '../chunk-TWLKXV2O.js';
|
|
7
7
|
import '../chunk-LGABFD3L.js';
|
|
@@ -17,7 +17,7 @@ import '../chunk-2KTQ75LN.js';
|
|
|
17
17
|
import '../chunk-MVIEIKOI.js';
|
|
18
18
|
import '../chunk-3VB5AT4R.js';
|
|
19
19
|
import '../chunk-FO7BLCEW.js';
|
|
20
|
-
import '../chunk-
|
|
20
|
+
import '../chunk-P26FCZP3.js';
|
|
21
21
|
import '../chunk-3IE7KZY4.js';
|
|
22
22
|
import '../chunk-LRI4RH2N.js';
|
|
23
23
|
import '../chunk-5IKOLUWK.js';
|
package/dist/ai/index.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
3
|
+
var chunkSD6VDTQR_cjs = require('../chunk-SD6VDTQR.cjs');
|
|
4
|
+
require('../chunk-KSNUMQGS.cjs');
|
|
5
5
|
require('../chunk-FKJBXGWP.cjs');
|
|
6
|
-
require('../chunk-
|
|
6
|
+
require('../chunk-3JAI3OVG.cjs');
|
|
7
7
|
require('../chunk-SUIDD2C5.cjs');
|
|
8
8
|
require('../chunk-2L4YXZAZ.cjs');
|
|
9
9
|
require('../chunk-ECD5XHBM.cjs');
|
|
@@ -19,7 +19,7 @@ require('../chunk-3KRL2EGN.cjs');
|
|
|
19
19
|
require('../chunk-4UFR2LB6.cjs');
|
|
20
20
|
require('../chunk-WQDIZH2Z.cjs');
|
|
21
21
|
require('../chunk-5UCXMYE7.cjs');
|
|
22
|
-
require('../chunk-
|
|
22
|
+
require('../chunk-2F45Y2ON.cjs');
|
|
23
23
|
require('../chunk-R66QG3XT.cjs');
|
|
24
24
|
require('../chunk-L7POWM5B.cjs');
|
|
25
25
|
require('../chunk-NAGUZFXX.cjs');
|
|
@@ -29,47 +29,47 @@ require('../chunk-3WNW5Y7P.cjs');
|
|
|
29
29
|
|
|
30
30
|
Object.defineProperty(exports, "DIAGRAM_REGISTRY", {
|
|
31
31
|
enumerable: true,
|
|
32
|
-
get: function () { return
|
|
32
|
+
get: function () { return chunkSD6VDTQR_cjs.DIAGRAM_REGISTRY; }
|
|
33
33
|
});
|
|
34
34
|
Object.defineProperty(exports, "DIAGRAM_SINCE", {
|
|
35
35
|
enumerable: true,
|
|
36
|
-
get: function () { return
|
|
36
|
+
get: function () { return chunkSD6VDTQR_cjs.DIAGRAM_SINCE; }
|
|
37
37
|
});
|
|
38
38
|
Object.defineProperty(exports, "getAllDiagramTypes", {
|
|
39
39
|
enumerable: true,
|
|
40
|
-
get: function () { return
|
|
40
|
+
get: function () { return chunkSD6VDTQR_cjs.getAllDiagramTypes; }
|
|
41
41
|
});
|
|
42
42
|
Object.defineProperty(exports, "getDiagramMeta", {
|
|
43
43
|
enumerable: true,
|
|
44
|
-
get: function () { return
|
|
44
|
+
get: function () { return chunkSD6VDTQR_cjs.getDiagramMeta; }
|
|
45
45
|
});
|
|
46
46
|
Object.defineProperty(exports, "getDiagramSince", {
|
|
47
47
|
enumerable: true,
|
|
48
|
-
get: function () { return
|
|
48
|
+
get: function () { return chunkSD6VDTQR_cjs.getDiagramSince; }
|
|
49
49
|
});
|
|
50
50
|
Object.defineProperty(exports, "getExamples", {
|
|
51
51
|
enumerable: true,
|
|
52
|
-
get: function () { return
|
|
52
|
+
get: function () { return chunkSD6VDTQR_cjs.getExamples; }
|
|
53
53
|
});
|
|
54
54
|
Object.defineProperty(exports, "getSyntax", {
|
|
55
55
|
enumerable: true,
|
|
56
|
-
get: function () { return
|
|
56
|
+
get: function () { return chunkSD6VDTQR_cjs.getSyntax; }
|
|
57
57
|
});
|
|
58
58
|
Object.defineProperty(exports, "listDiagrams", {
|
|
59
59
|
enumerable: true,
|
|
60
|
-
get: function () { return
|
|
60
|
+
get: function () { return chunkSD6VDTQR_cjs.listDiagrams; }
|
|
61
61
|
});
|
|
62
62
|
Object.defineProperty(exports, "renderDsl", {
|
|
63
63
|
enumerable: true,
|
|
64
|
-
get: function () { return
|
|
64
|
+
get: function () { return chunkSD6VDTQR_cjs.renderDsl; }
|
|
65
65
|
});
|
|
66
66
|
Object.defineProperty(exports, "resolveDiagramType", {
|
|
67
67
|
enumerable: true,
|
|
68
|
-
get: function () { return
|
|
68
|
+
get: function () { return chunkSD6VDTQR_cjs.resolveDiagramType; }
|
|
69
69
|
});
|
|
70
70
|
Object.defineProperty(exports, "validateDsl", {
|
|
71
71
|
enumerable: true,
|
|
72
|
-
get: function () { return
|
|
72
|
+
get: function () { return chunkSD6VDTQR_cjs.validateDsl; }
|
|
73
73
|
});
|
|
74
74
|
//# sourceMappingURL=index.cjs.map
|
|
75
75
|
//# sourceMappingURL=index.cjs.map
|
package/dist/ai/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { DIAGRAM_REGISTRY, DIAGRAM_SINCE, getAllDiagramTypes, getDiagramMeta, getDiagramSince, getExamples, getSyntax, listDiagrams, renderDsl, resolveDiagramType, validateDsl } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { DIAGRAM_REGISTRY, DIAGRAM_SINCE, getAllDiagramTypes, getDiagramMeta, getDiagramSince, getExamples, getSyntax, listDiagrams, renderDsl, resolveDiagramType, validateDsl } from '../chunk-ITUPR7G5.js';
|
|
2
|
+
import '../chunk-IZWKJVIC.js';
|
|
3
3
|
import '../chunk-RJMCWT7Z.js';
|
|
4
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-JVAJ6ZLO.js';
|
|
5
5
|
import '../chunk-EPKIJEH7.js';
|
|
6
6
|
import '../chunk-TWLKXV2O.js';
|
|
7
7
|
import '../chunk-LGABFD3L.js';
|
|
@@ -17,7 +17,7 @@ import '../chunk-2KTQ75LN.js';
|
|
|
17
17
|
import '../chunk-MVIEIKOI.js';
|
|
18
18
|
import '../chunk-3VB5AT4R.js';
|
|
19
19
|
import '../chunk-FO7BLCEW.js';
|
|
20
|
-
import '../chunk-
|
|
20
|
+
import '../chunk-P26FCZP3.js';
|
|
21
21
|
import '../chunk-3IE7KZY4.js';
|
|
22
22
|
import '../chunk-LRI4RH2N.js';
|
|
23
23
|
import '../chunk-5IKOLUWK.js';
|
package/dist/browser.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkKSNUMQGS_cjs = require('./chunk-KSNUMQGS.cjs');
|
|
4
4
|
require('./chunk-FKJBXGWP.cjs');
|
|
5
|
-
require('./chunk-
|
|
5
|
+
require('./chunk-3JAI3OVG.cjs');
|
|
6
6
|
require('./chunk-SUIDD2C5.cjs');
|
|
7
7
|
require('./chunk-2L4YXZAZ.cjs');
|
|
8
8
|
require('./chunk-ECD5XHBM.cjs');
|
|
@@ -18,7 +18,7 @@ require('./chunk-3KRL2EGN.cjs');
|
|
|
18
18
|
require('./chunk-4UFR2LB6.cjs');
|
|
19
19
|
require('./chunk-WQDIZH2Z.cjs');
|
|
20
20
|
require('./chunk-5UCXMYE7.cjs');
|
|
21
|
-
require('./chunk-
|
|
21
|
+
require('./chunk-2F45Y2ON.cjs');
|
|
22
22
|
require('./chunk-R66QG3XT.cjs');
|
|
23
23
|
require('./chunk-L7POWM5B.cjs');
|
|
24
24
|
require('./chunk-NAGUZFXX.cjs');
|
|
@@ -26,10 +26,10 @@ require('./chunk-3WNW5Y7P.cjs');
|
|
|
26
26
|
|
|
27
27
|
// src/browser.ts
|
|
28
28
|
function renderToElement(text, config) {
|
|
29
|
-
return svgStringToElement(
|
|
29
|
+
return svgStringToElement(chunkKSNUMQGS_cjs.render(text, config));
|
|
30
30
|
}
|
|
31
31
|
function renderPreviewToElement(text, config) {
|
|
32
|
-
return svgStringToElement(
|
|
32
|
+
return svgStringToElement(chunkKSNUMQGS_cjs.renderPreview(text, config));
|
|
33
33
|
}
|
|
34
34
|
function svgStringToElement(svgString) {
|
|
35
35
|
const parser = new DOMParser();
|
|
@@ -42,23 +42,23 @@ function svgStringToElement(svgString) {
|
|
|
42
42
|
return el;
|
|
43
43
|
}
|
|
44
44
|
function renderToContainer(text, container, config) {
|
|
45
|
-
container.innerHTML =
|
|
45
|
+
container.innerHTML = chunkKSNUMQGS_cjs.render(text, config);
|
|
46
46
|
}
|
|
47
47
|
function renderPreviewToContainer(text, container, config) {
|
|
48
|
-
container.innerHTML =
|
|
48
|
+
container.innerHTML = chunkKSNUMQGS_cjs.renderPreview(text, config);
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
Object.defineProperty(exports, "render", {
|
|
52
52
|
enumerable: true,
|
|
53
|
-
get: function () { return
|
|
53
|
+
get: function () { return chunkKSNUMQGS_cjs.render; }
|
|
54
54
|
});
|
|
55
55
|
Object.defineProperty(exports, "renderPreview", {
|
|
56
56
|
enumerable: true,
|
|
57
|
-
get: function () { return
|
|
57
|
+
get: function () { return chunkKSNUMQGS_cjs.renderPreview; }
|
|
58
58
|
});
|
|
59
59
|
Object.defineProperty(exports, "renderResult", {
|
|
60
60
|
enumerable: true,
|
|
61
|
-
get: function () { return
|
|
61
|
+
get: function () { return chunkKSNUMQGS_cjs.renderResult; }
|
|
62
62
|
});
|
|
63
63
|
exports.renderPreviewToContainer = renderPreviewToContainer;
|
|
64
64
|
exports.renderPreviewToElement = renderPreviewToElement;
|
package/dist/browser.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { render, renderPreview } from './chunk-
|
|
2
|
-
export { render, renderPreview, renderResult } from './chunk-
|
|
1
|
+
import { render, renderPreview } from './chunk-IZWKJVIC.js';
|
|
2
|
+
export { render, renderPreview, renderResult } from './chunk-IZWKJVIC.js';
|
|
3
3
|
import './chunk-RJMCWT7Z.js';
|
|
4
|
-
import './chunk-
|
|
4
|
+
import './chunk-JVAJ6ZLO.js';
|
|
5
5
|
import './chunk-EPKIJEH7.js';
|
|
6
6
|
import './chunk-TWLKXV2O.js';
|
|
7
7
|
import './chunk-LGABFD3L.js';
|
|
@@ -17,7 +17,7 @@ import './chunk-2KTQ75LN.js';
|
|
|
17
17
|
import './chunk-MVIEIKOI.js';
|
|
18
18
|
import './chunk-3VB5AT4R.js';
|
|
19
19
|
import './chunk-FO7BLCEW.js';
|
|
20
|
-
import './chunk-
|
|
20
|
+
import './chunk-P26FCZP3.js';
|
|
21
21
|
import './chunk-3IE7KZY4.js';
|
|
22
22
|
import './chunk-LRI4RH2N.js';
|
|
23
23
|
import './chunk-5IKOLUWK.js';
|
|
@@ -67,9 +67,48 @@ function parseTiming(text2) {
|
|
|
67
67
|
const sigMatch = line.match(/^([^:]+):\s*(.+)$/);
|
|
68
68
|
if (sigMatch) {
|
|
69
69
|
const name = sigMatch[1].trim();
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
const rhs = sigMatch[2].trim();
|
|
71
|
+
const tok = rhs.split(/\s+/);
|
|
72
|
+
let wave;
|
|
73
|
+
let data = [];
|
|
74
|
+
if (/^clock$/i.test(tok[0])) {
|
|
75
|
+
const n = Number(tok[1]);
|
|
76
|
+
if (!Number.isInteger(n) || n < 1) {
|
|
77
|
+
throw new TimingParseError(
|
|
78
|
+
`clock needs a positive cycle count, e.g. "${name}: clock 8"`,
|
|
79
|
+
lineNo,
|
|
80
|
+
void 0,
|
|
81
|
+
line
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
wave = (/^neg/i.test(tok[2] ?? "") ? "n" : "p").repeat(n);
|
|
85
|
+
} else if (/^rle$/i.test(tok[0])) {
|
|
86
|
+
wave = "";
|
|
87
|
+
for (const seg of tok.slice(1)) {
|
|
88
|
+
const sm = seg.match(/^(.)\*(\d+)$/);
|
|
89
|
+
if (!sm || !VALID_STATES.test(sm[1])) {
|
|
90
|
+
throw new TimingParseError(
|
|
91
|
+
`rle segment must be <state>*<count>, e.g. "1*2 0*6"; got "${seg}"`,
|
|
92
|
+
lineNo,
|
|
93
|
+
void 0,
|
|
94
|
+
line
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
wave += sm[1].repeat(Number(sm[2]));
|
|
98
|
+
}
|
|
99
|
+
} else {
|
|
100
|
+
const parsed = splitDataList(rhs);
|
|
101
|
+
wave = parsed.wave;
|
|
102
|
+
data = parsed.data;
|
|
103
|
+
if (!VALID_STATES.test(wave)) {
|
|
104
|
+
const bad = [...wave].find((c) => !VALID_STATES.test(c));
|
|
105
|
+
throw new TimingParseError(
|
|
106
|
+
`Invalid wave string "${wave}" for signal ${name}` + (bad ? ` \u2014 "${bad}" is not a valid state` : "") + `. Valid states: 0 1 x z = . p P n N h H l L u d 2-9. Tip: use "clock N" for a clock or "rle 1*2 0*6" for run-length.`,
|
|
107
|
+
lineNo,
|
|
108
|
+
void 0,
|
|
109
|
+
line
|
|
110
|
+
);
|
|
111
|
+
}
|
|
73
112
|
}
|
|
74
113
|
const signal = { name, wave, data: data.length ? data : void 0 };
|
|
75
114
|
if (currentGroup) currentGroup.signals.push(signal);
|
|
@@ -459,5 +498,5 @@ var timing = {
|
|
|
459
498
|
exports.parseTiming = parseTiming;
|
|
460
499
|
exports.renderTiming = renderTiming;
|
|
461
500
|
exports.timing = timing;
|
|
462
|
-
//# sourceMappingURL=chunk-
|
|
463
|
-
//# sourceMappingURL=chunk-
|
|
501
|
+
//# sourceMappingURL=chunk-2F45Y2ON.cjs.map
|
|
502
|
+
//# sourceMappingURL=chunk-2F45Y2ON.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/diagrams/timing/parser.ts","../src/diagrams/timing/renderer.ts","../src/diagrams/timing/index.ts"],"names":["text","title","matchQuotedTitle","el","group","svgRoot","desc","defs"],"mappings":";;;;;;AAGO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,WAAA,CACE,OAAA,EACO,IAAA,EACA,MAAA,EACA,MAAA,EACP;AACA,IAAA,KAAA,CAAM,SAAS,MAAA,GAAY,CAAA,KAAA,EAAQ,IAAI,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA;AAJxD,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AAAA,EANS,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAKX,CAAA;AAEA,IAAM,YAAA,GAAe,gCAAA;AAErB,SAAS,cAAc,IAAA,EAAgD;AAErE,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAE1B,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,gBAAgB,CAAA;AACxC,EAAA,IAAI,CAAC,GAAG,OAAO,EAAE,MAAM,OAAA,EAAS,IAAA,EAAM,EAAC,EAAE;AACzC,EAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK;AAC5B,EAAA,IAAI,CAAC,SAAA,EAAW,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,EAAC,EAAE;AAExC,EAAA,MAAM,OAAiB,EAAC;AAExB,EAAA,IAAI,IAAI,SAAA,CAAU,OAAA,CAAQ,cAAA,EAAgB,EAAE,EAAE,IAAA,EAAK;AACnD,EAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC3D,EAAA,MAAM,EAAA,GAAK,YAAA;AACX,EAAA,IAAI,KAAA;AACJ,EAAA,OAAA,CAAQ,KAAA,GAAQ,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA,MAAO,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACxD,EAAA,OAAO,EAAE,MAAM,IAAA,EAAK;AACtB;AAEO,SAAS,YAAYA,KAAAA,EAAyB;AACnD,EAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA;AAC9D,EAAA,MAAM,UAA6C,EAAC;AACpD,EAAA,IAAIC,MAAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,YAAA,GAAmC,IAAA;AAEvC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACxB,IAAA,MAAM,SAAS,CAAA,GAAI,CAAA;AACnB,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAGnC,IAAA,IAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,EAAG;AAC3B,MAAA,MAAM,CAAA,GAAIC,mCAAiB,IAAI,CAAA;AAC/B,MAAA,IAAI,CAAA,KAAM,MAAA,EAAWD,MAAAA,GAAQ,CAAA;AAC7B,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,8BAA8B,CAAA;AACpD,MAAA,IAAI,EAAA,EAAI,MAAA,GAAS,UAAA,CAAW,EAAA,CAAG,CAAC,CAAC,CAAA;AACjC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA,IAAK,IAAA,CAAK,MAAM,2BAA2B,CAAA;AACxF,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,YAAA,GAAe,EAAE,KAAA,EAAO,SAAA,CAAU,CAAC,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE;AAClD,MAAA,OAAA,CAAQ,KAAK,YAAY,CAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,YAAA,GAAe,IAAA;AACf,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,YAAA,GAAe,IAAA;AACf,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA;AAC/C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,EAAK;AAC9B,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,EAAK;AAC7B,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAC3B,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,OAAiB,EAAC;AAEtB,MAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG;AAE3B,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,CAAA;AACvB,QAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,IAAK,IAAI,CAAA,EAAG;AACjC,UAAA,MAAM,IAAI,gBAAA;AAAA,YACR,6CAA6C,IAAI,CAAA,UAAA,CAAA;AAAA,YACjD,MAAA;AAAA,YAAQ,MAAA;AAAA,YAAW;AAAA,WACrB;AAAA,QACF;AACA,QAAA,IAAA,GAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,IAAK,EAAE,CAAA,GAAI,GAAA,GAAM,GAAA,EAAK,MAAA,CAAO,CAAC,CAAA;AAAA,MAC1D,WAAW,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG;AAEhC,QAAA,IAAA,GAAO,EAAA;AACP,QAAA,KAAA,MAAW,GAAA,IAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AAC9B,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,KAAA,CAAM,cAAc,CAAA;AACnC,UAAA,IAAI,CAAC,MAAM,CAAC,YAAA,CAAa,KAAK,EAAA,CAAG,CAAC,CAAC,CAAA,EAAG;AACpC,YAAA,MAAM,IAAI,gBAAA;AAAA,cACR,6DAA6D,GAAG,CAAA,CAAA,CAAA;AAAA,cAChE,MAAA;AAAA,cAAQ,MAAA;AAAA,cAAW;AAAA,aACrB;AAAA,UACF;AACA,UAAA,IAAA,IAAQ,EAAA,CAAG,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA;AAAA,QACpC;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,MAAA,GAAS,cAAc,GAAG,CAAA;AAChC,QAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,QAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,QAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5B,UAAA,MAAM,GAAA,GAAM,CAAC,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,YAAA,CAAa,IAAA,CAAK,CAAC,CAAC,CAAA;AACvD,UAAA,MAAM,IAAI,gBAAA;AAAA,YACR,CAAA,qBAAA,EAAwB,IAAI,CAAA,aAAA,EAAgB,IAAI,MAC7C,GAAA,GAAM,CAAA,SAAA,EAAO,GAAG,CAAA,sBAAA,CAAA,GAA2B,EAAA,CAAA,GAC5C,CAAA,oHAAA,CAAA;AAAA,YAEF,MAAA;AAAA,YAAQ,MAAA;AAAA,YAAW;AAAA,WACrB;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAuB,EAAE,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,CAAK,MAAA,GAAS,OAAO,MAAA,EAAU;AAChF,MAAA,IAAI,YAAA,EAAc,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,WAC7C,OAAA,CAAQ,KAAK,MAAM,CAAA;AACxB,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAAA,MAAAA,EAAO,QAAQ,OAAA,EAAQ;AAClD;;;AChIA,IAAM,MAAA,GAAS,GAAA;AACf,IAAM,KAAA,GAAQ,EAAA;AACd,IAAM,OAAA,GAAU,EAAA;AAChB,IAAM,OAAA,GAAU,EAAA;AAChB,IAAM,KAAA,GAAQ,CAAA;AACd,IAAM,UAAA,GAAa,EAAA;AACnB,IAAM,aAAA,GAAgB,EAAA;AAMtB,SAAS,OAAA,CAAQ,KAAA,EAA0C,MAAA,GAAS,CAAA,EAAc;AAChF,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,UAAU,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,IACnD,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,CAAK,KAAA,EAAO,QAAQ,CAAA;AACrD,MAAA,GAAA,CAAI,KAAK,GAAG,OAAA,CAAQ,KAAK,OAAA,EAAS,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,IAC/C;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAYA,SAAS,UAAA,CAAW,QAAsB,GAAA,EAA+C;AACvF,EAAA,MAAM,EAAE,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,MAAK,GAAI,GAAA;AAC/B,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI,IAAA,GAAkB,MAAA;AACtB,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,QAAA,GAAW,EAAA;AAEf,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,EAAW,CAAA,KAAc;AAC1C,IAAA,IAAI,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AACjC,IAAA,QAAA,GAAW,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAAA,EACxB,CAAA;AACA,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,EAAW,CAAA,KAAc;AAC7C,IAAA,QAAA,IAAY,CAAA,GAAA,EAAM,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAAA,EAC1B,CAAA;AACA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,MAAA,QAAA,GAAW,EAAA;AAAA,IACb;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAc;AAC9B,IAAA,MAAM,KAAA,GAAQ,SAAA;AACd,IAAA,MAAM,GAAA,GAAM,CAAA;AACZ,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,GAAA,GAAM,SAAS,CAAC,CAAA;AAE3C,IAAA,MAAM,CAAA,GAAI,CAAA,EAAA,EAAK,KAAA,GAAQ,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,GAAA,EAAM,GAAA,GAAM,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,GAAA,GAAM,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,GAAA,EAAM,KAAA,GAAQ,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,CAAA;AACjJ,IAAA,QAAA,CAAS,IAAA;AAAA,MACPE,oBAAA,CAAG,MAAA,EAAQ,EAAE,KAAA,EAAO,sBAAA,EAAwB,GAAG,gBAAA,EAAkB,MAAA,CAAO,QAAQ,CAAA,EAAG;AAAA,KACrF;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,GAAO,OAAO,CAAA,IAAK,EAAA;AACxC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,QAAA,CAAS,IAAA;AAAA,QACPH,sBAAA;AAAA,UACE;AAAA,YACE,CAAA,EAAA,CAAI,QAAQ,GAAA,IAAO,CAAA;AAAA,YACnB,GAAG,IAAA,GAAO,CAAA;AAAA,YACV,KAAA,EAAO,4BAAA;AAAA,YACP,aAAA,EAAe;AAAA,WACjB;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF;AACA,IAAA,OAAA,EAAA;AACA,IAAA,QAAA,EAAA;AAAA,EACF,CAAA;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,MAAM,IAAI,CAAA,GAAI,EAAA;AACd,IAAA,MAAM,QAAQ,CAAA,GAAI,EAAA;AAGlB,IAAA,MAAM,SAAA,GAAY,EAAA,KAAO,GAAA,GAAM,QAAA,GAAW,EAAA;AAE1C,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,GAAA;AAAA,MACL,KAAK,GAAA;AAAA,MACL,KAAK,GAAA,EAAK;AACR,QAAA,IAAI,IAAA,KAAS,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA;AAC9B,QAAA,IAAI,SAAS,GAAA,IAAO,IAAA,KAAS,OAAO,IAAA,KAAS,MAAA,IAAU,SAAS,KAAA,EAAO;AACrE,UAAA,SAAA,EAAU;AACV,UAAA,SAAA,CAAU,GAAG,GAAG,CAAA;AAAA,QAClB,CAAA,MAAA,IAAW,SAAS,IAAA,EAAM;AACxB,UAAA,YAAA,CAAa,GAAG,GAAG,CAAA;AAAA,QACrB;AACA,QAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,QAAA,IAAA,GAAO,IAAA;AACP,QAAA;AAAA,MACF;AAAA,MACA,KAAK,GAAA;AAAA,MACL,KAAK,GAAA;AAAA,MACL,KAAK,GAAA,EAAK;AACR,QAAA,IAAI,IAAA,KAAS,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA;AAC9B,QAAA,IAAI,SAAS,GAAA,IAAO,IAAA,KAAS,OAAO,IAAA,KAAS,MAAA,IAAU,SAAS,KAAA,EAAO;AACrE,UAAA,SAAA,EAAU;AACV,UAAA,SAAA,CAAU,GAAG,GAAG,CAAA;AAAA,QAClB,CAAA,MAAA,IAAW,SAAS,IAAA,EAAM;AACxB,UAAA,YAAA,CAAa,GAAG,GAAG,CAAA;AAAA,QACrB;AACA,QAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,QAAA,IAAA,GAAO,IAAA;AACP,QAAA;AAAA,MACF;AAAA,MACA,KAAK,GAAA;AAAA,MACL,KAAK,GAAA,EAAK;AACR,QAAA,IAAI,IAAA,KAAS,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA;AAC9B,QAAA,SAAA,EAAU;AAEV,QAAA,SAAA,CAAU,GAAG,GAAG,CAAA;AAChB,QAAA,YAAA,CAAa,GAAG,GAAG,CAAA;AACnB,QAAA,YAAA,CAAa,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,GAAG,CAAA;AAC5B,QAAA,YAAA,CAAa,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,GAAG,CAAA;AAC5B,QAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,QAAA,SAAA,EAAU;AACV,QAAA,IAAA,GAAO,IAAA;AACP,QAAA;AAAA,MACF;AAAA,MACA,KAAK,GAAA;AAAA,MACL,KAAK,GAAA,EAAK;AACR,QAAA,IAAI,IAAA,KAAS,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA;AAC9B,QAAA,SAAA,EAAU;AACV,QAAA,SAAA,CAAU,GAAG,GAAG,CAAA;AAChB,QAAA,YAAA,CAAa,GAAG,GAAG,CAAA;AACnB,QAAA,YAAA,CAAa,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,GAAG,CAAA;AAC5B,QAAA,YAAA,CAAa,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,GAAG,CAAA;AAC5B,QAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,QAAA,SAAA,EAAU;AACV,QAAA,IAAA,GAAO,IAAA;AACP,QAAA;AAAA,MACF;AAAA,MACA,KAAK,GAAA,EAAK;AACR,QAAA,IAAI,IAAA,KAAS,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA;AAC9B,QAAA,SAAA,EAAU;AACV,QAAA,SAAA,CAAU,GAAG,GAAG,CAAA;AAChB,QAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,QAAA,IAAA,GAAO,IAAA;AACP,QAAA;AAAA,MACF;AAAA,MACA,KAAK,GAAA,EAAK;AACR,QAAA,IAAI,IAAA,KAAS,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA;AAC9B,QAAA,SAAA,EAAU;AACV,QAAA,SAAA,CAAU,GAAG,GAAG,CAAA;AAChB,QAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,QAAA,IAAA,GAAO,IAAA;AACP,QAAA;AAAA,MACF;AAAA,MACA,KAAK,GAAA,EAAK;AACR,QAAA,IAAI,IAAA,KAAS,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA;AAC9B,QAAA,SAAA,EAAU;AACV,QAAA,MAAA,CAAO,IAAA;AAAA,UACLG,qBAAG,MAAA,EAAQ;AAAA,YACT,EAAA,EAAI,CAAA;AAAA,YACJ,EAAA,EAAI,IAAA;AAAA,YACJ,EAAA,EAAI,KAAA;AAAA,YACJ,EAAA,EAAI,IAAA;AAAA,YACJ,KAAA,EAAO;AAAA,WACR;AAAA,SACH;AACA,QAAA,IAAA,GAAO,GAAA;AACP,QAAA;AAAA,MACF;AAAA,MACA,KAAK,GAAA,EAAK;AACR,QAAA,IAAI,IAAA,KAAS,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA;AAC9B,QAAA,SAAA,EAAU;AACV,QAAA,WAAA,CAAY,IAAA;AAAA,UACVA,qBAAG,MAAA,EAAQ;AAAA,YACT,CAAA;AAAA,YACA,CAAA,EAAG,GAAA;AAAA,YACH,KAAA,EAAO,EAAA;AAAA,YACP,QAAQ,GAAA,GAAM,GAAA;AAAA,YACd,KAAA,EAAO,0BAAA;AAAA,YACP,IAAA,EAAM;AAAA,WACP;AAAA,SACH;AACA,QAAA,IAAA,GAAO,GAAA;AACP,QAAA;AAAA,MACF;AAAA,MACA,KAAK,GAAA;AAAA,MACL,KAAK,GAAA;AAAA,MACL,KAAK,GAAA;AAAA,MACL,KAAK,GAAA;AAAA,MACL,KAAK,GAAA;AAAA,MACL,KAAK,GAAA;AAAA,MACL,KAAK,GAAA;AAAA,MACL,KAAK,GAAA;AAAA,MACL,KAAK,GAAA,EAAK;AAER,QAAA,MAAM,iBAAiB,EAAA,KAAO,GAAA;AAC9B,QAAA,IAAI,CAAC,cAAA,IAAkB,IAAA,KAAS,KAAA,WAAgB,CAAC,CAAA;AACjD,QAAA,IAAI,IAAA,KAAS,KAAA,IAAS,CAAC,cAAA,EAAgB;AACrC,UAAA,SAAA,EAAU;AACV,UAAA,SAAA,GAAY,CAAA;AAAA,QACd;AACA,QAAA,IAAA,GAAO,KAAA;AACP,QAAA;AAAA,MACF;AAAA,MACA,SAAS;AAEP,QAAA,SAAA,EAAU;AACV,QAAA,WAAA,CAAY,IAAA;AAAA,UACVA,qBAAG,MAAA,EAAQ;AAAA,YACT,CAAA;AAAA,YACA,CAAA,EAAG,GAAA;AAAA,YACH,KAAA,EAAO,EAAA;AAAA,YACP,QAAQ,GAAA,GAAM,GAAA;AAAA,YACd,KAAA,EAAO,0BAAA;AAAA,YACP,IAAA,EAAM;AAAA,WACP;AAAA,SACH;AACA,QAAA,IAAA,GAAO,GAAA;AAAA,MACT;AAAA;AAGF,IAAA,QAAA,GAAW,SAAA;AAAA,EACb;AAGA,EAAA,IAAI,IAAA,KAAS,KAAA,EAAO,QAAA,CAAS,IAAA,CAAK,SAAS,EAAE,CAAA;AAC7C,EAAA,SAAA,EAAU;AAEV,EAAA,MAAM,OAAA,GAAU,MACb,GAAA,CAAI,CAAC,MAAMA,oBAAA,CAAG,MAAA,EAAQ,EAAE,KAAA,EAAO,uBAAA,EAAyB,GAAG,CAAC,EAC5D,MAAA,CAAO,WAAA,EAAa,QAAQ,QAAQ,CAAA,CACpC,KAAK,EAAE,CAAA;AAEV,EAAA,OAAO,EAAE,GAAA,EAAK,OAAA,EAAS,QAAQ,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA,EAAE;AACnD;AAEO,SAAS,aAAa,GAAA,EAAwB;AACnD,EAAA,MAAM,EAAA,GAAK,UAAA,IAAc,GAAA,CAAI,MAAA,IAAU,CAAA,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AAChC,EAAA,MAAM,aAAa,IAAA,CAAK,GAAA;AAAA,IACtB,CAAA;AAAA,IACA,GAAG,IAAA,CAAK,OAAA,CAAQ,CAAC,MAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,CAAC,EAAE,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,GAAI,EAAG;AAAA,GAC5E;AACA,EAAA,MAAM,YAAY,UAAA,GAAa,EAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,SAAS,SAAA,GAAY,EAAA;AAEnC,EAAA,IAAI,CAAA,GAAI,OAAA;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,IAAA,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,OAAA,GAAU,aAAA,GAAgB,KAAA;AAAA,EAC5C;AACA,EAAA,MAAM,MAAA,GAAS,IAAI,OAAA,GAAU,EAAA;AAG7B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,YAAsB,EAAC;AAG7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,UAAA,EAAY,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,EAAA,GAAK,SAAS,CAAA,GAAI,EAAA;AACxB,IAAA,SAAA,CAAU,IAAA;AAAA,MACRA,qBAAG,MAAA,EAAQ;AAAA,QACT,EAAA,EAAI,EAAA;AAAA,QACJ,EAAA,EAAI,OAAA;AAAA,QACJ,EAAA,EAAI,EAAA;AAAA,QACJ,IAAI,MAAA,GAAS,OAAA;AAAA,QACb,KAAA,EAAO;AAAA,OACR;AAAA,KACH;AAAA,EACF;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAElB,IAAA,IAAI,GAAA,CAAI,SAAS,OAAA,EAAS;AACxB,MAAA,QAAA,CAAS,IAAA;AAAA,QACPH,sBAAA;AAAA,UACE;AAAA,YACE,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,EAAA;AAAA,YACpB,CAAA,EAAG,KAAK,aAAA,GAAgB,CAAA;AAAA,YACxB,KAAA,EAAO;AAAA,WACT;AAAA,UACA,GAAA,CAAI;AAAA;AACN,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,MAAM,EAAA,GAAK,KAAA;AACjB,IAAA,MAAM,GAAA,GAAM,KAAK,KAAA,GAAQ,KAAA;AACzB,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,GAAQ,CAAA;AAG1B,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AAC3E,IAAA,MAAM,cAAc,SAAA,GAAY,MAAA,CAAO,KAAK,KAAA,CAAM,CAAC,IAAI,MAAA,CAAO,IAAA;AAC9D,IAAA,QAAA,CAAS,IAAA;AAAA,MACPA,sBAAA;AAAA,QACE;AAAA,UACE,GAAG,MAAA,GAAS,CAAA;AAAA,UACZ,GAAG,IAAA,GAAO,CAAA;AAAA,UACV,KAAA,EAAO,YACH,uDAAA,GACA,uBAAA;AAAA,UACJ,aAAA,EAAe;AAAA,SACjB;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAI,WAAW,MAAA,EAAQ;AAAA,MACzC,EAAA;AAAA,MACA,GAAA;AAAA,MACA,GAAA;AAAA,MACA,IAEF,CAAC,CAAA;AAED,IAAA,QAAA,CAAS,IAAA;AAAA,MACPI,uBAAA;AAAA,QACE;AAAA,UACE,SAAA,EAAW,aAAa,MAAM,CAAA,IAAA,CAAA;AAAA,UAC9B,eAAe,MAAA,CAAO;AAAA,SACxB;AAAA,QACA,CAAC,GAAG;AAAA;AACN,KACF;AACA,IAAA,SAAA,CAAU,IAAA;AAAA,MACRA,uBAAA,CAAM,EAAE,SAAA,EAAW,CAAA,UAAA,EAAa,MAAM,CAAA,IAAA,CAAA,EAAO,EAAG,CAAC,MAAM,CAAC;AAAA,KAC1D;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAASD,oBAAA;AAAA,IACb,SAAA;AAAA,IACA;AAAA,MACE,EAAA,EAAI,yBAAA;AAAA,MACJ,YAAA,EAAc,gBAAA;AAAA,MACd,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACEA,oBAAA,CAAG,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,WAAW,CAAA;AAAA,MAC/DA,qBAAG,MAAA,EAAQ;AAAA,QACT,CAAA,EAAG,uCAAA;AAAA,QACH,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACjB;AAAA;AACH,GACF;AAEA,EAAA,MAAM,GAAA,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAWZ,IAAA,EAAK;AAEL,EAAA,OAAOE,yBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,kBAAA;AAAA,MACP,OAAA,EAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,MAC/B,KAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA,EAAM,KAAA;AAAA,MACN,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA;AAAA,MACEJ,uBAAA,CAAQ,GAAA,CAAI,KAAA,IAAS,gBAAgB,CAAA;AAAA,MACrCK,sBAAA,CAAK,CAAA,4BAAA,EAA+B,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,CAAE,MAAM,CAAA,QAAA,CAAU,CAAA;AAAA,MAC5FC,sBAAA,CAAK,CAAC,MAAA,EAAQJ,oBAAA,CAAG,SAAS,EAAC,EAAG,GAAG,CAAC,CAAC,CAAA;AAAA,MACnCC,uBAAA,CAAM,EAAE,KAAA,EAAO,yBAAA,IAA6B,SAAS,CAAA;AAAA,MACrDA,uBAAA,CAAM,EAAE,KAAA,EAAO,wBAAA,IAA4B,QAAQ,CAAA;AAAA,MACnDA,uBAAA,CAAM,EAAE,KAAA,EAAO,yBAAA,IAA6B,SAAS,CAAA;AAAA,MACrDA,uBAAA,CAAM,EAAE,KAAA,EAAO,wBAAA,IAA4B,QAAQ,CAAA;AAAA,MACnD,IAAI,KAAA,GACAJ,sBAAA;AAAA,QACE;AAAA,UACE,GAAG,KAAA,GAAQ,CAAA;AAAA,UACX,CAAA,EAAG,EAAA;AAAA,UACH,aAAA,EAAe,QAAA;AAAA,UACf,KAAA,EAAO,wBAAA;AAAA,UACP,KAAA,EAAO;AAAA,SACT;AAAA,QACA,GAAA,CAAI;AAAA,OACN,GACA;AAAA;AACN,GACF;AACF;;;AChaO,IAAM,MAAA,GAAwB;AAAA,EACnC,IAAA,EAAM,QAAA;AAAA,EACN,OAAOA,KAAAA,EAAuB;AAC5B,IAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK,CAAE,WAAA,EAAY,IAAK,EAAA;AAClE,IAAA,OAAO,KAAA,CAAM,WAAW,QAAQ,CAAA;AAAA,EAClC,CAAA;AAAA,EACA,KAAA,EAAO,WAAA;AAAA,EAEP,OAAOA,KAAAA,EAAsB;AAC3B,IAAA,MAAM,GAAA,GAAM,YAAYA,KAAI,CAAA;AAC5B,IAAA,OAAO,aAAa,GAAG,CAAA;AAAA,EACzB;AACF","file":"chunk-2F45Y2ON.cjs","sourcesContent":["import type { TimingAST, TimingSignal, TimingGroup } from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\n\nexport class TimingParseError extends Error {\n constructor(\n message: string,\n public line?: number,\n public column?: number,\n public source?: string\n ) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"TimingParseError\";\n }\n}\n\nconst VALID_STATES = /^[01xzpPnNhHlLudD=.23456789]+$/;\n\nfunction splitDataList(rest: string): { wave: string; data: string[] } {\n // Wave string is first token; remaining tokens are quoted strings or a `data: [...]` form\n const trimmed = rest.trim();\n // Accept: `wave data: [\"a\",\"b\"]` or `wave \"a\" \"b\" \"c\"`\n const m = trimmed.match(/^(\\S+)\\s*(.*)$/);\n if (!m) return { wave: trimmed, data: [] };\n const wave = m[1];\n const remainder = m[2].trim();\n if (!remainder) return { wave, data: [] };\n\n const data: string[] = [];\n // Strip `data:` prefix + optional brackets\n let r = remainder.replace(/^data\\s*:\\s*/, \"\").trim();\n if (r.startsWith(\"[\") && r.endsWith(\"]\")) r = r.slice(1, -1);\n const re = /\"([^\"]*)\"/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(r)) !== null) data.push(match[1]);\n return { wave, data };\n}\n\nexport function parseTiming(text: string): TimingAST {\n const lines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n const signals: Array<TimingSignal | TimingGroup> = [];\n let title: string | undefined;\n let hscale: number | undefined;\n let currentGroup: TimingGroup | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i] ?? \"\";\n const lineNo = i + 1;\n const line = raw.trim();\n if (!line || line.startsWith(\"#\")) continue;\n\n // Header: `timing \"title\" [hscale: 2]`\n if (/^timing\\b/i.test(line)) {\n const t = matchQuotedTitle(line);\n if (t !== undefined) title = t;\n const hs = line.match(/hscale\\s*:\\s*(\\d+(?:\\.\\d+)?)/);\n if (hs) hscale = parseFloat(hs[1]);\n continue;\n }\n\n // Group start: `[GroupName]` or `group \"name\" {`\n const groupOpen = line.match(/^\\[([^\\]]+)\\]$/) || line.match(/^group\\s+\"([^\"]+)\"\\s*\\{?$/);\n if (groupOpen) {\n currentGroup = { label: groupOpen[1], signals: [] };\n signals.push(currentGroup);\n continue;\n }\n if (line === \"}\") {\n currentGroup = null;\n continue;\n }\n if (line === \"---\") {\n currentGroup = null;\n continue;\n }\n\n // Signal: `NAME: wave ...`\n const sigMatch = line.match(/^([^:]+):\\s*(.+)$/);\n if (sigMatch) {\n const name = sigMatch[1].trim();\n const rhs = sigMatch[2].trim();\n const tok = rhs.split(/\\s+/);\n let wave: string;\n let data: string[] = [];\n\n if (/^clock$/i.test(tok[0])) {\n // `NAME: clock 8 [neg]` — N clock periods (no char-counting).\n const n = Number(tok[1]);\n if (!Number.isInteger(n) || n < 1) {\n throw new TimingParseError(\n `clock needs a positive cycle count, e.g. \"${name}: clock 8\"`,\n lineNo, undefined, line\n );\n }\n wave = (/^neg/i.test(tok[2] ?? \"\") ? \"n\" : \"p\").repeat(n);\n } else if (/^rle$/i.test(tok[0])) {\n // `NAME: rle 1*2 0*6 x*1` — run-length, each seg is <state>*<count>.\n wave = \"\";\n for (const seg of tok.slice(1)) {\n const sm = seg.match(/^(.)\\*(\\d+)$/);\n if (!sm || !VALID_STATES.test(sm[1])) {\n throw new TimingParseError(\n `rle segment must be <state>*<count>, e.g. \"1*2 0*6\"; got \"${seg}\"`,\n lineNo, undefined, line\n );\n }\n wave += sm[1].repeat(Number(sm[2]));\n }\n } else {\n const parsed = splitDataList(rhs);\n wave = parsed.wave;\n data = parsed.data;\n if (!VALID_STATES.test(wave)) {\n const bad = [...wave].find((c) => !VALID_STATES.test(c));\n throw new TimingParseError(\n `Invalid wave string \"${wave}\" for signal ${name}` +\n (bad ? ` — \"${bad}\" is not a valid state` : \"\") +\n `. Valid states: 0 1 x z = . p P n N h H l L u d 2-9` +\n `. Tip: use \"clock N\" for a clock or \"rle 1*2 0*6\" for run-length.`,\n lineNo, undefined, line\n );\n }\n }\n\n const signal: TimingSignal = { name, wave, data: data.length ? data : undefined };\n if (currentGroup) currentGroup.signals.push(signal);\n else signals.push(signal);\n continue;\n }\n }\n\n return { type: \"timing\", title, hscale, signals };\n}\n","import type { TimingAST, TimingSignal, TimingGroup } from \"../../core/types\";\nimport { svgRoot, defs, group, el, text, title as titleEl, desc } from \"../../core/svg\";\n\nconst NAME_W = 120;\nconst SIG_H = 36;\nconst PAD_TOP = 12;\nconst PAD_BOT = 12;\nconst PAD_V = 6; // vertical padding inside band for rail spacing\nconst DEFAULT_PW = 40;\nconst GROUP_LABEL_H = 22;\n\ntype FlatRow =\n | { kind: \"signal\"; signal: TimingSignal; indent: number }\n | { kind: \"group\"; label: string; indent: number };\n\nfunction flatten(items: Array<TimingSignal | TimingGroup>, indent = 0): FlatRow[] {\n const out: FlatRow[] = [];\n for (const item of items) {\n if (\"wave\" in item) {\n out.push({ kind: \"signal\", signal: item, indent });\n } else {\n out.push({ kind: \"group\", label: item.label, indent });\n out.push(...flatten(item.signals, indent + 1));\n }\n }\n return out;\n}\n\ninterface WaveCtx {\n pw: number;\n yHi: number;\n yLo: number;\n yMid: number;\n h: number;\n}\n\ntype PrevState = \"hi\" | \"lo\" | \"bus\" | \"z\" | \"x\" | \"none\";\n\nfunction renderWave(signal: TimingSignal, ctx: WaveCtx): { svg: string; labels: string } {\n const { pw, yHi, yLo, yMid } = ctx;\n const wave = signal.wave;\n const paths: string[] = [];\n const busRects: string[] = [];\n const busTexts: string[] = [];\n const xPatchRects: string[] = [];\n const zLines: string[] = [];\n\n let prev: PrevState = \"none\";\n let prevChar = \"\";\n let busStartX = 0;\n let busIndex = 0;\n let dataIdx = 0;\n let linePath = \"\";\n\n const startLine = (x: number, y: number) => {\n if (linePath) paths.push(linePath);\n linePath = `M ${x},${y}`;\n };\n const extendLineTo = (x: number, y: number) => {\n linePath += ` L ${x},${y}`;\n };\n const flushLine = () => {\n if (linePath) {\n paths.push(linePath);\n linePath = \"\";\n }\n };\n\n const closeBus = (x: number) => {\n const start = busStartX;\n const end = x;\n const inset = Math.min(5, (end - start) / 2);\n // Trapezoid outline\n const d = `M ${start + inset},${yHi} L ${end - inset},${yHi} L ${end},${yMid} L ${end - inset},${yLo} L ${start + inset},${yLo} L ${start},${yMid} Z`;\n busRects.push(\n el(\"path\", { class: \"schematex-timing-bus\", d, \"data-bus-index\": String(busIndex) })\n );\n // Data label\n const label = signal.data?.[dataIdx] ?? \"\";\n if (label) {\n busTexts.push(\n text(\n {\n x: (start + end) / 2,\n y: yMid + 4,\n class: \"schematex-timing-bus-label\",\n \"text-anchor\": \"middle\",\n },\n label\n )\n );\n }\n dataIdx++;\n busIndex++;\n };\n\n for (let i = 0; i < wave.length; i++) {\n const ch = wave[i];\n const x = i * pw;\n const xNext = x + pw;\n\n // Handle continuation '.'\n const effective = ch === \".\" ? prevChar : ch;\n\n switch (effective) {\n case \"0\":\n case \"l\":\n case \"L\": {\n if (prev === \"bus\") closeBus(x);\n if (prev === \"x\" || prev === \"z\" || prev === \"none\" || prev === \"bus\") {\n flushLine();\n startLine(x, yLo);\n } else if (prev === \"hi\") {\n extendLineTo(x, yLo);\n }\n extendLineTo(xNext, yLo);\n prev = \"lo\";\n break;\n }\n case \"1\":\n case \"h\":\n case \"H\": {\n if (prev === \"bus\") closeBus(x);\n if (prev === \"x\" || prev === \"z\" || prev === \"none\" || prev === \"bus\") {\n flushLine();\n startLine(x, yHi);\n } else if (prev === \"lo\") {\n extendLineTo(x, yHi);\n }\n extendLineTo(xNext, yHi);\n prev = \"hi\";\n break;\n }\n case \"p\":\n case \"P\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n // One-period positive clock: lo→hi at x, hi until midpoint, lo at mid, lo until xNext\n startLine(x, yLo);\n extendLineTo(x, yHi);\n extendLineTo(x + pw / 2, yHi);\n extendLineTo(x + pw / 2, yLo);\n extendLineTo(xNext, yLo);\n flushLine();\n prev = \"lo\";\n break;\n }\n case \"n\":\n case \"N\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n startLine(x, yHi);\n extendLineTo(x, yLo);\n extendLineTo(x + pw / 2, yLo);\n extendLineTo(x + pw / 2, yHi);\n extendLineTo(xNext, yHi);\n flushLine();\n prev = \"hi\";\n break;\n }\n case \"u\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n startLine(x, yLo);\n extendLineTo(xNext, yHi);\n prev = \"hi\";\n break;\n }\n case \"d\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n startLine(x, yHi);\n extendLineTo(xNext, yLo);\n prev = \"lo\";\n break;\n }\n case \"z\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n zLines.push(\n el(\"line\", {\n x1: x,\n y1: yMid,\n x2: xNext,\n y2: yMid,\n class: \"schematex-timing-hiz\",\n })\n );\n prev = \"z\";\n break;\n }\n case \"x\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n xPatchRects.push(\n el(\"rect\", {\n x,\n y: yHi,\n width: pw,\n height: yLo - yHi,\n class: \"schematex-timing-unknown\",\n fill: \"url(#schematex-timing-xhatch)\",\n })\n );\n prev = \"x\";\n break;\n }\n case \"=\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\": {\n // Each fresh bus char (not '.') begins a new segment.\n const isContinuation = ch === \".\";\n if (!isContinuation && prev === \"bus\") closeBus(x);\n if (prev !== \"bus\" || !isContinuation) {\n flushLine();\n busStartX = x;\n }\n prev = \"bus\";\n break;\n }\n default: {\n // unknown char -> treat as x\n flushLine();\n xPatchRects.push(\n el(\"rect\", {\n x,\n y: yHi,\n width: pw,\n height: yLo - yHi,\n class: \"schematex-timing-unknown\",\n fill: \"url(#schematex-timing-xhatch)\",\n })\n );\n prev = \"x\";\n }\n }\n\n prevChar = effective;\n }\n\n // Close trailing bus\n if (prev === \"bus\") closeBus(wave.length * pw);\n flushLine();\n\n const waveSvg = paths\n .map((d) => el(\"path\", { class: \"schematex-timing-wave\", d }))\n .concat(xPatchRects, zLines, busRects)\n .join(\"\");\n\n return { svg: waveSvg, labels: busTexts.join(\"\") };\n}\n\nexport function renderTiming(ast: TimingAST): string {\n const pw = DEFAULT_PW * (ast.hscale ?? 1);\n const rows = flatten(ast.signals);\n const maxWaveLen = Math.max(\n 1,\n ...rows.flatMap((r) => (r.kind === \"signal\" ? [r.signal.wave.length] : []))\n );\n const waveAreaW = maxWaveLen * pw;\n const width = NAME_W + waveAreaW + 20;\n\n let y = PAD_TOP;\n const rowYs: number[] = [];\n for (const r of rows) {\n rowYs.push(y);\n y += r.kind === \"group\" ? GROUP_LABEL_H : SIG_H;\n }\n const height = y + PAD_BOT + 10;\n\n // Render rows\n const waveSvgs: string[] = [];\n const labelSvgs: string[] = [];\n const nameSvgs: string[] = [];\n const gridLines: string[] = [];\n\n // Grid: vertical period ticks across signal area\n for (let i = 0; i <= maxWaveLen; i++) {\n const xg = NAME_W + i * pw;\n gridLines.push(\n el(\"line\", {\n x1: xg,\n y1: PAD_TOP,\n x2: xg,\n y2: height - PAD_BOT,\n class: \"schematex-timing-grid\",\n })\n );\n }\n\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n const ry = rowYs[i];\n\n if (row.kind === \"group\") {\n nameSvgs.push(\n text(\n {\n x: 6 + row.indent * 10,\n y: ry + GROUP_LABEL_H - 6,\n class: \"schematex-timing-group-label\",\n },\n row.label\n )\n );\n continue;\n }\n\n const signal = row.signal;\n const yHi = ry + PAD_V;\n const yLo = ry + SIG_H - PAD_V;\n const yMid = ry + SIG_H / 2;\n\n // Signal name (right-aligned in name column). `~NAME` or `/NAME` → overlined active-low.\n const activeLow = signal.name.startsWith(\"~\") || signal.name.startsWith(\"/\");\n const displayName = activeLow ? signal.name.slice(1) : signal.name;\n nameSvgs.push(\n text(\n {\n x: NAME_W - 8,\n y: yMid + 4,\n class: activeLow\n ? \"schematex-timing-name schematex-timing-name-activelow\"\n : \"schematex-timing-name\",\n \"text-anchor\": \"end\",\n },\n displayName\n )\n );\n\n const { svg, labels } = renderWave(signal, {\n pw,\n yHi,\n yLo,\n yMid,\n h: SIG_H - 2 * PAD_V,\n });\n\n waveSvgs.push(\n group(\n {\n transform: `translate(${NAME_W}, 0)`,\n \"data-signal\": signal.name,\n },\n [svg]\n )\n );\n labelSvgs.push(\n group({ transform: `translate(${NAME_W}, 0)` }, [labels])\n );\n }\n\n const xhatch = el(\n \"pattern\",\n {\n id: \"schematex-timing-xhatch\",\n patternUnits: \"userSpaceOnUse\",\n width: 6,\n height: 6,\n },\n [\n el(\"rect\", { x: 0, y: 0, width: 6, height: 6, fill: \"#f5f5f5\" }),\n el(\"path\", {\n d: \"M 0,6 L 6,0 M -1,1 L 1,-1 M 5,7 L 7,5\",\n stroke: \"#999\",\n \"stroke-width\": 0.8,\n }),\n ]\n );\n\n const css = `\n.schematex-timing { font-family: system-ui, -apple-system, sans-serif; }\n.schematex-timing-name { font: 12px monospace; fill: #111; }\n.schematex-timing-name-activelow { text-decoration: overline; }\n.schematex-timing-group-label { font: bold 12px sans-serif; fill: #111; }\n.schematex-timing-wave { stroke: #111; stroke-width: 1.75; fill: none; stroke-linejoin: miter; stroke-linecap: square; }\n.schematex-timing-bus { fill: none; stroke: #111; stroke-width: 1.5; }\n.schematex-timing-bus-label { font: 11px monospace; fill: #111; }\n.schematex-timing-unknown { stroke: #555; stroke-width: 0.5; }\n.schematex-timing-hiz { stroke: #555; stroke-width: 1.5; stroke-dasharray: 4 3; }\n.schematex-timing-grid { stroke: #eee; stroke-width: 0.5; }\n`.trim();\n\n return svgRoot(\n {\n class: \"schematex-timing\",\n viewBox: `0 0 ${width} ${height}`,\n width,\n height,\n role: \"img\",\n \"data-diagram-type\": \"timing\",\n },\n [\n titleEl(ast.title ?? \"Timing Diagram\"),\n desc(`Digital timing diagram with ${rows.filter((r) => r.kind === \"signal\").length} signals`),\n defs([xhatch, el(\"style\", {}, css)]),\n group({ class: \"schematex-timing-grid-g\" }, gridLines),\n group({ class: \"schematex-timing-waves\" }, waveSvgs),\n group({ class: \"schematex-timing-labels\" }, labelSvgs),\n group({ class: \"schematex-timing-names\" }, nameSvgs),\n ast.title\n ? text(\n {\n x: width / 2,\n y: 14,\n \"text-anchor\": \"middle\",\n class: \"schematex-timing-title\",\n style: \"font: bold 13px sans-serif; fill: #333;\",\n },\n ast.title\n )\n : \"\",\n ]\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseTiming } from \"./parser\";\nimport { renderTiming } from \"./renderer\";\n\nexport const timing: DiagramPlugin = {\n type: \"timing\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"timing\");\n },\n parse: parseTiming,\n\n render(text: string): string {\n const ast = parseTiming(text);\n return renderTiming(ast);\n },\n};\n\nexport { parseTiming } from \"./parser\";\nexport { renderTiming } from \"./renderer\";\n"]}
|
|
@@ -1132,16 +1132,19 @@ function parseNetlist(body, title2) {
|
|
|
1132
1132
|
ensureNet(net).anchors.push(`${id}.${pinOrder[p]}`);
|
|
1133
1133
|
}
|
|
1134
1134
|
pinMap[id] = pins;
|
|
1135
|
+
const dirHint = (kv.dir ?? kv.orient ?? kv.direction)?.toLowerCase();
|
|
1136
|
+
const explicitDir = dirHint === "right" || dirHint === "left" || dirHint === "up" || dirHint === "down" ? dirHint : void 0;
|
|
1135
1137
|
const comp = {
|
|
1136
1138
|
id,
|
|
1137
1139
|
componentType: cType,
|
|
1138
|
-
direction: "right",
|
|
1140
|
+
direction: explicitDir ?? "right",
|
|
1139
1141
|
label: kv.label ?? id,
|
|
1140
1142
|
value: kv.value ?? valueFromTail,
|
|
1141
|
-
attrs: {}
|
|
1143
|
+
attrs: explicitDir ? { dirExplicit: "true" } : {}
|
|
1142
1144
|
};
|
|
1143
1145
|
for (const [k, v] of Object.entries(kv)) {
|
|
1144
1146
|
if (k === "label" || k === "value" || k === "type") continue;
|
|
1147
|
+
if (k === "dir" || k === "orient" || k === "direction") continue;
|
|
1145
1148
|
comp.attrs[k] = v;
|
|
1146
1149
|
}
|
|
1147
1150
|
components.push(comp);
|
|
@@ -1669,11 +1672,11 @@ function layoutCircuit(ast) {
|
|
|
1669
1672
|
}
|
|
1670
1673
|
|
|
1671
1674
|
// src/diagrams/circuit/autolayout.ts
|
|
1672
|
-
var COL_W =
|
|
1673
|
-
var ROW_H =
|
|
1674
|
-
var
|
|
1675
|
-
var
|
|
1676
|
-
var
|
|
1675
|
+
var COL_W = 96;
|
|
1676
|
+
var ROW_H = 80;
|
|
1677
|
+
var LEFT_MARGIN = 70;
|
|
1678
|
+
var TOP_MARGIN = 56;
|
|
1679
|
+
var SHUNT_OFFSET = 28;
|
|
1677
1680
|
function isPowerSource(c) {
|
|
1678
1681
|
return c.componentType === "voltage_source" || c.componentType === "current_source" || c.componentType === "ac_source" || c.componentType === "battery" || c.componentType === "vcc";
|
|
1679
1682
|
}
|
|
@@ -1702,56 +1705,87 @@ function extendBBox(bbox, pt) {
|
|
|
1702
1705
|
}
|
|
1703
1706
|
function layoutCircuitNetlist(ast) {
|
|
1704
1707
|
const pinMap = ast.pinMap ?? {};
|
|
1708
|
+
const isShunt = (c) => {
|
|
1709
|
+
if (isPowerSource(c) || isGround(c)) return false;
|
|
1710
|
+
const pins = pinMap[c.id];
|
|
1711
|
+
if (!pins) return false;
|
|
1712
|
+
const nets = Object.values(pins);
|
|
1713
|
+
return nets.length === 2 && nets.filter((n) => n === "GND").length === 1;
|
|
1714
|
+
};
|
|
1705
1715
|
const powerComps = [];
|
|
1706
1716
|
const groundComps = [];
|
|
1717
|
+
const shuntComps = [];
|
|
1707
1718
|
const middleComps = [];
|
|
1708
1719
|
for (const c of ast.components) {
|
|
1709
1720
|
if (isPowerSource(c)) powerComps.push(c);
|
|
1710
1721
|
else if (isGround(c)) groundComps.push(c);
|
|
1722
|
+
else if (isShunt(c)) shuntComps.push(c);
|
|
1711
1723
|
else middleComps.push(c);
|
|
1712
1724
|
}
|
|
1713
|
-
const
|
|
1714
|
-
const mainRank = [...powerComps, ...middleComps];
|
|
1715
|
-
if (mainRank.length) ranks.push(mainRank);
|
|
1716
|
-
if (groundComps.length) ranks.push(groundComps);
|
|
1717
|
-
if (ranks.length === 0) ranks.push(ast.components);
|
|
1725
|
+
const spine = [...powerComps, ...middleComps];
|
|
1718
1726
|
const placed = /* @__PURE__ */ new Map();
|
|
1719
1727
|
const items = [];
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
const
|
|
1724
|
-
const
|
|
1725
|
-
const
|
|
1726
|
-
|
|
1727
|
-
const
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1728
|
+
const place = (comp, x, y, fallbackDir) => {
|
|
1729
|
+
const direction = comp.attrs?.dirExplicit === "true" ? comp.direction : fallbackDir ?? defaultDirection(comp);
|
|
1730
|
+
comp.direction = direction;
|
|
1731
|
+
const rot = rotationOf(direction);
|
|
1732
|
+
const sym = getSymbol(comp.componentType);
|
|
1733
|
+
const worldAnchors = {};
|
|
1734
|
+
if (sym) {
|
|
1735
|
+
for (const [name, pt] of Object.entries(sym.anchors)) {
|
|
1736
|
+
const rp = rotatePt(pt, rot);
|
|
1737
|
+
worldAnchors[name] = { x: x + rp.x, y: y + rp.y };
|
|
1738
|
+
}
|
|
1739
|
+
} else {
|
|
1740
|
+
worldAnchors.start = { x, y };
|
|
1741
|
+
worldAnchors.end = { x: x + 30, y };
|
|
1742
|
+
}
|
|
1743
|
+
const laid = {
|
|
1744
|
+
component: comp,
|
|
1745
|
+
x,
|
|
1746
|
+
y,
|
|
1747
|
+
rotation: rot,
|
|
1748
|
+
length: sym?.length ?? 30,
|
|
1749
|
+
anchors: worldAnchors
|
|
1750
|
+
};
|
|
1751
|
+
items.push(laid);
|
|
1752
|
+
placed.set(comp.id, laid);
|
|
1753
|
+
return laid;
|
|
1754
|
+
};
|
|
1755
|
+
if (spine.length === 0 && shuntComps.length === 0) {
|
|
1756
|
+
ast.components.forEach(
|
|
1757
|
+
(comp, i) => place(comp, LEFT_MARGIN + i * COL_W, TOP_MARGIN)
|
|
1758
|
+
);
|
|
1759
|
+
} else {
|
|
1760
|
+
const spineY = TOP_MARGIN;
|
|
1761
|
+
spine.forEach((comp, i) => place(comp, LEFT_MARGIN + i * COL_W, spineY));
|
|
1762
|
+
const spinePinX = /* @__PURE__ */ new Map();
|
|
1763
|
+
for (const comp of spine) {
|
|
1764
|
+
const pins = pinMap[comp.id];
|
|
1765
|
+
const laid = placed.get(comp.id);
|
|
1766
|
+
if (!pins || !laid) continue;
|
|
1767
|
+
for (const [pinName, net] of Object.entries(pins)) {
|
|
1768
|
+
if (net === "GND") continue;
|
|
1769
|
+
const a = laid.anchors[pinName];
|
|
1770
|
+
if (a && !spinePinX.has(net)) spinePinX.set(net, a.x);
|
|
1743
1771
|
}
|
|
1744
|
-
const laid = {
|
|
1745
|
-
component: comp,
|
|
1746
|
-
x,
|
|
1747
|
-
y,
|
|
1748
|
-
rotation: rot,
|
|
1749
|
-
length: sym?.length ?? 30,
|
|
1750
|
-
anchors: worldAnchors
|
|
1751
|
-
};
|
|
1752
|
-
items.push(laid);
|
|
1753
|
-
placed.set(comp.id, laid);
|
|
1754
1772
|
}
|
|
1773
|
+
const shuntY = spineY + ROW_H;
|
|
1774
|
+
const sharedNode = /* @__PURE__ */ new Map();
|
|
1775
|
+
shuntComps.forEach((comp, idx) => {
|
|
1776
|
+
const pins = pinMap[comp.id];
|
|
1777
|
+
const sigNet = Object.values(pins).find((n) => n !== "GND");
|
|
1778
|
+
let x = (sigNet !== void 0 ? spinePinX.get(sigNet) : void 0) ?? LEFT_MARGIN + (spine.length + idx) * COL_W;
|
|
1779
|
+
const used = sharedNode.get(x) ?? 0;
|
|
1780
|
+
sharedNode.set(x, used + 1);
|
|
1781
|
+
x += used * SHUNT_OFFSET;
|
|
1782
|
+
place(comp, x, shuntY, "down");
|
|
1783
|
+
});
|
|
1784
|
+
const baseY = shuntComps.length ? shuntY : spineY;
|
|
1785
|
+
const groundY = baseY + ROW_H;
|
|
1786
|
+
const xs = items.map((it) => it.x);
|
|
1787
|
+
const gx = xs.length ? (Math.min(...xs) + Math.max(...xs)) / 2 : LEFT_MARGIN;
|
|
1788
|
+
groundComps.forEach((comp, i) => place(comp, gx + i * COL_W, groundY, "down"));
|
|
1755
1789
|
}
|
|
1756
1790
|
const netPins = /* @__PURE__ */ new Map();
|
|
1757
1791
|
for (const comp of ast.components) {
|
|
@@ -2050,5 +2084,5 @@ exports.layoutCircuitNetlist = layoutCircuitNetlist;
|
|
|
2050
2084
|
exports.parseCircuit = parseCircuit;
|
|
2051
2085
|
exports.parseNetlist = parseNetlist;
|
|
2052
2086
|
exports.renderCircuit = renderCircuit;
|
|
2053
|
-
//# sourceMappingURL=chunk-
|
|
2054
|
-
//# sourceMappingURL=chunk-
|
|
2087
|
+
//# sourceMappingURL=chunk-3JAI3OVG.cjs.map
|
|
2088
|
+
//# sourceMappingURL=chunk-3JAI3OVG.cjs.map
|