circuitscript 0.1.4 → 0.1.7
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/cjs/BaseVisitor.js +149 -80
- package/dist/cjs/SemanticTokenVisitor.js +19 -13
- package/dist/cjs/antlr/CircuitScriptParser.js +711 -671
- package/dist/cjs/builtinMethods.js +48 -22
- package/dist/cjs/draw_symbols.js +4 -1
- package/dist/cjs/environment.js +118 -0
- package/dist/cjs/execute.js +98 -46
- package/dist/cjs/geometry.js +1 -0
- package/dist/cjs/globals.js +14 -7
- package/dist/cjs/helpers.js +142 -150
- package/dist/cjs/index.js +5 -0
- package/dist/cjs/layout.js +39 -14
- package/dist/cjs/main.js +34 -21
- package/dist/cjs/objects/ClassComponent.js +4 -1
- package/dist/cjs/objects/ExecutionScope.js +40 -2
- package/dist/cjs/objects/ParamDefinition.js +15 -15
- package/dist/cjs/parser.js +27 -21
- package/dist/cjs/regenerate-tests.js +9 -6
- package/dist/cjs/render.js +3 -1
- package/dist/cjs/sizing.js +10 -60
- package/dist/cjs/utils.js +148 -17
- package/dist/cjs/validate/SymbolTable.js +96 -0
- package/dist/cjs/validate/SymbolValidatorResolveVisitor.js +14 -0
- package/dist/cjs/validate/SymbolValidatorVisitor.js +170 -0
- package/dist/cjs/validate.js +52 -44
- package/dist/cjs/visitor.js +149 -31
- package/dist/esm/{BaseVisitor.mjs → BaseVisitor.js} +124 -56
- package/dist/esm/{SemanticTokenVisitor.mjs → SemanticTokenVisitor.js} +17 -11
- package/dist/esm/antlr/{CircuitScriptParser.mjs → CircuitScriptParser.js} +711 -671
- package/dist/esm/{builtinMethods.mjs → builtinMethods.js} +40 -14
- package/dist/esm/{draw_symbols.mjs → draw_symbols.js} +11 -8
- package/dist/esm/environment.js +110 -0
- package/dist/esm/{execute.mjs → execute.js} +111 -58
- package/dist/esm/{export.mjs → export.js} +2 -2
- package/dist/esm/{geometry.mjs → geometry.js} +6 -5
- package/dist/esm/{globals.mjs → globals.js} +9 -2
- package/dist/esm/helpers.js +377 -0
- package/dist/esm/index.js +20 -0
- package/dist/esm/{layout.mjs → layout.js} +44 -22
- package/dist/esm/{lexer.mjs → lexer.js} +2 -2
- package/dist/esm/{main.mjs → main.js} +36 -23
- package/dist/esm/objects/{ClassComponent.mjs → ClassComponent.js} +9 -5
- package/dist/esm/objects/{ExecutionScope.mjs → ExecutionScope.js} +40 -2
- package/dist/esm/objects/{Frame.mjs → Frame.js} +1 -1
- package/dist/esm/objects/{ParamDefinition.mjs → ParamDefinition.js} +1 -1
- package/dist/esm/objects/{PinDefinition.mjs → PinDefinition.js} +1 -1
- package/dist/esm/parser.js +71 -0
- package/dist/esm/{regenerate-tests.mjs → regenerate-tests.js} +10 -7
- package/dist/esm/{render.mjs → render.js} +11 -9
- package/dist/esm/{sizing.mjs → sizing.js} +11 -36
- package/dist/esm/utils.js +286 -0
- package/dist/esm/validate/SymbolTable.js +90 -0
- package/dist/esm/validate/SymbolValidatorResolveVisitor.js +10 -0
- package/dist/esm/validate/SymbolValidatorVisitor.js +163 -0
- package/dist/esm/validate.js +86 -0
- package/dist/esm/{visitor.mjs → visitor.js} +160 -42
- package/dist/fonts/Arial.ttf +0 -0
- package/dist/fonts/Inter-Bold.ttf +0 -0
- package/dist/fonts/Inter-Regular.ttf +0 -0
- package/dist/fonts/OpenSans-Regular.ttf +0 -0
- package/dist/fonts/Roboto-Regular.ttf +0 -0
- package/dist/libs/lib.cst +423 -0
- package/dist/types/BaseVisitor.d.ts +36 -22
- package/dist/types/SemanticTokenVisitor.d.ts +6 -5
- package/dist/types/antlr/CircuitScriptParser.d.ts +4 -2
- package/dist/types/builtinMethods.d.ts +3 -2
- package/dist/types/draw_symbols.d.ts +2 -6
- package/dist/types/environment.d.ts +31 -0
- package/dist/types/execute.d.ts +2 -3
- package/dist/types/globals.d.ts +7 -2
- package/dist/types/helpers.d.ts +12 -14
- package/dist/types/index.d.ts +5 -0
- package/dist/types/objects/ClassComponent.d.ts +2 -3
- package/dist/types/objects/ExecutionScope.d.ts +20 -6
- package/dist/types/objects/types.d.ts +6 -1
- package/dist/types/parser.d.ts +7 -11
- package/dist/types/sizing.d.ts +0 -3
- package/dist/types/utils.d.ts +33 -4
- package/dist/types/validate/SymbolTable.d.ts +40 -0
- package/dist/types/validate/SymbolValidatorResolveVisitor.d.ts +7 -0
- package/dist/types/validate/SymbolValidatorVisitor.d.ts +32 -0
- package/dist/types/validate.d.ts +1 -1
- package/libs/lib.cst +12 -22
- package/package.json +14 -13
- package/dist/cjs/SymbolValidatorVisitor.js +0 -233
- package/dist/esm/SymbolValidatorVisitor.mjs +0 -222
- package/dist/esm/helpers.mjs +0 -380
- package/dist/esm/index.mjs +0 -15
- package/dist/esm/parser.mjs +0 -64
- package/dist/esm/utils.mjs +0 -169
- package/dist/esm/validate.mjs +0 -74
- package/dist/types/SymbolValidatorVisitor.d.ts +0 -61
- package/dist/types/layout.d.ts +0 -148
- /package/dist/esm/antlr/{CircuitScriptLexer.mjs → CircuitScriptLexer.js} +0 -0
- /package/dist/esm/antlr/{CircuitScriptVisitor.mjs → CircuitScriptVisitor.js} +0 -0
- /package/dist/esm/{fonts.mjs → fonts.js} +0 -0
- /package/dist/esm/{logger.mjs → logger.js} +0 -0
- /package/dist/esm/objects/{Net.mjs → Net.js} +0 -0
- /package/dist/esm/objects/{PinTypes.mjs → PinTypes.js} +0 -0
- /package/dist/esm/objects/{Wire.mjs → Wire.js} +0 -0
- /package/dist/esm/objects/{types.mjs → types.js} +0 -0
- /package/dist/esm/{server.mjs → server.js} +0 -0
package/dist/cjs/helpers.js
CHANGED
|
@@ -3,19 +3,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getPaperSize = exports.isSupportedPaperSize = exports.PaperGridReferences = exports.pxToMM = exports.milsToMM = exports.UnitDimension = exports.
|
|
6
|
+
exports.getPaperSize = exports.isSupportedPaperSize = exports.PaperGridReferences = exports.pxToMM = exports.milsToMM = exports.UnitDimension = exports.detectJSModuleType = exports.renderScript = exports.validateScript = exports.ParseErrorStrategy = exports.getSemanticTokens = exports.prepareFile = exports.JSModuleType = void 0;
|
|
7
7
|
const fs_1 = require("fs");
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
9
|
const pdfkit_1 = __importDefault(require("pdfkit"));
|
|
10
10
|
const export_js_1 = require("./export.js");
|
|
11
11
|
const layout_js_1 = require("./layout.js");
|
|
12
|
-
const ExecutionScope_js_1 = require("./objects/ExecutionScope.js");
|
|
13
12
|
const parser_js_1 = require("./parser.js");
|
|
14
13
|
const render_js_1 = require("./render.js");
|
|
15
14
|
const utils_js_1 = require("./utils.js");
|
|
16
15
|
const visitor_js_1 = require("./visitor.js");
|
|
17
|
-
const
|
|
18
|
-
const
|
|
16
|
+
const SymbolValidatorVisitor_js_1 = require("./validate/SymbolValidatorVisitor.js");
|
|
17
|
+
const SymbolValidatorResolveVisitor_js_1 = require("./validate/SymbolValidatorResolveVisitor.js");
|
|
19
18
|
const antlr4ng_1 = require("antlr4ng");
|
|
20
19
|
const lexer_js_1 = require("./lexer.js");
|
|
21
20
|
const CircuitScriptParser_js_1 = require("./antlr/CircuitScriptParser.js");
|
|
@@ -45,22 +44,12 @@ function prepareFile(textData) {
|
|
|
45
44
|
};
|
|
46
45
|
}
|
|
47
46
|
exports.prepareFile = prepareFile;
|
|
48
|
-
function
|
|
49
|
-
try {
|
|
50
|
-
return (0, fs_1.readFileSync)(filePath, { encoding: 'utf-8' });
|
|
51
|
-
}
|
|
52
|
-
catch (err) {
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
exports.getScriptText = getScriptText;
|
|
57
|
-
function getSemanticTokens(scriptData, options) {
|
|
47
|
+
async function getSemanticTokens(scriptData, options) {
|
|
58
48
|
const { parser, lexer, tokens } = prepareFile(scriptData);
|
|
59
49
|
const tree = parser.script();
|
|
60
|
-
const
|
|
61
|
-
const visitor = new SemanticTokenVisitor_js_1.SemanticTokensVisitor(true, null, currentDirectory, defaultLibsPath, lexer, scriptData);
|
|
50
|
+
const visitor = new SemanticTokenVisitor_js_1.SemanticTokensVisitor(true, null, options.environment, lexer, scriptData);
|
|
62
51
|
parser.removeErrorListeners();
|
|
63
|
-
visitor.onImportFile = (visitor, textData) => {
|
|
52
|
+
visitor.onImportFile = async (visitor, filePath, textData) => {
|
|
64
53
|
let hasError = false;
|
|
65
54
|
let hasParseError = false;
|
|
66
55
|
if (textData !== null) {
|
|
@@ -73,6 +62,7 @@ function getSemanticTokens(scriptData, options) {
|
|
|
73
62
|
console.log('Error while parsing: ', err);
|
|
74
63
|
hasParseError = true;
|
|
75
64
|
hasError = true;
|
|
65
|
+
throw new utils_js_1.ParseError(`Error parsing semantic tokens in imported file: ${err}`);
|
|
76
66
|
}
|
|
77
67
|
}
|
|
78
68
|
else {
|
|
@@ -83,7 +73,7 @@ function getSemanticTokens(scriptData, options) {
|
|
|
83
73
|
hasError, hasParseError
|
|
84
74
|
};
|
|
85
75
|
};
|
|
86
|
-
visitor.
|
|
76
|
+
await visitor.visitAsync(tree);
|
|
87
77
|
const semanticTokens = visitor.getTokens();
|
|
88
78
|
const parsedTokens = (0, SemanticTokenVisitor_js_1.prepareTokens)(tokens.getTokens(), lexer, scriptData);
|
|
89
79
|
const finalParsedTokens = [];
|
|
@@ -121,27 +111,30 @@ class ParseErrorStrategy extends antlr4ng_1.DefaultErrorStrategy {
|
|
|
121
111
|
}
|
|
122
112
|
}
|
|
123
113
|
exports.ParseErrorStrategy = ParseErrorStrategy;
|
|
124
|
-
function validateScript(scriptData, options) {
|
|
114
|
+
async function validateScript(filePath, scriptData, options) {
|
|
125
115
|
const { parser } = prepareFile(scriptData);
|
|
126
116
|
parser.removeErrorListeners();
|
|
127
117
|
parser.errorHandler = new ParseErrorStrategy();
|
|
128
118
|
parser.addErrorListener(new TokenErrorListener());
|
|
129
119
|
const tree = parser.script();
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
visitor.onImportFile = (visitor, textData) => {
|
|
120
|
+
const visitor = new SymbolValidatorVisitor_js_1.SymbolValidatorVisitor(true, null, options.environment);
|
|
121
|
+
visitor.enterFile(filePath);
|
|
122
|
+
visitor.onImportFile = async (visitor, filePath, textData) => {
|
|
123
|
+
visitor.enterFile(filePath);
|
|
133
124
|
let hasError = false;
|
|
134
125
|
let hasParseError = false;
|
|
135
126
|
if (textData !== null) {
|
|
136
127
|
const { parser } = prepareFile(textData);
|
|
137
128
|
const tree = parser.script();
|
|
138
129
|
try {
|
|
139
|
-
visitor.
|
|
130
|
+
await visitor.visitAsync(tree);
|
|
131
|
+
visitor.exitFile();
|
|
140
132
|
}
|
|
141
133
|
catch (err) {
|
|
142
134
|
console.log('got an error while parsing tree: ', err);
|
|
143
135
|
hasParseError = true;
|
|
144
136
|
hasError = true;
|
|
137
|
+
throw new utils_js_1.ParseError(`Error parsing validation in imported file: ${err}`);
|
|
145
138
|
}
|
|
146
139
|
}
|
|
147
140
|
else {
|
|
@@ -152,135 +145,160 @@ function validateScript(scriptData, options) {
|
|
|
152
145
|
hasError, hasParseError
|
|
153
146
|
};
|
|
154
147
|
};
|
|
155
|
-
visitor.
|
|
148
|
+
await visitor.visitAsync(tree);
|
|
156
149
|
const symbolTable = visitor.getSymbols();
|
|
157
150
|
symbolTable.clearUndefined();
|
|
158
|
-
const visitorResolver = new
|
|
151
|
+
const visitorResolver = new SymbolValidatorResolveVisitor_js_1.SymbolValidatorResolveVisitor(true, null, options.environment);
|
|
152
|
+
visitorResolver.enterFile(filePath);
|
|
159
153
|
visitorResolver.setSymbols(visitor.getSymbols());
|
|
160
154
|
visitorResolver.onImportFile = visitor.onImportFile;
|
|
161
|
-
visitorResolver.
|
|
155
|
+
await visitorResolver.visitAsync(tree);
|
|
162
156
|
return visitorResolver;
|
|
163
157
|
}
|
|
164
158
|
exports.validateScript = validateScript;
|
|
165
|
-
function renderScript(scriptData, outputPath, options) {
|
|
166
|
-
const {
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
|
|
159
|
+
async function renderScript(scriptData, outputPath, options) {
|
|
160
|
+
const { dumpNets = false, dumpData = false, showStats = false, environment } = options;
|
|
161
|
+
const errors = [];
|
|
162
|
+
const onErrorHandler = (message, context, error) => {
|
|
163
|
+
if (error && error instanceof utils_js_1.RuntimeExecutionError) {
|
|
164
|
+
errors.push(error);
|
|
165
|
+
}
|
|
166
|
+
else if (error && error instanceof antlr4ng_1.RecognitionException) {
|
|
167
|
+
errors.push(new utils_js_1.ParseSyntaxError(message, context.start, context.stop));
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
errors.push(new utils_js_1.ParseError(message, context.start, context.stop));
|
|
170
171
|
}
|
|
171
172
|
};
|
|
172
|
-
const visitor = new visitor_js_1.ParserVisitor(true, onErrorHandler,
|
|
173
|
-
visitor.onImportFile = (visitor, fileData) => {
|
|
174
|
-
const { hasError, hasParseError } = (0, parser_js_1.parseFileWithVisitor)(visitor, fileData);
|
|
173
|
+
const visitor = new visitor_js_1.ParserVisitor(true, onErrorHandler, options.environment);
|
|
174
|
+
visitor.onImportFile = async (visitor, filePath, fileData) => {
|
|
175
|
+
const { hasError, hasParseError } = await (0, parser_js_1.parseFileWithVisitor)(visitor, fileData);
|
|
176
|
+
if (hasError || hasParseError) {
|
|
177
|
+
throw new utils_js_1.ParseError(`Error parsing imported file: ${filePath}`, undefined, undefined, filePath);
|
|
178
|
+
}
|
|
175
179
|
return { hasError, hasParseError };
|
|
176
180
|
};
|
|
177
181
|
visitor.log('reading file');
|
|
178
182
|
visitor.log('done reading file');
|
|
179
|
-
const { tree, parser,
|
|
183
|
+
const { tree, parser, parserTimeTaken, lexerTimeTaken } = await (0, parser_js_1.parseFileWithVisitor)(visitor, scriptData);
|
|
180
184
|
showStats && console.log('Lexing took:', lexerTimeTaken);
|
|
181
185
|
showStats && console.log('Parsing took:', parserTimeTaken);
|
|
182
186
|
if (dumpNets) {
|
|
183
187
|
const nets = visitor.dumpNets();
|
|
184
|
-
console.log(
|
|
185
|
-
}
|
|
186
|
-
dumpData && (0, fs_1.writeFileSync)('dump/tree.lisp', tree.toStringTree(null, parser));
|
|
187
|
-
dumpData && (0, fs_1.writeFileSync)('dump/raw-parser.txt', visitor.logger.dump());
|
|
188
|
-
if (hasError || hasParseError) {
|
|
189
|
-
console.log('Error while parsing');
|
|
190
|
-
return null;
|
|
191
|
-
}
|
|
192
|
-
const { frameComponent } = visitor.applySheetFrameComponent();
|
|
193
|
-
try {
|
|
194
|
-
visitor.annotateComponents();
|
|
195
|
-
}
|
|
196
|
-
catch (err) {
|
|
197
|
-
console.log('Error during annotation: ', err);
|
|
188
|
+
nets.forEach(item => console.log(item.join(" | ")));
|
|
198
189
|
}
|
|
199
|
-
const
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
tmp[2] = tmp[2].map(item2 => {
|
|
205
|
-
const lengthValue = item2.value;
|
|
206
|
-
const useValue = [item2.direction];
|
|
207
|
-
if (lengthValue !== null) {
|
|
208
|
-
useValue.push(lengthValue.value);
|
|
209
|
-
useValue.push(lengthValue.type);
|
|
210
|
-
}
|
|
211
|
-
return useValue.join(",");
|
|
212
|
-
}).join(" ");
|
|
213
|
-
}
|
|
214
|
-
else if (action === ExecutionScope_js_1.SequenceAction.Frame) {
|
|
215
|
-
tmp[1] = item[1].frameId;
|
|
216
|
-
}
|
|
217
|
-
else if (action !== ExecutionScope_js_1.SequenceAction.WireJump) {
|
|
218
|
-
tmp[1] = item[1].instanceName;
|
|
190
|
+
const dumpDirectory = environment.getRelativeToModule('/dump/');
|
|
191
|
+
if (dumpData) {
|
|
192
|
+
console.log('Dump data to:', dumpDirectory);
|
|
193
|
+
if (!(0, fs_1.existsSync)(dumpDirectory)) {
|
|
194
|
+
(0, fs_1.mkdirSync)(dumpDirectory);
|
|
219
195
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
dumpData && (0, fs_1.writeFileSync)('
|
|
196
|
+
}
|
|
197
|
+
dumpData && (0, fs_1.writeFileSync)(dumpDirectory + 'tree.lisp', tree.toStringTree(null, parser));
|
|
198
|
+
dumpData && (0, fs_1.writeFileSync)(dumpDirectory + 'raw-parser.txt', visitor.logger.dump());
|
|
223
199
|
let svgOutput = "";
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
fileExtension = path_1.default.extname(outputPath).substring(1);
|
|
229
|
-
if (fileExtension === "pdf") {
|
|
230
|
-
outputDefaultZoom = 1;
|
|
231
|
-
}
|
|
200
|
+
if (errors.length === 0) {
|
|
201
|
+
const { frameComponent } = visitor.applySheetFrameComponent();
|
|
202
|
+
try {
|
|
203
|
+
visitor.annotateComponents();
|
|
232
204
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
missingFootprints.forEach(entry => {
|
|
236
|
-
console.log(`${entry.refdes} (${entry.instanceName}) does not have footprint`);
|
|
237
|
-
});
|
|
238
|
-
(0, fs_1.writeFileSync)(outputPath, (0, export_js_1.printTree)(kicadNetList));
|
|
239
|
-
console.log('Generated file', outputPath);
|
|
240
|
-
return null;
|
|
205
|
+
catch (err) {
|
|
206
|
+
throw new utils_js_1.RenderError(`Error during component annotation: ${err}`, 'annotation');
|
|
241
207
|
}
|
|
242
|
-
const
|
|
243
|
-
const
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
dumpData && (0, fs_1.writeFileSync)('dump/raw-render.txt', renderLogger.dump());
|
|
253
|
-
svgOutput = (0, render_js_1.generateSvgOutput)(svgCanvas, outputDefaultZoom);
|
|
254
|
-
if (outputPath) {
|
|
255
|
-
if (fileExtension === 'svg') {
|
|
256
|
-
(0, fs_1.writeFileSync)(outputPath, svgOutput);
|
|
257
|
-
}
|
|
258
|
-
else if (fileExtension === 'pdf') {
|
|
259
|
-
let sheetSize = "A4";
|
|
260
|
-
let sheetSizeDefined = false;
|
|
261
|
-
if (frameComponent) {
|
|
262
|
-
sheetSize = frameComponent.getParam(Frame_js_1.FrameParamKeys.PaperSize);
|
|
263
|
-
sheetSizeDefined = true;
|
|
208
|
+
const { sequence, nets } = visitor.getGraph();
|
|
209
|
+
const tmpSequence = (0, utils_js_1.generateDebugSequenceAction)(sequence).map(item => (0, utils_js_1.sequenceActionString)(item));
|
|
210
|
+
dumpData && (0, fs_1.writeFileSync)(dumpDirectory + 'raw-sequence.txt', tmpSequence.join('\n'));
|
|
211
|
+
try {
|
|
212
|
+
let fileExtension = null;
|
|
213
|
+
let outputDefaultZoom = globals_js_1.defaultZoomScale;
|
|
214
|
+
if (outputPath) {
|
|
215
|
+
fileExtension = path_1.default.extname(outputPath).substring(1);
|
|
216
|
+
if (fileExtension === "pdf") {
|
|
217
|
+
outputDefaultZoom = 1;
|
|
264
218
|
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
219
|
+
}
|
|
220
|
+
if (fileExtension === 'net') {
|
|
221
|
+
const { tree: kicadNetList, missingFootprints } = (0, export_js_1.generateKiCADNetList)(visitor.getNetList());
|
|
222
|
+
missingFootprints.forEach(entry => {
|
|
223
|
+
console.log(`${entry.refdes} (${entry.instanceName}) does not have footprint`);
|
|
268
224
|
});
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
doc.end();
|
|
225
|
+
(0, fs_1.writeFileSync)(outputPath, (0, export_js_1.printTree)(kicadNetList));
|
|
226
|
+
console.log('Generated file', outputPath);
|
|
227
|
+
return null;
|
|
273
228
|
}
|
|
274
|
-
|
|
275
|
-
|
|
229
|
+
const layoutEngine = new layout_js_1.LayoutEngine();
|
|
230
|
+
const layoutTimer = new utils_js_1.SimpleStopwatch();
|
|
231
|
+
let sheetFrames;
|
|
232
|
+
try {
|
|
233
|
+
sheetFrames = layoutEngine.runLayout(sequence, nets);
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
throw new utils_js_1.RenderError(`Error during layout generation: ${err}`, 'layout');
|
|
237
|
+
}
|
|
238
|
+
layoutEngine.printWarnings();
|
|
239
|
+
showStats && console.log('Layout took:', layoutTimer.lap());
|
|
240
|
+
dumpData && (0, fs_1.writeFileSync)(dumpDirectory + 'raw-layout.txt', layoutEngine.logger.dump());
|
|
241
|
+
const generateSvgTimer = new utils_js_1.SimpleStopwatch();
|
|
242
|
+
const renderLogger = new logger_js_1.Logger();
|
|
243
|
+
let svgCanvas;
|
|
244
|
+
try {
|
|
245
|
+
svgCanvas = (0, render_js_1.renderSheetsToSVG)(sheetFrames, renderLogger);
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
throw new utils_js_1.RenderError(`Error during SVG generation: ${err}`, 'svg_generation');
|
|
249
|
+
}
|
|
250
|
+
showStats && console.log('Render took:', generateSvgTimer.lap());
|
|
251
|
+
dumpData && (0, fs_1.writeFileSync)(dumpDirectory + 'raw-render.txt', renderLogger.dump());
|
|
252
|
+
try {
|
|
253
|
+
svgOutput = (0, render_js_1.generateSvgOutput)(svgCanvas, outputDefaultZoom);
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
throw new utils_js_1.RenderError(`Error generating SVG output: ${err}`, 'svg_output');
|
|
257
|
+
}
|
|
258
|
+
if (outputPath) {
|
|
259
|
+
if (fileExtension === 'svg') {
|
|
260
|
+
try {
|
|
261
|
+
(0, fs_1.writeFileSync)(outputPath, svgOutput);
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
throw new utils_js_1.RenderError(`Error writing SVG file: ${err}`, 'file_output');
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
else if (fileExtension === 'pdf') {
|
|
268
|
+
let sheetSize = "A4";
|
|
269
|
+
let sheetSizeDefined = false;
|
|
270
|
+
if (frameComponent) {
|
|
271
|
+
sheetSize = frameComponent.getParam(Frame_js_1.FrameParamKeys.PaperSize);
|
|
272
|
+
sheetSizeDefined = true;
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
const doc = new pdfkit_1.default({
|
|
276
|
+
layout: 'landscape',
|
|
277
|
+
size: sheetSize
|
|
278
|
+
});
|
|
279
|
+
const outputStream = (0, fs_1.createWriteStream)(outputPath);
|
|
280
|
+
(0, render_js_1.generatePdfOutput)(doc, svgCanvas, sheetSize, sheetSizeDefined, outputDefaultZoom);
|
|
281
|
+
doc.pipe(outputStream);
|
|
282
|
+
doc.end();
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
throw new utils_js_1.RenderError(`Error generating PDF file: ${err}`, 'pdf_output');
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
throw new utils_js_1.RenderError(`Invalid output format: ${fileExtension}`, 'file_output');
|
|
290
|
+
}
|
|
291
|
+
console.log('Generated file', outputPath);
|
|
276
292
|
}
|
|
277
|
-
|
|
293
|
+
}
|
|
294
|
+
catch (err) {
|
|
295
|
+
throw new utils_js_1.RenderError(`Error during rendering: ${err}`, 'output_generation');
|
|
278
296
|
}
|
|
279
297
|
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
298
|
+
return {
|
|
299
|
+
svgOutput,
|
|
300
|
+
errors
|
|
301
|
+
};
|
|
284
302
|
}
|
|
285
303
|
exports.renderScript = renderScript;
|
|
286
304
|
function detectJSModuleType() {
|
|
@@ -293,32 +311,6 @@ function detectJSModuleType() {
|
|
|
293
311
|
}
|
|
294
312
|
}
|
|
295
313
|
exports.detectJSModuleType = detectJSModuleType;
|
|
296
|
-
const context = (0, this_file_1.createContext)();
|
|
297
|
-
function getCurrentPath() {
|
|
298
|
-
const filename = context.filename;
|
|
299
|
-
return { filePath: filename };
|
|
300
|
-
}
|
|
301
|
-
exports.getCurrentPath = getCurrentPath;
|
|
302
|
-
function getToolsPath() {
|
|
303
|
-
const { filePath } = getCurrentPath();
|
|
304
|
-
return path_1.default.normalize(path_1.default.dirname(filePath) + '/../../');
|
|
305
|
-
}
|
|
306
|
-
function getFontsPath() {
|
|
307
|
-
const toolsPath = getToolsPath();
|
|
308
|
-
return path_1.default.normalize(toolsPath + "fonts");
|
|
309
|
-
}
|
|
310
|
-
exports.getFontsPath = getFontsPath;
|
|
311
|
-
function getDefaultLibsPath() {
|
|
312
|
-
const toolsPath = getToolsPath();
|
|
313
|
-
return path_1.default.normalize(toolsPath + "libs");
|
|
314
|
-
}
|
|
315
|
-
exports.getDefaultLibsPath = getDefaultLibsPath;
|
|
316
|
-
function getPackageVersion() {
|
|
317
|
-
const packageJson = JSON.parse((0, fs_1.readFileSync)(getToolsPath() + 'package.json').toString());
|
|
318
|
-
const { version } = packageJson;
|
|
319
|
-
return version;
|
|
320
|
-
}
|
|
321
|
-
exports.getPackageVersion = getPackageVersion;
|
|
322
314
|
class UnitDimension {
|
|
323
315
|
constructor(value, type = globals_js_1.LengthUnit.mils) {
|
|
324
316
|
this.value = value;
|
package/dist/cjs/index.js
CHANGED
|
@@ -29,3 +29,8 @@ __exportStar(require("./utils.js"), exports);
|
|
|
29
29
|
__exportStar(require("./visitor.js"), exports);
|
|
30
30
|
__exportStar(require("./sizing.js"), exports);
|
|
31
31
|
__exportStar(require("./objects/types.js"), exports);
|
|
32
|
+
__exportStar(require("./builtinMethods.js"), exports);
|
|
33
|
+
__exportStar(require("./validate/SymbolTable.js"), exports);
|
|
34
|
+
__exportStar(require("./validate/SymbolValidatorResolveVisitor.js"), exports);
|
|
35
|
+
__exportStar(require("./validate/SymbolValidatorVisitor.js"), exports);
|
|
36
|
+
__exportStar(require("./environment.js"), exports);
|
package/dist/cjs/layout.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.ExtractDrawingRects = exports.CalculatePinPositions = exports.RenderJunction = exports.RenderFrameType = exports.RenderFrame = exports.RenderText = exports.RenderComponent = exports.RenderWire = exports.RenderObject = exports.getBounds = exports.applyComponentParamsToSymbol = exports.LayoutEngine = void 0;
|
|
4
|
-
const graphlib_1 = require("@dagrejs/graphlib");
|
|
7
|
+
const graphlib_1 = __importDefault(require("@dagrejs/graphlib"));
|
|
8
|
+
const { Graph, alg } = graphlib_1.default;
|
|
5
9
|
const draw_symbols_js_1 = require("./draw_symbols.js");
|
|
6
10
|
const ExecutionScope_js_1 = require("./objects/ExecutionScope.js");
|
|
7
11
|
const globals_js_1 = require("./globals.js");
|
|
@@ -111,6 +115,7 @@ class LayoutEngine {
|
|
|
111
115
|
findJunctions(wireGroups) {
|
|
112
116
|
const junctions = [];
|
|
113
117
|
const mergedWires = [];
|
|
118
|
+
const debugSegments = false;
|
|
114
119
|
for (const [key, wires] of wireGroups) {
|
|
115
120
|
const allLines = wires.map(wire => {
|
|
116
121
|
return wire.points.map(pt => {
|
|
@@ -120,15 +125,35 @@ class LayoutEngine {
|
|
|
120
125
|
};
|
|
121
126
|
});
|
|
122
127
|
});
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
128
|
+
if (debugSegments) {
|
|
129
|
+
const tmpSegments = [];
|
|
130
|
+
allLines.forEach(wire => {
|
|
131
|
+
for (let i = 1; i < wire.length; i++) {
|
|
132
|
+
const pt1 = wire[i - 1];
|
|
133
|
+
const pt2 = wire[i];
|
|
134
|
+
tmpSegments.push([
|
|
135
|
+
[pt1.x.toNumber(), pt1.y.toNumber()],
|
|
136
|
+
[pt2.x.toNumber(), pt2.y.toNumber()],
|
|
137
|
+
]);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
mergedWires.push({
|
|
141
|
+
netName: key,
|
|
142
|
+
segments: tmpSegments,
|
|
143
|
+
intersectPoints: [],
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
const { intersectPoints, segments } = geometry_js_1.Geometry.mergeWires(allLines);
|
|
148
|
+
mergedWires.push({
|
|
149
|
+
netName: key,
|
|
150
|
+
segments,
|
|
151
|
+
intersectPoints,
|
|
152
|
+
});
|
|
153
|
+
intersectPoints.forEach(([x, y]) => {
|
|
154
|
+
junctions.push(new RenderJunction((0, ParamDefinition_js_1.numeric)(x), (0, ParamDefinition_js_1.numeric)(y)));
|
|
155
|
+
});
|
|
156
|
+
}
|
|
132
157
|
}
|
|
133
158
|
return {
|
|
134
159
|
junctions,
|
|
@@ -348,7 +373,7 @@ class LayoutEngine {
|
|
|
348
373
|
const frameArea = [tmpX1, tmpY1, tmpX2, tmpY2];
|
|
349
374
|
const overlaps = avoidAreas.filter(area => (0, utils_js_1.areasOverlap)(frameArea, area));
|
|
350
375
|
const doesOverlapAreasToAvoid = overlaps.length > 0;
|
|
351
|
-
if (doesExceedFrameHeight || doesOverlapAreasToAvoid) {
|
|
376
|
+
if (boundPoints.length > 0 && (doesExceedFrameHeight || doesOverlapAreasToAvoid)) {
|
|
352
377
|
innerFrameY = offsetY;
|
|
353
378
|
const nextX = (0, ParamDefinition_js_1.numeric)(xmax).sub(offsetX).add(frame.gap);
|
|
354
379
|
innerFrameX = offsetX.add(nextX);
|
|
@@ -378,7 +403,7 @@ class LayoutEngine {
|
|
|
378
403
|
const frameArea = [tmpX1, tmpY1, tmpX2, tmpY2];
|
|
379
404
|
const overlaps = avoidAreas.filter(area => (0, utils_js_1.areasOverlap)(frameArea, area));
|
|
380
405
|
const doesOverlapAreasToAvoid = overlaps.length > 0;
|
|
381
|
-
if (doesExceedFrameWidth || doesOverlapAreasToAvoid) {
|
|
406
|
+
if (boundPoints.length > 0 && (doesExceedFrameWidth || doesOverlapAreasToAvoid)) {
|
|
382
407
|
innerFrameX = offsetX.add(centeredOffsetX);
|
|
383
408
|
const { ymax } = getBoundsFromPoints(boundPoints);
|
|
384
409
|
const nextY = (0, ParamDefinition_js_1.numeric)(ymax).sub(offsetY).add(frame.gap);
|
|
@@ -585,7 +610,7 @@ class LayoutEngine {
|
|
|
585
610
|
generateLayoutGraph(sequence, nets) {
|
|
586
611
|
let previousNode = null;
|
|
587
612
|
let previousPin = null;
|
|
588
|
-
const graph = new
|
|
613
|
+
const graph = new Graph({
|
|
589
614
|
directed: false,
|
|
590
615
|
compound: true,
|
|
591
616
|
});
|
|
@@ -748,7 +773,7 @@ class LayoutEngine {
|
|
|
748
773
|
graph.setEdge(node1, node2, edgeValue);
|
|
749
774
|
}
|
|
750
775
|
sizeSubGraphs(graph) {
|
|
751
|
-
const subGraphs =
|
|
776
|
+
const subGraphs = alg.components(graph);
|
|
752
777
|
const subGraphsStarts = [];
|
|
753
778
|
this.print('===== placing subgraphs =====');
|
|
754
779
|
this.print('number of subgraphs: ', subGraphs.length);
|
package/dist/cjs/main.js
CHANGED
|
@@ -6,14 +6,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
const commander_1 = require("commander");
|
|
8
8
|
const figlet_1 = __importDefault(require("figlet"));
|
|
9
|
-
const path_1 = __importDefault(require("path"));
|
|
10
9
|
const fs_1 = require("fs");
|
|
11
|
-
const sizing_js_1 = require("./sizing.js");
|
|
12
10
|
const helpers_js_1 = require("./helpers.js");
|
|
11
|
+
const environment_js_1 = require("./environment.js");
|
|
13
12
|
async function main() {
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
const version =
|
|
13
|
+
const env = new environment_js_1.NodeScriptEnvironment();
|
|
14
|
+
environment_js_1.NodeScriptEnvironment.setInstance(env);
|
|
15
|
+
const version = env.getPackageVersion();
|
|
17
16
|
commander_1.program
|
|
18
17
|
.description('generate graphical output from circuitscript files')
|
|
19
18
|
.version(version)
|
|
@@ -24,7 +23,8 @@ async function main() {
|
|
|
24
23
|
.option('-w, --watch', 'Watch for file changes')
|
|
25
24
|
.option('-n, --dump-nets', 'Dump out net information')
|
|
26
25
|
.option('-d, --dump-data', 'Dump data during parsing')
|
|
27
|
-
.option('-s, --stats', 'Show stats during generation')
|
|
26
|
+
.option('-s, --stats', 'Show stats during generation')
|
|
27
|
+
.option('-x, --skip-output', 'Skip output generation');
|
|
28
28
|
commander_1.program.addHelpText('before', figlet_1.default.textSync('circuitscript', {
|
|
29
29
|
font: 'Small Slant'
|
|
30
30
|
}));
|
|
@@ -37,11 +37,13 @@ async function main() {
|
|
|
37
37
|
const watchFileChanges = options.watch;
|
|
38
38
|
const dumpNets = options.dumpNets;
|
|
39
39
|
const dumpData = options.dumpData;
|
|
40
|
-
|
|
40
|
+
if (options.currentDirectory) {
|
|
41
|
+
throw "Parameter not supported yet";
|
|
42
|
+
}
|
|
41
43
|
if (watchFileChanges) {
|
|
42
44
|
console.log('watching for file changes...');
|
|
43
45
|
}
|
|
44
|
-
await
|
|
46
|
+
await env.prepareSVGEnvironment();
|
|
45
47
|
let inputFilePath = "";
|
|
46
48
|
if (args.length > 2) {
|
|
47
49
|
console.log("Error: Extra arguments passed");
|
|
@@ -50,11 +52,8 @@ async function main() {
|
|
|
50
52
|
let scriptData;
|
|
51
53
|
if (args.length > 0 && args[0]) {
|
|
52
54
|
inputFilePath = args[0];
|
|
53
|
-
if ((
|
|
54
|
-
scriptData =
|
|
55
|
-
if (currentDirectory === null) {
|
|
56
|
-
currentDirectory = path_1.default.dirname(inputFilePath);
|
|
57
|
-
}
|
|
55
|
+
if ((await env.exists(inputFilePath))) {
|
|
56
|
+
scriptData = await env.readFile(inputFilePath, { encoding: 'utf-8' });
|
|
58
57
|
}
|
|
59
58
|
else {
|
|
60
59
|
console.error("Error: File could not be found");
|
|
@@ -69,29 +68,43 @@ async function main() {
|
|
|
69
68
|
return;
|
|
70
69
|
}
|
|
71
70
|
const scriptOptions = {
|
|
72
|
-
currentDirectory,
|
|
73
|
-
defaultLibsPath,
|
|
74
71
|
dumpNets,
|
|
75
72
|
dumpData,
|
|
76
73
|
showStats: options.stats,
|
|
74
|
+
environment: env,
|
|
77
75
|
};
|
|
78
76
|
let outputPath = null;
|
|
79
77
|
if (args.length > 0 && args[1]) {
|
|
80
78
|
outputPath = args[1];
|
|
81
79
|
}
|
|
82
|
-
const output =
|
|
83
|
-
if (outputPath === null && output) {
|
|
80
|
+
const output = await parseFile(scriptData, outputPath, scriptOptions);
|
|
81
|
+
if (outputPath === null && output && (options.skipOutput === undefined)) {
|
|
84
82
|
console.log(output);
|
|
85
83
|
}
|
|
86
84
|
if (watchFileChanges) {
|
|
87
|
-
(0, fs_1.watch)(inputFilePath, event => {
|
|
85
|
+
(0, fs_1.watch)(inputFilePath, async (event) => {
|
|
88
86
|
if (event === 'change') {
|
|
89
|
-
const scriptData =
|
|
90
|
-
(
|
|
91
|
-
console.log('done');
|
|
87
|
+
const scriptData = await env.readFile(inputFilePath, { encoding: 'utf-8' });
|
|
88
|
+
parseFile(scriptData, outputPath, scriptOptions);
|
|
92
89
|
}
|
|
93
90
|
});
|
|
94
91
|
}
|
|
95
92
|
}
|
|
96
93
|
exports.default = main;
|
|
94
|
+
async function parseFile(scriptData, outputPath, scriptOptions) {
|
|
95
|
+
try {
|
|
96
|
+
const { svgOutput: output, errors } = await (0, helpers_js_1.renderScript)(scriptData, outputPath, scriptOptions);
|
|
97
|
+
errors.forEach((err, index) => {
|
|
98
|
+
console.log(`[${index}] ${err}`);
|
|
99
|
+
});
|
|
100
|
+
if (errors.length > 0) {
|
|
101
|
+
console.log('Render failed due to syntax or parsing errors');
|
|
102
|
+
}
|
|
103
|
+
return output;
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
console.error(`Unexpected Error: ${error}`);
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
97
110
|
main();
|
|
@@ -11,7 +11,7 @@ class ClassComponent {
|
|
|
11
11
|
this.pins = new Map();
|
|
12
12
|
this.pinNets = new Map();
|
|
13
13
|
this.pinWires = new Map();
|
|
14
|
-
this.pinsMaxPositions =
|
|
14
|
+
this.pinsMaxPositions = new Map();
|
|
15
15
|
this._copyID = null;
|
|
16
16
|
this._copyFrom = null;
|
|
17
17
|
this.arrangeProps = null;
|
|
@@ -144,6 +144,9 @@ class ClassComponent {
|
|
|
144
144
|
for (const [key, value] of this.pins) {
|
|
145
145
|
component.pins.set(key, value);
|
|
146
146
|
}
|
|
147
|
+
for (const [key, value] of this.pinsMaxPositions) {
|
|
148
|
+
component.pinsMaxPositions.set(key, value);
|
|
149
|
+
}
|
|
147
150
|
component.refreshCache();
|
|
148
151
|
return component;
|
|
149
152
|
}
|