circuitscript 0.0.31 → 0.0.34

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 (51) hide show
  1. package/dist/cjs/BaseVisitor.js +187 -39
  2. package/dist/cjs/antlr/CircuitScriptLexer.js +226 -185
  3. package/dist/cjs/antlr/CircuitScriptParser.js +1439 -902
  4. package/dist/cjs/draw_symbols.js +1 -0
  5. package/dist/cjs/execute.js +16 -12
  6. package/dist/cjs/globals.js +15 -2
  7. package/dist/cjs/helpers.js +81 -6
  8. package/dist/cjs/layout.js +120 -37
  9. package/dist/cjs/objects/ClassComponent.js +3 -0
  10. package/dist/cjs/objects/ExecutionScope.js +1 -0
  11. package/dist/cjs/objects/Frame.js +6 -1
  12. package/dist/cjs/objects/ParamDefinition.js +1 -7
  13. package/dist/cjs/objects/types.js +6 -0
  14. package/dist/cjs/regenerate-tests.js +2 -1
  15. package/dist/cjs/render.js +243 -45
  16. package/dist/cjs/visitor.js +162 -27
  17. package/dist/esm/BaseVisitor.mjs +189 -41
  18. package/dist/esm/antlr/CircuitScriptLexer.mjs +226 -185
  19. package/dist/esm/antlr/CircuitScriptParser.mjs +1428 -899
  20. package/dist/esm/antlr/CircuitScriptVisitor.mjs +9 -2
  21. package/dist/esm/draw_symbols.mjs +1 -0
  22. package/dist/esm/execute.mjs +16 -12
  23. package/dist/esm/globals.mjs +14 -1
  24. package/dist/esm/helpers.mjs +81 -8
  25. package/dist/esm/layout.mjs +120 -38
  26. package/dist/esm/objects/ClassComponent.mjs +3 -0
  27. package/dist/esm/objects/ExecutionScope.mjs +1 -0
  28. package/dist/esm/objects/Frame.mjs +7 -1
  29. package/dist/esm/objects/ParamDefinition.mjs +0 -6
  30. package/dist/esm/objects/types.mjs +6 -0
  31. package/dist/esm/regenerate-tests.mjs +2 -1
  32. package/dist/esm/render.mjs +239 -46
  33. package/dist/esm/visitor.mjs +164 -29
  34. package/dist/types/BaseVisitor.d.ts +8 -2
  35. package/dist/types/antlr/CircuitScriptLexer.d.ts +41 -30
  36. package/dist/types/antlr/CircuitScriptParser.d.ts +169 -81
  37. package/dist/types/antlr/CircuitScriptVisitor.d.ts +18 -4
  38. package/dist/types/draw_symbols.d.ts +2 -1
  39. package/dist/types/execute.d.ts +6 -3
  40. package/dist/types/globals.d.ts +12 -0
  41. package/dist/types/helpers.d.ts +12 -0
  42. package/dist/types/layout.d.ts +23 -10
  43. package/dist/types/objects/ClassComponent.d.ts +2 -1
  44. package/dist/types/objects/ExecutionScope.d.ts +2 -0
  45. package/dist/types/objects/Frame.d.ts +8 -2
  46. package/dist/types/objects/ParamDefinition.d.ts +0 -4
  47. package/dist/types/objects/types.d.ts +4 -2
  48. package/dist/types/render.d.ts +6 -10
  49. package/dist/types/visitor.d.ts +10 -2
  50. package/libs/lib.cst +283 -0
  51. package/package.json +5 -1
@@ -605,6 +605,7 @@ var PlaceHolderCommands;
605
605
  PlaceHolderCommands["textColor"] = "textColor";
606
606
  PlaceHolderCommands["text"] = "text";
607
607
  PlaceHolderCommands["units"] = "units";
608
+ PlaceHolderCommands["for"] = "for";
608
609
  })(PlaceHolderCommands || (exports.PlaceHolderCommands = PlaceHolderCommands = {}));
609
610
  class SymbolCustom extends SymbolGraphic {
610
611
  constructor(pinDefinition) {
@@ -439,12 +439,16 @@ class ExecutionContext {
439
439
  this.log('did not find block point');
440
440
  return null;
441
441
  }
442
- breakBranch() {
443
- this.log('break branch');
444
- const branchesInfo = this.scope.blockStack.get(this.scope.indentLevel - 1);
445
- const branchIndex = branchesInfo['block_index'];
446
- const branchIndexRef = branchesInfo['inner_blocks'].get(branchIndex);
447
- branchIndexRef['ignore_last_net'] = true;
442
+ addBreakContext(ctx) {
443
+ this.log('add break context');
444
+ this.scope.breakStack.push(ctx);
445
+ }
446
+ popBreakContext() {
447
+ this.log('pop break context');
448
+ return this.scope.breakStack.pop();
449
+ }
450
+ getBreakContext() {
451
+ return this.scope.breakStack[this.scope.breakStack.length - 1];
448
452
  }
449
453
  createFunction(functionName, __runFunc) {
450
454
  this.scope.functions.set(functionName, __runFunc);
@@ -776,9 +780,10 @@ class ExecutionContext {
776
780
  }
777
781
  }
778
782
  }
779
- enterFrame() {
783
+ enterFrame(frameType) {
780
784
  const frameId = this.scope.frames.length + 1;
781
- const frameObject = new Frame_js_1.Frame(frameId);
785
+ const frameObject = new Frame_js_1.Frame(frameId, frameType);
786
+ this.log('Enter frame', frameId);
782
787
  this.scope.frames.push(frameObject);
783
788
  this.scope.sequence.push([ExecutionScope_js_1.SequenceAction.Frame,
784
789
  frameObject, ExecutionScope_js_1.FrameAction.Enter]);
@@ -790,6 +795,7 @@ class ExecutionContext {
790
795
  const frame = this.scope.frames[frameId - 1];
791
796
  this.scope.sequence.push([ExecutionScope_js_1.SequenceAction.Frame,
792
797
  frame, ExecutionScope_js_1.FrameAction.Exit]);
798
+ this.log('Leave frame', frameId);
793
799
  }
794
800
  }
795
801
  exports.ExecutionContext = ExecutionContext;
@@ -841,10 +847,8 @@ function getPortSide(pins, arrangeProps) {
841
847
  }
842
848
  let position = 0;
843
849
  useItems.forEach(item => {
844
- if (typeof item === 'object') {
845
- if (item.blank) {
846
- position += item.blank;
847
- }
850
+ if (typeof item === 'object' && Array.isArray(item)) {
851
+ position += item[0];
848
852
  }
849
853
  if (existingPinIds.indexOf(item) !== -1) {
850
854
  result.push({
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BlockTypes = exports.ReferenceTypes = exports.ComponentTypes = exports.ColorScheme = exports.PortPaddingVertical = exports.PortPaddingHorizontal = exports.PortArrowSize = exports.junctionSize = exports.defaultFontSize = exports.defaultFontBold = exports.defaultFont = exports.displayUnits = exports.defaultFrameTitleTextSize = exports.CustomSymbolParamTextSize = exports.CustomSymbolRefDesSize = exports.CustomSymbolPinIdSize = exports.CustomSymbolPinTextSize = exports.defaultPinIdTextSize = exports.defaultPinNameTextSize = exports.defaultWireLineWidth = exports.defaultSymbolLineWidth = exports.fontDisplayScale = exports.defaultZoomScale = exports.defaultGridSizeUnits = exports.portHeight = exports.portWidth = exports.PxToMM = exports.MMToPx = exports.MilsToMM = exports.WireAutoDirection = exports.LengthUnit = exports.SymbolPinSide = exports.LayoutDirection = exports.ParamKeys = exports.NoNetText = exports.GlobalNames = void 0;
3
+ exports.RenderFlags = exports.GlobalDocumentName = exports.FrameType = exports.BlockTypes = exports.ReferenceTypes = exports.ComponentTypes = exports.ColorScheme = exports.PortPaddingVertical = exports.PortPaddingHorizontal = exports.PortArrowSize = exports.junctionSize = exports.defaultFontSize = exports.defaultFontBold = exports.defaultFont = exports.displayUnits = exports.defaultFrameTitleTextSize = exports.CustomSymbolParamTextSize = exports.CustomSymbolRefDesSize = exports.CustomSymbolPinIdSize = exports.CustomSymbolPinTextSize = exports.defaultPageSpacingMM = exports.defaultPageMarginMM = exports.defaultPinIdTextSize = exports.defaultPinNameTextSize = exports.defaultWireLineWidth = exports.defaultSymbolLineWidth = exports.fontDisplayScale = exports.defaultZoomScale = exports.defaultGridSizeUnits = exports.portHeight = exports.portWidth = exports.PxToMM = exports.MMToPt = exports.MMToPx = exports.MilsToMM = exports.WireAutoDirection = exports.LengthUnit = exports.SymbolPinSide = exports.LayoutDirection = exports.ParamKeys = exports.NoNetText = exports.GlobalNames = void 0;
4
4
  var GlobalNames;
5
5
  (function (GlobalNames) {
6
6
  GlobalNames["__root"] = "__root";
@@ -39,6 +39,7 @@ var WireAutoDirection;
39
39
  })(WireAutoDirection || (exports.WireAutoDirection = WireAutoDirection = {}));
40
40
  exports.MilsToMM = 0.0254;
41
41
  exports.MMToPx = 3.779276;
42
+ exports.MMToPt = 2.8346456693;
42
43
  exports.PxToMM = 0.2645833;
43
44
  exports.portWidth = 20;
44
45
  exports.portHeight = 2;
@@ -49,6 +50,8 @@ exports.defaultSymbolLineWidth = exports.MilsToMM * 6;
49
50
  exports.defaultWireLineWidth = exports.MilsToMM * 6;
50
51
  exports.defaultPinNameTextSize = 40;
51
52
  exports.defaultPinIdTextSize = 30;
53
+ exports.defaultPageMarginMM = 10;
54
+ exports.defaultPageSpacingMM = 10;
52
55
  exports.CustomSymbolPinTextSize = exports.defaultPinNameTextSize;
53
56
  exports.CustomSymbolPinIdSize = exports.defaultPinIdTextSize;
54
57
  exports.CustomSymbolRefDesSize = 50;
@@ -64,7 +67,7 @@ exports.PortPaddingHorizontal = exports.MilsToMM * 10;
64
67
  exports.PortPaddingVertical = exports.MilsToMM * 10;
65
68
  exports.ColorScheme = {
66
69
  BodyColor: 'rgb(255, 255, 194)',
67
- JunctionColor: 'rgba(0, 132, 0)',
70
+ JunctionColor: 'rgb(0, 132, 0)',
68
71
  WireColor: 'rgb(0, 132, 0)',
69
72
  PinLineColor: '#333',
70
73
  PinNameColor: '#333',
@@ -91,3 +94,13 @@ var BlockTypes;
91
94
  BlockTypes[BlockTypes["Parallel"] = 3] = "Parallel";
92
95
  BlockTypes[BlockTypes["Point"] = 4] = "Point";
93
96
  })(BlockTypes || (exports.BlockTypes = BlockTypes = {}));
97
+ var FrameType;
98
+ (function (FrameType) {
99
+ FrameType[FrameType["Frame"] = 1] = "Frame";
100
+ FrameType[FrameType["Sheet"] = 2] = "Sheet";
101
+ })(FrameType || (exports.FrameType = FrameType = {}));
102
+ exports.GlobalDocumentName = 'document';
103
+ exports.RenderFlags = {
104
+ ShowElementFrames: false,
105
+ ShowOrigin: false,
106
+ };
@@ -3,8 +3,10 @@ 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.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.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;
7
7
  const fs_1 = require("fs");
8
+ const path_1 = __importDefault(require("path"));
9
+ const pdfkit_1 = __importDefault(require("pdfkit"));
8
10
  const export_js_1 = require("./export.js");
9
11
  const layout_js_1 = require("./layout.js");
10
12
  const ExecutionScope_js_1 = require("./objects/ExecutionScope.js");
@@ -18,8 +20,8 @@ const antlr4ng_1 = require("antlr4ng");
18
20
  const lexer_js_1 = require("./lexer.js");
19
21
  const CircuitScriptParser_js_1 = require("./antlr/CircuitScriptParser.js");
20
22
  const SemanticTokenVisitor_js_1 = require("./SemanticTokenVisitor.js");
21
- const path_1 = __importDefault(require("path"));
22
23
  const globals_js_1 = require("./globals.js");
24
+ const Frame_js_1 = require("./objects/Frame.js");
23
25
  var JSModuleType;
24
26
  (function (JSModuleType) {
25
27
  JSModuleType["CommonJs"] = "cjs";
@@ -185,6 +187,7 @@ function renderScript(scriptData, outputPath, options) {
185
187
  console.log('Error while parsing');
186
188
  return null;
187
189
  }
190
+ const { frameComponent } = visitor.applySheetFrameComponent();
188
191
  try {
189
192
  visitor.annotateComponents();
190
193
  }
@@ -217,19 +220,49 @@ function renderScript(scriptData, outputPath, options) {
217
220
  return tmp.join(" | ");
218
221
  });
219
222
  dumpData && (0, fs_1.writeFileSync)('dump/raw-sequence.txt', tmpSequence.join('\n'));
220
- let svgOutput = null;
223
+ let svgOutput = "";
221
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
+ }
232
+ }
222
233
  const layoutEngine = new layout_js_1.LayoutEngine();
223
234
  const layoutTimer = new utils_js_1.SimpleStopwatch();
224
- const graph = layoutEngine.runLayout(sequence, nets);
235
+ const sheetFrames = layoutEngine.runLayout(sequence, nets);
225
236
  layoutEngine.printWarnings();
226
237
  showStats && console.log('Layout took:', layoutTimer.lap());
227
238
  dumpData && (0, fs_1.writeFileSync)('dump/raw-layout.txt', layoutEngine.logger.dump());
228
239
  const generateSvgTimer = new utils_js_1.SimpleStopwatch();
229
- svgOutput = (0, render_js_1.generateSVG2)(graph);
240
+ const svgCanvas = (0, render_js_1.renderSheetsToSVG)(sheetFrames);
230
241
  showStats && console.log('Render took:', generateSvgTimer.lap());
242
+ svgOutput = (0, render_js_1.generateSvgOutput)(svgCanvas, outputDefaultZoom);
231
243
  if (outputPath) {
232
- (0, fs_1.writeFileSync)(outputPath, svgOutput);
244
+ if (fileExtension === 'svg') {
245
+ (0, fs_1.writeFileSync)(outputPath, svgOutput);
246
+ }
247
+ else if (fileExtension === 'pdf') {
248
+ let sheetSize = "A4";
249
+ let sheetSizeDefined = false;
250
+ if (frameComponent) {
251
+ sheetSize = frameComponent.getParam(Frame_js_1.FrameParamKeys.PaperSize);
252
+ sheetSizeDefined = true;
253
+ }
254
+ const doc = new pdfkit_1.default({
255
+ layout: 'landscape',
256
+ size: sheetSize
257
+ });
258
+ const outputStream = (0, fs_1.createWriteStream)(outputPath);
259
+ (0, render_js_1.generatePdfOutput)(doc, svgCanvas, sheetSize, sheetSizeDefined, outputDefaultZoom);
260
+ doc.pipe(outputStream);
261
+ doc.end();
262
+ }
263
+ else {
264
+ throw "Invalid output format";
265
+ }
233
266
  console.log('Generated file', outputPath);
234
267
  }
235
268
  }
@@ -309,3 +342,45 @@ function pxToMM(value) {
309
342
  return value * globals_js_1.PxToMM;
310
343
  }
311
344
  exports.pxToMM = pxToMM;
345
+ const PaperSizes = {
346
+ 'A0': [1189, 841],
347
+ 'A1': [841, 594],
348
+ 'A2': [594, 420],
349
+ 'A3': [420, 297],
350
+ 'A4': [297, 210],
351
+ 'A5': [210, 148],
352
+ 'A6': [148, 105],
353
+ };
354
+ exports.PaperGridReferences = {
355
+ 'A0': [16, 24],
356
+ 'A1': [12, 16],
357
+ 'A2': [8, 12],
358
+ 'A3': [6, 8],
359
+ 'A4': [4, 6],
360
+ };
361
+ function isSupportedPaperSize(type) {
362
+ if (PaperSizes[type]) {
363
+ return true;
364
+ }
365
+ return false;
366
+ }
367
+ exports.isSupportedPaperSize = isSupportedPaperSize;
368
+ function getPaperSize(type, margin = globals_js_1.defaultPageMarginMM) {
369
+ if (PaperSizes[type]) {
370
+ const [width, height] = PaperSizes[type];
371
+ const useWidth = width - margin * 2;
372
+ const useHeight = height - margin * 2;
373
+ return {
374
+ width: Math.floor(useWidth * (1 / globals_js_1.MilsToMM)),
375
+ height: Math.floor(useHeight * (1 / globals_js_1.MilsToMM)),
376
+ widthMM: useWidth,
377
+ heightMM: useHeight,
378
+ originalWidthMM: width,
379
+ originalHeightMM: height,
380
+ };
381
+ }
382
+ else {
383
+ return getPaperSize('A4');
384
+ }
385
+ }
386
+ exports.getPaperSize = getPaperSize;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CalculatePinPositions = exports.RenderJunction = exports.RenderFrameType = exports.RenderFrame = exports.RenderText = exports.RenderComponent = exports.RenderWire = exports.RenderObject = exports.getBounds = exports.LayoutEngine = void 0;
3
+ exports.ExtractDrawingRects = exports.CalculatePinPositions = exports.RenderJunction = exports.RenderFrameType = exports.RenderFrame = exports.RenderText = exports.RenderComponent = exports.RenderWire = exports.RenderObject = exports.getBounds = exports.LayoutEngine = void 0;
4
4
  const graphlib_1 = require("@dagrejs/graphlib");
5
5
  const draw_symbols_js_1 = require("./draw_symbols.js");
6
6
  const ExecutionScope_js_1 = require("./objects/ExecutionScope.js");
@@ -13,10 +13,13 @@ const utils_js_1 = require("./utils.js");
13
13
  const types_js_1 = require("./objects/types.js");
14
14
  const helpers_js_1 = require("./helpers.js");
15
15
  class LayoutEngine {
16
- constructor() {
16
+ constructor(options = { showBaseFrame: false }) {
17
17
  this.placeSubgraphVersion = 2;
18
18
  this.layoutWarnings = [];
19
+ this.showBaseFrame = false;
19
20
  this.logger = new logger_js_1.Logger();
21
+ const { showBaseFrame = false } = options ?? {};
22
+ this.showBaseFrame = showBaseFrame;
20
23
  }
21
24
  print(...params) {
22
25
  this.logger.add(params.join(' '));
@@ -60,38 +63,51 @@ class LayoutEngine {
60
63
  this.print('-- items:', item.components);
61
64
  });
62
65
  }
63
- const { textObjects, elementFrames } = this.placeFrames(graph, subgraphInfo, containerFrames);
66
+ const { elementFrames } = this.placeFrames(graph, subgraphInfo, containerFrames);
64
67
  const frameObjects = [...elementFrames, ...containerFrames];
65
- const placedComponents = [];
66
- const placedWires = [];
67
- const tmpNodes = graph.nodes();
68
- tmpNodes.forEach(item => {
69
- const nodeValue = graph.node(item);
70
- const [nodeType, nodeItem] = nodeValue;
71
- if (nodeType === RenderItemType.Component) {
72
- placedComponents.push(nodeItem);
73
- }
74
- else if (nodeType === RenderItemType.Wire) {
75
- placedWires.push(nodeItem);
76
- }
68
+ const sheetFrames = frameObjects.filter(item => {
69
+ return item.frame.frameType === globals_js_1.FrameType.Sheet;
70
+ });
71
+ if (sheetFrames.length === 0) {
72
+ sheetFrames.push(containerFrames[0]);
73
+ }
74
+ const sheetFrameObjects = sheetFrames.map(sheet => {
75
+ const items = this.flattenFrameItems(sheet);
76
+ const components = items.filter(item => item instanceof RenderComponent);
77
+ const wires = items.filter(item => item instanceof RenderWire);
78
+ const textObjects = items.filter(item => item instanceof RenderText);
79
+ const frames = items.filter(item => item instanceof RenderFrame);
80
+ const wireGroups = new Map();
81
+ wires.forEach(wire => {
82
+ const { netName } = wire;
83
+ if (!wireGroups.has(netName)) {
84
+ wireGroups.set(netName, []);
85
+ }
86
+ wireGroups.get(netName).push(wire);
87
+ });
88
+ const { junctions, mergedWires } = this.findJunctions(wireGroups);
89
+ return {
90
+ frame: sheet,
91
+ frames,
92
+ components,
93
+ wires,
94
+ textObjects,
95
+ junctions,
96
+ mergedWires,
97
+ };
77
98
  });
78
- const wireGroups = new Map();
79
- placedWires.forEach(wire => {
80
- const { netName } = wire;
81
- if (!wireGroups.has(netName)) {
82
- wireGroups.set(netName, []);
99
+ return sheetFrameObjects;
100
+ }
101
+ flattenFrameItems(frame) {
102
+ const items = [];
103
+ frame.innerItems.forEach(item => {
104
+ items.push(item);
105
+ if (item instanceof RenderFrame) {
106
+ const inner = this.flattenFrameItems(item);
107
+ items.push(...inner);
83
108
  }
84
- wireGroups.get(netName).push(wire);
85
109
  });
86
- const { junctions, mergedWires } = this.findJunctions(wireGroups);
87
- return {
88
- components: placedComponents,
89
- wires: placedWires,
90
- mergedWires,
91
- junctions,
92
- frameObjects,
93
- textObjects,
94
- };
110
+ return items;
95
111
  }
96
112
  findJunctions(wireGroups) {
97
113
  const junctions = [];
@@ -124,6 +140,11 @@ class LayoutEngine {
124
140
  const baseFrame = frameObjects[0];
125
141
  baseFrame.padding = 0;
126
142
  baseFrame.borderWidth = 0;
143
+ if (this.showBaseFrame) {
144
+ baseFrame.borderWidth = 5;
145
+ baseFrame.width = 11692 - 400 * 2;
146
+ baseFrame.height = 8267 - 400 * 2;
147
+ }
127
148
  baseFrame.x = 0;
128
149
  baseFrame.y = 0;
129
150
  let textObjects = [];
@@ -136,7 +157,7 @@ class LayoutEngine {
136
157
  const result = this.prepareFrames(graph, subgraphInfo, baseFrame);
137
158
  textObjects = result.textObjects;
138
159
  elementFrames = result.elementFrames;
139
- const logFrames = false;
160
+ const logFrames = true;
140
161
  if (logFrames) {
141
162
  this.print('===== dump frames =====');
142
163
  this.dumpFrame(baseFrame);
@@ -170,8 +191,14 @@ class LayoutEngine {
170
191
  this.print(level, "".padStart(level * 4), 'frame', frame.x, frame.y);
171
192
  const innerItems = frame.innerItems;
172
193
  innerItems.forEach(innerFrame => {
173
- innerFrame.x += frame.x;
174
- innerFrame.y += frame.y;
194
+ if (innerFrame.frame.frameType === globals_js_1.FrameType.Sheet) {
195
+ innerFrame.x = 0;
196
+ innerFrame.y = 0;
197
+ }
198
+ else {
199
+ innerFrame.x += frame.x;
200
+ innerFrame.y += frame.y;
201
+ }
175
202
  if (innerFrame.type === RenderFrameType.Elements) {
176
203
  this.print(level, "".padStart(level * 4), 'element frame', innerFrame.x, innerFrame.y);
177
204
  innerFrame.innerItems.forEach(item2 => {
@@ -259,7 +286,34 @@ class LayoutEngine {
259
286
  }
260
287
  boundPoints.push([innerFrame.x, innerFrame.y], [innerFrame.x + frameWidth, innerFrame.y + frameHeight]);
261
288
  });
262
- frame.bounds = (0, utils_js_1.resizeBounds)(getBoundsFromPoints(boundPoints), frame.padding);
289
+ const contentsBounds = (0, utils_js_1.resizeBounds)(getBoundsFromPoints(boundPoints), frame.padding);
290
+ if (frame.frame.parameters.has(Frame_js_1.FrameParamKeys.SheetFrame)) {
291
+ const frameComponent = frame.frame.parameters.get(Frame_js_1.FrameParamKeys.SheetFrame);
292
+ const rects = ExtractDrawingRects(frameComponent.displayProp);
293
+ let frameWidth = 0;
294
+ let frameHeight = 0;
295
+ if (rects[1]) {
296
+ frameWidth = (0, helpers_js_1.milsToMM)(rects[1].width);
297
+ frameHeight = (0, helpers_js_1.milsToMM)(rects[1].height);
298
+ }
299
+ const contentsWidth = contentsBounds.xmax - contentsBounds.xmin;
300
+ const contentsHeight = contentsBounds.ymax - contentsBounds.ymin;
301
+ const frameOffsetX = (0, utils_js_1.toNearestGrid)((frameWidth - contentsWidth) / 2, gridSize);
302
+ const frameOffsetY = (0, utils_js_1.toNearestGrid)((frameHeight - contentsHeight) / 2, gridSize);
303
+ innerFrames.forEach(innerFrame => {
304
+ innerFrame.x += frameOffsetX;
305
+ innerFrame.y += frameOffsetY;
306
+ });
307
+ frame.bounds = {
308
+ xmin: 0,
309
+ ymin: 0,
310
+ xmax: frameWidth,
311
+ ymax: frameHeight
312
+ };
313
+ }
314
+ else {
315
+ frame.bounds = contentsBounds;
316
+ }
263
317
  }
264
318
  dumpFrame(frame, level = 0) {
265
319
  this.print(level, "".padStart(level * 4), 'frame, items:', frame.innerItems.length);
@@ -497,6 +551,14 @@ class LayoutEngine {
497
551
  newFrame.borderWidth =
498
552
  frameObject.parameters.get(Frame_js_1.FrameParamKeys.Border);
499
553
  }
554
+ if (frameObject.parameters.has(Frame_js_1.FrameParamKeys.Width)) {
555
+ newFrame.width =
556
+ frameObject.parameters.get(Frame_js_1.FrameParamKeys.Width);
557
+ }
558
+ if (frameObject.parameters.has(Frame_js_1.FrameParamKeys.Height)) {
559
+ newFrame.height =
560
+ frameObject.parameters.get(Frame_js_1.FrameParamKeys.Height);
561
+ }
500
562
  containerFrames.push(newFrame);
501
563
  frameStack.push(newFrame);
502
564
  prevFrame && prevFrame.innerItems.push(newFrame);
@@ -658,14 +720,20 @@ class LayoutEngine {
658
720
  floatingNode.isFloating = false;
659
721
  this.print('set node as not floating:', floatingNode);
660
722
  const originNode = findOriginNode(fixedNode);
661
- originNodeGroups.get(originNode).push(floatingNode);
662
- this.print('linking node', floatingNode, 'to origin node', originNode);
723
+ const itemsArray = originNodeGroups.get(originNode);
724
+ if (itemsArray.indexOf(floatingNode) === -1) {
725
+ itemsArray.push(floatingNode);
726
+ this.print('linking node', floatingNode, 'to origin node', originNode);
727
+ }
728
+ else {
729
+ this.print('node is alread linked', floatingNode, 'to origin node', originNode);
730
+ }
663
731
  }
664
732
  [node1, node2].forEach(item => {
665
733
  if (item instanceof RenderWire && item.isEndAutoLength()) {
666
734
  const [instance, pin] = item.getEndAuto();
667
735
  const [, targetNode] = graph.node(instance.instanceName);
668
- this.print('wire auto length to target:', instance, pin);
736
+ this.print('wire', item, 'auto length to target:', instance, pin);
669
737
  if (targetNode.isFloating) {
670
738
  throw "Cannot create auto wire with floating node! Wire id: " + item.id + " to node " + instance + " pin " + pin;
671
739
  }
@@ -676,6 +744,7 @@ class LayoutEngine {
676
744
  }
677
745
  const [untilX, untilY] = getNodePositionAtPin(targetNode, pin);
678
746
  item.setEndAuto(untilX, untilY);
747
+ this.print(`set wire auto end at: ${untilX} ${untilY}`);
679
748
  }
680
749
  });
681
750
  });
@@ -1230,6 +1299,9 @@ class RenderFrame extends RenderObject {
1230
1299
  this.gap = (0, helpers_js_1.milsToMM)(100);
1231
1300
  this.direction = Frame_js_1.FramePlotDirection.Column;
1232
1301
  this.borderWidth = 5;
1302
+ this.width = null;
1303
+ this.height = null;
1304
+ this.size = null;
1233
1305
  this.subgraphId = "";
1234
1306
  this.containsTitle = false;
1235
1307
  this.frame = frame;
@@ -1278,6 +1350,17 @@ function CalculatePinPositions(component) {
1278
1350
  return pinPositionMapping;
1279
1351
  }
1280
1352
  exports.CalculatePinPositions = CalculatePinPositions;
1353
+ function ExtractDrawingRects(drawing) {
1354
+ return drawing.getCommands().filter(item => {
1355
+ return (item[0] === draw_symbols_js_1.PlaceHolderCommands.rect);
1356
+ }).map(item => {
1357
+ return {
1358
+ width: item[1][2],
1359
+ height: item[1][3],
1360
+ };
1361
+ });
1362
+ }
1363
+ exports.ExtractDrawingRects = ExtractDrawingRects;
1281
1364
  function isPointOverlap(x, y, other) {
1282
1365
  return (x >= other.x && y >= other.y && x <= (other.x + other.width) && y <= (other.y + other.height));
1283
1366
  }
@@ -79,6 +79,9 @@ class ClassComponent {
79
79
  this.parameters.set(key, value);
80
80
  this.refreshParamCache();
81
81
  }
82
+ hasParam(key) {
83
+ return this.parameters.has(key);
84
+ }
82
85
  refreshParamCache() {
83
86
  this._cachedParams =
84
87
  JSON.stringify(Object.fromEntries(this.parameters));
@@ -9,6 +9,7 @@ class ExecutionScope {
9
9
  this.variables = new Map();
10
10
  this.symbols = new Map();
11
11
  this.blockStack = new Map();
12
+ this.breakStack = [];
12
13
  this.wires = [];
13
14
  this.frames = [];
14
15
  this.indentLevel = 0;
@@ -2,9 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FramePlotDirection = exports.FrameParamKeys = exports.Frame = void 0;
4
4
  class Frame {
5
- constructor(frameId) {
5
+ constructor(frameId, frameType) {
6
6
  this.parameters = new Map();
7
7
  this.frameId = frameId;
8
+ this.frameType = frameType;
8
9
  }
9
10
  }
10
11
  exports.Frame = Frame;
@@ -14,6 +15,10 @@ var FrameParamKeys;
14
15
  FrameParamKeys["Direction"] = "direction";
15
16
  FrameParamKeys["Padding"] = "padding";
16
17
  FrameParamKeys["Border"] = "border";
18
+ FrameParamKeys["Width"] = "width";
19
+ FrameParamKeys["Height"] = "height";
20
+ FrameParamKeys["PaperSize"] = "paper_size";
21
+ FrameParamKeys["SheetFrame"] = "sheet_frame";
17
22
  })(FrameParamKeys || (exports.FrameParamKeys = FrameParamKeys = {}));
18
23
  var FramePlotDirection;
19
24
  (function (FramePlotDirection) {
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PinBlankValue = exports.PercentageValue = exports.NumericValue = exports.ParamDefinition = void 0;
3
+ exports.PercentageValue = exports.NumericValue = exports.ParamDefinition = void 0;
4
4
  class ParamDefinition {
5
5
  constructor(paramName, paramValue) {
6
6
  this.paramName = paramName;
@@ -34,9 +34,3 @@ class PercentageValue {
34
34
  }
35
35
  }
36
36
  exports.PercentageValue = PercentageValue;
37
- class PinBlankValue {
38
- constructor(value) {
39
- this.blank = value;
40
- }
41
- }
42
- exports.PinBlankValue = PinBlankValue;
@@ -5,6 +5,9 @@ class UndeclaredReference {
5
5
  constructor(reference) {
6
6
  this.reference = reference;
7
7
  }
8
+ throwMessage() {
9
+ return `Unknown symbol: ${this.reference.name}`;
10
+ }
8
11
  }
9
12
  exports.UndeclaredReference = UndeclaredReference;
10
13
  class DeclaredReference {
@@ -15,6 +18,9 @@ class DeclaredReference {
15
18
  this.type = refType.type;
16
19
  this.value = refType.value;
17
20
  }
21
+ toString() {
22
+ return `[DeclaredReference name: ${this.name} trailers:${this.trailers} found: ${this.found}]`;
23
+ }
18
24
  }
19
25
  exports.DeclaredReference = DeclaredReference;
20
26
  var ParseSymbolType;
@@ -31,7 +31,8 @@ async function regenerateTests(extra = "") {
31
31
  return cstFiles;
32
32
  }
33
33
  (async () => {
34
- const generateDiff = false;
34
+ const generateDiff = (process.argv.indexOf('-diff') !== -1);
35
+ console.log('diff flag: ', generateDiff);
35
36
  const nextExtra = generateDiff ? '.next' : '';
36
37
  const cstFiles = await regenerateTests(nextExtra);
37
38
  const allFiles = [];