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.
Files changed (102) hide show
  1. package/dist/cjs/BaseVisitor.js +149 -80
  2. package/dist/cjs/SemanticTokenVisitor.js +19 -13
  3. package/dist/cjs/antlr/CircuitScriptParser.js +711 -671
  4. package/dist/cjs/builtinMethods.js +48 -22
  5. package/dist/cjs/draw_symbols.js +4 -1
  6. package/dist/cjs/environment.js +118 -0
  7. package/dist/cjs/execute.js +98 -46
  8. package/dist/cjs/geometry.js +1 -0
  9. package/dist/cjs/globals.js +14 -7
  10. package/dist/cjs/helpers.js +142 -150
  11. package/dist/cjs/index.js +5 -0
  12. package/dist/cjs/layout.js +39 -14
  13. package/dist/cjs/main.js +34 -21
  14. package/dist/cjs/objects/ClassComponent.js +4 -1
  15. package/dist/cjs/objects/ExecutionScope.js +40 -2
  16. package/dist/cjs/objects/ParamDefinition.js +15 -15
  17. package/dist/cjs/parser.js +27 -21
  18. package/dist/cjs/regenerate-tests.js +9 -6
  19. package/dist/cjs/render.js +3 -1
  20. package/dist/cjs/sizing.js +10 -60
  21. package/dist/cjs/utils.js +148 -17
  22. package/dist/cjs/validate/SymbolTable.js +96 -0
  23. package/dist/cjs/validate/SymbolValidatorResolveVisitor.js +14 -0
  24. package/dist/cjs/validate/SymbolValidatorVisitor.js +170 -0
  25. package/dist/cjs/validate.js +52 -44
  26. package/dist/cjs/visitor.js +149 -31
  27. package/dist/esm/{BaseVisitor.mjs → BaseVisitor.js} +124 -56
  28. package/dist/esm/{SemanticTokenVisitor.mjs → SemanticTokenVisitor.js} +17 -11
  29. package/dist/esm/antlr/{CircuitScriptParser.mjs → CircuitScriptParser.js} +711 -671
  30. package/dist/esm/{builtinMethods.mjs → builtinMethods.js} +40 -14
  31. package/dist/esm/{draw_symbols.mjs → draw_symbols.js} +11 -8
  32. package/dist/esm/environment.js +110 -0
  33. package/dist/esm/{execute.mjs → execute.js} +111 -58
  34. package/dist/esm/{export.mjs → export.js} +2 -2
  35. package/dist/esm/{geometry.mjs → geometry.js} +6 -5
  36. package/dist/esm/{globals.mjs → globals.js} +9 -2
  37. package/dist/esm/helpers.js +377 -0
  38. package/dist/esm/index.js +20 -0
  39. package/dist/esm/{layout.mjs → layout.js} +44 -22
  40. package/dist/esm/{lexer.mjs → lexer.js} +2 -2
  41. package/dist/esm/{main.mjs → main.js} +36 -23
  42. package/dist/esm/objects/{ClassComponent.mjs → ClassComponent.js} +9 -5
  43. package/dist/esm/objects/{ExecutionScope.mjs → ExecutionScope.js} +40 -2
  44. package/dist/esm/objects/{Frame.mjs → Frame.js} +1 -1
  45. package/dist/esm/objects/{ParamDefinition.mjs → ParamDefinition.js} +1 -1
  46. package/dist/esm/objects/{PinDefinition.mjs → PinDefinition.js} +1 -1
  47. package/dist/esm/parser.js +71 -0
  48. package/dist/esm/{regenerate-tests.mjs → regenerate-tests.js} +10 -7
  49. package/dist/esm/{render.mjs → render.js} +11 -9
  50. package/dist/esm/{sizing.mjs → sizing.js} +11 -36
  51. package/dist/esm/utils.js +286 -0
  52. package/dist/esm/validate/SymbolTable.js +90 -0
  53. package/dist/esm/validate/SymbolValidatorResolveVisitor.js +10 -0
  54. package/dist/esm/validate/SymbolValidatorVisitor.js +163 -0
  55. package/dist/esm/validate.js +86 -0
  56. package/dist/esm/{visitor.mjs → visitor.js} +160 -42
  57. package/dist/fonts/Arial.ttf +0 -0
  58. package/dist/fonts/Inter-Bold.ttf +0 -0
  59. package/dist/fonts/Inter-Regular.ttf +0 -0
  60. package/dist/fonts/OpenSans-Regular.ttf +0 -0
  61. package/dist/fonts/Roboto-Regular.ttf +0 -0
  62. package/dist/libs/lib.cst +423 -0
  63. package/dist/types/BaseVisitor.d.ts +36 -22
  64. package/dist/types/SemanticTokenVisitor.d.ts +6 -5
  65. package/dist/types/antlr/CircuitScriptParser.d.ts +4 -2
  66. package/dist/types/builtinMethods.d.ts +3 -2
  67. package/dist/types/draw_symbols.d.ts +2 -6
  68. package/dist/types/environment.d.ts +31 -0
  69. package/dist/types/execute.d.ts +2 -3
  70. package/dist/types/globals.d.ts +7 -2
  71. package/dist/types/helpers.d.ts +12 -14
  72. package/dist/types/index.d.ts +5 -0
  73. package/dist/types/objects/ClassComponent.d.ts +2 -3
  74. package/dist/types/objects/ExecutionScope.d.ts +20 -6
  75. package/dist/types/objects/types.d.ts +6 -1
  76. package/dist/types/parser.d.ts +7 -11
  77. package/dist/types/sizing.d.ts +0 -3
  78. package/dist/types/utils.d.ts +33 -4
  79. package/dist/types/validate/SymbolTable.d.ts +40 -0
  80. package/dist/types/validate/SymbolValidatorResolveVisitor.d.ts +7 -0
  81. package/dist/types/validate/SymbolValidatorVisitor.d.ts +32 -0
  82. package/dist/types/validate.d.ts +1 -1
  83. package/libs/lib.cst +12 -22
  84. package/package.json +14 -13
  85. package/dist/cjs/SymbolValidatorVisitor.js +0 -233
  86. package/dist/esm/SymbolValidatorVisitor.mjs +0 -222
  87. package/dist/esm/helpers.mjs +0 -380
  88. package/dist/esm/index.mjs +0 -15
  89. package/dist/esm/parser.mjs +0 -64
  90. package/dist/esm/utils.mjs +0 -169
  91. package/dist/esm/validate.mjs +0 -74
  92. package/dist/types/SymbolValidatorVisitor.d.ts +0 -61
  93. package/dist/types/layout.d.ts +0 -148
  94. /package/dist/esm/antlr/{CircuitScriptLexer.mjs → CircuitScriptLexer.js} +0 -0
  95. /package/dist/esm/antlr/{CircuitScriptVisitor.mjs → CircuitScriptVisitor.js} +0 -0
  96. /package/dist/esm/{fonts.mjs → fonts.js} +0 -0
  97. /package/dist/esm/{logger.mjs → logger.js} +0 -0
  98. /package/dist/esm/objects/{Net.mjs → Net.js} +0 -0
  99. /package/dist/esm/objects/{PinTypes.mjs → PinTypes.js} +0 -0
  100. /package/dist/esm/objects/{Wire.mjs → Wire.js} +0 -0
  101. /package/dist/esm/objects/{types.mjs → types.js} +0 -0
  102. /package/dist/esm/{server.mjs → server.js} +0 -0
@@ -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.getPackageVersion = exports.getDefaultLibsPath = exports.getFontsPath = exports.getCurrentPath = exports.detectJSModuleType = exports.renderScript = exports.validateScript = exports.ParseErrorStrategy = exports.getSemanticTokens = exports.getScriptText = exports.prepareFile = exports.JSModuleType = void 0;
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 this_file_1 = require("this-file");
18
- const SymbolValidatorVisitor_js_1 = require("./SymbolValidatorVisitor.js");
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 getScriptText(filePath) {
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 { currentDirectory = null, defaultLibsPath, } = options;
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.visit(tree);
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 { currentDirectory = null, defaultLibsPath, } = options;
131
- const visitor = new SymbolValidatorVisitor_js_1.SymbolValidatorVisitor(true, null, currentDirectory, defaultLibsPath);
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.visit(tree);
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.visit(tree);
148
+ await visitor.visitAsync(tree);
156
149
  const symbolTable = visitor.getSymbols();
157
150
  symbolTable.clearUndefined();
158
- const visitorResolver = new SymbolValidatorVisitor_js_1.SymbolValidatorResolveVisitor(true, null, currentDirectory, defaultLibsPath);
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.visit(tree);
155
+ await visitorResolver.visitAsync(tree);
162
156
  return visitorResolver;
163
157
  }
164
158
  exports.validateScript = validateScript;
165
- function renderScript(scriptData, outputPath, options) {
166
- const { currentDirectory = null, defaultLibsPath, dumpNets = false, dumpData = false, showStats = false } = options;
167
- const onErrorHandler = (line, column, message, error) => {
168
- if (error instanceof visitor_js_1.VisitorExecutionException) {
169
- console.log('Error', line, column, message, error.errorMessage);
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, currentDirectory, defaultLibsPath);
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, hasParseError, hasError, parserTimeTaken, lexerTimeTaken } = (0, parser_js_1.parseFileWithVisitor)(visitor, scriptData);
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(nets);
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 { sequence, nets } = visitor.getGraph();
200
- const tmpSequence = sequence.map(item => {
201
- const tmp = [...item];
202
- const action = tmp[0];
203
- if (action === ExecutionScope_js_1.SequenceAction.Wire) {
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
- return tmp.join(" | ");
221
- });
222
- dumpData && (0, fs_1.writeFileSync)('dump/raw-sequence.txt', tmpSequence.join('\n'));
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
- try {
225
- let fileExtension = null;
226
- let outputDefaultZoom = globals_js_1.defaultZoomScale;
227
- if (outputPath) {
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
- if (fileExtension === 'net') {
234
- const { tree: kicadNetList, missingFootprints } = (0, export_js_1.generateKiCADNetList)(visitor.getNetList());
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 layoutEngine = new layout_js_1.LayoutEngine();
243
- const layoutTimer = new utils_js_1.SimpleStopwatch();
244
- const sheetFrames = layoutEngine.runLayout(sequence, nets);
245
- layoutEngine.printWarnings();
246
- showStats && console.log('Layout took:', layoutTimer.lap());
247
- dumpData && (0, fs_1.writeFileSync)('dump/raw-layout.txt', layoutEngine.logger.dump());
248
- const generateSvgTimer = new utils_js_1.SimpleStopwatch();
249
- const renderLogger = new logger_js_1.Logger();
250
- const svgCanvas = (0, render_js_1.renderSheetsToSVG)(sheetFrames, renderLogger);
251
- showStats && console.log('Render took:', generateSvgTimer.lap());
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
- const doc = new pdfkit_1.default({
266
- layout: 'landscape',
267
- size: sheetSize
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
- const outputStream = (0, fs_1.createWriteStream)(outputPath);
270
- (0, render_js_1.generatePdfOutput)(doc, svgCanvas, sheetSize, sheetSizeDefined, outputDefaultZoom);
271
- doc.pipe(outputStream);
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
- else {
275
- throw "Invalid output format";
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
- console.log('Generated file', outputPath);
293
+ }
294
+ catch (err) {
295
+ throw new utils_js_1.RenderError(`Error during rendering: ${err}`, 'output_generation');
278
296
  }
279
297
  }
280
- catch (err) {
281
- console.log('Error during render: ', err);
282
- }
283
- return svgOutput;
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);
@@ -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
- const { intersectPoints, segments } = geometry_js_1.Geometry.mergeWires(allLines);
124
- mergedWires.push({
125
- netName: key,
126
- segments,
127
- intersectPoints,
128
- });
129
- intersectPoints.forEach(([x, y]) => {
130
- junctions.push(new RenderJunction((0, ParamDefinition_js_1.numeric)(x), (0, ParamDefinition_js_1.numeric)(y)));
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 graphlib_1.Graph({
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 = graphlib_1.alg.components(graph);
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 fontsPath = (0, helpers_js_1.getFontsPath)();
15
- const defaultLibsPath = (0, helpers_js_1.getDefaultLibsPath)();
16
- const version = (0, helpers_js_1.getPackageVersion)();
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
- let currentDirectory = options.currentDirectory ?? null;
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 (0, sizing_js_1.prepareSVGEnvironment)(fontsPath);
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 ((0, fs_1.existsSync)(inputFilePath)) {
54
- scriptData = (0, fs_1.readFileSync)(inputFilePath, { encoding: 'utf-8' });
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 = (0, helpers_js_1.renderScript)(scriptData, outputPath, scriptOptions);
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 = (0, fs_1.readFileSync)(inputFilePath, { encoding: 'utf-8' });
90
- (0, helpers_js_1.renderScript)(scriptData, outputPath, scriptOptions);
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
  }